diff --git a/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookGroupMixin.java b/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookGroupMixin.java index 003fcfd..d79ac07 100644 --- a/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookGroupMixin.java +++ b/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookGroupMixin.java @@ -72,9 +72,9 @@ public class RecipeBookGroupMixin { } CRAFTING_SEARCH_MAP = craftingSearchMap; CRAFTING_MAP = craftingMap; - RecipeBookIsPainClient.LOGGER.info("[RBIP] recipe book init complete"); field_1805 = groups.toArray(new RecipeBookGroup[0]); + RecipeBookIsPainClient.LOGGER.info("[RBIP] recipe book init complete"); } @Inject(at = @At("HEAD"), method = "getGroups", cancellable = true) diff --git a/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookWidgetMixin.java b/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookWidgetMixin.java index b126019..9b39a38 100644 --- a/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookWidgetMixin.java +++ b/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookWidgetMixin.java @@ -1,21 +1,29 @@ package me.melontini.recipebookispain.mixin; +import me.melontini.recipebookispain.client.RecipeBookIsPainClient; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; import net.minecraft.client.gui.screen.recipebook.RecipeGroupButtonWidget; +import net.minecraft.client.gui.widget.ToggleButtonWidget; import net.minecraft.client.recipebook.ClientRecipeBook; import net.minecraft.client.recipebook.RecipeBookGroup; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.Identifier; +import net.minecraft.util.Pair; +import org.apache.commons.compress.utils.Lists; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.List; @Mixin(RecipeBookWidget.class) -public class RecipeBookWidgetMixin { +public abstract class RecipeBookWidgetMixin { @Shadow protected MinecraftClient client; @Shadow @@ -30,32 +38,115 @@ public class RecipeBookWidgetMixin { @Shadow private int parentWidth; + @Shadow @Final protected static Identifier TEXTURE; + + @Shadow public abstract boolean isOpen(); + + @Unique + private static int page = 0; + + @Unique + private int pages; + @Unique + private ToggleButtonWidget nextPageButton; + @Unique + private ToggleButtonWidget prevPageButton; + + @Unique + public List> groupTab = Lists.newArrayList(); + + @Inject(at = @At("RETURN"), method = "reset") + private void recipe_book_is_pain$init(CallbackInfo ci) { + int a = (this.parentWidth - 147) / 2 - this.leftOffset; + int s = (this.parentHeight + 166) / 2; + this.nextPageButton = new ToggleButtonWidget(a + 10, s, 12, 17, false); + this.nextPageButton.setTextureUV(1, 208, 13, 18, TEXTURE); + this.prevPageButton = new ToggleButtonWidget(a - 10, s, 12, 17, true); + this.prevPageButton.setTextureUV(1, 208, 13, 18, TEXTURE); + page = 0; + } + + @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;pop()V", shift = At.Shift.BEFORE), method = "render") + private void recipe_book_is_pain$render(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) { + this.prevPageButton.render(matrices, mouseX, mouseY, delta); + this.nextPageButton.render(matrices, mouseX, mouseY, delta); + updatePages(); + + + //if (client.world.getTime() % 20 == 0) refreshTabButtons(); + reloadPages(); + } + @Unique + private void reloadPages() { + int c = (this.parentWidth - 147) / 2 - this.leftOffset - 30; + int b = (this.parentHeight - 166) / 2 + 3; + int l = 0; + for (Pair pair : groupTab) { + RecipeGroupButtonWidget widget = pair.getRight(); + if (pair.getLeft() == page) { + RecipeBookGroup recipeBookGroup = widget.getCategory(); + if (recipeBookGroup == RecipeBookGroup.CRAFTING_SEARCH || recipeBookGroup == RecipeBookGroup.FURNACE_SEARCH) { + widget.visible = true; + widget.setPos(c, b + 27 * l++); + if (l == 6) { + l = 0; + } + } else if (widget.hasKnownRecipes(recipeBook)) { + if (l == 6) { + l = 0; + } + widget.setPos(c, b + 27 * l++); + widget.checkForNewRecipes(this.client); + } + } else { + widget.visible = false; + } + } + } + + @Inject(at = @At("HEAD"), method = "mouseClicked", cancellable = true) + private void recipe_book_is_pain$mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { + if (this.isOpen() && !this.client.player.isSpectator()) { + if (nextPageButton.mouseClicked(mouseX, mouseY, button)) { + if (page <= this.pages) ++page; + updatePages(); + //RecipeBookIsPainClient.LOGGER.info(page); + cir.setReturnValue(true); + } else if (prevPageButton.mouseClicked(mouseX, mouseY, button)) { + if (page > 0) --page; + updatePages(); + //RecipeBookIsPainClient.LOGGER.info(page); + cir.setReturnValue(true); + } + } + //RecipeBookIsPainClient.LOGGER.info(pages); + } + + private void updatePages() { + this.nextPageButton.visible = this.pages > 0 && page < this.pages; + this.prevPageButton.visible = this.pages > 0 && page != 0; + } + @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Inject(at = @At("HEAD"), method = "refreshTabButtons", cancellable = true) private void recipe_book_is_pain$refresh(CallbackInfo ci) { - int i = (this.parentWidth - 147) / 2 - this.leftOffset - 16; - int j = (this.parentHeight - 166) / 2 + 3; + groupTab.clear(); int l = 0; int p = 0; - int a; - //I'm in pain for (RecipeGroupButtonWidget recipeGroupButtonWidget : this.tabButtons) { - RecipeBookGroup recipeBookGroup = recipeGroupButtonWidget.getCategory(); - if (recipeBookGroup == RecipeBookGroup.CRAFTING_SEARCH || recipeBookGroup == RecipeBookGroup.FURNACE_SEARCH) { - recipeGroupButtonWidget.visible = true; - recipeGroupButtonWidget.setPos(i, j + 27 * l++); - } else if (recipeGroupButtonWidget.hasKnownRecipes(recipeBook)) { - p++; - a = (int) Math.ceil(p / 6); - if (l / 6 == 1 | l / 6 == 2 | l / 6 == 3 | l / 6 == 4 | l / 6 == 5 | l / 6 == 6 | l / 6 == 7) { - l = 0; - } - recipeGroupButtonWidget.setPos(i - 20 * a, j + 27 * l++); - recipeGroupButtonWidget.checkForNewRecipes(this.client); + p++; + l++; + groupTab.add(new Pair<>((int) Math.ceil(p / 6), recipeGroupButtonWidget)); + if (l == 6) { + l = 0; } } + + this.pages = (int) Math.ceil(p / 6); + //RecipeBookIsPainClient.LOGGER.info(groupTab); + ci.cancel(); } } diff --git a/src/main/java/me/melontini/recipebookispain/mixin/RecipeGroupButtonWidgetMixin.java b/src/main/java/me/melontini/recipebookispain/mixin/RecipeGroupButtonWidgetMixin.java index 51b4c25..e60310a 100644 --- a/src/main/java/me/melontini/recipebookispain/mixin/RecipeGroupButtonWidgetMixin.java +++ b/src/main/java/me/melontini/recipebookispain/mixin/RecipeGroupButtonWidgetMixin.java @@ -29,7 +29,7 @@ public class RecipeGroupButtonWidgetMixin extends ToggleButtonWidget { @ModifyConstant(method = "", constant = @Constant(intValue = 35, ordinal = 0)) private static int recipe_book_is_pain$init(int constant) { - return 20; + return 30; } @Redirect(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/recipebook/RecipeGroupButtonWidget;drawTexture(Lnet/minecraft/client/util/math/MatrixStack;IIIIII)V"), method = "renderButton") @@ -42,11 +42,10 @@ public class RecipeGroupButtonWidgetMixin extends ToggleButtonWidget { private void renderIcons(ItemRenderer itemRenderer) { List list = this.category.getIcons(); if (list.size() == 1) { - itemRenderer.renderInGui(list.get(0), this.x + 4, this.y + 5); + itemRenderer.renderInGui(list.get(0), this.x + 9, this.y + 5); } else if (list.size() == 2) { - //impossible btw - itemRenderer.renderInGui(list.get(0), this.x + 2, this.y + 5); - itemRenderer.renderInGui(list.get(1), this.x + 4, this.y + 5); + itemRenderer.renderInGui(list.get(0), this.x + 3, this.y + 5); + itemRenderer.renderInGui(list.get(1), this.x + 14, this.y + 5); } } }