From 86213bf6c804e59bae76636342ec7895d2f82a5f Mon Sep 17 00:00:00 2001 From: Discreater Date: Thu, 29 Apr 2021 01:59:15 +0800 Subject: [PATCH] feat: simple item transfer --- .../jecalculation/client/gui/JecGui.java | 32 +++++++---- .../client/gui/drawables/DLabel.java | 2 +- .../client/gui/guis/GuiCalculator.java | 2 +- .../client/gui/guis/GuiRecipe.java | 31 +++++++++++ .../jecalculation/core/labels/ILabel.java | 54 ++++++++++++------- .../core/labels/labels/LabelItemStack.java | 7 ++- .../core/labels/labels/LabelOreDict.java | 2 +- .../jecalculation/nei/JecaOverlayHandler.java | 39 +++----------- .../towdium/jecalculation/nei/NEIPlugin.java | 2 +- 9 files changed, 102 insertions(+), 69 deletions(-) diff --git a/src/main/java/me/towdium/jecalculation/client/gui/JecGui.java b/src/main/java/me/towdium/jecalculation/client/gui/JecGui.java index fa81a94..db36914 100644 --- a/src/main/java/me/towdium/jecalculation/client/gui/JecGui.java +++ b/src/main/java/me/towdium/jecalculation/client/gui/JecGui.java @@ -40,7 +40,7 @@ public class JecGui extends GuiContainer { public static final int COLOR_GUI_GREY = 0xFFA1A1A1; public static final int COLOR_TEXT_RED = 0xFF0000; public static final int COLOR_TEXT_WHITE = 0xFFFFFF; - protected static JecGui last; + public static JecGui current; public static final boolean ALWAYS_TOOLTIP = false; protected JecGui parent; @@ -56,6 +56,7 @@ public class JecGui extends GuiContainer { super(acceptsTransfer ? new ContainerTransfer() : new ContainerNonTransfer()); this.parent = parent; this.root = root; + if (inventorySlots instanceof JecContainer) ((JecContainer) inventorySlots).setGui(this); } public static boolean mouseIn(int xPos, int yPos, int xSize, int ySize, int xMouse, int yMouse) { @@ -73,25 +74,25 @@ public class JecGui extends GuiContainer { } public static JecGui getCurrent() { - return last; + return current; } private static void displayGuiUnsafe(boolean updateParent, boolean acceptsTransfer, IDrawable root) { Minecraft mc = Minecraft.getMinecraft(); JecGui parent; if (mc.currentScreen == null) parent = null; - else if (!(mc.currentScreen instanceof JecGui)) parent = last; + else if (!(mc.currentScreen instanceof JecGui)) parent = current; else if (updateParent) parent = (JecGui) mc.currentScreen; else parent = ((JecGui) mc.currentScreen).parent; JecGui toShow = new JecGui(parent, acceptsTransfer, root); mc.displayGuiScreen(toShow); - last = toShow; + current = toShow; } @Override public void onGuiClosed() { super.onGuiClosed(); - last = null; + current = null; } @Override @@ -392,18 +393,27 @@ public class JecGui extends GuiContainer { return Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT); } - public static class ContainerTransfer extends Container { + public static class JecContainer extends Container { + JecGui gui; + + public JecGui getGui() { + return gui; + } + + public void setGui(JecGui gui) { + this.gui = gui; + } + @Override public boolean canInteractWith(EntityPlayer playerIn) { return true; } } - public static class ContainerNonTransfer extends Container { - @Override - public boolean canInteractWith(EntityPlayer playerIn) { - return true; - } + public static class ContainerTransfer extends JecContainer { + } + + public static class ContainerNonTransfer extends JecContainer { } public int getGuiLeft() { diff --git a/src/main/java/me/towdium/jecalculation/client/gui/drawables/DLabel.java b/src/main/java/me/towdium/jecalculation/client/gui/drawables/DLabel.java index 184dc6b..b433580 100644 --- a/src/main/java/me/towdium/jecalculation/client/gui/drawables/DLabel.java +++ b/src/main/java/me/towdium/jecalculation/client/gui/drawables/DLabel.java @@ -51,7 +51,7 @@ public class DLabel implements IDrawable { gui.drawText(xPos + xSize / 2 + 7.5f, yPos + ySize / 2 + 7 - (int) (font.size * gui.getFontRenderer().FONT_HEIGHT), font, label.getAmountString()); - if (mouseIn(xMouse, yMouse)) { + if (label != ILabel.EMPTY && mouseIn(xMouse, yMouse)) { gui.drawRectangle(xPos + 1, yPos + 1, xSize - 2, ySize - 2, 0x80FFFFFF); ArrayList buf = new ArrayList<>(); buf.add(label.getDisplayName()); diff --git a/src/main/java/me/towdium/jecalculation/client/gui/guis/GuiCalculator.java b/src/main/java/me/towdium/jecalculation/client/gui/guis/GuiCalculator.java index 8953353..39b5dce 100644 --- a/src/main/java/me/towdium/jecalculation/client/gui/guis/GuiCalculator.java +++ b/src/main/java/me/towdium/jecalculation/client/gui/guis/GuiCalculator.java @@ -23,7 +23,7 @@ public class GuiCalculator extends DContainer { JecGui.getCurrent().hand = l; })))); add(new DButtonIcon(130, 7, 20, 20, Resource.BTN_NEW_N, Resource.BTN_NEW_F, "calculator.recipe") - .setListenerLeft(() -> JecGui.displayGui(new GuiRecipe()))); + .setListenerLeft(() -> JecGui.displayGui(true, true, new GuiRecipe()))); add(new DButtonIcon(149, 7, 20, 20, Resource.BTN_SEARCH_N, Resource.BTN_SEARCH_F, "calculator.search")); add(new DLabelGroup(7, 87, 9, 4, RESULT)); add(new DLabelGroup(7, 31, 8, 1, PICKER)); diff --git a/src/main/java/me/towdium/jecalculation/client/gui/guis/GuiRecipe.java b/src/main/java/me/towdium/jecalculation/client/gui/guis/GuiRecipe.java index 7294d6e..6e2ee89 100644 --- a/src/main/java/me/towdium/jecalculation/client/gui/guis/GuiRecipe.java +++ b/src/main/java/me/towdium/jecalculation/client/gui/guis/GuiRecipe.java @@ -1,7 +1,15 @@ package me.towdium.jecalculation.client.gui.guis; +import codechicken.nei.recipe.IRecipeHandler; import me.towdium.jecalculation.client.gui.Resource; import me.towdium.jecalculation.client.gui.drawables.*; +import me.towdium.jecalculation.core.labels.ILabel; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; import static me.towdium.jecalculation.client.gui.drawables.DLabel.enumMode.EDITOR; @@ -43,4 +51,27 @@ public class GuiRecipe extends DContainer { removeAll(buttonYes, buttonNo, textField); } } + + public void transfer(IRecipeHandler recipe, int recipeIndex) { + List> buf = new ArrayList<>(); + List input = new ArrayList<>(); + List output = new ArrayList<>(); + + List raw = new ArrayList<>(); + List itemStacks = recipe.getIngredientStacks(recipeIndex).stream() + .map((positionedStack) -> positionedStack.item).collect(Collectors.toList()); + + itemStacks.forEach((itemStack) -> { + raw.add(ILabel.CONVERTER_ITEM.toLabel(itemStack)); + }); + List guessed = ILabel.CONVERTER_ITEM.toLabel(itemStacks); + input.add(guessed.isEmpty() ? ILabel.CONVERTER_ITEM.toLabel(itemStacks.get(0)) : guessed.get(0)); + buf.add(raw); + + ItemStack outputStack = recipe.getResultStack(recipeIndex).item; + output.add(ILabel.CONVERTER_ITEM.toLabel(outputStack)); + + groupInput.setLabel(input, 0); + groupOutput.setLabel(output, 0); + } } diff --git a/src/main/java/me/towdium/jecalculation/core/labels/ILabel.java b/src/main/java/me/towdium/jecalculation/core/labels/ILabel.java index 0ffda85..147e7e4 100644 --- a/src/main/java/me/towdium/jecalculation/core/labels/ILabel.java +++ b/src/main/java/me/towdium/jecalculation/core/labels/ILabel.java @@ -30,8 +30,9 @@ public interface ILabel { RegistryConverterFluid CONVERTER_FLUID = RegistryConverterFluid.INSTANCE; RegistryEditor EDITOR = RegistryEditor.INSTANCE; ILabel EMPTY = new LabelItemStack(ItemStackHelper.EMPTY_ITEM_STACK, 0); - String LOCALIZE_PREFIX = "label"; - String LOCALIZE_SUFFIX = "name"; + + String FORMAT_BLUE = "\u00A79"; + String FORMAT_ITALIC = "\u00A7o"; ILabel increaseAmount(); @@ -71,8 +72,8 @@ public interface ILabel { /** * Since {@link ILabel} merging is bidirectional, it is redundant to * implement on both side. So this class is created for merging - * {@link ILabel ILabel(s)}. - * It uses singleton mode. First register merge functions, then use + * {@link ILabel label(s)}. + * It uses singleton mode. First registerGuess merge functions, then use * {@link #test(ILabel, ILabel)} and {@link #merge(ILabel, ILabel, boolean)} * to operate the {@link ILabel}. * For registering, see {@link RegistryDeserializer}. @@ -82,7 +83,7 @@ public interface ILabel { static { INSTANCE = new RegistryEntryMerger(); - // register functions here + // registerGuess functions here } private Relation functions = new Relation<>(); @@ -115,14 +116,14 @@ public interface ILabel { * @param a an {@link ILabel} to merge * @param b another {@link ILabel} to merge * @param add add together or cancel each other - * @return merged {@link ILabel ILabel(s)} if not changed (no matter order), they cannot merge. + * @return merged {@link ILabel label(s)} if not changed (no matter order), they cannot merge. */ Pair merge(ILabel a, ILabel b, boolean add); } } /** - * This class is used to register an {@link ILabel} type. + * This class is used to registerGuess an {@link ILabel} type. * Here you can find the identifier and deserializer of one type. * For {@link ILabel} operations, see {@link RegistryEntryMerger} */ @@ -148,7 +149,7 @@ public interface ILabel { /** * @param nbt NBT to deserialize - * @return the recovered ILabel + * @return the recovered label * A typical NBT structure of an {@link ILabel} is as follows: *
{@code
          * {
@@ -168,23 +169,36 @@ public interface ILabel {
     }
 
     class RegistryConverter {
-        List, List>> handlers = new ArrayList<>();
+        List, List>> handlersGuess = new ArrayList<>();
+        List> handlersRaw = new ArrayList<>();
 
         private RegistryConverter() {
         }
 
-        public ILabel toEntry(T ingredient) {
-            return handlers.stream().map(h -> h.apply(Collections.singletonList(ingredient)))
-                    .filter(l -> !l.isEmpty()).findFirst().orElse(Collections.singletonList(ILabel.EMPTY)).get(0);
+        /**
+         * @param ingredient the ingredient, possibly itemStack or FluidStack
+         * @return the identical representation
+         */
+        public ILabel toLabel(T ingredient) {
+            return handlersRaw.stream().map(h -> h.apply(ingredient))
+                              .filter(Objects::nonNull).findFirst().orElse(ILabel.EMPTY);
         }
 
-        public List toEntry(List ingredients) {
-            return new ReversedIterator<>(handlers).stream().flatMap(h -> h.apply(ingredients).stream())
-                    .collect(Collectors.toList());
+        /**
+         * @param ingredients the list of ingredient, possibly itemStack or FluidStack
+         * @return list of guessed representation, sorted by possibility
+         */
+        public List toLabel(List ingredients) {
+            return new ReversedIterator<>(handlersGuess).stream().flatMap(h -> h.apply(ingredients).stream())
+                                                        .collect(Collectors.toList());
         }
 
-        void register(Function, List> handler) {
-            handlers.add(handler);
+        void registerGuess(Function, List> handler) {
+            handlersGuess.add(handler);
+        }
+
+        void registerRaw(Function handler) {
+            handlersRaw.add(handler);
         }
     }
 
@@ -194,14 +208,14 @@ public interface ILabel {
         static {
             INSTANCE = new RegistryConverterItem();
 
-            INSTANCE.register(RegistryConverterItem::convertRawItemStack);
+            INSTANCE.registerRaw(RegistryConverterItem::convertRawItemStack);
         }
 
         private RegistryConverterItem() {
         }
 
-        public static List convertRawItemStack(List iss) {
-            return iss.stream().map(LabelItemStack::new).collect(Collectors.toList());
+        public static ILabel convertRawItemStack(ItemStack is) {
+            return new LabelItemStack(is);
         }
     }
 
diff --git a/src/main/java/me/towdium/jecalculation/core/labels/labels/LabelItemStack.java b/src/main/java/me/towdium/jecalculation/core/labels/labels/LabelItemStack.java
index 83fd6fe..e7a1743 100644
--- a/src/main/java/me/towdium/jecalculation/core/labels/labels/LabelItemStack.java
+++ b/src/main/java/me/towdium/jecalculation/core/labels/labels/LabelItemStack.java
@@ -42,7 +42,7 @@ public class LabelItemStack extends LabelSimpleAmount {
 
     @Override
     public List getToolTip(List existing) {
-        existing.add("&9" + Utilities.getModName(itemStack));
+        existing.add(FORMAT_BLUE + FORMAT_ITALIC + Utilities.getModName(itemStack));
         return existing;
     }
 
@@ -68,4 +68,9 @@ public class LabelItemStack extends LabelSimpleAmount {
     public void drawEntry(JecGui gui) {
         gui.drawItemStack(0, 0, itemStack, false);
     }
+
+    @Override
+    public boolean equals(Object obj) {
+        return obj instanceof LabelItemStack && itemStack.equals(((LabelItemStack) obj).itemStack);
+    }
 }
diff --git a/src/main/java/me/towdium/jecalculation/core/labels/labels/LabelOreDict.java b/src/main/java/me/towdium/jecalculation/core/labels/labels/LabelOreDict.java
index 67eba62..4e99db0 100644
--- a/src/main/java/me/towdium/jecalculation/core/labels/labels/LabelOreDict.java
+++ b/src/main/java/me/towdium/jecalculation/core/labels/labels/LabelOreDict.java
@@ -56,7 +56,7 @@ public class LabelOreDict extends LabelSimpleAmount {
 
     @Override
     public List getToolTip(List existing) {
-        existing.add("\u00A79\u00A7o" + JustEnoughCalculation.Reference.MODNAME);
+        existing.add(FORMAT_BLUE + FORMAT_ITALIC + JustEnoughCalculation.Reference.MODNAME);
         return existing;
     }
 
diff --git a/src/main/java/me/towdium/jecalculation/nei/JecaOverlayHandler.java b/src/main/java/me/towdium/jecalculation/nei/JecaOverlayHandler.java
index 0d0f1d0..dcbb3a2 100644
--- a/src/main/java/me/towdium/jecalculation/nei/JecaOverlayHandler.java
+++ b/src/main/java/me/towdium/jecalculation/nei/JecaOverlayHandler.java
@@ -1,48 +1,21 @@
 package me.towdium.jecalculation.nei;
 
-import codechicken.nei.PositionedStack;
 import codechicken.nei.api.IOverlayHandler;
 import codechicken.nei.recipe.IRecipeHandler;
+import me.towdium.jecalculation.JustEnoughCalculation;
 import me.towdium.jecalculation.client.gui.JecGui;
 import me.towdium.jecalculation.client.gui.guis.GuiRecipe;
-import me.towdium.jecalculation.utils.ItemStackHelper;
-import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.inventory.GuiContainer;
-import net.minecraft.item.ItemStack;
-
-import java.util.ArrayList;
-import java.util.List;
 
 public class JecaOverlayHandler implements IOverlayHandler {
     @Override
     public void overlayRecipe(GuiContainer firstGui, IRecipeHandler recipe, int recipeIndex, boolean shift) {
-        if(firstGui instanceof JecGui) {
-            List inputStacks = new ArrayList<>();
-            LOOP:
-            for (PositionedStack positionedStack : recipe.getIngredientStacks(recipeIndex)) {
-                ItemStack itemStack = positionedStack.items[0];
-                for (ItemStack exist : inputStacks) {
-                    if (ItemStackHelper.isTypeEqual(exist, itemStack)) {
-                        exist.stackSize += itemStack.stackSize;
-                        continue LOOP;
-                    }
-                }
-                inputStacks.add(itemStack.copy());
+        JustEnoughCalculation.logger.info("shift ? " + shift);
+        if (shift && firstGui instanceof JecGui) {
+            JecGui gui = (JecGui) firstGui;
+            if (gui.root instanceof GuiRecipe) {
+                ((GuiRecipe) gui.root).transfer(recipe, recipeIndex);
             }
-            ItemStack outputStack = recipe.getResultStack(recipeIndex).items[0];
-
-            Minecraft mc = Minecraft.getMinecraft();
-            JecGui.displayGui(new GuiRecipe());
-            GuiContainer myGuiContainer = (GuiContainer) mc.currentScreen;
-            if (myGuiContainer != null) {
-                myGuiContainer.inventorySlots.getSlot(0).putStack(outputStack);
-                for (int i = 8; i <= 8 + inputStacks.size() - 1 && i <= 19; i++) {
-                    myGuiContainer.inventorySlots.getSlot(i).putStack(inputStacks.get(i - 8));
-                }
-                //crafting item, nei may not have
-                //                myGuiContainer.inventorySlots.getSlot(4).putStack();
-            }
-
         } else {
             System.out.println(firstGui.getClass().toString());
         }
diff --git a/src/main/java/me/towdium/jecalculation/nei/NEIPlugin.java b/src/main/java/me/towdium/jecalculation/nei/NEIPlugin.java
index 6de4be8..56e7d56 100644
--- a/src/main/java/me/towdium/jecalculation/nei/NEIPlugin.java
+++ b/src/main/java/me/towdium/jecalculation/nei/NEIPlugin.java
@@ -16,7 +16,7 @@ public class NEIPlugin {
 
     public static ILabel getEntryUnderMouse() {
         if (NEIPlugin.currentItemStack == null) return ILabel.EMPTY;
-        else return registryItem.toEntry(NEIPlugin.currentItemStack);
+        else return registryItem.toLabel(NEIPlugin.currentItemStack);
     }
 
     public static void setEntryUnderMouse(ItemStack itemStack) {