From 63703a67eeaffac60a24e332dcffe0244dc544c1 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Mon, 18 Jul 2022 14:44:10 +0000 Subject: [PATCH] hackiest fix ever. --- build.gradle | 8 +++++++- gradle.properties | 2 +- src/main/resources/recipe-book-is-pain.mixins.json | 2 ++ src/main/java/me/melontini/recipebookispain/access/RecipeBookWidgetAccess.java | 7 +++++++ src/main/java/me/melontini/recipebookispain/mixin/MixinConfigPlugin.java | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/me/melontini/recipebookispain/mixin/MouseWheelieCompatMixin.java | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/me/melontini/recipebookispain/mixin/RecipeBookWidgetMixin.java | 35 +++++++++++++++++++++++++++++++++-- 7 file(s) changed, 150 insertion(s)(+), 4 deletion(s)(-) diff --git a/build.gradle b/build.gradle --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,11 @@ // See https://docs.gradle.org/current/userguide/declaring_repositories.html // for more information about repositories. maven { - url 'https://jitpack.io' + name = "Modrinth" + url = "https://api.modrinth.com/maven" + content { + includeGroup "maven.modrinth" + } } } @@ -23,6 +27,8 @@ minecraft "com.mojang:minecraft:${project.minecraft_version}" mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + + modCompileOnly("maven.modrinth:mouse-wheelie:1.8.8+mc1.18-pre5") } processResources { diff --git a/gradle.properties b/gradle.properties --- a/gradle.properties +++ b/gradle.properties @@ -6,6 +6,6 @@ yarn_mappings=1.18+build.1 loader_version=0.14.8 # Mod Properties -mod_version=0.5-1.18 +mod_version=0.6-1.18 maven_group=me.melontini archives_base_name=recipe-book-is-pain diff --git a/src/main/resources/recipe-book-is-pain.mixins.json b/src/main/resources/recipe-book-is-pain.mixins.json --- a/src/main/resources/recipe-book-is-pain.mixins.json +++ b/src/main/resources/recipe-book-is-pain.mixins.json @@ -3,11 +3,13 @@ "minVersion": "0.8", "package": "me.melontini.recipebookispain.mixin", "compatibilityLevel": "JAVA_17", + "plugin": "me.melontini.recipebookispain.mixin.MixinConfigPlugin", "mixins": [ ], "client": [ "Accessor", "ClientRecipeBookMixin", + "MouseWheelieCompatMixin", "RecipeBookGroupMixin", "RecipeBookWidgetMixin", "RecipeGroupButtonMixin" diff --git a/src/main/java/me/melontini/recipebookispain/access/RecipeBookWidgetAccess.java b/src/main/java/me/melontini/recipebookispain/access/RecipeBookWidgetAccess.java new file mode 100644 --- /dev/null +++ b/src/main/java/me/melontini/recipebookispain/access/RecipeBookWidgetAccess.java @@ -0,0 +1,7 @@ +package me.melontini.recipebookispain.access; + +public interface RecipeBookWidgetAccess { + int getBookPage(); + + void setBookPage(int page); +} diff --git a/src/main/java/me/melontini/recipebookispain/mixin/MixinConfigPlugin.java b/src/main/java/me/melontini/recipebookispain/mixin/MixinConfigPlugin.java new file mode 100644 --- /dev/null +++ b/src/main/java/me/melontini/recipebookispain/mixin/MixinConfigPlugin.java @@ -0,0 +1,49 @@ +package me.melontini.recipebookispain.mixin; + +import net.fabricmc.loader.api.FabricLoader; +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.util.List; +import java.util.Objects; +import java.util.Set; + +public class MixinConfigPlugin implements IMixinConfigPlugin { + @Override + public void onLoad(String mixinPackage) { + + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + if (Objects.equals(mixinClassName, "me.melontini.recipebookispain.mixin.MouseWheelieCompatMixin") && !FabricLoader.getInstance().isModLoaded("mousewheelie")) + return false; + return true; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } +} diff --git a/src/main/java/me/melontini/recipebookispain/mixin/MouseWheelieCompatMixin.java b/src/main/java/me/melontini/recipebookispain/mixin/MouseWheelieCompatMixin.java new file mode 100644 --- /dev/null +++ b/src/main/java/me/melontini/recipebookispain/mixin/MouseWheelieCompatMixin.java @@ -0,0 +1,51 @@ +package me.melontini.recipebookispain.mixin; + +import de.siphalor.mousewheelie.client.mixin.gui.other.MixinRecipeBookWidget; +import de.siphalor.mousewheelie.client.util.ScrollAction; +import me.melontini.recipebookispain.access.RecipeBookWidgetAccess; +import me.melontini.recipebookispain.access.RecipeGroupButtonAccess; +import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; +import net.minecraft.client.gui.screen.recipebook.RecipeGroupButtonWidget; +import net.minecraft.util.math.MathHelper; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.List; + +@Pseudo +@Mixin(value = RecipeBookWidget.class, priority = 1001) +public abstract class MouseWheelieCompatMixin { + @Shadow + @Final + private List tabButtons; + + @Shadow + @Nullable + private RecipeGroupButtonWidget currentTab; + + @Shadow + protected abstract void refreshResults(boolean resetCurrentPage); + + //pain + //pretty funny tho + @SuppressWarnings("ReferenceToMixin") + @Dynamic(mixin = MixinRecipeBookWidget.class) + @Inject(at = @At(value = "INVOKE", target = "net/minecraft/client/gui/screen/recipebook/RecipeGroupButtonWidget.setToggled (Z)V", ordinal = 0, shift = At.Shift.BEFORE), method = "mouseWheelie_scrollRecipeBook", cancellable = true) + private void inject(double mouseX, double mouseY, double scrollAmount, CallbackInfoReturnable cir) { + RecipeBookWidget bookWidget = (RecipeBookWidget) (Object) this; + int index; + index = this.tabButtons.indexOf(this.currentTab); + int newIndex = MathHelper.clamp(index + (int) Math.round(scrollAmount), 0, this.tabButtons.size() - 1); + this.currentTab.setToggled(false); + this.currentTab = this.tabButtons.get(newIndex); + this.currentTab.setToggled(true); + if (((RecipeBookWidgetAccess) bookWidget).getBookPage() != ((RecipeGroupButtonAccess) this.currentTab).getPage()) { + ((RecipeBookWidgetAccess) bookWidget).setBookPage(((RecipeGroupButtonAccess) this.currentTab).getPage()); + } + this.refreshResults(true); + cir.setReturnValue(ScrollAction.SUCCESS); + } +} diff --git a/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookWidgetMixin.java b/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookWidgetMixin.java --- a/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookWidgetMixin.java +++ b/src/main/java/me/melontini/recipebookispain/mixin/RecipeBookWidgetMixin.java @@ -1,5 +1,6 @@ package me.melontini.recipebookispain.mixin; +import me.melontini.recipebookispain.access.RecipeBookWidgetAccess; import me.melontini.recipebookispain.access.RecipeGroupButtonAccess; import me.melontini.recipebookispain.client.RecipeBookIsPainClient; import net.minecraft.client.MinecraftClient; @@ -10,8 +11,10 @@ import net.minecraft.client.recipebook.RecipeBookGroup; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemGroup; +import net.minecraft.screen.AbstractRecipeScreenHandler; import net.minecraft.text.Text; import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -24,7 +27,7 @@ import java.util.List; @Mixin(RecipeBookWidget.class) -public abstract class RecipeBookWidgetMixin { +public abstract class RecipeBookWidgetMixin implements RecipeBookWidgetAccess { @Shadow @Final protected static Identifier TEXTURE; @@ -52,6 +55,10 @@ @Shadow public abstract boolean isOpen(); + + @Shadow protected AbstractRecipeScreenHandler craftingScreenHandler; + + @Shadow @Nullable private RecipeGroupButtonWidget currentTab; @Inject(at = @At("RETURN"), method = "reset") private void recipe_book_is_pain$init(CallbackInfo ci) { @@ -89,7 +96,6 @@ @Unique //mmm spaghettio private void updatePages(int mouseX, int mouseY, MatrixStack stack) { for (RecipeGroupButtonWidget widget : tabButtons) { - if (((RecipeGroupButtonAccess) widget).getPage() == page) { RecipeBookGroup recipeBookGroup = widget.getCategory(); if (client.currentScreen != null) if (recipeBookGroup.name().contains("_SEARCH")) { @@ -141,6 +147,21 @@ int b = (this.parentHeight - 166) / 2 + 3; 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); + } + + if (this.currentTab != 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); + for (RecipeGroupButtonWidget widget : this.tabButtons) { RecipeBookGroup recipeBookGroup = widget.getCategory(); if (recipeBookGroup.name().contains("_SEARCH") || widget.hasKnownRecipes(recipeBook)) { @@ -158,5 +179,15 @@ this.pages = (int) Math.ceil(p / 6); ci.cancel(); + } + + @Override + public int getBookPage() { + return page; + } + + @Override + public void setBookPage(int page) { + this.page = page; } } -- tangled.sh