From 9d95e8103e241a528d23daf95ef6e1344c04d203 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Tue, 14 Feb 2023 17:04:00 +0700 Subject: [PATCH] 1.19.3 --- .github/workflows/publish.yml | 44 +++++++++++ CHANGELOG.md | 3 + gradle.properties | 8 +- .../recipebookispain/RecipeBookIsPain.java | 44 +++++------ .../recipebookispain/access/ItemAccess.java | 8 ++ .../access/RecipeBookWidgetAccess.java | 2 + .../mixin/ClientRecipeBookMixin.java | 38 +++++++--- .../recipebookispain/mixin/ItemMixin.java | 22 ++++++ .../mixin/RecipeBookGroupMixin.java | 12 ++- .../mixin/RecipeBookWidgetMixin.java | 74 ++++++++++--------- .../resources/recipebookispain.mixins.json | 1 + 11 files changed, 177 insertions(+), 79 deletions(-) create mode 100644 .github/workflows/publish.yml create mode 100644 CHANGELOG.md create mode 100644 src/main/java/me/melontini/recipebookispain/access/ItemAccess.java create mode 100644 src/main/java/me/melontini/recipebookispain/mixin/ItemMixin.java diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..0b462b2 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,44 @@ +on: + push: + tags: + - 'v*' + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - name: checkout repository + uses: actions/checkout@v2 + - name: validate gradle wrapper + uses: gradle/wrapper-validation-action@v1 + - name: setup jdk 17 + uses: actions/setup-java@v2 + with: + distribution: adopt + java-version: 17 + - name: make gradle wrapper executable + run: chmod +x ./gradlew + - name: build + run: ./gradlew build + - name: Publish Minecraft Mods + uses: Kir-Antipov/mc-publish@v3.2 + with: + version-type: beta + modrinth-id: fLAsXzkA + modrinth-token: ${{ secrets.MODRINTH_TOKEN }} + modrinth-featured: true + modrinth-unfeature-mode: subset + + curseforge-id: 825157 + curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} + + game-versions: | + 1.19.2 + + loaders: | + forge + + changelog-file: CHANGELOG.md + + java: | + 17 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e95ef0d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3 @@ +## What's new: + +* Updated to 1.19.3 \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 96bc6d0..28d02a8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,14 +9,14 @@ loom.platform=forge # Base properties # minecraft version - minecraft_version=1.19 + minecraft_version=1.19.3 # forge version, latest version can be found on https://files.minecraftforge.net/ - forge_version=1.19-41.0.105 + forge_version=1.19.3-44.1.16 # yarn, latest version can be found on https://fabricmc.net/use - yarn_mappings=1.19+build.4 + yarn_mappings=1.19.3+build.5 # Mod Properties - mod_version=0.7.1-1.19-forge + mod_version=0.8.0-1.19.3-forge maven_group=me.melontini archives_base_name=recipe-book-is-pain mod_id=recipe-book-is-pain diff --git a/src/main/java/me/melontini/recipebookispain/RecipeBookIsPain.java b/src/main/java/me/melontini/recipebookispain/RecipeBookIsPain.java index 7f9e95f..287deb7 100644 --- a/src/main/java/me/melontini/recipebookispain/RecipeBookIsPain.java +++ b/src/main/java/me/melontini/recipebookispain/RecipeBookIsPain.java @@ -2,6 +2,7 @@ package me.melontini.recipebookispain; import net.minecraft.client.recipebook.RecipeBookGroup; import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemGroups; import net.minecraftforge.client.event.RegisterRecipeBookCategoriesEvent; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.fml.common.Mod; @@ -18,40 +19,33 @@ import java.util.Map; public class RecipeBookIsPain { public static final Logger LOGGER = LogManager.getLogger("RBIP"); - public static Map ADDED_GROUPS = new HashMap<>(); - public static Map AAAAAAAA = new HashMap<>(); - public static List CRAFTING_SEARCH_MAP = new ArrayList<>(); - public static List CRAFTING_MAP = new ArrayList<>(); + public static List CRAFTING_SEARCH_LIST = new ArrayList<>(); + public static List CRAFTING_LIST = new ArrayList<>(); + + public static Map RECIPE_BOOK_GROUP_TO_ITEM_GROUP = new HashMap<>(); + public static Map ITEM_GROUP_TO_RECIPE_BOOK_GROUP = new HashMap<>(); public RecipeBookIsPain() { FMLJavaModLoadingContext.get().getModEventBus().addListener(EventPriority.LOWEST, false, RegisterRecipeBookCategoriesEvent.class, registerRecipeBookCategoriesEvent -> { - List groups = new ArrayList<>(); - - for (ItemGroup group : ItemGroup.GROUPS) { - if (group != ItemGroup.HOTBAR && group != ItemGroup.INVENTORY && group != ItemGroup.SEARCH) { - String name = "P_CRAFTING_" + group.getIndex(); - var group1 = RecipeBookGroup.create(name, group.getIcon()); - RecipeBookIsPain.ADDED_GROUPS.put(name, group1); - RecipeBookIsPain.AAAAAAAA.put(name, group); - groups.add(group1); - } - } + for (ItemGroup group : ItemGroups.getGroups()) { + if (group.getType() != ItemGroup.Type.INVENTORY && group.getType() != ItemGroup.Type.HOTBAR && group.getType() != ItemGroup.Type.SEARCH) { + String name = "P_CRAFTING_" + ItemGroups.getGroups().indexOf(group); + + RecipeBookGroup recipeBookGroup = RecipeBookGroup.create(name, group.getIcon()); + RecipeBookIsPain.RECIPE_BOOK_GROUP_TO_ITEM_GROUP.put(recipeBookGroup, group); + RecipeBookIsPain.ITEM_GROUP_TO_RECIPE_BOOK_GROUP.put(group, recipeBookGroup); - List craftingMap = new ArrayList<>(); - List craftingSearchMap = new ArrayList<>(); - craftingMap.add(RecipeBookGroup.CRAFTING_SEARCH); - for (RecipeBookGroup bookGroup : groups) { - if (bookGroup.toString().contains("P_CRAFTING")) { - craftingMap.add(bookGroup); - craftingSearchMap.add(bookGroup); + CRAFTING_LIST.add(recipeBookGroup); + CRAFTING_SEARCH_LIST.add(recipeBookGroup); } } - RecipeBookIsPain.CRAFTING_SEARCH_MAP.addAll(craftingSearchMap); - CRAFTING_MAP.addAll(craftingMap); + CRAFTING_LIST.add(0, RecipeBookGroup.CRAFTING_SEARCH); + CRAFTING_LIST.add(RecipeBookGroup.CRAFTING_MISC); + CRAFTING_SEARCH_LIST.add(RecipeBookGroup.CRAFTING_MISC); registerRecipeBookCategoriesEvent.aggregateCategories.remove(RecipeBookGroup.CRAFTING_SEARCH); - registerRecipeBookCategoriesEvent.registerAggregateCategory(RecipeBookGroup.CRAFTING_SEARCH, CRAFTING_SEARCH_MAP); + registerRecipeBookCategoriesEvent.registerAggregateCategory(RecipeBookGroup.CRAFTING_SEARCH, CRAFTING_SEARCH_LIST); RecipeBookIsPain.LOGGER.info("[RBIP] recipe book init complete"); }); } diff --git a/src/main/java/me/melontini/recipebookispain/access/ItemAccess.java b/src/main/java/me/melontini/recipebookispain/access/ItemAccess.java new file mode 100644 index 0000000..4ca65cd --- /dev/null +++ b/src/main/java/me/melontini/recipebookispain/access/ItemAccess.java @@ -0,0 +1,8 @@ +package me.melontini.recipebookispain.access; + +import net.minecraft.item.ItemGroup; + +public interface ItemAccess { + ItemGroup rbip$getPossibleGroup(); + void rbip$setPossibleGroup(ItemGroup group); +} diff --git a/src/main/java/me/melontini/recipebookispain/access/RecipeBookWidgetAccess.java b/src/main/java/me/melontini/recipebookispain/access/RecipeBookWidgetAccess.java index e2cbb25..0537e49 100644 --- a/src/main/java/me/melontini/recipebookispain/access/RecipeBookWidgetAccess.java +++ b/src/main/java/me/melontini/recipebookispain/access/RecipeBookWidgetAccess.java @@ -4,4 +4,6 @@ public interface RecipeBookWidgetAccess { int getBookPage(); void setBookPage(int page); + + void updatePages(); } diff --git a/src/main/java/me/melontini/recipebookispain/mixin/ClientRecipeBookMixin.java b/src/main/java/me/melontini/recipebookispain/mixin/ClientRecipeBookMixin.java index 98baff5..80ab1f7 100644 --- a/src/main/java/me/melontini/recipebookispain/mixin/ClientRecipeBookMixin.java +++ b/src/main/java/me/melontini/recipebookispain/mixin/ClientRecipeBookMixin.java @@ -1,32 +1,52 @@ package me.melontini.recipebookispain.mixin; import me.melontini.recipebookispain.RecipeBookIsPain; +import me.melontini.recipebookispain.access.ItemAccess; import net.minecraft.client.recipebook.ClientRecipeBook; import net.minecraft.client.recipebook.RecipeBookGroup; import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemGroups; import net.minecraft.item.ItemStack; +import net.minecraft.recipe.CraftingRecipe; import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeType; +import net.minecraft.resource.featuretoggle.FeatureFlags; +import net.minecraft.resource.featuretoggle.FeatureSet; import org.spongepowered.asm.mixin.Mixin; 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; @Mixin(value = ClientRecipeBook.class, priority = 999) public class ClientRecipeBookMixin { + @Inject(at = @At("TAIL"), method = "") + private static void rbip$setupGroups(CallbackInfo ci) { + ItemGroups.updateDisplayParameters(FeatureSet.of(FeatureFlags.BUNDLE, FeatureFlags.UPDATE_1_20, FeatureFlags.VANILLA), true); + for (ItemGroup group : ItemGroups.getGroups()) { + if (group.getType() != ItemGroup.Type.INVENTORY && group.getType() != ItemGroup.Type.HOTBAR && group.getType() != ItemGroup.Type.SEARCH) { + group.getSearchTabStacks().forEach(stack -> { + if (((ItemAccess) stack.getItem()).rbip$getPossibleGroup() == ItemGroups.getDefaultTab()) { + ((ItemAccess) stack.getItem()).rbip$setPossibleGroup(group); + } + }); + } + } + } + @Inject(at = @At("HEAD"), method = "getGroupForRecipe", cancellable = true) private static void recipe_book_is_pain$getGroupForRecipe(Recipe recipe, CallbackInfoReturnable cir) { - RecipeType recipeType = recipe.getType(); - if (recipeType == RecipeType.CRAFTING) { + if (recipe instanceof CraftingRecipe) { ItemStack itemStack = recipe.getOutput(); - ItemGroup group = itemStack.getItem().getGroup(); + ItemGroup group = ((ItemAccess) itemStack.getItem()).rbip$getPossibleGroup(); if (group != null) { - if (group != ItemGroup.HOTBAR && group != ItemGroup.INVENTORY && group != ItemGroup.SEARCH) - if (RecipeBookIsPain.ADDED_GROUPS.get("P_CRAFTING_" + group.getIndex()) != null) - cir.setReturnValue(RecipeBookIsPain.ADDED_GROUPS.get("P_CRAFTING_" + group.getIndex())); - else - cir.setReturnValue(RecipeBookIsPain.ADDED_GROUPS.get("P_CRAFTING_" + ItemGroup.MISC.getIndex())); + if (group.getType() != ItemGroup.Type.INVENTORY && group.getType() != ItemGroup.Type.HOTBAR && group.getType() != ItemGroup.Type.SEARCH) { + if (RecipeBookIsPain.ITEM_GROUP_TO_RECIPE_BOOK_GROUP.get(group) != null) { + cir.setReturnValue(RecipeBookIsPain.ITEM_GROUP_TO_RECIPE_BOOK_GROUP.get(group)); + return; + } + } } + cir.setReturnValue(RecipeBookGroup.CRAFTING_MISC); } } } diff --git a/src/main/java/me/melontini/recipebookispain/mixin/ItemMixin.java b/src/main/java/me/melontini/recipebookispain/mixin/ItemMixin.java new file mode 100644 index 0000000..7555905 --- /dev/null +++ b/src/main/java/me/melontini/recipebookispain/mixin/ItemMixin.java @@ -0,0 +1,22 @@ +package me.melontini.recipebookispain.mixin; + +import me.melontini.recipebookispain.access.ItemAccess; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemGroups; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(Item.class) +public class ItemMixin implements ItemAccess { + public ItemGroup rbip$possibleGroup = ItemGroups.getDefaultTab(); + + @Override + public ItemGroup rbip$getPossibleGroup() { + return rbip$possibleGroup; + } + + @Override + public void rbip$setPossibleGroup(ItemGroup group) { + rbip$possibleGroup = group; + } +} diff --git a/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookGroupMixin.java b/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookGroupMixin.java index 8ae9f79..766eed7 100644 --- a/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookGroupMixin.java +++ b/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookGroupMixin.java @@ -1,23 +1,21 @@ package me.melontini.recipebookispain.mixin; import net.minecraft.client.recipebook.RecipeBookGroup; -import net.minecraft.recipe.book.RecipeBookCategory; import org.spongepowered.asm.mixin.Mixin; 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.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.Redirect; import java.util.List; -import static me.melontini.recipebookispain.RecipeBookIsPain.CRAFTING_MAP; +import static me.melontini.recipebookispain.RecipeBookIsPain.CRAFTING_LIST; @Mixin(RecipeBookGroup.class) @Unique public class RecipeBookGroupMixin { - @Inject(at = @At("HEAD"), method = "getGroups", cancellable = true) - private static void recipe_book_is_pain$getGroups(RecipeBookCategory category, CallbackInfoReturnable> cir) { - if (category == RecipeBookCategory.CRAFTING) cir.setReturnValue(CRAFTING_MAP); + @Redirect(at = @At(value = "FIELD", target = "Lnet/minecraft/client/recipebook/RecipeBookGroup;CRAFTING:Ljava/util/List;"), method = "getGroups") + private static List recipe_book_is_pain$getGroups() { + return CRAFTING_LIST; } } diff --git a/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookWidgetMixin.java b/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookWidgetMixin.java index 1ee040f..5c459db 100644 --- a/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookWidgetMixin.java +++ b/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookWidgetMixin.java @@ -10,7 +10,7 @@ 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.item.ItemGroup; +import net.minecraft.item.ItemGroups; import net.minecraft.screen.AbstractRecipeScreenHandler; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -33,6 +33,8 @@ public abstract class RecipeBookWidgetMixin implements RecipeBookWidgetAccess { protected static Identifier TEXTURE; @Shadow protected MinecraftClient client; + @Shadow + protected AbstractRecipeScreenHandler craftingScreenHandler; @Unique private int page = 0; @Shadow @@ -56,11 +58,9 @@ public abstract class RecipeBookWidgetMixin implements RecipeBookWidgetAccess { @Shadow public abstract boolean isOpen(); - @Shadow protected AbstractRecipeScreenHandler craftingScreenHandler; - - @Shadow @Nullable private RecipeGroupButtonWidget currentTab; + @Shadow private @Nullable RecipeGroupButtonWidget currentTab; - @Inject(at = @At("RETURN"), method = "reset") + @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/recipebook/RecipeGroupButtonWidget;setToggled(Z)V", shift = At.Shift.BEFORE), 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; @@ -73,9 +73,21 @@ public abstract class RecipeBookWidgetMixin implements RecipeBookWidgetAccess { @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) { - updatePageSwitchButtons(); renderPageText(matrices); - updatePages(mouseX, mouseY, matrices); + for (RecipeGroupButtonWidget widget : tabButtons) { + if (widget.visible) { + if (widget.getCategory().name().contains("_SEARCH")) { + if (widget.isHovered()) + client.currentScreen.renderTooltip(matrices, ItemGroups.getSearchGroup().getDisplayName(), mouseX, mouseY); + } else { + if (RecipeBookIsPain.RECIPE_BOOK_GROUP_TO_ITEM_GROUP.get(widget.getCategory()) != null) { + Text text = RecipeBookIsPain.RECIPE_BOOK_GROUP_TO_ITEM_GROUP.get(widget.getCategory()).getDisplayName(); + if (text != null) + if (widget.isHovered()) client.currentScreen.renderTooltip(matrices, text, mouseX, mouseY); + } + } + } + } this.prevPageButton.render(matrices, mouseX, mouseY, delta); this.nextPageButton.render(matrices, mouseX, mouseY, delta); } @@ -93,22 +105,17 @@ public abstract class RecipeBookWidgetMixin implements RecipeBookWidgetAccess { } } - @Unique //mmm spaghettio - private void updatePages(int mouseX, int mouseY, MatrixStack stack) { + @Unique + @Override + public void updatePages() { for (RecipeGroupButtonWidget widget : tabButtons) { if (((RecipeGroupButtonAccess) widget).getPage() == page) { RecipeBookGroup recipeBookGroup = widget.getCategory(); - if (client.currentScreen != null) if (recipeBookGroup.name().contains("_SEARCH")) { + if (recipeBookGroup.name().contains("_SEARCH")) { widget.visible = true; - if (widget.isHovered()) - client.currentScreen.renderTooltip(stack, ItemGroup.SEARCH.getDisplayName(), mouseX, mouseY); } else if (widget.hasKnownRecipes(recipeBook)) { + widget.visible = true; widget.checkForNewRecipes(this.client); - if (RecipeBookIsPain.AAAAAAAA.get(recipeBookGroup.name()) != null) { - Text text = RecipeBookIsPain.AAAAAAAA.get(recipeBookGroup.name()).getDisplayName(); - if (text != null) - if (widget.isHovered()) client.currentScreen.renderTooltip(stack, text, mouseX, mouseY); - } } } else { widget.visible = false; @@ -121,10 +128,12 @@ public abstract class RecipeBookWidgetMixin implements RecipeBookWidgetAccess { if (this.client.player != null) if (this.isOpen() && !this.client.player.isSpectator()) { if (nextPageButton.mouseClicked(mouseX, mouseY, button)) { if (this.page <= this.pages) ++this.page; + updatePages(); updatePageSwitchButtons(); cir.setReturnValue(true); } else if (prevPageButton.mouseClicked(mouseX, mouseY, button)) { if (this.page > 0) --this.page; + updatePages(); updatePageSwitchButtons(); cir.setReturnValue(true); } @@ -148,36 +157,33 @@ public abstract class RecipeBookWidgetMixin implements RecipeBookWidgetAccess { int l = 0; this.tabButtons.clear(); - for (RecipeBookGroup group : RecipeBookGroup.getGroups(this.craftingScreenHandler.getCategory())) { - var widget = new RecipeGroupButtonWidget(group); - if (group.name().contains("_SEARCH") || widget.hasKnownRecipes(recipeBook)) this.tabButtons.add(widget); + for (RecipeBookGroup recipeBookGroup : RecipeBookGroup.getGroups(this.craftingScreenHandler.getCategory())) { + var widget = new RecipeGroupButtonWidget(recipeBookGroup); + if (recipeBookGroup.name().contains("_SEARCH") || widget.hasKnownRecipes(this.recipeBook)) { + this.tabButtons.add(new RecipeGroupButtonWidget(recipeBookGroup)); + } } - if (this.currentTab != null) { - this.currentTab = this.tabButtons.stream().filter((button) -> - button.getCategory().equals(this.currentTab.getCategory())).findFirst().orElse(null); + this.currentTab = this.tabButtons.stream().filter((button) -> button.getCategory().equals(this.currentTab.getCategory())).findFirst().orElse(null); } if (this.currentTab == null) { this.currentTab = this.tabButtons.get(0); } - this.currentTab.setToggled(true); + this.currentTab.setToggled(true); for (RecipeGroupButtonWidget widget : this.tabButtons) { - RecipeBookGroup recipeBookGroup = widget.getCategory(); - if (recipeBookGroup.name().contains("_SEARCH") || widget.hasKnownRecipes(recipeBook)) { - ((RecipeGroupButtonAccess) widget).setPage((int) Math.ceil(p / 6)); - widget.setPos(c, b + 27 * l++); - widget.visible = ((RecipeGroupButtonAccess) widget).getPage() == page; - if (l == 6) { - l = 0; - } - p++; + ((RecipeGroupButtonAccess) widget).setPage((int) Math.ceil(p / 6)); + widget.setPos(c, b + 27 * l++); + if (l == 6) { + l = 0; } + p++; } --p; this.pages = (int) Math.ceil(p / 6); - + updatePages(); + updatePageSwitchButtons(); ci.cancel(); } diff --git a/src/main/resources/recipebookispain.mixins.json b/src/main/resources/recipebookispain.mixins.json index 1fcad33..ebfc311 100644 --- a/src/main/resources/recipebookispain.mixins.json +++ b/src/main/resources/recipebookispain.mixins.json @@ -7,6 +7,7 @@ ], "client": [ "ClientRecipeBookMixin", + "ItemMixin", "RecipeBookGroupMixin", "RecipeBookWidgetMixin", "RecipeGroupButtonMixin" -- 2.51.2