From dfa3067117e96aa630a88952f0e5d4535bee8bf3 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 12 Jan 2019 21:28:36 +0800 Subject: Basic Config --- .../me/shedaniel/rei/RoughlyEnoughItemsCore.java | 10 +- .../java/me/shedaniel/rei/client/ClientHelper.java | 26 ++++- .../java/me/shedaniel/rei/client/ConfigHelper.java | 90 +++++++++++++++++ .../me/shedaniel/rei/client/ConfigManager.java | 74 -------------- .../java/me/shedaniel/rei/client/REIConfig.java | 1 + .../me/shedaniel/rei/gui/ContainerGuiOverlay.java | 34 ++++--- .../me/shedaniel/rei/gui/widget/ButtonWidget.java | 14 +-- .../me/shedaniel/rei/gui/widget/ConfigWidget.java | 108 +++++++++++++++++++++ .../shedaniel/rei/gui/widget/ItemListOverlay.java | 10 +- .../rei/gui/widget/RecipeViewingWidget.java | 5 + .../shedaniel/rei/gui/widget/TextFieldWidget.java | 18 ++-- .../rei/mixin/MixinBrewingRecipeRegistry.java | 68 +++++++++++++ .../me/shedaniel/rei/plugin/BrewingRecipe.java | 17 ++++ .../rei/plugin/DefaultBrewingCategory.java | 66 +++++++++++++ .../rei/plugin/DefaultBrewingDisplay.java | 54 +++++++++++ .../me/shedaniel/rei/plugin/DefaultPlugin.java | 14 +++ 16 files changed, 494 insertions(+), 115 deletions(-) create mode 100644 src/main/java/me/shedaniel/rei/client/ConfigHelper.java delete mode 100644 src/main/java/me/shedaniel/rei/client/ConfigManager.java create mode 100644 src/main/java/me/shedaniel/rei/gui/widget/ConfigWidget.java create mode 100644 src/main/java/me/shedaniel/rei/mixin/MixinBrewingRecipeRegistry.java create mode 100644 src/main/java/me/shedaniel/rei/plugin/BrewingRecipe.java create mode 100644 src/main/java/me/shedaniel/rei/plugin/DefaultBrewingCategory.java create mode 100644 src/main/java/me/shedaniel/rei/plugin/DefaultBrewingDisplay.java (limited to 'src/main/java') diff --git a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index 157d8bd26..830251a61 100644 --- a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -2,7 +2,7 @@ package me.shedaniel.rei; import me.shedaniel.rei.api.IRecipePlugin; import me.shedaniel.rei.client.ClientHelper; -import me.shedaniel.rei.client.ConfigManager; +import me.shedaniel.rei.client.ConfigHelper; import me.shedaniel.rei.client.RecipeHelper; import me.shedaniel.rei.listeners.IListener; import me.shedaniel.rei.plugin.DefaultPlugin; @@ -27,7 +27,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer, ModInitiali public static final Identifier DELETE_ITEMS_PACKET = new Identifier("roughlyenoughitems", "deleteitem"); public static final Identifier CREATE_ITEMS_PACKET = new Identifier("roughlyenoughitems", "createitem"); private static final List listeners = new ArrayList<>(); - private static ConfigManager configManager; + private static ConfigHelper configHelper; public static List getListeners(Class listenerClass) { return listeners.stream().filter(listener -> { @@ -37,15 +37,15 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer, ModInitiali }).collect(Collectors.toList()); } - public static ConfigManager getConfigManager() { - return configManager; + public static ConfigHelper getConfigHelper() { + return configHelper; } @Override public void onInitializeClient() { registerREIListeners(); registerDefaultPlugin(); - configManager = new ConfigManager(); + configHelper = new ConfigHelper(); } private void registerDefaultPlugin() { diff --git a/src/main/java/me/shedaniel/rei/client/ClientHelper.java b/src/main/java/me/shedaniel/rei/client/ClientHelper.java index 306ddaa6b..8ca032457 100644 --- a/src/main/java/me/shedaniel/rei/client/ClientHelper.java +++ b/src/main/java/me/shedaniel/rei/client/ClientHelper.java @@ -6,6 +6,7 @@ import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.IRecipeCategory; import me.shedaniel.rei.api.IRecipeDisplay; import me.shedaniel.rei.gui.ContainerGuiOverlay; +import me.shedaniel.rei.gui.widget.ConfigWidget; import me.shedaniel.rei.gui.widget.RecipeViewingWidget; import me.shedaniel.rei.listeners.ClientLoaded; import me.shedaniel.rei.listeners.IMixinContainerGui; @@ -15,6 +16,8 @@ import net.fabricmc.fabric.impl.client.keybinding.KeyBindingRegistryImpl; import net.fabricmc.loader.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.Mouse; +import net.minecraft.client.gui.ContainerGui; +import net.minecraft.client.gui.Gui; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.util.InputUtil; import net.minecraft.enchantment.Enchantment; @@ -23,6 +26,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.server.network.packet.CustomPayloadServerPacket; +import net.minecraft.util.DefaultedList; import net.minecraft.util.Identifier; import net.minecraft.util.PacketByteBuf; import net.minecraft.util.registry.Registry; @@ -30,6 +34,7 @@ import net.minecraft.util.registry.Registry; import java.awt.*; import java.awt.event.KeyEvent; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -117,9 +122,16 @@ public class ClientHelper implements ClientLoaded, ClientModInitializer { return map.keySet().size() > 0; } + public static void openConfigWindow(Gui parent) { + MinecraftClient.getInstance().openGui(new ConfigWidget(parent)); + } + @Override public void clientLoaded() { - Registry.ITEM.forEach(this::registerItem); + Registry.ITEM.forEach(item -> { + if (!item.equals(Items.ENCHANTED_BOOK)) + registerItem(item); + }); Registry.ENCHANTMENT.forEach(enchantment -> { for(int i = enchantment.getMinimumLevel(); i < enchantment.getMaximumLevel(); i++) { Map map = new HashMap<>(); @@ -133,13 +145,23 @@ public class ClientHelper implements ClientLoaded, ClientModInitializer { public void registerItem(Item item) { registerItemStack(item.getDefaultStack()); + DefaultedList stacks = DefaultedList.create(); + item.addStacksForDisplay(item.getItemGroup(), stacks); + stacks.forEach(this::registerItemStack); } public void registerItemStack(ItemStack stack) { - if (!stack.getItem().equals(Items.AIR)) + if (!stack.getItem().equals(Items.AIR) && !alreadyContain(stack)) itemList.add(stack); } + private boolean alreadyContain(ItemStack stack) { + for(ItemStack itemStack : itemList) + if (ItemStack.areEqual(stack, itemStack)) + return true; + return false; + } + @Override public void onInitializeClient() { this.cheating = false; diff --git a/src/main/java/me/shedaniel/rei/client/ConfigHelper.java b/src/main/java/me/shedaniel/rei/client/ConfigHelper.java new file mode 100644 index 000000000..90c789e4a --- /dev/null +++ b/src/main/java/me/shedaniel/rei/client/ConfigHelper.java @@ -0,0 +1,90 @@ +package me.shedaniel.rei.client; + +import me.shedaniel.rei.RoughlyEnoughItemsCore; +import net.fabricmc.loader.FabricLoader; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.file.Files; + +public class ConfigHelper { + + private final File configFile; + private REIConfig config; + private boolean craftableOnly; + + public ConfigHelper() { + this.configFile = new File(FabricLoader.INSTANCE.getConfigDirectory(), "rei.json"); + this.craftableOnly = false; + try { + loadConfig(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void saveConfig() throws IOException { + configFile.getParentFile().mkdirs(); + if (!configFile.exists() && !configFile.createNewFile()) { + RoughlyEnoughItemsCore.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(); + } + } + + public void loadConfig() throws IOException { + if (!configFile.exists() || !configFile.canRead()) { + config = new REIConfig(); + saveConfig(); + return; + } + boolean failed = false; + try { + config = REIConfig.GSON.fromJson(new InputStreamReader(Files.newInputStream(configFile.toPath())), REIConfig.class); + } catch (Exception e) { + failed = true; + } + if (failed || config == null) { + RoughlyEnoughItemsCore.LOGGER.error("REI: Failed to load config! Overwriting with default config."); + config = new REIConfig(); + } + saveConfig(); + } + + public REIItemListOrdering getItemListOrdering() { + return config.itemListOrdering; + } + + public boolean isAscending() { + return config.isAscending; + } + + public boolean craftableOnly() { + return craftableOnly && config.enableCraftableOnlyButton; + } + + public boolean showCraftableOnlyButton() { + return config.enableCraftableOnlyButton; + } + + public void setShowCraftableOnlyButton(boolean enableCraftableOnlyButton) { + config.enableCraftableOnlyButton = enableCraftableOnlyButton; + } + + public boolean sideSearchField() { + return config.sideSearchField; + } + + public void setSideSearchField(boolean sideSearchField) { + config.sideSearchField = sideSearchField; + } + +} diff --git a/src/main/java/me/shedaniel/rei/client/ConfigManager.java b/src/main/java/me/shedaniel/rei/client/ConfigManager.java deleted file mode 100644 index 3ff143f44..000000000 --- a/src/main/java/me/shedaniel/rei/client/ConfigManager.java +++ /dev/null @@ -1,74 +0,0 @@ -package me.shedaniel.rei.client; - -import me.shedaniel.rei.RoughlyEnoughItemsCore; -import net.fabricmc.loader.FabricLoader; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.file.Files; - -public class ConfigManager { - - private final File configFile; - private REIConfig config; - private boolean craftableOnly; - - public ConfigManager() { - this.configFile = new File(FabricLoader.INSTANCE.getConfigDirectory(), "rei.json"); - this.craftableOnly = false; - try { - loadConfig(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public void saveConfig() throws IOException { - configFile.getParentFile().mkdirs(); - if (!configFile.exists() && !configFile.createNewFile()) { - RoughlyEnoughItemsCore.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(); - } - } - - public void loadConfig() throws IOException { - if (!configFile.exists() || !configFile.canRead()) { - config = new REIConfig(); - saveConfig(); - return; - } - boolean failed = false; - try { - config = REIConfig.GSON.fromJson(new InputStreamReader(Files.newInputStream(configFile.toPath())), REIConfig.class); - } catch (Exception e) { - failed = true; - } - if (failed || config == null) { - RoughlyEnoughItemsCore.LOGGER.error("REI: Failed to load config! Overwriting with default config."); - config = new REIConfig(); - } - saveConfig(); - } - - public REIItemListOrdering getItemListOrdering() { - return config.itemListOrdering; - } - - public boolean isAscending() { - return config.isAscending; - } - - public boolean craftableOnly() { - return craftableOnly && config.enableCraftableOnlyButton; - } - -} diff --git a/src/main/java/me/shedaniel/rei/client/REIConfig.java b/src/main/java/me/shedaniel/rei/client/REIConfig.java index 2f4060a9f..7c9079245 100644 --- a/src/main/java/me/shedaniel/rei/client/REIConfig.java +++ b/src/main/java/me/shedaniel/rei/client/REIConfig.java @@ -14,5 +14,6 @@ public class REIConfig { public REIItemListOrdering itemListOrdering = REIItemListOrdering.REGISTRY; public boolean isAscending = true; public boolean enableCraftableOnlyButton = true; + public boolean sideSearchField = false; } diff --git a/src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java b/src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java index a7fde1457..5a5581597 100644 --- a/src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java +++ b/src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java @@ -81,6 +81,12 @@ public class ContainerGuiOverlay extends Gui { ClientHelper.setCheating(!ClientHelper.isCheating()); } }); + widgets.add(new ButtonWidget(10, 35, 40, 20, I18n.translate("text.rei.config")) { + @Override + public void onPressed(int button, double mouseX, double mouseY) { + ClientHelper.openConfigWindow(containerGui.getContainerGui()); + } + }); this.widgets.add(new LabelWidget(rectangle.x + (rectangle.width / 2), rectangle.y + 10, "") { @Override public void draw(int mouseX, int mouseY, float partialTicks) { @@ -89,25 +95,21 @@ public class ContainerGuiOverlay extends Gui { super.draw(mouseX, mouseY, partialTicks); } }); -// Rectangle textFieldArea = getTextFieldArea(); -// this.widgets.add(searchField = new TextFieldWidget(-1, MinecraftClient.getInstance().fontRenderer, -// (int) textFieldArea.getX(), (int) textFieldArea.getY(), (int) textFieldArea.getWidth(), (int) textFieldArea.getHeight()) { -// @Override -// public void addText(String string_1) { -// super.addText(string_1); -// searchTerm = this.getText(); -// itemListOverlay.updateList(page, searchTerm); -// } -// }); if (GuiHelper.searchField == null) GuiHelper.searchField = new TextFieldWidget(0, 0, 0, 0) { @Override - public void addText(String string_1) { - super.addText(string_1); - searchTerm = this.getText(); - itemListOverlay.updateList(page, searchTerm); + public boolean mouseClicked(double double_1, double double_2, int int_1) { + if (isVisible() && getBounds().contains(double_1, double_2) && int_1 == 1) { + setText(""); + return true; + } + return super.mouseClicked(double_1, double_2, int_1); } }; + GuiHelper.searchField.setChangedListener(s -> { + searchTerm = s; + itemListOverlay.updateList(page, searchTerm); + }); GuiHelper.searchField.setBounds(getTextFieldArea()); this.widgets.add(GuiHelper.searchField); GuiHelper.searchField.setText(searchTerm); @@ -116,6 +118,8 @@ public class ContainerGuiOverlay extends Gui { } private Rectangle getTextFieldArea() { + if (RoughlyEnoughItemsCore.getConfigHelper().sideSearchField()) + return new Rectangle(rectangle.x + 2, window.getScaledHeight() - 22, rectangle.width - 6, 18); if (MinecraftClient.getInstance().currentGui instanceof RecipeViewingWidget) { RecipeViewingWidget widget = (RecipeViewingWidget) MinecraftClient.getInstance().currentGui; return new Rectangle(widget.getBounds().x, window.getScaledHeight() - 22, widget.getBounds().width, 18); @@ -128,7 +132,7 @@ public class ContainerGuiOverlay extends Gui { } private Rectangle getItemListArea() { - return new Rectangle(rectangle.x + 2, rectangle.y + 24, rectangle.width - 4, rectangle.height - 27); + return new Rectangle(rectangle.x + 2, rectangle.y + 24, rectangle.width - 4, rectangle.height - (RoughlyEnoughItemsCore.getConfigHelper().sideSearchField() ? 27 + 22 : 27)); } public Rectangle getRectangle() { diff --git a/src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java index 2a69df8ff..238efc2e3 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java @@ -28,17 +28,17 @@ public abstract class ButtonWidget extends Drawable implements IWidget { private boolean pressed; private Rectangle bounds; - public ButtonWidget(int int_2, int int_3, int int_4, int int_5, String string_1) { + public ButtonWidget(int x, int y, int width, int height, String text) { this.width = 200; this.height = 20; this.enabled = true; this.visible = true; - this.x = int_2; - this.y = int_3; - this.width = int_4; - this.height = int_5; - this.text = string_1; - this.bounds = new Rectangle(x, y, width, height); + this.x = x; + this.y = y; + this.width = width; + this.height = height; + this.text = text; + this.bounds = new Rectangle(x, this.y, this.width, this.height); } public Rectangle getBounds() { diff --git a/src/main/java/me/shedaniel/rei/gui/widget/ConfigWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/ConfigWidget.java new file mode 100644 index 000000000..d0a094b49 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/widget/ConfigWidget.java @@ -0,0 +1,108 @@ +package me.shedaniel.rei.gui.widget; + +import com.google.common.collect.Lists; +import me.shedaniel.rei.RoughlyEnoughItemsCore; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiEventListener; +import net.minecraft.client.render.GuiLighting; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.util.Window; + +import java.io.IOException; +import java.util.List; + +public class ConfigWidget extends Gui { + + private List widgets; + private Gui parent; + + public ConfigWidget(Gui parent) { + this.parent = parent; + this.widgets = Lists.newArrayList(); + } + + @Override + public boolean keyPressed(int int_1, int int_2, int int_3) { + if (int_1 == 256 && this.doesEscapeKeyClose()) { + MinecraftClient.getInstance().openGui(parent); + return true; + } else { + return super.keyPressed(int_1, int_2, int_3); + } + } + + @Override + protected void onInitialized() { + super.onInitialized(); + widgets.clear(); + Window window = MinecraftClient.getInstance().window; + widgets.add(new ButtonWidget(window.getScaledWidth() / 2 - 20, 30, 40, 20, "") { + @Override + public void onPressed(int button, double mouseX, double mouseY) { + if (button == 0) + RoughlyEnoughItemsCore.getConfigHelper().setSideSearchField(!RoughlyEnoughItemsCore.getConfigHelper().sideSearchField()); + try { + RoughlyEnoughItemsCore.getConfigHelper().saveConfig(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void draw(int mouseX, int mouseY, float partialTicks) { + text = getTrueFalseText(RoughlyEnoughItemsCore.getConfigHelper().sideSearchField()); + String t = I18n.translate("text.rei.centre_searchbox"); + int width = fontRenderer.getStringWidth(t); + fontRenderer.drawWithShadow(t, this.x - width - 10, this.y + (this.height - 8) / 2, -1); + super.draw(mouseX, mouseY, partialTicks); + } + }); + widgets.add(new ButtonWidget(window.getScaledWidth() / 2 - 20, 60, 40, 20, "") { + @Override + public void onPressed(int button, double mouseX, double mouseY) { + if (button == 0) + RoughlyEnoughItemsCore.getConfigHelper().setShowCraftableOnlyButton(!RoughlyEnoughItemsCore.getConfigHelper().showCraftableOnlyButton()); + try { + RoughlyEnoughItemsCore.getConfigHelper().saveConfig(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void draw(int mouseX, int mouseY, float partialTicks) { + text = getTrueFalseText(RoughlyEnoughItemsCore.getConfigHelper().showCraftableOnlyButton()); + String t = I18n.translate("text.rei.enable_craftable_only"); + int width = fontRenderer.getStringWidth(t); + fontRenderer.drawWithShadow(t, this.x - width - 10, this.y + (this.height - 8) / 2, -1); + super.draw(mouseX, mouseY, partialTicks); + } + }); + } + + private String getTrueFalseText(boolean showCraftableOnlyButton) { + return String.format("%s%b", showCraftableOnlyButton ? "§a" : "§c", showCraftableOnlyButton); + } + + @Override + public void draw(int int_1, int int_2, float float_1) { + drawBackground(0); + super.draw(int_1, int_2, float_1); + widgets.forEach(widget -> { + GuiLighting.disable(); + widget.draw(int_1, int_2, float_1); + }); + } + + @Override + public boolean isPauseScreen() { + return false; + } + + @Override + public List getEntries() { + return widgets; + } + +} diff --git a/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java b/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java index a87775c7d..f515a6ede 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java @@ -106,7 +106,7 @@ public class ItemListOverlay extends Drawable implements IWidget { List os = new LinkedList<>(ol), stacks = Lists.newArrayList(), finalStacks = Lists.newArrayList(); List itemGroups = new LinkedList<>(Arrays.asList(ItemGroup.GROUPS)); itemGroups.add(null); - REIItemListOrdering ordering = RoughlyEnoughItemsCore.getConfigManager().getItemListOrdering(); + REIItemListOrdering ordering = RoughlyEnoughItemsCore.getConfigHelper().getItemListOrdering(); if (ordering != REIItemListOrdering.REGISTRY) Collections.sort(os, (itemStack, t1) -> { if (ordering.equals(REIItemListOrdering.NAME)) @@ -115,7 +115,7 @@ public class ItemListOverlay extends Drawable implements IWidget { return itemGroups.indexOf(itemStack.getItem().getItemGroup()) - itemGroups.indexOf(t1.getItem().getItemGroup()); return 0; }); - if (!RoughlyEnoughItemsCore.getConfigManager().isAscending()) + if (!RoughlyEnoughItemsCore.getConfigHelper().isAscending()) Collections.reverse(os); Arrays.stream(searchTerm.split("\\|")).forEachOrdered(s -> { List arguments = new ArrayList<>(); @@ -135,14 +135,14 @@ public class ItemListOverlay extends Drawable implements IWidget { arguments.add(new SearchArgument(SearchArgument.ArgumentType.TEXT, s, true)); os.stream().filter(itemStack -> filterItem(itemStack, arguments)).forEachOrdered(stacks::add); }); - List workingItems = RoughlyEnoughItemsCore.getConfigManager().craftableOnly() && inventoryItems.size() > 0 ? new ArrayList<>() : new LinkedList<>(ol); - if (RoughlyEnoughItemsCore.getConfigManager().craftableOnly()) { + List workingItems = RoughlyEnoughItemsCore.getConfigHelper().craftableOnly() && inventoryItems.size() > 0 ? new ArrayList<>() : new LinkedList<>(ol); + if (RoughlyEnoughItemsCore.getConfigHelper().craftableOnly()) { RecipeHelper.findCraftableByItems(inventoryItems).forEach(workingItems::add); workingItems.addAll(inventoryItems); } final List finalWorkingItems = workingItems; finalStacks.addAll(stacks.stream().filter(itemStack -> { - if (!RoughlyEnoughItemsCore.getConfigManager().craftableOnly()) + if (!RoughlyEnoughItemsCore.getConfigHelper().craftableOnly()) return true; for(ItemStack workingItem : finalWorkingItems) if (itemStack.isEqualIgnoreTags(workingItem)) diff --git a/src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidget.java index 365ed3cdd..777106f93 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidget.java @@ -73,6 +73,11 @@ public class RecipeViewingWidget extends Gui { return super.keyPressed(int_1, int_2, int_3); } + @Override + public boolean isPauseScreen() { + return false; + } + @Override public void onClosed() { GuiHelper.resetOverlay(); diff --git a/src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java index e735293be..d6b0dbfba 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java @@ -49,13 +49,6 @@ public class TextFieldWidget extends Drawable implements IWidget { this(rectangle.x, rectangle.y, rectangle.width, rectangle.height); } - public void setBounds(Rectangle rectangle) { - this.x = rectangle.x; - this.y = rectangle.y; - this.width = rectangle.width; - this.height = rectangle.height; - } - public TextFieldWidget(int x, int y, int width, int height) { this.text = ""; this.maxLength = 32; @@ -76,6 +69,17 @@ public class TextFieldWidget extends Drawable implements IWidget { this.height = height; } + public Rectangle getBounds() { + return new Rectangle(x, y, width, height); + } + + public void setBounds(Rectangle rectangle) { + this.x = rectangle.x; + this.y = rectangle.y; + this.width = rectangle.width; + this.height = rectangle.height; + } + public void setChangedListener(Consumer biConsumer_1) { this.changedListener = biConsumer_1; } diff --git a/src/main/java/me/shedaniel/rei/mixin/MixinBrewingRecipeRegistry.java b/src/main/java/me/shedaniel/rei/mixin/MixinBrewingRecipeRegistry.java new file mode 100644 index 000000000..5813a42b3 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/mixin/MixinBrewingRecipeRegistry.java @@ -0,0 +1,68 @@ +package me.shedaniel.rei.mixin; + +import com.google.common.collect.Lists; +import me.shedaniel.rei.plugin.BrewingRecipe; +import me.shedaniel.rei.plugin.DefaultBrewingDisplay; +import me.shedaniel.rei.plugin.DefaultPlugin; +import net.minecraft.item.Item; +import net.minecraft.item.ItemProvider; +import net.minecraft.item.ItemStack; +import net.minecraft.item.PotionItem; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionUtil; +import net.minecraft.recipe.BrewingRecipeRegistry; +import net.minecraft.recipe.Ingredient; +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 java.util.List; + +@Mixin(BrewingRecipeRegistry.class) +public class MixinBrewingRecipeRegistry { + + private static final List ITEM_RECIPES = Lists.newArrayList(); + private static final List REGISTERED_POTION_TYPES = Lists.newArrayList(); + private static final List POTION_TYPES = Lists.newArrayList(); + + @Inject(method = "method_8080", at = @At("RETURN")) + private static void method_8080(Item item_1, CallbackInfo ci) { + if (!(item_1 instanceof PotionItem)) { + } else { + POTION_TYPES.add(Ingredient.ofItems(new ItemProvider[]{item_1})); + } + } + + @Inject(method = "method_8071", at = @At("RETURN")) + private static void method_8071(Item item_1, Item item_2, Item item_3, CallbackInfo ci) { + if (!(item_1 instanceof PotionItem)) { + } else if (!(item_3 instanceof PotionItem)) { + } else { + ITEM_RECIPES.add(new BrewingRecipe(item_1, Ingredient.ofItems(new ItemProvider[]{item_2}), item_3)); + } + } + + @Inject(method = "registerPotionRecipe", at = @At("RETURN")) + private static void registerPotionRecipe(Potion potion_1, Item item_1, Potion potion_2, CallbackInfo ci) { + if (!REGISTERED_POTION_TYPES.contains(potion_1)) + registerPotionType(potion_1); + if (!REGISTERED_POTION_TYPES.contains(potion_2)) + registerPotionType(potion_2); + POTION_TYPES.forEach(ingredient -> { + for(ItemStack stack : ingredient.getStackArray()) { + DefaultPlugin.registerBrewingDisplay(new DefaultBrewingDisplay(PotionUtil.setPotion(stack.copy(), potion_1), Ingredient.ofItems(new ItemProvider[]{item_1}), + PotionUtil.setPotion(stack.copy(), potion_2))); + } + }); + } + + private static void registerPotionType(Potion potion) { + REGISTERED_POTION_TYPES.add(potion); + ITEM_RECIPES.forEach(recipe -> { + DefaultPlugin.registerBrewingDisplay(new DefaultBrewingDisplay(PotionUtil.setPotion(recipe.input.getDefaultStack(), potion), recipe.ingredient, + PotionUtil.setPotion(recipe.output.getDefaultStack(), potion))); + }); + } + +} diff --git a/src/main/java/me/shedaniel/rei/plugin/BrewingRecipe.java b/src/main/java/me/shedaniel/rei/plugin/BrewingRecipe.java new file mode 100644 index 000000000..b4bcdb39a --- /dev/null +++ b/src/main/java/me/shedaniel/rei/plugin/BrewingRecipe.java @@ -0,0 +1,17 @@ +package me.shedaniel.rei.plugin; + +import net.minecraft.item.Item; +import net.minecraft.recipe.Ingredient; + +public class BrewingRecipe { + + public final Item input; + public final Ingredient ingredient; + public final Item output; + + public BrewingRecipe(Item object_1, Ingredient ingredient_1, Item object_2) { + this.input = object_1; + this.ingredient = ingredient_1; + this.output = object_2; + } +} \ No newline at end of file diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultBrewingCategory.java b/src/main/java/me/shedaniel/rei/plugin/DefaultBrewingCategory.java new file mode 100644 index 000000000..1f28e1ce1 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/plugin/DefaultBrewingCategory.java @@ -0,0 +1,66 @@ +package me.shedaniel.rei.plugin; + +import com.mojang.blaze3d.platform.GlStateManager; +import me.shedaniel.rei.api.IRecipeCategory; +import me.shedaniel.rei.gui.widget.IWidget; +import me.shedaniel.rei.gui.widget.ItemSlotWidget; +import me.shedaniel.rei.gui.widget.RecipeBaseWidget; +import me.shedaniel.rei.listeners.IMixinContainerGui; +import net.minecraft.block.Blocks; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.GuiLighting; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; + +import java.awt.*; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +public class DefaultBrewingCategory implements IRecipeCategory { + + private static final Identifier DISPLAY_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/display.png"); + + @Override + public Identifier getIdentifier() { + return DefaultPlugin.BREWING; + } + + @Override + public ItemStack getCategoryIcon() { + return new ItemStack(Blocks.BREWING_STAND); + } + + @Override + public String getCategoryName() { + return I18n.translate("category.rei.brewing"); + } + + @Override + public List setupDisplay(IMixinContainerGui containerGui, DefaultBrewingDisplay recipeDisplay, Rectangle bounds) { + Point startPoint = new Point((int) bounds.getCenterX() - 52, (int) bounds.getCenterY() - 29); + List widgets = new LinkedList<>(Arrays.asList(new RecipeBaseWidget(bounds) { + @Override + public void draw(int mouseX, int mouseY, float partialTicks) { + super.draw(mouseX, mouseY, partialTicks); + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); + GuiLighting.disable(); + MinecraftClient.getInstance().getTextureManager().bindTexture(DISPLAY_TEXTURE); + drawTexturedRect(startPoint.x, startPoint.y, 0, 108, 103, 59); + int width = MathHelper.ceil((System.currentTimeMillis() / 250 % 18d) / 1f); + drawTexturedRect(startPoint.x + 44, startPoint.y + 28, 103, 163, width, 4); + } + })); + widgets.add(new ItemSlotWidget(startPoint.x + 1, startPoint.y + 1, Arrays.asList(new ItemStack(Items.BLAZE_POWDER)), false, true, containerGui, true)); + widgets.add(new ItemSlotWidget(startPoint.x + 63, startPoint.y + 1, recipeDisplay.getInput().get(0), false, true, containerGui, true)); + widgets.add(new ItemSlotWidget(startPoint.x + 40, startPoint.y + 1, recipeDisplay.getInput().get(1), false, true, containerGui, true)); + widgets.add(new ItemSlotWidget(startPoint.x + 40, startPoint.y + 35, recipeDisplay.getOutput(0), false, true, containerGui, true)); + widgets.add(new ItemSlotWidget(startPoint.x + 63, startPoint.y + 42, recipeDisplay.getOutput(1), false, true, containerGui, true)); + widgets.add(new ItemSlotWidget(startPoint.x + 86, startPoint.y + 35, recipeDisplay.getOutput(2), false, true, containerGui, true)); + return widgets; + } + +} diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultBrewingDisplay.java b/src/main/java/me/shedaniel/rei/plugin/DefaultBrewingDisplay.java new file mode 100644 index 000000000..1b0057e11 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/plugin/DefaultBrewingDisplay.java @@ -0,0 +1,54 @@ +package me.shedaniel.rei.plugin; + +import me.shedaniel.rei.api.IRecipeDisplay; +import net.minecraft.block.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.recipe.Ingredient; +import net.minecraft.recipe.Recipe; +import net.minecraft.util.Identifier; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class DefaultBrewingDisplay implements IRecipeDisplay { + + private ItemStack input, output; + private Ingredient reactant; + + public DefaultBrewingDisplay(ItemStack input, Ingredient reactant, ItemStack output) { + this.input = input; + this.reactant = reactant; + this.output = output; + } + + @Override + public Recipe getRecipe() { + return null; + } + + @Override + public List> getInput() { + return Arrays.asList(Arrays.asList(input), Arrays.asList(reactant.getStackArray())); + } + + @Override + public List getOutput() { + return Arrays.asList(output); + } + + @Override + public Identifier getRecipeCategory() { + return DefaultPlugin.BREWING; + } + + public List getOutput(int slot) { + List stack = new ArrayList<>(); + for(int i = 0; i < slot * 2; i++) + stack.add(new ItemStack(Blocks.AIR)); + for(int i = 0; i < 6 - slot * 2; i++) + stack.addAll(getOutput()); + return stack; + } + +} diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java index c2359e09b..6b9b6341f 100644 --- a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java +++ b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java @@ -1,5 +1,7 @@ package me.shedaniel.rei.plugin; +import com.google.common.collect.Lists; +import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.IRecipePlugin; import me.shedaniel.rei.client.RecipeHelper; import net.minecraft.recipe.Recipe; @@ -10,12 +12,21 @@ import net.minecraft.recipe.smelting.SmeltingRecipe; import net.minecraft.recipe.smelting.SmokingRecipe; import net.minecraft.util.Identifier; +import java.util.List; + public class DefaultPlugin implements IRecipePlugin { static final Identifier CRAFTING = new Identifier("roughlyenoughitems", "plugins/crafting"); static final Identifier SMELTING = new Identifier("roughlyenoughitems", "plugins/smelting"); static final Identifier SMOKING = new Identifier("roughlyenoughitems", "plugins/smoking"); static final Identifier BLASTING = new Identifier("roughlyenoughitems", "plugins/blasting"); + static final Identifier BREWING = new Identifier("roughlyenoughitems", "plugins/brewing"); + + static final List BREWING_DISPLAYS = Lists.newArrayList(); + + public static void registerBrewingDisplay(DefaultBrewingDisplay display) { + BREWING_DISPLAYS.add(display); + } @Override public void registerPluginCategories() { @@ -23,6 +34,7 @@ public class DefaultPlugin implements IRecipePlugin { RecipeHelper.registerCategory(new DefaultSmeltingCategory()); RecipeHelper.registerCategory(new DefaultSmokingCategory()); RecipeHelper.registerCategory(new DefaultBlastingCategory()); + RecipeHelper.registerCategory(new DefaultBrewingCategory()); } @Override @@ -38,6 +50,8 @@ public class DefaultPlugin implements IRecipePlugin { RecipeHelper.registerRecipe(SMOKING, new DefaultSmokingDisplay((SmokingRecipe) value)); else if (value instanceof BlastingRecipe) RecipeHelper.registerRecipe(BLASTING, new DefaultBlastingDisplay((BlastingRecipe) value)); + BREWING_DISPLAYS.forEach(display -> RecipeHelper.registerRecipe(BREWING, display)); + RoughlyEnoughItemsCore.LOGGER.info("bad lol " + BREWING_DISPLAYS.size()); } } -- cgit