diff --git a/src/main/java/com/asdflj/ae2thing/api/MouseWheelHandler.java b/src/main/java/com/asdflj/ae2thing/api/MouseWheelHandler.java index b12f74c..3edaf83 100644 --- a/src/main/java/com/asdflj/ae2thing/api/MouseWheelHandler.java +++ b/src/main/java/com/asdflj/ae2thing/api/MouseWheelHandler.java @@ -1,10 +1,10 @@ package com.asdflj.ae2thing.api; import appeng.api.events.GuiScrollEvent; -import codechicken.nei.recipe.GuiRecipe; +import codechicken.nei.recipe.GuiOverlayButton; @FunctionalInterface public interface MouseWheelHandler { - boolean handleMouseWheel(GuiScrollEvent event, GuiRecipe recipe); + boolean handleMouseWheel(GuiScrollEvent event, GuiOverlayButton overlayButton); } diff --git a/src/main/java/com/asdflj/ae2thing/client/event/GuiOverlayButtonEvent.java b/src/main/java/com/asdflj/ae2thing/client/event/GuiOverlayButtonEvent.java new file mode 100644 index 0000000..3e77746 --- /dev/null +++ b/src/main/java/com/asdflj/ae2thing/client/event/GuiOverlayButtonEvent.java @@ -0,0 +1,19 @@ +package com.asdflj.ae2thing.client.event; + +import net.minecraftforge.client.event.GuiScreenEvent; + +import codechicken.nei.recipe.GuiOverlayButton; + +public class GuiOverlayButtonEvent extends GuiScreenEvent { + + private final GuiOverlayButton button; + + public GuiOverlayButtonEvent(GuiOverlayButton btn) { + super(btn.firstGui); + button = btn; + } + + public GuiOverlayButton getButton() { + return button; + } +} diff --git a/src/main/java/com/asdflj/ae2thing/coremod/mixin/nei/AccessorGuiOverlayButton.java b/src/main/java/com/asdflj/ae2thing/coremod/mixin/nei/AccessorGuiOverlayButton.java deleted file mode 100644 index a4a8325..0000000 --- a/src/main/java/com/asdflj/ae2thing/coremod/mixin/nei/AccessorGuiOverlayButton.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.asdflj.ae2thing.coremod.mixin.nei; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import codechicken.nei.recipe.GuiOverlayButton; - -@Mixin(GuiOverlayButton.class) -public interface AccessorGuiOverlayButton { - - @Accessor(value = "requireShiftForOverlayRecipe", remap = false) - void setRequireShiftForOverlayRecipe(boolean value); -} diff --git a/src/main/java/com/asdflj/ae2thing/coremod/mixin/nei/MixinGuiOverlayButton.java b/src/main/java/com/asdflj/ae2thing/coremod/mixin/nei/MixinGuiOverlayButton.java new file mode 100644 index 0000000..aaac090 --- /dev/null +++ b/src/main/java/com/asdflj/ae2thing/coremod/mixin/nei/MixinGuiOverlayButton.java @@ -0,0 +1,32 @@ +package com.asdflj.ae2thing.coremod.mixin.nei; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraftforge.common.MinecraftForge; + +import org.spongepowered.asm.mixin.Final; +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 com.asdflj.ae2thing.client.event.GuiOverlayButtonEvent; + +import codechicken.nei.recipe.GuiOverlayButton; +import codechicken.nei.recipe.GuiRecipeButton; +import codechicken.nei.recipe.RecipeHandlerRef; + +@Mixin(GuiOverlayButton.class) +public abstract class MixinGuiOverlayButton extends GuiRecipeButton { + + @Final + public GuiContainer firstGui; + + protected MixinGuiOverlayButton(RecipeHandlerRef point, int x, int y, int buttonId, String label) { + super(point, x, y, buttonId, label); + } + + @Inject(method = "mouseReleased", at = @At(value = "TAIL")) + public void mouseReleased(int mouseX, int mouseY, CallbackInfo ci) { + MinecraftForge.EVENT_BUS.post(new GuiOverlayButtonEvent((GuiOverlayButton) ((Object) this))); + } +} diff --git a/src/main/java/com/asdflj/ae2thing/crossmod/waila/PatternPermutationToolTip.java b/src/main/java/com/asdflj/ae2thing/crossmod/waila/PatternPermutationToolTip.java index fc81d2f..e27a5a3 100644 --- a/src/main/java/com/asdflj/ae2thing/crossmod/waila/PatternPermutationToolTip.java +++ b/src/main/java/com/asdflj/ae2thing/crossmod/waila/PatternPermutationToolTip.java @@ -1,9 +1,7 @@ package com.asdflj.ae2thing.crossmod.waila; import java.util.List; -import java.util.Optional; -import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; @@ -11,59 +9,44 @@ import com.asdflj.ae2thing.proxy.ClientProxy; import appeng.container.slot.SlotFake; -import appeng.util.Platform; import codechicken.lib.gui.GuiDraw; import codechicken.nei.NEIClientConfig; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.AcceptsFollowingTooltipLineHandler; -import codechicken.nei.recipe.GuiOverlayButton; -import codechicken.nei.recipe.GuiRecipe; +import codechicken.nei.recipe.RecipeHandlerRef; public class PatternPermutationToolTip extends mcp.mobius.waila.handlers.nei.TooltipHandlerWaila { protected AcceptsFollowingTooltipLineHandler acceptsFollowingTooltipLineHandler; @Override - public List handleItemTooltip(GuiContainer gui, ItemStack itemstack, int arg2, int arg3, + public List handleItemTooltip(GuiContainer gui, ItemStack itemstack, int x, int y, List currenttip) { if (NEIClientConfig.showCycledIngredientsTooltip() && gui instanceof GuiWirelessDualInterfaceTerminal && gui.theSlot instanceof SlotFake slot && slot.getHasStack() - && ClientProxy.getRecipe() != null) { - GuiRecipe recipe = ClientProxy.getRecipe(); - Optional guiButton = recipe.getOverlayButtons() - .stream() - .findFirst(); - if (guiButton.isPresent()) { - PositionedStack currentIngredients = null; - ItemStack slotItem = slot.getStack(); - if (slotItem == null) return currenttip; - GuiOverlayButton btn = (GuiOverlayButton) guiButton.get(); - List list = btn.handlerRef.handler.getIngredientStacks(btn.handlerRef.recipeIndex); - out: for (PositionedStack stack : list) { - for (ItemStack item : stack.items) { - if (Platform.isSameItemPrecise(slotItem, item)) { - currentIngredients = stack; - break out; - } - } - - } - if (currentIngredients != null && currentIngredients.items.length > 1 - && currentIngredients.containsWithNBT(slot.getStack())) { + && ClientProxy.getOverlayButton() != null) { + RecipeHandlerRef ref = ClientProxy.getOverlayButton().handlerRef; + List currentIngredients = ref.handler.getIngredientStacks(ref.recipeIndex); + for (PositionedStack positionedStack : currentIngredients) { + if (positionedStack.items.length > 1 && positionedStack.containsWithNBT(slot.getStack())) { if (this.acceptsFollowingTooltipLineHandler == null - || this.acceptsFollowingTooltipLineHandler.tooltipGUID != currentIngredients) { - this.acceptsFollowingTooltipLineHandler = AcceptsFollowingTooltipLineHandler.of( - currentIngredients, - currentIngredients.getFilteredPermutations(), - currentIngredients.item); + || this.acceptsFollowingTooltipLineHandler.tooltipGUID != positionedStack) { + this.acceptsFollowingTooltipLineHandler = AcceptsFollowingTooltipLineHandler + .of(positionedStack, positionedStack.getFilteredPermutations(), positionedStack.item); } + if (this.acceptsFollowingTooltipLineHandler != null) { - this.acceptsFollowingTooltipLineHandler.setActiveStack(slotItem); - currenttip.add("§x" + GuiDraw.getTipLineId(this.acceptsFollowingTooltipLineHandler)); + this.acceptsFollowingTooltipLineHandler.setActiveStack(slot.getStack()); + currenttip.add( + GuiDraw.TOOLTIP_HANDLER + GuiDraw.getTipLineId(this.acceptsFollowingTooltipLineHandler)); + break; } } } + + return currenttip; + } return currenttip; } diff --git a/src/main/java/com/asdflj/ae2thing/nei/PatternTerminalRecipeTransferHandler.java b/src/main/java/com/asdflj/ae2thing/nei/PatternTerminalRecipeTransferHandler.java index 19ba4a7..4c2b2de 100644 --- a/src/main/java/com/asdflj/ae2thing/nei/PatternTerminalRecipeTransferHandler.java +++ b/src/main/java/com/asdflj/ae2thing/nei/PatternTerminalRecipeTransferHandler.java @@ -7,10 +7,8 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; -import java.util.Optional; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; @@ -22,6 +20,7 @@ import com.asdflj.ae2thing.nei.object.OrderStack; import com.asdflj.ae2thing.nei.recipes.FluidRecipe; import com.asdflj.ae2thing.network.CPacketTransferRecipe; +import com.asdflj.ae2thing.proxy.ClientProxy; import com.asdflj.ae2thing.util.GTUtil; import com.asdflj.ae2thing.util.ModAndClassUtil; import com.asdflj.ae2thing.util.PHUtil; @@ -61,16 +60,13 @@ private static ItemStack findSameItem(ItemStack[] items, ItemStack item, Constan } public PatternTerminalRecipeTransferHandler() { - mouseHandlers.add((event, recipe) -> { + mouseHandlers.add((event, overlayButton) -> { GuiScreen screen = Minecraft.getMinecraft().currentScreen; - if (screen instanceof AEBaseGui g && recipe != null && GuiScreen.isShiftKeyDown()) { - Optional guiButton = recipe.getOverlayButtons() - .stream() - .findFirst(); - if (guiButton.isPresent() && g.theSlot instanceof SlotFake slot) { + if (screen instanceof AEBaseGui g && overlayButton != null && GuiScreen.isShiftKeyDown()) { + GuiOverlayButton btn = ClientProxy.getOverlayButton(); + if (btn != null && g.theSlot instanceof SlotFake slot) { ItemStack slotItem = slot.getStack(); if (slotItem == null) return false; - GuiOverlayButton btn = (GuiOverlayButton) guiButton.get(); List list = btn.handlerRef.handler.getIngredientStacks(btn.handlerRef.recipeIndex); for (PositionedStack stack : list) { diff --git a/src/main/java/com/asdflj/ae2thing/proxy/ClientProxy.java b/src/main/java/com/asdflj/ae2thing/proxy/ClientProxy.java index cd293f8..7f2f061 100644 --- a/src/main/java/com/asdflj/ae2thing/proxy/ClientProxy.java +++ b/src/main/java/com/asdflj/ae2thing/proxy/ClientProxy.java @@ -24,6 +24,7 @@ import com.asdflj.ae2thing.api.adapter.terminal.parts.AETerminal; import com.asdflj.ae2thing.api.adapter.terminal.parts.FCPatternTerminal; import com.asdflj.ae2thing.client.event.CraftTracking; +import com.asdflj.ae2thing.client.event.GuiOverlayButtonEvent; import com.asdflj.ae2thing.client.event.NotificationEvent; import com.asdflj.ae2thing.client.event.OpenTerminalEvent; import com.asdflj.ae2thing.client.event.UpdateAmountTextEvent; @@ -31,11 +32,9 @@ import com.asdflj.ae2thing.client.gui.GuiCraftingTerminal; import com.asdflj.ae2thing.client.gui.GuiInfusionPatternTerminal; import com.asdflj.ae2thing.client.gui.GuiWirelessDualInterfaceTerminal; -import com.asdflj.ae2thing.client.gui.IGuiMonitorTerminal; import com.asdflj.ae2thing.client.render.BlockPosHighlighter; import com.asdflj.ae2thing.client.render.Notification; import com.asdflj.ae2thing.common.item.ItemPhial; -import com.asdflj.ae2thing.coremod.mixin.nei.AccessorGuiOverlayButton; import com.asdflj.ae2thing.loader.KeybindLoader; import com.asdflj.ae2thing.loader.ListenerLoader; import com.asdflj.ae2thing.loader.RenderLoader; @@ -60,6 +59,7 @@ import codechicken.nei.api.API; import codechicken.nei.recipe.GuiOverlayButton; import codechicken.nei.recipe.GuiRecipe; +import codechicken.nei.recipe.GuiRecipeButton; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLLoadCompleteEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; @@ -69,7 +69,7 @@ public class ClientProxy extends CommonProxy { - private static GuiRecipe recipe = null; + private static GuiOverlayButton overlayButton = null; public static List mouseHandlers = new ArrayList<>(); @Override @@ -87,8 +87,8 @@ public void onLoadComplete(FMLLoadCompleteEvent event) { } } - public static GuiRecipe getRecipe() { - return recipe; + public static GuiOverlayButton getOverlayButton() { + return overlayButton; } @Override @@ -120,7 +120,7 @@ public void updateCraftAmount(UpdateAmountTextEvent amount) { public boolean handleMouseWheelInput(GuiScrollEvent event) { if (mouseHandlers.isEmpty()) return false; for (MouseWheelHandler handler : mouseHandlers) { - if (handler.handleMouseWheel(event, recipe)) { + if (handler.handleMouseWheel(event, overlayButton)) { return true; } } @@ -212,19 +212,21 @@ public void tickEvent(TickEvent.PlayerTickEvent event) { } @SubscribeEvent - public void onActionPerformedEventPre(GuiScreenEvent.ActionPerformedEvent.Pre event) { - // nee handler overlayRecipe so i need other way - if (event.button instanceof GuiOverlayButton && event.gui instanceof GuiRecipeg) { - recipe = g; - if (g.getFirstScreen() instanceof IGuiMonitorTerminal - && event.button instanceof AccessorGuiOverlayButton btn) { - btn.setRequireShiftForOverlayRecipe(false); + public void onActionPerformedEventPost(GuiRecipeButton.UpdateRecipeButtonsEvent.Post event) { + if (!(event.gui instanceof GuiRecipe)) return; + overlayButton = null; + for (GuiRecipeButton btn : event.buttonList) { + if (btn instanceof GuiOverlayButton gob) { + gob.setRequireShiftForOverlayRecipe(false); } - } else { - recipe = null; } } + @SubscribeEvent + public void onActionOverlayButton(GuiOverlayButtonEvent event) { + overlayButton = event.getButton(); + } + @SubscribeEvent public void initGuiEvent(GuiScreenEvent.InitGuiEvent.Post event) { if (event.gui instanceof BaseMEGui bg) { diff --git a/src/main/resources/mixins.ae2thing.late.json b/src/main/resources/mixins.ae2thing.late.json index fba2eec..a44ba4e 100644 --- a/src/main/resources/mixins.ae2thing.late.json +++ b/src/main/resources/mixins.ae2thing.late.json @@ -8,29 +8,29 @@ "mixins": [ ], "client": [ + "ae.AccessorGuiScrollbar", "ae.MixinAEBaseGui", "ae.MixinContainerCraftConfirm", + "ae.MixinCraftingCPUCluster", + "ae.MixinGuiCraftAmount", "ae.MixinGuiCraftConfirm", "ae.MixinItemRepo", - "ae.MixinGuiCraftAmount", + "ae.MixinTileIOPort", + "br.MixinBRUtil", "fc.MixinGuiFluidCraftAmount", "nei.MixinGuiContainerManager", + "nei.MixinGuiOverlayButton", "nei.MixinIOverlayHandler", "nei.MixinPanelWidget", "nei.MixinRecipeItemInputHandler", - "nei.AccessorGuiOverlayButton", "tc.nei.MixinLoadCraftingRecipes", "tc.nei.MixinTemplateRecipeHandler", - "wct.MixinRandomUtils", - "ae.AccessorGuiScrollbar", - "ae.MixinCraftingCPUCluster", - "ae.MixinTileIOPort", - "br.MixinBRUtil" + "wct.MixinRandomUtils" ], "server": [ - "wct.MixinRandomUtils", - "ae.MixinTileIOPort", "ae.MixinContainerCraftConfirm", - "ae.MixinCraftingCPUCluster" + "ae.MixinCraftingCPUCluster", + "ae.MixinTileIOPort", + "wct.MixinRandomUtils" ] }