From e01283e9900ecdb874636f1b364f0b5584618d4f Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 9 Jan 2019 18:49:17 +0800 Subject: 1.5.1 Backport --- src/main/java/me/shedaniel/ClientListener.java | 14 +- src/main/java/me/shedaniel/Core.java | 38 +++-- .../java/me/shedaniel/api/IDisplayCategory.java | 2 + .../shedaniel/api/IDisplayCategoryCraftable.java | 17 ++ src/main/java/me/shedaniel/api/IDisplayHelper.java | 7 - src/main/java/me/shedaniel/api/IDrawable.java | 4 +- src/main/java/me/shedaniel/api/IREIPlugin.java | 7 +- src/main/java/me/shedaniel/api/IRecipe.java | 11 +- src/main/java/me/shedaniel/api/IRecipeManager.java | 1 + .../java/me/shedaniel/api/TriBooleanProducer.java | 8 - .../java/me/shedaniel/api/TriBooleanSupplier.java | 8 + src/main/java/me/shedaniel/config/REIConfig.java | 7 +- .../me/shedaniel/config/REIItemListOrdering.java | 21 +++ .../java/me/shedaniel/config/REIRuntimeConfig.java | 8 + src/main/java/me/shedaniel/gui/ConfigGui.java | 72 +++++++- src/main/java/me/shedaniel/gui/Drawable.java | 2 + src/main/java/me/shedaniel/gui/GuiItemList.java | 184 ++++++++++++++------- .../java/me/shedaniel/gui/REIRenderHelper.java | 14 +- .../java/me/shedaniel/gui/RecipeContainer.java | 1 + src/main/java/me/shedaniel/gui/RecipeGui.java | 37 +++-- src/main/java/me/shedaniel/gui/SearchArgument.java | 1 + src/main/java/me/shedaniel/gui/widget/Button.java | 11 +- src/main/java/me/shedaniel/gui/widget/Control.java | 5 +- .../gui/widget/CraftableToggleButton.java | 73 ++++++++ .../java/me/shedaniel/gui/widget/IFocusable.java | 2 + src/main/java/me/shedaniel/gui/widget/REISlot.java | 3 +- .../java/me/shedaniel/gui/widget/SmallButton.java | 72 ++++++++ src/main/java/me/shedaniel/gui/widget/Tab.java | 5 +- .../java/me/shedaniel/gui/widget/WidgetArrow.java | 2 + .../java/me/shedaniel/impl/REIRecipeManager.java | 122 ++++++++++---- .../java/me/shedaniel/library/KeyBindFunction.java | 1 + src/main/java/me/shedaniel/library/Sink.java | 2 + .../shedaniel/listenerdefinitions/CharInput.java | 1 + .../shedaniel/listenerdefinitions/DoneLoading.java | 2 + .../listenerdefinitions/DrawContainer.java | 2 + .../listenerdefinitions/GuiCickListener.java | 8 - .../me/shedaniel/listenerdefinitions/GuiClick.java | 10 ++ .../shedaniel/listenerdefinitions/GuiKeyDown.java | 1 + .../listenerdefinitions/GuiMouseScroll.java | 7 + .../listenerdefinitions/IMixinGuiContainer.java | 1 + .../listenerdefinitions/IMixinGuiRecipeBook.java | 9 + .../listenerdefinitions/MinecraftResize.java | 2 + .../listenerdefinitions/MouseScrollListener.java | 5 - .../listenerdefinitions/PotionCraftingAdder.java | 2 + .../listenerdefinitions/RecipeLoadListener.java | 2 + .../shedaniel/listeners/DrawContainerListener.java | 3 +- .../java/me/shedaniel/listeners/InitListener.java | 5 +- .../java/me/shedaniel/mixins/MixinDoneLoading.java | 8 +- .../me/shedaniel/mixins/MixinGuiContainer.java | 4 +- .../mixins/MixinGuiContainerCreative.java | 4 +- .../me/shedaniel/mixins/MixinGuiRecipeBook.java | 22 +++ .../me/shedaniel/mixins/MixinKeyboardListener.java | 11 +- .../me/shedaniel/mixins/MixinRecipeManager.java | 6 +- .../java/me/shedaniel/network/CheatPacket.java | 1 + .../java/me/shedaniel/network/DeletePacket.java | 2 + .../java/me/shedaniel/plugin/VanillaPlugin.java | 26 +-- .../plugin/crafting/VanillaCraftingCategory.java | 47 +++++- .../plugin/crafting/VanillaCraftingRecipe.java | 9 + .../crafting/VanillaShapedCraftingRecipe.java | 6 +- .../crafting/VanillaShapelessCraftingRecipe.java | 6 +- .../plugin/furnace/VanillaFurnaceCategory.java | 44 ++++- .../plugin/furnace/VanillaFurnaceRecipe.java | 15 ++ .../plugin/potion/VanillaPotionRecipe.java | 9 + 63 files changed, 808 insertions(+), 234 deletions(-) create mode 100644 src/main/java/me/shedaniel/api/IDisplayCategoryCraftable.java delete mode 100755 src/main/java/me/shedaniel/api/IDisplayHelper.java delete mode 100755 src/main/java/me/shedaniel/api/TriBooleanProducer.java create mode 100755 src/main/java/me/shedaniel/api/TriBooleanSupplier.java create mode 100644 src/main/java/me/shedaniel/config/REIItemListOrdering.java create mode 100644 src/main/java/me/shedaniel/config/REIRuntimeConfig.java create mode 100644 src/main/java/me/shedaniel/gui/widget/CraftableToggleButton.java create mode 100644 src/main/java/me/shedaniel/gui/widget/SmallButton.java delete mode 100755 src/main/java/me/shedaniel/listenerdefinitions/GuiCickListener.java create mode 100755 src/main/java/me/shedaniel/listenerdefinitions/GuiClick.java create mode 100755 src/main/java/me/shedaniel/listenerdefinitions/GuiMouseScroll.java create mode 100644 src/main/java/me/shedaniel/listenerdefinitions/IMixinGuiRecipeBook.java delete mode 100755 src/main/java/me/shedaniel/listenerdefinitions/MouseScrollListener.java create mode 100644 src/main/java/me/shedaniel/mixins/MixinGuiRecipeBook.java (limited to 'src/main/java') diff --git a/src/main/java/me/shedaniel/ClientListener.java b/src/main/java/me/shedaniel/ClientListener.java index b6b1052bd..16b4f6f0d 100755 --- a/src/main/java/me/shedaniel/ClientListener.java +++ b/src/main/java/me/shedaniel/ClientListener.java @@ -18,9 +18,9 @@ import java.util.*; public class ClientListener implements DoneLoading, RecipeLoadListener { - public static KeyBindFunction recipeKeybind; - public static KeyBindFunction hideKeybind; - public static KeyBindFunction useKeybind; + public static KeyBindFunction recipeKeyBind; + public static KeyBindFunction hideKeyBind; + public static KeyBindFunction useKeyBind; public static List keyBinds = new ArrayList<>(); private List plugins; @@ -38,7 +38,7 @@ public class ClientListener implements DoneLoading, RecipeLoadListener { plugins = new ArrayList<>(); stackList = new ArrayList<>(); - recipeKeybind = new KeyBindFunction(Core.config.recipeKeyBind) { + recipeKeyBind = new KeyBindFunction(Core.config.recipeKeyBind) { @Override public boolean apply(int key) { if (key == this.getKey()) @@ -46,7 +46,7 @@ public class ClientListener implements DoneLoading, RecipeLoadListener { return key == this.getKey(); } }; - hideKeybind = new KeyBindFunction(Core.config.hideKeyBind) { + hideKeyBind = new KeyBindFunction(Core.config.hideKeyBind) { @Override public boolean apply(int key) { if (key == this.getKey()) @@ -54,7 +54,7 @@ public class ClientListener implements DoneLoading, RecipeLoadListener { return key == this.getKey(); } }; - useKeybind = new KeyBindFunction(Core.config.usageKeyBind) { + useKeyBind = new KeyBindFunction(Core.config.usageKeyBind) { @Override public boolean apply(int key) { if (key == this.getKey()) @@ -62,7 +62,7 @@ public class ClientListener implements DoneLoading, RecipeLoadListener { return key == this.getKey(); } }; - keyBinds.addAll(Arrays.asList(recipeKeybind, hideKeybind, useKeybind)); + keyBinds.addAll(Arrays.asList(recipeKeyBind, hideKeyBind, useKeyBind)); buildItemList(); } diff --git a/src/main/java/me/shedaniel/Core.java b/src/main/java/me/shedaniel/Core.java index 4bfbb3990..1f0464bf9 100755 --- a/src/main/java/me/shedaniel/Core.java +++ b/src/main/java/me/shedaniel/Core.java @@ -6,11 +6,14 @@ import com.google.gson.JsonObject; import com.google.gson.internal.Streams; import com.google.gson.stream.JsonWriter; import me.shedaniel.config.REIConfig; +import me.shedaniel.config.REIRuntimeConfig; import me.shedaniel.network.CheatPacket; import me.shedaniel.network.DeletePacket; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.network.EnumPacketDirection; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dimdev.rift.listener.PacketAdder; import org.dimdev.riftloader.RiftLoader; import org.dimdev.riftloader.listener.InitializationListener; @@ -44,46 +47,49 @@ public class Core implements PacketAdder, InitializationListener { public static final File configFile = new File(RiftLoader.instance.configDir, "rei.json"); public static REIConfig config; - public static boolean centreSearchBox; + public static REIRuntimeConfig runtimeConfig; + public static Logger LOGGER = LogManager.getFormatterLogger("REI"); @Override public void onInitialization() { try { loadConfig(); - centreSearchBox = config.centreSearchBox; + runtimeConfig = new REIRuntimeConfig(); } catch (IOException e) { e.printStackTrace(); } } public static void loadConfig() throws IOException { - if (!configFile.exists()) - loadDefaultConfig(); + if (!configFile.exists() || !configFile.canRead()) { + config = new REIConfig(); + saveConfig(); + return; + } boolean failed = false; try { - InputStream in = Files.newInputStream(configFile.toPath()); - config = REIConfig.GSON.fromJson(new InputStreamReader(in), REIConfig.class); - } catch (Exception e){ + config = REIConfig.GSON.fromJson(new InputStreamReader(Files.newInputStream(configFile.toPath())), REIConfig.class); + } catch (Exception e) { failed = true; } if (failed || config == null) { - System.out.println("[REI] Failed to load config! Overwriting with default config."); + Core.LOGGER.error("REI: Failed to load config! Overwriting with default config."); config = new REIConfig(); } saveConfig(); } - public static void loadDefaultConfig() throws IOException { - config = new REIConfig(); - saveConfig(); - } - public static void saveConfig() throws IOException { configFile.getParentFile().mkdirs(); - if (configFile.exists()) - configFile.delete(); - try (PrintWriter writer = new PrintWriter(configFile)) { + if (!configFile.exists() && !configFile.createNewFile()) { + Core.LOGGER.error("REI: Failed to save config! Overwriting with default config."); + config = new REIConfig(); + return; + } + FileWriter writer = new FileWriter(configFile, false); + try { REIConfig.GSON.toJson(config, writer); + } finally { writer.close(); } } diff --git a/src/main/java/me/shedaniel/api/IDisplayCategory.java b/src/main/java/me/shedaniel/api/IDisplayCategory.java index 7e41920bd..61b0b9962 100755 --- a/src/main/java/me/shedaniel/api/IDisplayCategory.java +++ b/src/main/java/me/shedaniel/api/IDisplayCategory.java @@ -11,6 +11,7 @@ import java.util.List; * Created by James on 8/7/2018. */ public interface IDisplayCategory { + public String getId(); public String getDisplayName(); @@ -28,4 +29,5 @@ public interface IDisplayCategory { public void addWidget(List controls, int number); public ItemStack getCategoryIcon(); + } diff --git a/src/main/java/me/shedaniel/api/IDisplayCategoryCraftable.java b/src/main/java/me/shedaniel/api/IDisplayCategoryCraftable.java new file mode 100644 index 000000000..596d50307 --- /dev/null +++ b/src/main/java/me/shedaniel/api/IDisplayCategoryCraftable.java @@ -0,0 +1,17 @@ +package me.shedaniel.api; + +import me.shedaniel.gui.RecipeGui; +import me.shedaniel.gui.widget.Control; +import net.minecraft.client.gui.GuiScreen; + +import java.util.List; + +public interface IDisplayCategoryCraftable extends IDisplayCategory { + + public boolean canAutoCraftHere(Class guiClass, T recipe); + + public boolean performAutoCraft(GuiScreen gui, T recipe); + + public void registerAutoCraftButton(List control, RecipeGui recipeGui, GuiScreen parentGui, T recipe, int number); + +} diff --git a/src/main/java/me/shedaniel/api/IDisplayHelper.java b/src/main/java/me/shedaniel/api/IDisplayHelper.java deleted file mode 100755 index 6f230d3b5..000000000 --- a/src/main/java/me/shedaniel/api/IDisplayHelper.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.shedaniel.api; - -/** - * Created by James on 8/7/2018. - */ -public interface IDisplayHelper { -} diff --git a/src/main/java/me/shedaniel/api/IDrawable.java b/src/main/java/me/shedaniel/api/IDrawable.java index 102b7e1c5..48294bea7 100755 --- a/src/main/java/me/shedaniel/api/IDrawable.java +++ b/src/main/java/me/shedaniel/api/IDrawable.java @@ -4,7 +4,9 @@ package me.shedaniel.api; * Created by James on 8/7/2018. */ public interface IDrawable { + public void draw(); - + public boolean isHighlighted(); + } diff --git a/src/main/java/me/shedaniel/api/IREIPlugin.java b/src/main/java/me/shedaniel/api/IREIPlugin.java index 98060163d..bde5f0d71 100755 --- a/src/main/java/me/shedaniel/api/IREIPlugin.java +++ b/src/main/java/me/shedaniel/api/IREIPlugin.java @@ -5,5 +5,10 @@ package me.shedaniel.api; */ public interface IREIPlugin { - public void register(); + public void registerCategories(); + + public void registerRecipes(); + + public void registerSpecialGuiExclusion(); + } diff --git a/src/main/java/me/shedaniel/api/IRecipe.java b/src/main/java/me/shedaniel/api/IRecipe.java index 6359c351a..32def1b7e 100755 --- a/src/main/java/me/shedaniel/api/IRecipe.java +++ b/src/main/java/me/shedaniel/api/IRecipe.java @@ -1,15 +1,20 @@ package me.shedaniel.api; +import net.minecraft.item.ItemStack; + import java.util.List; /** * Created by James on 7/27/2018. */ public interface IRecipe { - + public String getId(); - + public List getOutput(); - + public List> getInput(); + + public List> getRecipeRequiredInput(); + } diff --git a/src/main/java/me/shedaniel/api/IRecipeManager.java b/src/main/java/me/shedaniel/api/IRecipeManager.java index 355a1cd4d..82135bf3f 100755 --- a/src/main/java/me/shedaniel/api/IRecipeManager.java +++ b/src/main/java/me/shedaniel/api/IRecipeManager.java @@ -17,4 +17,5 @@ public interface IRecipeManager { public void addDisplayAdapter(IDisplayCategory adapter); public Map> getRecipesFor(ItemStack stack); + } diff --git a/src/main/java/me/shedaniel/api/TriBooleanProducer.java b/src/main/java/me/shedaniel/api/TriBooleanProducer.java deleted file mode 100755 index 0925fee75..000000000 --- a/src/main/java/me/shedaniel/api/TriBooleanProducer.java +++ /dev/null @@ -1,8 +0,0 @@ -package me.shedaniel.api; - -/** - * Created by James on 8/4/2018. - */ -public interface TriBooleanProducer { - public boolean accept(int first, int second, int third); -} diff --git a/src/main/java/me/shedaniel/api/TriBooleanSupplier.java b/src/main/java/me/shedaniel/api/TriBooleanSupplier.java new file mode 100755 index 000000000..241307740 --- /dev/null +++ b/src/main/java/me/shedaniel/api/TriBooleanSupplier.java @@ -0,0 +1,8 @@ +package me.shedaniel.api; + +/** + * Created by James on 8/4/2018. + */ +public interface TriBooleanSupplier { + public boolean accept(int first, int second, int third); +} diff --git a/src/main/java/me/shedaniel/config/REIConfig.java b/src/main/java/me/shedaniel/config/REIConfig.java index 9e6b3d36f..c9e2efe47 100644 --- a/src/main/java/me/shedaniel/config/REIConfig.java +++ b/src/main/java/me/shedaniel/config/REIConfig.java @@ -7,11 +7,16 @@ import java.awt.event.KeyEvent; public class REIConfig { - public static Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + public static Gson GSON = new GsonBuilder() + .setPrettyPrinting() + .create(); public int recipeKeyBind = KeyEvent.VK_R; public int usageKeyBind = KeyEvent.VK_U; public int hideKeyBind = KeyEvent.VK_O; public boolean centreSearchBox = false; + public REIItemListOrdering itemListOrdering = REIItemListOrdering.REGISTRY; + public boolean isAscending = true; + public boolean enableCraftableOnlyButton = false; } diff --git a/src/main/java/me/shedaniel/config/REIItemListOrdering.java b/src/main/java/me/shedaniel/config/REIItemListOrdering.java new file mode 100644 index 000000000..f0a6b5356 --- /dev/null +++ b/src/main/java/me/shedaniel/config/REIItemListOrdering.java @@ -0,0 +1,21 @@ +package me.shedaniel.config; + +import com.google.gson.annotations.SerializedName; + +public enum REIItemListOrdering { + + @SerializedName("registry") REGISTRY("ordering.rei.registry"), + @SerializedName("name") NAME("ordering.rei.name"), + @SerializedName("item_groups") ITEM_GROUPS("ordering.rei.item_groups"); + + private String nameTranslationKey; + + REIItemListOrdering(String nameTranslationKey) { + this.nameTranslationKey = nameTranslationKey; + } + + public String getNameTranslationKey() { + return nameTranslationKey; + } + +} diff --git a/src/main/java/me/shedaniel/config/REIRuntimeConfig.java b/src/main/java/me/shedaniel/config/REIRuntimeConfig.java new file mode 100644 index 000000000..b13a72bfb --- /dev/null +++ b/src/main/java/me/shedaniel/config/REIRuntimeConfig.java @@ -0,0 +1,8 @@ +package me.shedaniel.config; + +public class REIRuntimeConfig { + + public boolean craftableOnly = false; + public boolean centreSearchBox = false; + +} diff --git a/src/main/java/me/shedaniel/gui/ConfigGui.java b/src/main/java/me/shedaniel/gui/ConfigGui.java index b7426af30..bdf679768 100644 --- a/src/main/java/me/shedaniel/gui/ConfigGui.java +++ b/src/main/java/me/shedaniel/gui/ConfigGui.java @@ -2,12 +2,13 @@ package me.shedaniel.gui; import me.shedaniel.ClientListener; import me.shedaniel.Core; +import me.shedaniel.config.REIItemListOrdering; import me.shedaniel.gui.widget.KeyBindButton; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.resources.I18n; -import net.minecraft.client.util.InputMappings; import java.io.IOException; import java.util.Arrays; @@ -24,7 +25,7 @@ public class ConfigGui extends GuiScreen { protected void initGui() { addButton(new KeyBindButton(997, parent.width / 2 - 20, 30, 80, 20, Core.config.recipeKeyBind, key -> { Core.config.recipeKeyBind = key; - ClientListener.recipeKeybind.setKey(key); + ClientListener.recipeKeyBind.setKey(key); try { Core.saveConfig(); } catch (IOException e) { @@ -33,7 +34,7 @@ public class ConfigGui extends GuiScreen { })); addButton(new KeyBindButton(998, parent.width / 2 - 20, 60, 80, 20, Core.config.usageKeyBind, key -> { Core.config.usageKeyBind = key; - ClientListener.useKeybind.setKey(key); + ClientListener.useKeyBind.setKey(key); try { Core.saveConfig(); } catch (IOException e) { @@ -42,7 +43,7 @@ public class ConfigGui extends GuiScreen { })); addButton(new KeyBindButton(999, parent.width / 2 - 20, 90, 80, 20, Core.config.hideKeyBind, key -> { Core.config.hideKeyBind = key; - ClientListener.hideKeybind.setKey(key); + ClientListener.hideKeyBind.setKey(key); try { Core.saveConfig(); } catch (IOException e) { @@ -59,7 +60,7 @@ public class ConfigGui extends GuiScreen { e.printStackTrace(); } } - + @Override public void render(int int_1, int int_2, float float_1) { this.displayString = I18n.format("text.rei.centre_searchbox", Core.config.centreSearchBox ? "§a" : "§c", Core.config.centreSearchBox); @@ -67,23 +68,75 @@ public class ConfigGui extends GuiScreen { if (this.hovered) drawSuggestion(int_1, int_2); } - + protected void drawSuggestion(int x, int y) { drawHoveringText(Arrays.asList(I18n.format("text.rei.centre_searchbox.tooltip").split("\n")), x, y); } }); + addButton(new GuiButton(1001, parent.width / 2 - 90, 150, 150, 20, "") { + @Override + public void onClick(double double_1, double double_2) { + Core.config.enableCraftableOnlyButton = !Core.config.enableCraftableOnlyButton; + try { + Core.saveConfig(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void render(int int_1, int int_2, float float_1) { + RenderHelper.disableStandardItemLighting(); + this.displayString = I18n.format("text.rei.enable_craftable_only.button", Core.config.enableCraftableOnlyButton ? "§a" : "§c", Core.config.enableCraftableOnlyButton); + super.render(int_1, int_2, float_1); + if (this.hovered) + drawSuggestion(int_1, int_2); + } + + protected void drawSuggestion(int x, int y) { + drawHoveringText(Arrays.asList(I18n.format("text.rei.enable_craftable_only.tooltip").split("\n")), x, y); + } + }); + addButton(new GuiButton(1002, parent.width / 2 - 90, 180, 150, 20, "") { + @Override + public void onClick(double double_1, double double_2) { + int index = Arrays.asList(REIItemListOrdering.values()).indexOf(Core.config.itemListOrdering) + 1; + if (index >= REIItemListOrdering.values().length) { + index = 0; + Core.config.isAscending = !Core.config.isAscending; + } + Core.config.itemListOrdering = REIItemListOrdering.values()[index]; + try { + Core.saveConfig(); + REIRenderHelper.reiGui.updateView(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void render(int int_1, int int_2, float float_1) { + RenderHelper.disableStandardItemLighting(); + this.displayString = I18n.format("text.rei.list_ordering_button", I18n.format(Core.config.itemListOrdering.getNameTranslationKey()), + I18n.format(Core.config.isAscending ? "ordering.rei.ascending" : "ordering.rei.descending")); + super.render(int_1, int_2, float_1); + } + }); } @Override public void render(int mouseX, int mouseY, float partialTicks) { drawDefaultBackground(); super.render(mouseX, mouseY, partialTicks); + RenderHelper.disableStandardItemLighting(); String text = I18n.format("key.rei.recipe") + ": "; - drawString(Minecraft.getInstance().fontRenderer, text, parent.width / 2 - 40 - Minecraft.getInstance().fontRenderer.getStringWidth(text), 30 + 6, -1); + drawString(Minecraft.getInstance().fontRenderer, text, parent.width / 2 - 25 - Minecraft.getInstance().fontRenderer.getStringWidth(text), 30 + 6, -1); text = I18n.format("key.rei.use") + ": "; - drawString(Minecraft.getInstance().fontRenderer, text, parent.width / 2 - 40 - Minecraft.getInstance().fontRenderer.getStringWidth(text), 60 + 6, -1); + drawString(Minecraft.getInstance().fontRenderer, text, parent.width / 2 - 25 - Minecraft.getInstance().fontRenderer.getStringWidth(text), 60 + 6, -1); text = I18n.format("key.rei.hide") + ": "; - drawString(Minecraft.getInstance().fontRenderer, text, parent.width / 2 - 40 - Minecraft.getInstance().fontRenderer.getStringWidth(text), 90 + 6, -1); + drawString(Minecraft.getInstance().fontRenderer, text, parent.width / 2 - 25 - Minecraft.getInstance().fontRenderer.getStringWidth(text), 90 + 6, -1); + text = I18n.format("text.rei.list_ordering") + ": "; + drawString(Minecraft.getInstance().fontRenderer, text, parent.width / 2 - 95 - Minecraft.getInstance().fontRenderer.getStringWidth(text), 180 + 6, -1); } @Override @@ -97,4 +150,5 @@ public class ConfigGui extends GuiScreen { return super.keyPressed(p_keyPressed_1_, p_keyPressed_2_, p_keyPressed_3_); } } + } diff --git a/src/main/java/me/shedaniel/gui/Drawable.java b/src/main/java/me/shedaniel/gui/Drawable.java index 76d49e049..a2e5740a4 100755 --- a/src/main/java/me/shedaniel/gui/Drawable.java +++ b/src/main/java/me/shedaniel/gui/Drawable.java @@ -9,6 +9,7 @@ import java.awt.*; * Created by James on 7/28/2018. */ public abstract class Drawable implements IDrawable { + protected Rectangle rect; public Drawable(int x, int y, int width, int height) { @@ -30,4 +31,5 @@ public abstract class Drawable implements IDrawable { } return false; } + } diff --git a/src/main/java/me/shedaniel/gui/GuiItemList.java b/src/main/java/me/shedaniel/gui/GuiItemList.java index 27da65727..150bb149d 100755 --- a/src/main/java/me/shedaniel/gui/GuiItemList.java +++ b/src/main/java/me/shedaniel/gui/GuiItemList.java @@ -1,28 +1,30 @@ package me.shedaniel.gui; +import com.google.common.collect.ImmutableList; import me.shedaniel.ClientListener; import me.shedaniel.Core; +import me.shedaniel.config.REIItemListOrdering; import me.shedaniel.gui.widget.Button; -import me.shedaniel.gui.widget.Control; -import me.shedaniel.gui.widget.REISlot; -import me.shedaniel.gui.widget.TextBox; +import me.shedaniel.gui.widget.*; +import me.shedaniel.impl.REIRecipeManager; import me.shedaniel.listenerdefinitions.IMixinGuiContainer; import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; import net.minecraft.util.registry.IRegistry; -import net.minecraft.util.text.TextComponentTranslation; import java.awt.*; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.*; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -42,12 +44,11 @@ public class GuiItemList extends Drawable { protected boolean visible = true; private int oldGuiLeft = 0; private boolean cheatMode = false; - private Button btnCategoryPageLeft, btnCategoryPageRight; - public Button btnRecipeLeft, btnRecipeRight; + private List lastPlayerItems = new ArrayList<>(); public GuiItemList(GuiContainer overlayedGui) { super(calculateRect(overlayedGui)); - FOOTERSIZE = Core.centreSearchBox ? 18 : 44; + FOOTERSIZE = Core.runtimeConfig.centreSearchBox ? 18 : 44; displaySlots = new ArrayList<>(); controls = new ArrayList<>(); this.overlayedGui = overlayedGui; @@ -56,7 +57,7 @@ public class GuiItemList extends Drawable { } public boolean canCheat() { - EntityPlayer player = Minecraft.getInstance().player; + EntityPlayerSP player = Minecraft.getInstance().player; if (cheatMode) { if (!player.hasPermissionLevel(1)) { cheatClicked(0); @@ -80,7 +81,6 @@ public class GuiItemList extends Drawable { if (overlayedGui != Minecraft.getInstance().currentScreen) { if (Minecraft.getInstance().currentScreen instanceof GuiContainer) { overlayedGui = (GuiContainer) Minecraft.getInstance().currentScreen; - } else { needsResize = true; return; @@ -102,11 +102,21 @@ public class GuiItemList extends Drawable { } searchBox = new TextBox(getSearchBoxArea()); searchBox.setText(savedText); + if (Core.config.enableCraftableOnlyButton) { + CraftableToggleButton buttonCraftableOnly = new CraftableToggleButton(getCraftableToggleArea()); + buttonCraftableOnly.setOnClick(i -> { + Core.runtimeConfig.craftableOnly = !Core.runtimeConfig.craftableOnly; + REIRenderHelper.updateSearch(); + return true; + }); + controls.add(buttonCraftableOnly); + } controls.add(searchBox); buttonCheating = new Button(5, 5, 45, 20, getCheatModeText()); buttonCheating.onClick = this::cheatClicked; buttonConfig = new Button(5, 28, 45, 20, I18n.format("text.rei.config")); buttonConfig.onClick = i -> { + Minecraft.getInstance().displayGuiScreen(null); Minecraft.getInstance().displayGuiScreen(new ConfigGui(overlayedGui)); return true; }; @@ -119,17 +129,25 @@ public class GuiItemList extends Drawable { } private Rectangle getSearchBoxArea() { + int widthOffset = Core.config.enableCraftableOnlyButton ? -24 : 0; int ch = ((IMixinGuiContainer) overlayedGui).getContainerHeight(), cw = ((IMixinGuiContainer) overlayedGui).getContainerWidth(); - if (Core.config.centreSearchBox) { - if (ch + 4 + 18 > rect.height) //Will be out of bounds - return new Rectangle(overlayedGui.width / 2 - cw / 2, rect.height + 100, cw, 18); - return new Rectangle(overlayedGui.width / 2 - cw / 2, rect.height - 31, cw, 18); + if (Core.runtimeConfig.centreSearchBox) { + if (ch + 4 + 18 > Minecraft.getInstance().mainWindow.getScaledHeight()) //Will be out of bounds + return new Rectangle(overlayedGui.width / 2 - cw / 2, rect.height + 100, cw + widthOffset, 18); + return new Rectangle(overlayedGui.width / 2 - cw / 2, rect.height - 31, cw + widthOffset, 18); } - return new Rectangle(rect.x, rect.height - 31, rect.width - 4, 18); + return new Rectangle(rect.x, rect.height - 31, rect.width - 4 + widthOffset, 18); + } + + private Rectangle getCraftableToggleArea() { + Rectangle searchBoxArea = getSearchBoxArea(); + searchBoxArea.setLocation(searchBoxArea.x + searchBoxArea.width + 4, searchBoxArea.y - 1); + searchBoxArea.setSize(20, 20); + return searchBoxArea; } private void fillSlots() { - page = MathHelper.clamp(page, 0, (int) Math.floor(view.size() / displaySlots.size())); + page = MathHelper.clamp(page, 0, MathHelper.ceil(view.size() / displaySlots.size())); int firstSlot = page * displaySlots.size(); for(int i = 0; i < displaySlots.size(); i++) { if (firstSlot + i < view.size() && firstSlot + i >= 0) { @@ -165,9 +183,10 @@ public class GuiItemList extends Drawable { while (true) { REISlot slot = new REISlot(x + xOffset, y + yOffset); slot.setCheatable(true); + if (REIRecipeManager.instance().canAddSlot(Minecraft.getInstance().currentScreen.getClass(), slot.rect)) + displaySlots.add(slot); xOffset += 18; currentX++; - displaySlots.add(slot); if (currentX >= perRow) { xOffset = 0; yOffset += 18; @@ -183,34 +202,48 @@ public class GuiItemList extends Drawable { public void draw() { if (!visible) return; - if (needsResize == true) - resize(); - if (oldGuiLeft != ((IMixinGuiContainer) overlayedGui).getGuiLeft()) + if (Minecraft.getInstance().currentScreen instanceof GuiContainer) + overlayedGui = (GuiContainer) Minecraft.getInstance().currentScreen; + if (needsResize == true || oldGuiLeft != ((IMixinGuiContainer) overlayedGui).getGuiLeft()) resize(); + else if (Core.runtimeConfig.craftableOnly && (!hasSameListContent(new LinkedList<>(lastPlayerItems), getInventoryItemsTypes()) || (getInventoryItemsTypes().size() != lastPlayerItems.size()))) { + this.lastPlayerItems = new LinkedList<>(getInventoryItemsTypes()); + updateView(); + } GlStateManager.pushMatrix(); updateButtons(); controls.forEach(Control::draw); - String header = String.format("%s/%s", page + 1, ((int) Math.floor(view.size() / displaySlots.size())) + 1); RenderHelper.disableStandardItemLighting(); + String header = String.format("%s/%s", page + 1, MathHelper.ceil(view.size() / displaySlots.size()) + 1); Minecraft.getInstance().fontRenderer.drawStringWithShadow(header, rect.x + (rect.width / 2) - (Minecraft.getInstance().fontRenderer.getStringWidth(header) / 2), rect.y + 10, -1); GlStateManager.popMatrix(); } - private void updateButtons() { - if (page == 0) - buttonLeft.setEnabled(false); - else - buttonLeft.setEnabled(true); - if (displaySlots.size() + displaySlots.size() * page >= view.size()) - buttonRight.setEnabled(false); - else - buttonRight.setEnabled(true); + private boolean hasSameListContent(List list1, List list2) { + Collections.sort(list1, (itemStack, t1) -> { + return itemStack.getDisplayName().getFormattedText().compareToIgnoreCase(t1.getDisplayName().getFormattedText()); + }); + Collections.sort(list2, (itemStack, t1) -> { + return itemStack.getDisplayName().getFormattedText().compareToIgnoreCase(t1.getDisplayName().getFormattedText()); + }); + String lastString = String.join("", list1.stream().map(itemStack -> { + return itemStack.getDisplayName().getFormattedText(); + }).collect(Collectors.toList())), currentString = String.join("", list2.stream().map(itemStack -> { + return itemStack.getDisplayName().getFormattedText(); + }).collect(Collectors.toList())); + return lastString.equals(currentString); } + private void updateButtons() { + buttonLeft.setEnabled(MathHelper.ceil(view.size() / displaySlots.size()) > 1); + buttonRight.setEnabled(MathHelper.ceil(view.size() / displaySlots.size()) > 1); + } public boolean btnRightClicked(int button) { if (button == 0) { page++; + if (page > MathHelper.ceil(view.size() / displaySlots.size())) + page = 0; fillSlots(); return true; } @@ -220,6 +253,8 @@ public class GuiItemList extends Drawable { public boolean btnLeftClicked(int button) { if (button == 0) { page--; + if (page < 0) + page = MathHelper.ceil(view.size() / displaySlots.size()); fillSlots(); return true; } @@ -229,7 +264,6 @@ public class GuiItemList extends Drawable { public boolean cheatClicked(int button) { if (button == 0) { cheatMode = !cheatMode; - buttonCheating.setString(getCheatModeText()); return true; } @@ -237,41 +271,75 @@ public class GuiItemList extends Drawable { } private String getCheatModeText() { - if (cheatMode) { - TextComponentTranslation cheat = new TextComponentTranslation("text.rei.cheat", new Object[]{null}); - return cheat.getFormattedText(); - } - TextComponentTranslation noCheat = new TextComponentTranslation("text.rei.nocheat", new Object[]{null}); - return noCheat.getFormattedText(); + return I18n.format(String.format("%s%s", "text.rei.", cheatMode ? "cheat" : "nocheat")); } protected void updateView() { String searchText = searchBox.getText(); view.clear(); List stacks = new ArrayList<>(); - Arrays.stream(searchText.split("\\|")).forEachOrdered(s -> { - List arguments = new ArrayList<>(); - while (s.startsWith(" ")) s = s.substring(1); - while (s.endsWith(" ")) s = s.substring(0, s.length()); - if (s.startsWith("@-") || s.startsWith("-@")) - arguments.add(new SearchArgument(SearchArgument.ArgumentType.MOD, s.substring(2), false)); - else if (s.startsWith("@")) - arguments.add(new SearchArgument(SearchArgument.ArgumentType.MOD, s.substring(1), true)); - else if (s.startsWith("#-") || s.startsWith("-#")) - arguments.add(new SearchArgument(SearchArgument.ArgumentType.TOOLTIP, s.substring(2), false)); - else if (s.startsWith("#")) - arguments.add(new SearchArgument(SearchArgument.ArgumentType.TOOLTIP, s.substring(1), true)); - else if (s.startsWith("-")) - arguments.add(new SearchArgument(SearchArgument.ArgumentType.TEXT, s.substring(1), false)); - else - arguments.add(new SearchArgument(SearchArgument.ArgumentType.TEXT, s, true)); - ClientListener.stackList.stream().filter(itemStack -> filterItem(itemStack, arguments)).forEachOrdered(stacks::add); - }); - view.addAll(stacks.stream().distinct().collect(Collectors.toList())); + if (ClientListener.stackList != null) { + List stackList = new LinkedList<>(ClientListener.stackList); + List itemGroups = new LinkedList<>(Arrays.asList(ItemGroup.GROUPS)); + itemGroups.add(null); + if (Core.config.itemListOrdering != REIItemListOrdering.REGISTRY) + Collections.sort(stackList, (itemStack, t1) -> { + if (Core.config.itemListOrdering.equals(REIItemListOrdering.NAME)) + return itemStack.getDisplayName().getFormattedText().compareToIgnoreCase(t1.getDisplayName().getFormattedText()); + if (Core.config.itemListOrdering.equals(REIItemListOrdering.ITEM_GROUPS)) + return itemGroups.indexOf(itemStack.getItem().getGroup()) - itemGroups.indexOf(t1.getItem().getGroup()); + return 0; + }); + if (!Core.config.isAscending) + Collections.reverse(stackList); + Arrays.stream(searchText.split("\\|")).forEachOrdered(s -> { + List arguments = new ArrayList<>(); + while (s.startsWith(" ")) s = s.substring(1); + while (s.endsWith(" ")) s = s.substring(0, s.length()); + if (s.startsWith("@-") || s.startsWith("-@")) + arguments.add(new SearchArgument(SearchArgument.ArgumentType.MOD, s.substring(2), false)); + else if (s.startsWith("@")) + arguments.add(new SearchArgument(SearchArgument.ArgumentType.MOD, s.substring(1), true)); + else if (s.startsWith("#-") || s.startsWith("-#")) + arguments.add(new SearchArgument(SearchArgument.ArgumentType.TOOLTIP, s.substring(2), false)); + else if (s.startsWith("#")) + arguments.add(new SearchArgument(SearchArgument.ArgumentType.TOOLTIP, s.substring(1), true)); + else if (s.startsWith("-")) + arguments.add(new SearchArgument(SearchArgument.ArgumentType.TEXT, s.substring(1), false)); + else + arguments.add(new SearchArgument(SearchArgument.ArgumentType.TEXT, s, true)); + stackList.stream().filter(itemStack -> filterItem(itemStack, arguments)).forEachOrdered(stacks::add); + }); + } + List workingItems = ClientListener.stackList == null || (Core.runtimeConfig.craftableOnly && lastPlayerItems.size() > 0) ? new ArrayList<>() : ClientListener.stackList; + if (Core.runtimeConfig.craftableOnly) { + REIRecipeManager.instance().findCraftableByItems(lastPlayerItems).forEach(workingItems::add); + workingItems.addAll(lastPlayerItems); + } + final List finalWorkingItems = workingItems; + view.addAll(stacks.stream().filter(itemStack -> { + if (!Core.runtimeConfig.craftableOnly) + return true; + for(ItemStack workingItem : finalWorkingItems) + if (itemStack.isItemEqual(workingItem)) + return true; + return false; + }).distinct().collect(Collectors.toList())); page = 0; fillSlots(); } + private List getInventoryItemsTypes() { + List> field_7543 = ImmutableList.of(Minecraft.getInstance().player.inventory.mainInventory, Minecraft.getInstance().player.inventory.armorInventory + , Minecraft.getInstance().player.inventory.offHandInventory); + List inventoryStacks = new ArrayList<>(); + field_7543.forEach(itemStacks -> itemStacks.forEach(itemStack -> { + if (!itemStack.getItem().equals(Items.AIR)) + inventoryStacks.add(itemStack); + })); + return inventoryStacks; + } + private boolean filterItem(ItemStack itemStack, List arguments) { String mod = getMod(itemStack); List toolTipsList = REIRenderHelper.getOverlayedGui().getItemToolTip(itemStack); diff --git a/src/main/java/me/shedaniel/gui/REIRenderHelper.java b/src/main/java/me/shedaniel/gui/REIRenderHelper.java index 25193d954..892faddcd 100755 --- a/src/main/java/me/shedaniel/gui/REIRenderHelper.java +++ b/src/main/java/me/shedaniel/gui/REIRenderHelper.java @@ -27,6 +27,7 @@ import java.util.stream.Collectors; * Created by James on 7/28/2018. */ public class REIRenderHelper { + static Point mouseLoc; static public GuiItemList reiGui; static GuiContainer overlayedGui; @@ -96,15 +97,8 @@ public class REIRenderHelper { private static void renderTooltips() { - GlStateManager.pushMatrix(); - GlStateManager.enableLighting(); - for(TooltipData tooltipData : tooltipsToRender) { - getOverlayedGui().drawHoveringText(tooltipData.text, tooltipData.x, tooltipData.y); - } - GlStateManager.disableLighting(); + tooltipsToRender.forEach(tooltipData -> getOverlayedGui().drawHoveringText(tooltipData.text, tooltipData.x, tooltipData.y)); tooltipsToRender.clear(); - GlStateManager.popMatrix(); - } public static boolean mouseClick(int x, int y, int button) { @@ -143,6 +137,10 @@ public class REIRenderHelper { return false; } + public static boolean isGuiVisible() { + return reiGui != null && reiGui.visible; + } + public static boolean keyDown(int typedChar, int keyCode, int unknown) { boolean handled = false; if (focusedControl != null && focusedControl instanceof Control) { diff --git a/src/main/java/me/shedaniel/gui/RecipeContainer.java b/src/main/java/me/shedaniel/gui/RecipeContainer.java index f8605a45c..a35e61dd7 100755 --- a/src/main/java/me/shedaniel/gui/RecipeContainer.java +++ b/src/main/java/me/shedaniel/gui/RecipeContainer.java @@ -10,4 +10,5 @@ public class RecipeContainer extends Container { public boolean canInteractWith(EntityPlayer entityPlayer) { return true; } + } diff --git a/src/main/java/me/shedaniel/gui/RecipeGui.java b/src/main/java/me/shedaniel/gui/RecipeGui.java index 1674bcc6d..9372046fd 100755 --- a/src/main/java/me/shedaniel/gui/RecipeGui.java +++ b/src/main/java/me/shedaniel/gui/RecipeGui.java @@ -1,6 +1,7 @@ package me.shedaniel.gui; import me.shedaniel.api.IDisplayCategory; +import me.shedaniel.api.IDisplayCategoryCraftable; import me.shedaniel.api.IRecipe; import me.shedaniel.gui.widget.Button; import me.shedaniel.gui.widget.Control; @@ -27,8 +28,8 @@ public class RecipeGui extends GuiContainer { private final Container container; private final GuiScreen prevScreen; public final Map> recipes; - public int guiWidth = 176; - public int guiHeight = 222; + public final int guiWidth = 176; + public final int guiHeight = 222; ArrayList categories = new ArrayList<>(); private int categoryTabPage = 0; public IDisplayCategory selectedCategory; @@ -48,11 +49,15 @@ public class RecipeGui extends GuiContainer { this.mc = Minecraft.getInstance(); this.itemRender = mc.getItemRenderer(); this.fontRenderer = mc.fontRenderer; - this.mainWindow = Minecraft.getInstance().mainWindow; + this.mainWindow = mc.mainWindow; setupCategories(); } + public GuiScreen getPrevScreen() { + return prevScreen; + } + private void setupCategories() { for(IDisplayCategory adapter : REIRecipeManager.instance().getDisplayAdapters()) if (recipes.containsKey(adapter)) @@ -68,17 +73,17 @@ public class RecipeGui extends GuiContainer { selectedCategory = categories.get(tab.getId() + categoryTabPage * 6); recipePointer = 0; updateRecipe(); - return true; + return false; })); updateRecipe(); } - @Override public void render(int mouseX, int mouseY, float partialTicks) { drawDefaultBackground(); super.render(mouseX, mouseY, partialTicks); int y = (int) ((mainWindow.getScaledHeight() / 2 - this.guiHeight / 2)); + RenderHelper.disableStandardItemLighting(); drawCenteredString(this.fontRenderer, selectedCategory.getDisplayName(), guiLeft + guiWidth / 2, y + 11, -1); drawCenteredString(this.fontRenderer, String.format("%d/%d", 1 + getCurrentPage(), getTotalPages()), guiLeft + guiWidth / 2, y + 34, -1); controls.forEach(Control::draw); @@ -95,7 +100,6 @@ public class RecipeGui extends GuiContainer { controls.forEach(Control::tick); } - @Override public void onResize(Minecraft p_onResize_1_, int p_onResize_2_, int p_onResize_3_) { super.onResize(p_onResize_1_, p_onResize_2_, p_onResize_3_); @@ -103,8 +107,6 @@ public class RecipeGui extends GuiContainer { } private void updateRecipe() { - int categoryPointer = categories.indexOf(selectedCategory); - IRecipe recipe = recipes.get(selectedCategory).get(recipePointer); selectedCategory.resetRecipes(); selectedCategory.addRecipe(recipe); @@ -164,8 +166,13 @@ public class RecipeGui extends GuiContainer { List newControls = new LinkedList<>(); selectedCategory.addWidget(newControls, 0); - if (recipes.get(selectedCategory).size() >= recipePointer + 2) + if (selectedCategory instanceof IDisplayCategoryCraftable) + ((IDisplayCategoryCraftable) selectedCategory).registerAutoCraftButton(newControls, this, getPrevScreen(), recipe, 0); + if (recipes.get(selectedCategory).size() >= recipePointer + 2) { selectedCategory.addWidget(newControls, 1); + if (selectedCategory instanceof IDisplayCategoryCraftable) + ((IDisplayCategoryCraftable) selectedCategory).registerAutoCraftButton(newControls, this, getPrevScreen(), recipes.get(selectedCategory).get(recipePointer + 1), 1); + } newControls.forEach(f -> f.move(guiLeft, guiTop)); controls.addAll(newControls); @@ -191,7 +198,7 @@ public class RecipeGui extends GuiContainer { //Tabs if (tabsEnabled) { GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); - RenderHelper.enableGUIStandardItemLighting(); + RenderHelper.enableStandardItemLighting(); this.mc.getTextureManager().bindTexture(CREATIVE_INVENTORY_TABS); tabs.stream().filter(tab -> tab.getId() + categoryTabPage * 6 == categories.indexOf(selectedCategory)).forEach(Tab::drawTab); } @@ -214,7 +221,7 @@ public class RecipeGui extends GuiContainer { if (tabsEnabled) tabs.stream().filter(tab -> tab.getId() + categoryTabPage * 6 != categories.indexOf(selectedCategory)).forEach(tab -> { GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); - RenderHelper.enableGUIStandardItemLighting(); + RenderHelper.enableStandardItemLighting(); this.mc.getTextureManager().bindTexture(CREATIVE_INVENTORY_TABS); tab.drawTab(); }); @@ -223,17 +230,12 @@ public class RecipeGui extends GuiContainer { @Override public boolean keyPressed(int p_keyPressed_1_, int p_keyPressed_2_, int p_keyPressed_3_) { if (p_keyPressed_1_ == 256 && prevScreen != null) { - Minecraft.getInstance().displayGuiScreen(prevScreen); + this.mc.displayGuiScreen(prevScreen); return true; } return super.keyPressed(p_keyPressed_1_, p_keyPressed_2_, p_keyPressed_3_); } - @Override - public void onGuiClosed() { - super.onGuiClosed(); - } - private boolean btnCategoryLeft(int button) { recipePointer = 0; int categoryPointer = categories.indexOf(selectedCategory); @@ -281,4 +283,5 @@ public class RecipeGui extends GuiContainer { private int getTotalPages() { return MathHelper.clamp(riseDoublesToInt(recipes.get(selectedCategory).size() / 2d), 1, Integer.MAX_VALUE); } + } diff --git a/src/main/java/me/shedaniel/gui/SearchArgument.java b/src/main/java/me/shedaniel/gui/SearchArgument.java index 253f87814..5eeddf01c 100644 --- a/src/main/java/me/shedaniel/gui/SearchArgument.java +++ b/src/main/java/me/shedaniel/gui/SearchArgument.java @@ -32,4 +32,5 @@ public class SearchArgument { public String toString() { return String.format("Argument[%s]: name = %s, include = %b", argumentType.name(), text, include); } + } diff --git a/src/main/java/me/shedaniel/gui/widget/Button.java b/src/main/java/me/shedaniel/gui/widget/Button.java index df43893ff..bdb7980ad 100755 --- a/src/main/java/me/shedaniel/gui/widget/Button.java +++ b/src/main/java/me/shedaniel/gui/widget/Button.java @@ -13,10 +13,10 @@ import java.awt.*; * Created by James on 7/29/2018. */ public class Button extends Control { + private String buttonText; protected static final ResourceLocation BUTTON_TEXTURES = new ResourceLocation("textures/gui/widgets.png"); - public Button(int x, int y, int width, int height, String buttonText) { super(x, y, width, height); this.buttonText = buttonText; @@ -31,7 +31,6 @@ public class Button extends Control { buttonText = text; } - @Override public void draw() { GlStateManager.pushMatrix(); @@ -54,19 +53,11 @@ public class Button extends Control { GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); gui.drawTexturedModalRect(rect.x, rect.y, 0, 46 + hoverState * 20, rect.width / 2, rect.height); gui.drawTexturedModalRect(rect.x + rect.width / 2, rect.y, 200 - rect.width / 2, 46 + hoverState * 20, rect.width / 2, rect.height); - //this.mouseDragged(lvt_4_1_, p_194828_1_, p_194828_2_); int lvt_7_1_ = 14737632; -// if(!this.enabled) { -// lvt_7_1_ = 10526880; -// } else if(this.hovered) { -// lvt_7_1_ = 16777120; -// } - gui.drawCenteredString(lvt_5_1_, this.buttonText, rect.x + rect.width / 2, rect.y + (rect.height - 8) / 2, lvt_7_1_); GlStateManager.enableLighting(); GlStateManager.popMatrix(); } - } diff --git a/src/main/java/me/shedaniel/gui/widget/Control.java b/src/main/java/me/shedaniel/gui/widget/Control.java index dd674e605..ededf7828 100755 --- a/src/main/java/me/shedaniel/gui/widget/Control.java +++ b/src/main/java/me/shedaniel/gui/widget/Control.java @@ -1,6 +1,6 @@ package me.shedaniel.gui.widget; -import me.shedaniel.api.TriBooleanProducer; +import me.shedaniel.api.TriBooleanSupplier; import me.shedaniel.gui.Drawable; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GlStateManager; @@ -15,9 +15,10 @@ import java.util.function.IntFunction; * Created by James on 7/29/2018. */ public abstract class Control extends Drawable { + private boolean enabled = true; public IntFunction onClick; - public TriBooleanProducer onKeyDown; + public TriBooleanSupplier onKeyDown; public BiConsumer charPressed; public Control(int x, int y, int width, int height) { diff --git a/src/main/java/me/shedaniel/gui/widget/CraftableToggleButton.java b/src/main/java/me/shedaniel/gui/widget/CraftableToggleButton.java new file mode 100644 index 000000000..06053da15 --- /dev/null +++ b/src/main/java/me/shedaniel/gui/widget/CraftableToggleButton.java @@ -0,0 +1,73 @@ +package me.shedaniel.gui.widget; + +import me.shedaniel.Core; +import me.shedaniel.gui.REIRenderHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.resources.I18n; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +import java.awt.*; +import java.util.Arrays; + +public class CraftableToggleButton extends Control { + + private ItemRenderer itemRenderer; + private final ItemStack itemStack; + //protected float zLevel; + protected static final ResourceLocation BUTTON_TEXTURES = new ResourceLocation("textures/gui/widgets.png"); + protected static final ResourceLocation CHEST_GUI_TEXTURE = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer.png"); + + public CraftableToggleButton(Rectangle rect) { + super(rect); + this.itemStack = new ItemStack(Blocks.CRAFTING_TABLE.asItem()); + this.itemRenderer = Minecraft.getInstance().getItemRenderer(); + } + + @Override + public void draw() { + GlStateManager.pushMatrix(); + GlStateManager.disableLighting(); + Minecraft lvt_4_1_ = Minecraft.getInstance(); + FontRenderer lvt_5_1_ = lvt_4_1_.fontRenderer; + lvt_4_1_.getTextureManager().bindTexture(BUTTON_TEXTURES); + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); + int hoverState = (byte) 0; + if (this.isEnabled()) { + if (!this.isHighlighted()) + hoverState = (byte) 1; + else + hoverState = (byte) 2; + } + + GlStateManager.enableBlend(); + GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + this.drawTexturedModalRect(rect.x, rect.y, 0, 46 + hoverState * 20, rect.width / 2, rect.height, 0); + this.drawTexturedModalRect(rect.x + rect.width / 2, rect.y, 200 - rect.width / 2, 46 + hoverState * 20, rect.width / 2, rect.height, 0); + + RenderHelper.enableGUIStandardItemLighting(); + this.itemRenderer.zLevel = 0.0F; + this.itemRenderer.renderItemAndEffectIntoGUI(itemStack, rect.x + 2, rect.y + 2); + GlStateManager.disableLighting(); + this.itemRenderer.zLevel = 0.0F; + RenderHelper.disableStandardItemLighting(); + lvt_4_1_.getTextureManager().bindTexture(CHEST_GUI_TEXTURE); + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); + this.drawTexturedModalRect(rect.x, rect.y, (72 + (Core.runtimeConfig.craftableOnly ? 0 : 20)), 222, 20, 20, 100); + GlStateManager.popMatrix(); + if (isHighlighted()) + drawTooltip(); + } + + private void drawTooltip() { + Point mouse = REIRenderHelper.getMouseLoc(); + REIRenderHelper.addToolTip(Arrays.asList(I18n.format(Core.runtimeConfig.craftableOnly ? "text.rei.showing_craftable" : "text.rei.showing_all")), mouse.x, mouse.y); + } + +} \ No newline at end of file diff --git a/src/main/java/me/shedaniel/gui/widget/IFocusable.java b/src/main/java/me/shedaniel/gui/widget/IFocusable.java index 54a0b9426..5735ab3f1 100755 --- a/src/main/java/me/shedaniel/gui/widget/IFocusable.java +++ b/src/main/java/me/shedaniel/gui/widget/IFocusable.java @@ -4,7 +4,9 @@ package me.shedaniel.gui.widget; * Created by James on 8/3/2018. */ public interface IFocusable { + public boolean hasFocus(); public void setFocused(boolean val); + } diff --git a/src/main/java/me/shedaniel/gui/widget/REISlot.java b/src/main/java/me/shedaniel/gui/widget/REISlot.java index 217bc996d..5f4f4ca7d 100755 --- a/src/main/java/me/shedaniel/gui/widget/REISlot.java +++ b/src/main/java/me/shedaniel/gui/widget/REISlot.java @@ -21,6 +21,7 @@ import java.util.List; * Created by James on 7/28/2018. */ public class REISlot extends Control { + private static final ResourceLocation RECIPE_GUI = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer.png"); private boolean cheatable = false; private List itemList = new LinkedList<>(); @@ -33,7 +34,6 @@ public class REISlot extends Control { private String extraTooltip; - @Override public void tick() { if (itemList.size() > 1) { @@ -183,5 +183,4 @@ public class REISlot extends Control { this.cheatable = cheatable; } - } diff --git a/src/main/java/me/shedaniel/gui/widget/SmallButton.java b/src/main/java/me/shedaniel/gui/widget/SmallButton.java new file mode 100644 index 000000000..918b6700a --- /dev/null +++ b/src/main/java/me/shedaniel/gui/widget/SmallButton.java @@ -0,0 +1,72 @@ +package me.shedaniel.gui.widget; + +import me.shedaniel.gui.REIRenderHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.util.ResourceLocation; + +import java.awt.*; +import java.util.Arrays; +import java.util.List; +import java.util.function.Function; + +public class SmallButton extends Control { + + private String buttonText; + private Function toolTipSupplier; + protected static final ResourceLocation BUTTON_TEXTURES = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer.png"); + + + public SmallButton(int x, int y, int width, int height, String buttonText, Function toolTipSupplier) { + super(x, y, width, height); + this.buttonText = buttonText; + this.toolTipSupplier = toolTipSupplier; + } + + public SmallButton(Rectangle rect, String buttonText, Function toolTipSupplier) { + super(rect); + this.buttonText = buttonText; + this.toolTipSupplier = toolTipSupplier; + } + + public void setString(String text) { + buttonText = text; + } + + @Override + public void draw() { + GlStateManager.pushMatrix(); + GlStateManager.disableLighting(); + GuiContainer gui = REIRenderHelper.getOverlayedGui(); + Minecraft lvt_4_1_ = Minecraft.getInstance(); + FontRenderer lvt_5_1_ = lvt_4_1_.fontRenderer; + lvt_4_1_.getTextureManager().bindTexture(BUTTON_TEXTURES); + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); + int hoverState = (byte) 0; + if (this.isEnabled()) { + if (!this.isHighlighted()) + hoverState = (byte) 1; + else + hoverState = (byte) 2; + } + + GlStateManager.enableBlend(); + GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + gui.drawTexturedModalRect(rect.x, rect.y, 18 + 44, 222 + hoverState * 10, rect.width, rect.height); + int lvt_7_1_ = 14737632; + + gui.drawCenteredString(lvt_5_1_, this.buttonText, rect.x + rect.width / 2, rect.y + (rect.height - 8) / 2, lvt_7_1_); + GlStateManager.enableLighting(); + GlStateManager.popMatrix(); + String ttS = toolTipSupplier.apply(isEnabled()); + if (isHighlighted() && ttS != "") { + List toolTip = Arrays.asList(ttS.split("\n")); + if (toolTip != null && toolTip.size() != 0) + gui.drawHoveringText(toolTip, REIRenderHelper.getMouseLoc().x, REIRenderHelper.getMouseLoc().y); + } + } + +} diff --git a/src/main/java/me/shedaniel/gui/widget/Tab.java b/src/main/java/me/shedaniel/gui/widget/Tab.java index b667435b0..89024fd46 100644 --- a/src/main/java/me/shedaniel/gui/widget/Tab.java +++ b/src/main/java/me/shedaniel/gui/widget/Tab.java @@ -4,6 +4,7 @@ import me.shedaniel.gui.REIRenderHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -80,8 +81,7 @@ public class Tab extends Control { this.drawTexturedModalRect(rect.x, rect.y - (selected ? 0 : 2), 28, (selected ? 32 : 0), 28, (selected ? 32 : 31)); this.zLevel = 100.0F; this.itemRender.zLevel = 100.0F; - GlStateManager.enableLighting(); - GlStateManager.enableRescaleNormal(); + RenderHelper.enableGUIStandardItemLighting(); this.itemRender.renderItemAndEffectIntoGUI(getItemStack(), l, i1); this.itemRender.renderItemOverlays(Minecraft.getInstance().fontRenderer, getItemStack(), l, i1); GlStateManager.disableLighting(); @@ -98,4 +98,5 @@ public class Tab extends Control { Point mouse = REIRenderHelper.getMouseLoc(); REIRenderHelper.addToolTip(toolTip, mouse.x, mouse.y); } + } diff --git a/src/main/java/me/shedaniel/gui/widget/WidgetArrow.java b/src/main/java/me/shedaniel/gui/widget/WidgetArrow.java index bc916f884..88f3a1438 100755 --- a/src/main/java/me/shedaniel/gui/widget/WidgetArrow.java +++ b/src/main/java/me/shedaniel/gui/widget/WidgetArrow.java @@ -6,6 +6,7 @@ import net.minecraft.client.renderer.RenderHelper; import net.minecraft.util.ResourceLocation; public class WidgetArrow extends Control { + private static final ResourceLocation RECIPE_GUI = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer.png"); private int progress = 0; private int updateTick = 0; @@ -39,4 +40,5 @@ public class WidgetArrow extends Control { progress = 0; } } + } diff --git a/src/main/java/me/shedaniel/impl/REIRecipeManager.java b/src/main/java/me/shedaniel/impl/REIRecipeManager.java index be8f71bbb..624405a22 100755 --- a/src/main/java/me/shedaniel/impl/REIRecipeManager.java +++ b/src/main/java/me/shedaniel/impl/REIRecipeManager.java @@ -1,34 +1,44 @@ pa