diff --git a/build.gradle b/build.gradle index c37e1e9..0973d98 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,11 @@ repositories { // 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 @@ dependencies { 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 index ec9099a..6f821a5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,6 +6,6 @@ minecraft_version=1.18 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/java/me/melontini/recipebookispain/access/RecipeBookWidgetAccess.java b/src/main/java/me/melontini/recipebookispain/access/RecipeBookWidgetAccess.java new file mode 100644 index 0000000..e2cbb25 --- /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 index 0000000..7e2a6cf --- /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 index 0000000..f630950 --- /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 index fc7f2ee..1affe7b 100644 --- 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.ClientRecipeBook; 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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.List; @Mixin(RecipeBookWidget.class) -public abstract class RecipeBookWidgetMixin { +public abstract class RecipeBookWidgetMixin implements RecipeBookWidgetAccess { @Shadow @Final protected static Identifier TEXTURE; @@ -53,6 +56,10 @@ public abstract class RecipeBookWidgetMixin { @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) { int a = (this.parentWidth - 147) / 2 - this.leftOffset; @@ -89,7 +96,6 @@ public abstract class RecipeBookWidgetMixin { @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 @@ public abstract class RecipeBookWidgetMixin { 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)) { @@ -159,4 +180,14 @@ public abstract class RecipeBookWidgetMixin { ci.cancel(); } + + @Override + public int getBookPage() { + return page; + } + + @Override + public void setBookPage(int page) { + this.page = page; + } } diff --git a/src/main/resources/recipe-book-is-pain.mixins.json b/src/main/resources/recipe-book-is-pain.mixins.json index d6042b7..04c926a 100644 --- 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"