From d3cc81a944066c8d03f3caa3be9372569f54ffc0 Mon Sep 17 00:00:00 2001 From: Ruisu Date: Sat, 13 Dec 2025 10:37:28 +0700 Subject: [PATCH 1/6] add NEI integration --- .../modularui/core/mixinplugin/Mixins.java | 6 +- .../core/mixinplugin/TargetedMod.java | 3 +- .../core/mixins/late/nei/RecipeInfoMixin.java | 70 +++++++++++++++++++ .../integration/nei/INEIRecipeTransfer.java | 67 ++++++++++++++++++ .../ModularUIGuiContainerStackOverlay.java | 62 ++++++++++++++++ .../ModularUIGuiContainerStackPositioner.java | 21 ++++++ .../integration/nei/NEIModularUIConfig.java | 3 + 7 files changed, 230 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java create mode 100644 src/main/java/com/cleanroommc/modularui/integration/nei/INEIRecipeTransfer.java create mode 100644 src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackOverlay.java create mode 100644 src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java diff --git a/src/main/java/com/cleanroommc/modularui/core/mixinplugin/Mixins.java b/src/main/java/com/cleanroommc/modularui/core/mixinplugin/Mixins.java index 1de7d46ea..3323fa546 100644 --- a/src/main/java/com/cleanroommc/modularui/core/mixinplugin/Mixins.java +++ b/src/main/java/com/cleanroommc/modularui/core/mixinplugin/Mixins.java @@ -27,7 +27,11 @@ public enum Mixins implements IMixins { THAUMCRAFT(new MixinBuilder() .addClientMixins("thaumcraft.ClientTickEventsFMLMixin") .setPhase(Phase.LATE) - .addRequiredMod(TargetedMod.THAUMCRAFT)); + .addRequiredMod(TargetedMod.THAUMCRAFT)), + NEI(new MixinBuilder() + .addCommonMixins("nei.RecipeInfoMixin") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.NEI)); private final MixinBuilder builder; diff --git a/src/main/java/com/cleanroommc/modularui/core/mixinplugin/TargetedMod.java b/src/main/java/com/cleanroommc/modularui/core/mixinplugin/TargetedMod.java index b9438f7b9..59755b4e2 100644 --- a/src/main/java/com/cleanroommc/modularui/core/mixinplugin/TargetedMod.java +++ b/src/main/java/com/cleanroommc/modularui/core/mixinplugin/TargetedMod.java @@ -6,7 +6,8 @@ public enum TargetedMod implements ITargetMod { - THAUMCRAFT("Thaumcraft"); + THAUMCRAFT("Thaumcraft"), + NEI("NotEnoughItems"); private final TargetModBuilder builder; diff --git a/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java b/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java new file mode 100644 index 000000000..cc746b08b --- /dev/null +++ b/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java @@ -0,0 +1,70 @@ +package com.cleanroommc.modularui.core.mixins.late.nei; + + +import com.cleanroommc.modularui.integration.nei.INEIRecipeTransfer; +import com.cleanroommc.modularui.integration.nei.ModularUIGuiContainerStackPositioner; +import com.cleanroommc.modularui.integration.nei.NEIModularUIConfig; +import com.cleanroommc.modularui.screen.GuiContainerWrapper; +import com.cleanroommc.modularui.screen.ModularContainer; + +import net.minecraft.client.gui.inventory.GuiContainer; + +import codechicken.nei.api.IOverlayHandler; +import codechicken.nei.api.IStackPositioner; +import codechicken.nei.recipe.RecipeInfo; +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.CallbackInfoReturnable; + +import java.util.Arrays; + +/* + Mixin to properly handle idents for modular uis +*/ +@Mixin(RecipeInfo.class) +public class RecipeInfoMixin { + + @Inject(method = "hasOverlayHandler(Lnet/minecraft/client/gui/inventory/GuiContainer;Ljava/lang/String;)Z", remap = false, cancellable = true, at=@At("HEAD")) + private static void modularui$hasOverlayHandler(GuiContainer gui, String ident, CallbackInfoReturnable ci) { + if (gui instanceof GuiContainerWrapper muw) { + if (gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { + if (Arrays.asList(tr.getIdents()).contains(ident)) { + ci.setReturnValue(true); + ci.cancel(); + } + } + } + } + + @Inject(method = "getStackPositioner", remap = false, cancellable = true, at=@At("HEAD")) + private static void modularui$getStackPositioner(GuiContainer gui, String ident, CallbackInfoReturnable ci) { + if (gui instanceof GuiContainerWrapper muw) { + if (gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { + if (Arrays.asList(tr.getIdents()).contains(ident)) { + //Hacky way around it, but should work + ModularUIGuiContainerStackPositioner positioner = NEIModularUIConfig.stackPositioner; + positioner.wrapper = muw; + positioner.container = muc; + positioner.recipeTransfer = tr; + ci.setReturnValue(positioner); + ci.cancel(); + return; + } + } + } + } + + @Inject(method = "getOverlayHandler", remap = false, cancellable = true, at=@At("HEAD")) + private static void modularui$getOverlayHandler(GuiContainer gui, String ident, CallbackInfoReturnable ci) { + if (gui instanceof GuiContainerWrapper muw) { + if (gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { + if (Arrays.asList(tr.getIdents()).contains(ident)) { + ci.setReturnValue(NEIModularUIConfig.overlayHandler); + ci.cancel(); + return; + } + } + } + } +} diff --git a/src/main/java/com/cleanroommc/modularui/integration/nei/INEIRecipeTransfer.java b/src/main/java/com/cleanroommc/modularui/integration/nei/INEIRecipeTransfer.java new file mode 100644 index 000000000..178af355d --- /dev/null +++ b/src/main/java/com/cleanroommc/modularui/integration/nei/INEIRecipeTransfer.java @@ -0,0 +1,67 @@ +package com.cleanroommc.modularui.integration.nei; + +import com.cleanroommc.modularui.screen.GuiContainerWrapper; +import com.cleanroommc.modularui.screen.ModularContainer; + +import net.minecraft.item.ItemStack; + +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.GuiOverlayButton; +import codechicken.nei.recipe.IRecipeHandler; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +public interface INEIRecipeTransfer { + String[] getIdents(); + + default void overlayRecipe(GuiContainerWrapper gui, ModularContainer self, IRecipeHandler recipe, int recipeIndex, boolean maxTransfer) { + transferRecipe(gui, self, recipe, recipeIndex, maxTransfer ? Integer.MAX_VALUE : 1); + } + + int transferRecipe(GuiContainerWrapper gui, ModularContainer self, IRecipeHandler recipe, int recipeIndex, int multiplier); + + default boolean canFillCraftingGrid(GuiContainerWrapper gui, ModularContainer self, IRecipeHandler recipe, int recipeIndex) { + return true; + } + + default boolean craft(GuiContainerWrapper gui, ModularContainer self, IRecipeHandler recipe, int recipeIndex, int multiplier) { + return false; + } + + default boolean canCraft(GuiContainerWrapper gui, ModularContainer self, IRecipeHandler recipe, int recipeIndex) { + return false; + } + + default List presenceOverlay(GuiContainerWrapper gui, ModularContainer self, IRecipeHandler recipe, int recipeIndex) { + final List itemPresenceSlots = new ArrayList<>(); + final List ingredients = recipe.getIngredientStacks(recipeIndex); + final List invStacks = gui.inventorySlots.inventorySlots.stream() + .filter( + s -> s != null && s.getStack() != null + && s.getStack().stackSize > 0 + && s.isItemValid(s.getStack()) + && s.canTakeStack(gui.mc.thePlayer)) + .map(s -> s.getStack().copy()).collect(Collectors.toList()); + + for (PositionedStack stack : ingredients) { + Optional used = invStacks.stream().filter(is -> is.stackSize > 0 && stack.contains(is)) + .findAny(); + + itemPresenceSlots.add(new GuiOverlayButton.ItemOverlayState(stack, used.isPresent())); + + if (used.isPresent()) { + ItemStack is = used.get(); + is.stackSize -= 1; + } + } + + return itemPresenceSlots; + } + + default ArrayList positionStacks(GuiContainerWrapper gui, ModularContainer self, ArrayList stacks) { + return stacks; + } +} diff --git a/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackOverlay.java b/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackOverlay.java new file mode 100644 index 000000000..829731f8c --- /dev/null +++ b/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackOverlay.java @@ -0,0 +1,62 @@ +package com.cleanroommc.modularui.integration.nei; + +import com.cleanroommc.modularui.screen.GuiContainerWrapper; +import com.cleanroommc.modularui.screen.ModularContainer; + +import net.minecraft.client.gui.inventory.GuiContainer; + +import codechicken.nei.api.IOverlayHandler; +import codechicken.nei.recipe.GuiOverlayButton; +import codechicken.nei.recipe.IRecipeHandler; + +import java.util.List; + +public class ModularUIGuiContainerStackOverlay implements IOverlayHandler { + + @Override + public void overlayRecipe(GuiContainer gui, IRecipeHandler recipe, int recipeIndex, boolean maxTransfer) { + if (gui instanceof GuiContainerWrapper muw && gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { + tr.overlayRecipe(muw, muc, recipe, recipeIndex, maxTransfer); + } + } + + @Override + public int transferRecipe(GuiContainer gui, IRecipeHandler recipe, int recipeIndex, int multiplier) { + if (gui instanceof GuiContainerWrapper muw && gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { + return tr.transferRecipe(muw, muc, recipe, recipeIndex, multiplier); + } + return IOverlayHandler.super.transferRecipe(gui, recipe, recipeIndex, multiplier); + } + + @Override + public boolean canFillCraftingGrid(GuiContainer gui, IRecipeHandler recipe, int recipeIndex) { + if (gui instanceof GuiContainerWrapper muw && gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { + return tr.canFillCraftingGrid(muw, muc, recipe, recipeIndex); + } + return IOverlayHandler.super.canFillCraftingGrid(gui, recipe, recipeIndex); + } + + @Override + public boolean craft(GuiContainer gui, IRecipeHandler recipe, int recipeIndex, int multiplier) { + if (gui instanceof GuiContainerWrapper muw && gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { + return tr.craft(muw, muc, recipe, recipeIndex, multiplier); + } + return IOverlayHandler.super.craft(gui, recipe, recipeIndex, multiplier); + } + + @Override + public boolean canCraft(GuiContainer gui, IRecipeHandler recipe, int recipeIndex) { + if (gui instanceof GuiContainerWrapper muw && gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { + return tr.canCraft(muw, muc, recipe, recipeIndex); + } + return IOverlayHandler.super.canCraft(gui, recipe, recipeIndex); + } + + @Override + public List presenceOverlay(GuiContainer gui, IRecipeHandler recipe, int recipeIndex) { + if (gui instanceof GuiContainerWrapper muw && gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { + return tr.presenceOverlay(muw, muc, recipe, recipeIndex); + } + return IOverlayHandler.super.presenceOverlay(gui, recipe, recipeIndex); + } +} diff --git a/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java b/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java new file mode 100644 index 000000000..ad89b7549 --- /dev/null +++ b/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java @@ -0,0 +1,21 @@ +package com.cleanroommc.modularui.integration.nei; + +import com.cleanroommc.modularui.screen.GuiContainerWrapper; +import com.cleanroommc.modularui.screen.ModularContainer; + +import codechicken.nei.PositionedStack; +import codechicken.nei.api.IStackPositioner; + +import java.util.ArrayList; + +public class ModularUIGuiContainerStackPositioner implements IStackPositioner { + + public GuiContainerWrapper wrapper; + public ModularContainer container; + public INEIRecipeTransfer recipeTransfer; + + @Override + public ArrayList positionStacks(ArrayList ai) { + return recipeTransfer.positionStacks(wrapper, container, ai); + } +} diff --git a/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java b/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java index aa4491c45..b92ffb858 100644 --- a/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java +++ b/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java @@ -7,6 +7,9 @@ @SuppressWarnings("unused") public class NEIModularUIConfig implements IConfigureNEI { + public static final ModularUIGuiContainerStackPositioner stackPositioner = new ModularUIGuiContainerStackPositioner(); + public static final ModularUIGuiContainerStackOverlay overlayHandler = new ModularUIGuiContainerStackOverlay(); + @Override public void loadConfig() { GuiContainerManager.addInputHandler(new ModularUIContainerInputHandler()); From ba32868e540a4deda6a7e2ae184dc95648390f4d Mon Sep 17 00:00:00 2001 From: Ruisu Date: Sat, 13 Dec 2025 14:24:43 +0700 Subject: [PATCH 2/6] cleanup --- .../core/mixins/late/nei/RecipeInfoMixin.java | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java b/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java index cc746b08b..af91c8e77 100644 --- a/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java +++ b/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java @@ -27,12 +27,10 @@ public class RecipeInfoMixin { @Inject(method = "hasOverlayHandler(Lnet/minecraft/client/gui/inventory/GuiContainer;Ljava/lang/String;)Z", remap = false, cancellable = true, at=@At("HEAD")) private static void modularui$hasOverlayHandler(GuiContainer gui, String ident, CallbackInfoReturnable ci) { - if (gui instanceof GuiContainerWrapper muw) { - if (gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { - if (Arrays.asList(tr.getIdents()).contains(ident)) { - ci.setReturnValue(true); - ci.cancel(); - } + if (gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { + if (Arrays.asList(tr.getIdents()).contains(ident)) { + ci.setReturnValue(true); + ci.cancel(); } } } @@ -57,13 +55,11 @@ public class RecipeInfoMixin { @Inject(method = "getOverlayHandler", remap = false, cancellable = true, at=@At("HEAD")) private static void modularui$getOverlayHandler(GuiContainer gui, String ident, CallbackInfoReturnable ci) { - if (gui instanceof GuiContainerWrapper muw) { - if (gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { - if (Arrays.asList(tr.getIdents()).contains(ident)) { - ci.setReturnValue(NEIModularUIConfig.overlayHandler); - ci.cancel(); - return; - } + if (gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { + if (Arrays.asList(tr.getIdents()).contains(ident)) { + ci.setReturnValue(NEIModularUIConfig.overlayHandler); + ci.cancel(); + return; } } } From 69aef709f41f2f9422206e04c307d0aefe234f4e Mon Sep 17 00:00:00 2001 From: Ruisu Date: Sun, 14 Dec 2025 08:58:49 +0700 Subject: [PATCH 3/6] fix --- .../core/mixins/late/nei/RecipeInfoMixin.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java b/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java index af91c8e77..122efbb84 100644 --- a/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java +++ b/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java @@ -37,18 +37,16 @@ public class RecipeInfoMixin { @Inject(method = "getStackPositioner", remap = false, cancellable = true, at=@At("HEAD")) private static void modularui$getStackPositioner(GuiContainer gui, String ident, CallbackInfoReturnable ci) { - if (gui instanceof GuiContainerWrapper muw) { - if (gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { - if (Arrays.asList(tr.getIdents()).contains(ident)) { - //Hacky way around it, but should work - ModularUIGuiContainerStackPositioner positioner = NEIModularUIConfig.stackPositioner; - positioner.wrapper = muw; - positioner.container = muc; - positioner.recipeTransfer = tr; - ci.setReturnValue(positioner); - ci.cancel(); - return; - } + if (gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { + if (Arrays.asList(tr.getIdents()).contains(ident)) { + //Hacky way around it, but should work + ModularUIGuiContainerStackPositioner positioner = NEIModularUIConfig.stackPositioner; + positioner.wrapper = (GuiContainerWrapper) gui; + positioner.container = muc; + positioner.recipeTransfer = tr; + ci.setReturnValue(positioner); + ci.cancel(); + return; } } } From 5c443655a4a05b36525cf58a411d28523286df60 Mon Sep 17 00:00:00 2001 From: Ruisu Date: Sun, 14 Dec 2025 14:34:08 +0700 Subject: [PATCH 4/6] fix --- .../core/mixins/late/nei/RecipeInfoMixin.java | 13 ++++------ .../ModularUIGuiContainerStackPositioner.java | 24 +++++++++++++------ .../integration/nei/NEIModularUIConfig.java | 1 - 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java b/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java index 122efbb84..985d9d1bf 100644 --- a/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java +++ b/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java @@ -37,16 +37,14 @@ public class RecipeInfoMixin { @Inject(method = "getStackPositioner", remap = false, cancellable = true, at=@At("HEAD")) private static void modularui$getStackPositioner(GuiContainer gui, String ident, CallbackInfoReturnable ci) { - if (gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { + if (gui instanceof GuiContainerWrapper gcw && + gui.inventorySlots instanceof ModularContainer muc && + muc instanceof INEIRecipeTransfer tr) { if (Arrays.asList(tr.getIdents()).contains(ident)) { - //Hacky way around it, but should work - ModularUIGuiContainerStackPositioner positioner = NEIModularUIConfig.stackPositioner; - positioner.wrapper = (GuiContainerWrapper) gui; - positioner.container = muc; - positioner.recipeTransfer = tr; + ModularUIGuiContainerStackPositioner positioner = + new ModularUIGuiContainerStackPositioner<>(gcw, muc, tr); ci.setReturnValue(positioner); ci.cancel(); - return; } } } @@ -57,7 +55,6 @@ public class RecipeInfoMixin { if (Arrays.asList(tr.getIdents()).contains(ident)) { ci.setReturnValue(NEIModularUIConfig.overlayHandler); ci.cancel(); - return; } } } diff --git a/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java b/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java index ad89b7549..ff02a2b0c 100644 --- a/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java +++ b/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java @@ -1,21 +1,31 @@ package com.cleanroommc.modularui.integration.nei; +import com.cleanroommc.modularui.api.IMuiScreen; import com.cleanroommc.modularui.screen.GuiContainerWrapper; import com.cleanroommc.modularui.screen.ModularContainer; import codechicken.nei.PositionedStack; import codechicken.nei.api.IStackPositioner; -import java.util.ArrayList; +import net.minecraft.client.gui.inventory.GuiContainer; -public class ModularUIGuiContainerStackPositioner implements IStackPositioner { +import java.util.ArrayList; - public GuiContainerWrapper wrapper; - public ModularContainer container; - public INEIRecipeTransfer recipeTransfer; +public class ModularUIGuiContainerStackPositioner implements IStackPositioner { + private final T wrapper; + private final ModularContainer container; + private final INEIRecipeTransfer recipeTransfer; + public ModularUIGuiContainerStackPositioner(T wrapper, ModularContainer container, INEIRecipeTransfer tr) { + this.wrapper = wrapper; + this.container = container; + this.recipeTransfer = tr; + } @Override - public ArrayList positionStacks(ArrayList ai) { - return recipeTransfer.positionStacks(wrapper, container, ai); + public ArrayList positionStacks(ArrayList stacks) { + if (wrapper instanceof GuiContainerWrapper gcw) { + return recipeTransfer.positionStacks(gcw, container, stacks); + } + return stacks; } } diff --git a/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java b/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java index b92ffb858..80298abbc 100644 --- a/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java +++ b/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java @@ -7,7 +7,6 @@ @SuppressWarnings("unused") public class NEIModularUIConfig implements IConfigureNEI { - public static final ModularUIGuiContainerStackPositioner stackPositioner = new ModularUIGuiContainerStackPositioner(); public static final ModularUIGuiContainerStackOverlay overlayHandler = new ModularUIGuiContainerStackOverlay(); @Override From eaf4712a4d362ee06ebb7197c982a44c54faaa19 Mon Sep 17 00:00:00 2001 From: Ruisu Date: Sun, 14 Dec 2025 14:44:54 +0700 Subject: [PATCH 5/6] undo --- .../core/mixins/late/nei/RecipeInfoMixin.java | 11 +++++---- .../ModularUIGuiContainerStackPositioner.java | 24 ++++++------------- .../integration/nei/NEIModularUIConfig.java | 1 + 3 files changed, 14 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java b/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java index 985d9d1bf..eeee1c341 100644 --- a/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java +++ b/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java @@ -37,12 +37,13 @@ public class RecipeInfoMixin { @Inject(method = "getStackPositioner", remap = false, cancellable = true, at=@At("HEAD")) private static void modularui$getStackPositioner(GuiContainer gui, String ident, CallbackInfoReturnable ci) { - if (gui instanceof GuiContainerWrapper gcw && - gui.inventorySlots instanceof ModularContainer muc && - muc instanceof INEIRecipeTransfer tr) { + if (gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { if (Arrays.asList(tr.getIdents()).contains(ident)) { - ModularUIGuiContainerStackPositioner positioner = - new ModularUIGuiContainerStackPositioner<>(gcw, muc, tr); + //Hacky way around it, but should work + ModularUIGuiContainerStackPositioner positioner = NEIModularUIConfig.stackPositioner; + positioner.wrapper = (GuiContainerWrapper) gui; + positioner.container = muc; + positioner.recipeTransfer = tr; ci.setReturnValue(positioner); ci.cancel(); } diff --git a/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java b/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java index ff02a2b0c..ad89b7549 100644 --- a/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java +++ b/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java @@ -1,31 +1,21 @@ package com.cleanroommc.modularui.integration.nei; -import com.cleanroommc.modularui.api.IMuiScreen; import com.cleanroommc.modularui.screen.GuiContainerWrapper; import com.cleanroommc.modularui.screen.ModularContainer; import codechicken.nei.PositionedStack; import codechicken.nei.api.IStackPositioner; -import net.minecraft.client.gui.inventory.GuiContainer; - import java.util.ArrayList; -public class ModularUIGuiContainerStackPositioner implements IStackPositioner { - private final T wrapper; - private final ModularContainer container; - private final INEIRecipeTransfer recipeTransfer; +public class ModularUIGuiContainerStackPositioner implements IStackPositioner { + + public GuiContainerWrapper wrapper; + public ModularContainer container; + public INEIRecipeTransfer recipeTransfer; - public ModularUIGuiContainerStackPositioner(T wrapper, ModularContainer container, INEIRecipeTransfer tr) { - this.wrapper = wrapper; - this.container = container; - this.recipeTransfer = tr; - } @Override - public ArrayList positionStacks(ArrayList stacks) { - if (wrapper instanceof GuiContainerWrapper gcw) { - return recipeTransfer.positionStacks(gcw, container, stacks); - } - return stacks; + public ArrayList positionStacks(ArrayList ai) { + return recipeTransfer.positionStacks(wrapper, container, ai); } } diff --git a/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java b/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java index 80298abbc..b92ffb858 100644 --- a/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java +++ b/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java @@ -7,6 +7,7 @@ @SuppressWarnings("unused") public class NEIModularUIConfig implements IConfigureNEI { + public static final ModularUIGuiContainerStackPositioner stackPositioner = new ModularUIGuiContainerStackPositioner(); public static final ModularUIGuiContainerStackOverlay overlayHandler = new ModularUIGuiContainerStackOverlay(); @Override From cc85a0325ca3f49591721d50939c86ae2f8cc0a8 Mon Sep 17 00:00:00 2001 From: brachy84 Date: Sun, 14 Dec 2025 10:03:38 +0100 Subject: [PATCH 6/6] fix --- .../core/mixins/late/nei/RecipeInfoMixin.java | 37 +++++-------- .../integration/nei/INEIRecipeTransfer.java | 23 ++++---- .../ModularUIGuiContainerStackOverlay.java | 52 +++++++++++-------- .../ModularUIGuiContainerStackPositioner.java | 30 ++++++++--- .../integration/nei/NEIModularUIConfig.java | 1 - 5 files changed, 77 insertions(+), 66 deletions(-) diff --git a/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java b/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java index eeee1c341..67d84ba0b 100644 --- a/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java +++ b/src/main/java/com/cleanroommc/modularui/core/mixins/late/nei/RecipeInfoMixin.java @@ -1,10 +1,10 @@ package com.cleanroommc.modularui.core.mixins.late.nei; +import com.cleanroommc.modularui.api.IMuiScreen; import com.cleanroommc.modularui.integration.nei.INEIRecipeTransfer; import com.cleanroommc.modularui.integration.nei.ModularUIGuiContainerStackPositioner; import com.cleanroommc.modularui.integration.nei.NEIModularUIConfig; -import com.cleanroommc.modularui.screen.GuiContainerWrapper; import com.cleanroommc.modularui.screen.ModularContainer; import net.minecraft.client.gui.inventory.GuiContainer; @@ -25,38 +25,27 @@ @Mixin(RecipeInfo.class) public class RecipeInfoMixin { - @Inject(method = "hasOverlayHandler(Lnet/minecraft/client/gui/inventory/GuiContainer;Ljava/lang/String;)Z", remap = false, cancellable = true, at=@At("HEAD")) + @Inject(method = "hasOverlayHandler(Lnet/minecraft/client/gui/inventory/GuiContainer;Ljava/lang/String;)Z", remap = false, cancellable = true, at = @At("HEAD")) private static void modularui$hasOverlayHandler(GuiContainer gui, String ident, CallbackInfoReturnable ci) { - if (gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { - if (Arrays.asList(tr.getIdents()).contains(ident)) { - ci.setReturnValue(true); - ci.cancel(); - } + if (gui instanceof IMuiScreen && gui.inventorySlots instanceof ModularContainer muc && + muc instanceof INEIRecipeTransfer tr && Arrays.asList(tr.getIdents()).contains(ident)) { + ci.setReturnValue(true); } } - @Inject(method = "getStackPositioner", remap = false, cancellable = true, at=@At("HEAD")) + @Inject(method = "getStackPositioner", remap = false, cancellable = true, at = @At("HEAD")) private static void modularui$getStackPositioner(GuiContainer gui, String ident, CallbackInfoReturnable ci) { - if (gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { - if (Arrays.asList(tr.getIdents()).contains(ident)) { - //Hacky way around it, but should work - ModularUIGuiContainerStackPositioner positioner = NEIModularUIConfig.stackPositioner; - positioner.wrapper = (GuiContainerWrapper) gui; - positioner.container = muc; - positioner.recipeTransfer = tr; - ci.setReturnValue(positioner); - ci.cancel(); - } + ModularUIGuiContainerStackPositioner positioner = ModularUIGuiContainerStackPositioner.of(gui, ident); + if (positioner != null) { + ci.setReturnValue(positioner); } } - @Inject(method = "getOverlayHandler", remap = false, cancellable = true, at=@At("HEAD")) + @Inject(method = "getOverlayHandler", remap = false, cancellable = true, at = @At("HEAD")) private static void modularui$getOverlayHandler(GuiContainer gui, String ident, CallbackInfoReturnable ci) { - if (gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { - if (Arrays.asList(tr.getIdents()).contains(ident)) { - ci.setReturnValue(NEIModularUIConfig.overlayHandler); - ci.cancel(); - } + if (gui instanceof IMuiScreen && gui.inventorySlots instanceof ModularContainer muc && + muc instanceof INEIRecipeTransfer tr && Arrays.asList(tr.getIdents()).contains(ident)) { + ci.setReturnValue(NEIModularUIConfig.overlayHandler); } } } diff --git a/src/main/java/com/cleanroommc/modularui/integration/nei/INEIRecipeTransfer.java b/src/main/java/com/cleanroommc/modularui/integration/nei/INEIRecipeTransfer.java index 178af355d..a91df3746 100644 --- a/src/main/java/com/cleanroommc/modularui/integration/nei/INEIRecipeTransfer.java +++ b/src/main/java/com/cleanroommc/modularui/integration/nei/INEIRecipeTransfer.java @@ -1,8 +1,6 @@ package com.cleanroommc.modularui.integration.nei; -import com.cleanroommc.modularui.screen.GuiContainerWrapper; -import com.cleanroommc.modularui.screen.ModularContainer; - +import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; import codechicken.nei.PositionedStack; @@ -14,28 +12,29 @@ import java.util.Optional; import java.util.stream.Collectors; -public interface INEIRecipeTransfer { +public interface INEIRecipeTransfer { + String[] getIdents(); - default void overlayRecipe(GuiContainerWrapper gui, ModularContainer self, IRecipeHandler recipe, int recipeIndex, boolean maxTransfer) { - transferRecipe(gui, self, recipe, recipeIndex, maxTransfer ? Integer.MAX_VALUE : 1); + default void overlayRecipe(G gui, IRecipeHandler recipe, int recipeIndex, boolean maxTransfer) { + transferRecipe(gui, recipe, recipeIndex, maxTransfer ? Integer.MAX_VALUE : 1); } - int transferRecipe(GuiContainerWrapper gui, ModularContainer self, IRecipeHandler recipe, int recipeIndex, int multiplier); + int transferRecipe(G gui, IRecipeHandler recipe, int recipeIndex, int multiplier); - default boolean canFillCraftingGrid(GuiContainerWrapper gui, ModularContainer self, IRecipeHandler recipe, int recipeIndex) { + default boolean canFillCraftingGrid(G gui, IRecipeHandler recipe, int recipeIndex) { return true; } - default boolean craft(GuiContainerWrapper gui, ModularContainer self, IRecipeHandler recipe, int recipeIndex, int multiplier) { + default boolean craft(G gui, IRecipeHandler recipe, int recipeIndex, int multiplier) { return false; } - default boolean canCraft(GuiContainerWrapper gui, ModularContainer self, IRecipeHandler recipe, int recipeIndex) { + default boolean canCraft(G gui, IRecipeHandler recipe, int recipeIndex) { return false; } - default List presenceOverlay(GuiContainerWrapper gui, ModularContainer self, IRecipeHandler recipe, int recipeIndex) { + default List presenceOverlay(G gui, IRecipeHandler recipe, int recipeIndex) { final List itemPresenceSlots = new ArrayList<>(); final List ingredients = recipe.getIngredientStacks(recipeIndex); final List invStacks = gui.inventorySlots.inventorySlots.stream() @@ -61,7 +60,7 @@ default List presenceOverlay(GuiContainerWrap return itemPresenceSlots; } - default ArrayList positionStacks(GuiContainerWrapper gui, ModularContainer self, ArrayList stacks) { + default ArrayList positionStacks(G gui, ArrayList stacks) { return stacks; } } diff --git a/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackOverlay.java b/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackOverlay.java index 829731f8c..bd6df33a6 100644 --- a/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackOverlay.java +++ b/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackOverlay.java @@ -1,5 +1,6 @@ package com.cleanroommc.modularui.integration.nei; +import com.cleanroommc.modularui.api.IMuiScreen; import com.cleanroommc.modularui.screen.GuiContainerWrapper; import com.cleanroommc.modularui.screen.ModularContainer; @@ -10,53 +11,58 @@ import codechicken.nei.recipe.IRecipeHandler; import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Consumer; public class ModularUIGuiContainerStackOverlay implements IOverlayHandler { + private interface Action { + T doAction(G gui, INEIRecipeTransfer tr); + } + + @SuppressWarnings("unchecked") + private static T doAction(GuiContainer gui, Action action) { + if (gui instanceof IMuiScreen && gui.inventorySlots instanceof ModularContainer mc && mc instanceof INEIRecipeTransfer tr) { + return action.doAction((G) gui, (INEIRecipeTransfer) tr); + } + return null; + } + @Override public void overlayRecipe(GuiContainer gui, IRecipeHandler recipe, int recipeIndex, boolean maxTransfer) { - if (gui instanceof GuiContainerWrapper muw && gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { - tr.overlayRecipe(muw, muc, recipe, recipeIndex, maxTransfer); - } + doAction(gui, (mui, tr) -> { + tr.overlayRecipe(mui, recipe, recipeIndex, maxTransfer); + return null; + }); } @Override public int transferRecipe(GuiContainer gui, IRecipeHandler recipe, int recipeIndex, int multiplier) { - if (gui instanceof GuiContainerWrapper muw && gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { - return tr.transferRecipe(muw, muc, recipe, recipeIndex, multiplier); - } - return IOverlayHandler.super.transferRecipe(gui, recipe, recipeIndex, multiplier); + var res = doAction(gui, (mui, tr) -> tr.transferRecipe(mui, recipe, recipeIndex, multiplier)); + return res != null ? res : IOverlayHandler.super.transferRecipe(gui, recipe, recipeIndex, multiplier); } @Override public boolean canFillCraftingGrid(GuiContainer gui, IRecipeHandler recipe, int recipeIndex) { - if (gui instanceof GuiContainerWrapper muw && gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { - return tr.canFillCraftingGrid(muw, muc, recipe, recipeIndex); - } - return IOverlayHandler.super.canFillCraftingGrid(gui, recipe, recipeIndex); + var res = doAction(gui, (mui, tr) -> tr.canFillCraftingGrid(mui, recipe, recipeIndex)); + return res != null ? res : IOverlayHandler.super.canFillCraftingGrid(gui, recipe, recipeIndex); } @Override public boolean craft(GuiContainer gui, IRecipeHandler recipe, int recipeIndex, int multiplier) { - if (gui instanceof GuiContainerWrapper muw && gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { - return tr.craft(muw, muc, recipe, recipeIndex, multiplier); - } - return IOverlayHandler.super.craft(gui, recipe, recipeIndex, multiplier); + var res = doAction(gui, (mui, tr) -> tr.craft(mui, recipe, recipeIndex, multiplier)); + return res != null ? res : IOverlayHandler.super.craft(gui, recipe, recipeIndex, multiplier); } @Override public boolean canCraft(GuiContainer gui, IRecipeHandler recipe, int recipeIndex) { - if (gui instanceof GuiContainerWrapper muw && gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { - return tr.canCraft(muw, muc, recipe, recipeIndex); - } - return IOverlayHandler.super.canCraft(gui, recipe, recipeIndex); + var res = doAction(gui, (mui, tr) -> tr.canCraft(mui, recipe, recipeIndex)); + return res != null ? res : IOverlayHandler.super.canCraft(gui, recipe, recipeIndex); } @Override public List presenceOverlay(GuiContainer gui, IRecipeHandler recipe, int recipeIndex) { - if (gui instanceof GuiContainerWrapper muw && gui.inventorySlots instanceof ModularContainer muc && muc instanceof INEIRecipeTransfer tr) { - return tr.presenceOverlay(muw, muc, recipe, recipeIndex); - } - return IOverlayHandler.super.presenceOverlay(gui, recipe, recipeIndex); + var res = doAction(gui, (mui, tr) -> tr.presenceOverlay(mui, recipe, recipeIndex)); + return res != null ? res : IOverlayHandler.super.presenceOverlay(gui, recipe, recipeIndex); } } diff --git a/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java b/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java index ad89b7549..08dd57403 100644 --- a/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java +++ b/src/main/java/com/cleanroommc/modularui/integration/nei/ModularUIGuiContainerStackPositioner.java @@ -1,21 +1,39 @@ package com.cleanroommc.modularui.integration.nei; -import com.cleanroommc.modularui.screen.GuiContainerWrapper; +import com.cleanroommc.modularui.api.IMuiScreen; import com.cleanroommc.modularui.screen.ModularContainer; +import net.minecraft.client.gui.inventory.GuiContainer; + import codechicken.nei.PositionedStack; import codechicken.nei.api.IStackPositioner; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Arrays; + +public class ModularUIGuiContainerStackPositioner implements IStackPositioner { -public class ModularUIGuiContainerStackPositioner implements IStackPositioner { + @Nullable + @SuppressWarnings("unchecked") + public static ModularUIGuiContainerStackPositioner of(GuiContainer gui, String ident) { + if (gui instanceof IMuiScreen && gui.inventorySlots instanceof ModularContainer mc && + mc instanceof INEIRecipeTransfer tr && Arrays.asList(tr.getIdents()).contains(ident)) { + return new ModularUIGuiContainerStackPositioner<>((G) gui, (INEIRecipeTransfer) tr); + } + return null; + } - public GuiContainerWrapper wrapper; - public ModularContainer container; - public INEIRecipeTransfer recipeTransfer; + public final G wrapper; + public final INEIRecipeTransfer recipeTransfer; + + public ModularUIGuiContainerStackPositioner(G wrapper, INEIRecipeTransfer recipeTransfer) { + this.wrapper = wrapper; + this.recipeTransfer = recipeTransfer; + } @Override public ArrayList positionStacks(ArrayList ai) { - return recipeTransfer.positionStacks(wrapper, container, ai); + return recipeTransfer.positionStacks(wrapper, ai); } } diff --git a/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java b/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java index b92ffb858..80298abbc 100644 --- a/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java +++ b/src/main/java/com/cleanroommc/modularui/integration/nei/NEIModularUIConfig.java @@ -7,7 +7,6 @@ @SuppressWarnings("unused") public class NEIModularUIConfig implements IConfigureNEI { - public static final ModularUIGuiContainerStackPositioner stackPositioner = new ModularUIGuiContainerStackPositioner(); public static final ModularUIGuiContainerStackOverlay overlayHandler = new ModularUIGuiContainerStackOverlay(); @Override