From 72e1653cbb38282f8dce59a00fb381e18bfc795d Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 8 Jan 2019 18:23:00 +0800 Subject: Craftable Only WIP --- src/main/java/me/shedaniel/gui/ConfigGui.java | 29 ++++++++- src/main/java/me/shedaniel/gui/Drawable.java | 2 + src/main/java/me/shedaniel/gui/GuiItemList.java | 74 ++++++++++++++++++++-- .../java/me/shedaniel/gui/REIRenderHelper.java | 6 ++ src/main/java/me/shedaniel/gui/RecipeGui.java | 11 ++-- src/main/java/me/shedaniel/gui/SearchArgument.java | 1 + src/main/java/me/shedaniel/gui/widget/Button.java | 2 - src/main/java/me/shedaniel/gui/widget/Control.java | 6 +- .../java/me/shedaniel/gui/widget/IFocusable.java | 2 + src/main/java/me/shedaniel/gui/widget/REISlot.java | 1 + src/main/java/me/shedaniel/gui/widget/TextBox.java | 1 + .../java/me/shedaniel/gui/widget/WidgetArrow.java | 2 + 12 files changed, 119 insertions(+), 18 deletions(-) (limited to 'src/main/java/me/shedaniel/gui') diff --git a/src/main/java/me/shedaniel/gui/ConfigGui.java b/src/main/java/me/shedaniel/gui/ConfigGui.java index 266347adf..6deeb24ea 100644 --- a/src/main/java/me/shedaniel/gui/ConfigGui.java +++ b/src/main/java/me/shedaniel/gui/ConfigGui.java @@ -74,6 +74,30 @@ public class ConfigGui extends Gui { } }); addButton(new ButtonWidget(1001, parent.width / 2 - 90, 150, 150, 20, "") { + @Override + public void onPressed(double double_1, double double_2) { + Core.config.enableCraftableOnlyButton = !Core.config.enableCraftableOnlyButton; + try { + Core.saveConfig(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void draw(int int_1, int int_2, float float_1) { + GuiLighting.disable(); + this.text = I18n.translate("text.rei.enable_craftable_only.button", Core.config.enableCraftableOnlyButton ? "§a" : "§c", Core.config.enableCraftableOnlyButton); + super.draw(int_1, int_2, float_1); + if (this.hovered) + drawSuggestion(int_1, int_2); + } + + protected void drawSuggestion(int x, int y) { + drawTooltip(Arrays.asList(I18n.translate("text.rei.enable_craftable_only.tooltip").split("\n")), x, y); + } + }); + addButton(new ButtonWidget(1002, parent.width / 2 - 90, 180, 150, 20, "") { @Override public void onPressed(double double_1, double double_2) { int index = Arrays.asList(REIItemListOrdering.values()).indexOf(Core.config.itemListOrdering) + 1; @@ -89,7 +113,7 @@ public class ConfigGui extends Gui { e.printStackTrace(); } } - + @Override public void draw(int int_1, int int_2, float float_1) { GuiLighting.disable(); @@ -112,7 +136,7 @@ public class ConfigGui extends Gui { text = I18n.translate("key.rei.hide") + ": "; drawString(MinecraftClient.getInstance().fontRenderer, text, parent.width / 2 - 25 - MinecraftClient.getInstance().fontRenderer.getStringWidth(text), 90 + 6, -1); text = I18n.translate("text.rei.list_ordering") + ": "; - drawString(MinecraftClient.getInstance().fontRenderer, text, parent.width / 2 - 95 - MinecraftClient.getInstance().fontRenderer.getStringWidth(text), 150 + 6, -1); + drawString(MinecraftClient.getInstance().fontRenderer, text, parent.width / 2 - 95 - MinecraftClient.getInstance().fontRenderer.getStringWidth(text), 180 + 6, -1); } @Override @@ -126,4 +150,5 @@ public class ConfigGui extends Gui { 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 18ea59d9b..18f8c3db8 100755 --- a/src/main/java/me/shedaniel/gui/GuiItemList.java +++ b/src/main/java/me/shedaniel/gui/GuiItemList.java @@ -1,8 +1,10 @@ package me.shedaniel.gui; +import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.platform.GlStateManager; import me.shedaniel.ClientListener; import me.shedaniel.Core; +import me.shedaniel.api.IRecipe; import me.shedaniel.config.REIItemListOrdering; import me.shedaniel.gui.widget.Button; import me.shedaniel.gui.widget.Control; @@ -14,12 +16,15 @@ import net.fabricmc.fabric.client.itemgroup.FabricCreativeGuiComponents; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.ContainerGui; import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.render.GuiLighting; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.util.Window; +import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.text.TextComponent; import net.minecraft.text.TranslatableTextComponent; +import net.minecraft.util.DefaultedList; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; import net.minecraft.util.registry.Registry; @@ -45,10 +50,11 @@ public class GuiItemList extends Drawable { protected boolean visible = true; private int oldGuiLeft = 0; private boolean cheatMode = false; + private List lastPlayerItems = new ArrayList<>(); public GuiItemList(ContainerGui overlayedGui) { super(calculateRect(overlayedGui)); - FOOTERSIZE = Core.centreSearchBox ? 18 : 44; + FOOTERSIZE = Core.runtimeConfig.centreSearchBox ? 18 : 44; displaySlots = new ArrayList<>(); controls = new ArrayList<>(); this.overlayedGui = overlayedGui; @@ -102,11 +108,21 @@ public class GuiItemList extends Drawable { } searchBox = new TextBox(getSearchBoxArea()); searchBox.setText(savedText); + if (Core.config.enableCraftableOnlyButton) { + Button buttonCraftableOnly = new Button(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.translate("text.rei.config")); buttonConfig.onClick = i -> { + MinecraftClient.getInstance().openGui(null); MinecraftClient.getInstance().openGui(new ConfigGui(overlayedGui)); return true; }; @@ -119,13 +135,21 @@ public class GuiItemList extends Drawable { } private Rectangle getSearchBoxArea() { + int widthOffset = Core.config.enableCraftableOnlyButton ? -24 : 0; int ch = ((IMixinContainerGui) overlayedGui).getContainerHeight(), cw = ((IMixinContainerGui) overlayedGui).getContainerWidth(); - if (Core.centreSearchBox) { + if (Core.runtimeConfig.centreSearchBox) { if (ch + 4 + 18 > MinecraftClient.getInstance().window.getScaledHeight()) //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); + 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 - 2); + searchBoxArea.setSize(20, 20); + return searchBoxArea; } private void fillSlots() { @@ -184,11 +208,22 @@ public class GuiItemList extends Drawable { public void draw() { if (!visible) return; + if (MinecraftClient.getInstance().currentGui instanceof ContainerGui) + overlayedGui = (ContainerGui) MinecraftClient.getInstance().currentGui; + if (Core.runtimeConfig.craftableOnly) { + List currentPlayerItems = getInventoryItemsTypes(); + for(ItemStack item : lastPlayerItems) + if (!currentPlayerItems.contains(item) || currentPlayerItems.size() != lastPlayerItems.size()) { + lastPlayerItems = new ArrayList<>(currentPlayerItems); + updateView(); + } + } if (needsResize == true || oldGuiLeft != ((IMixinContainerGui) overlayedGui).getGuiLeft()) resize(); GlStateManager.pushMatrix(); updateButtons(); controls.forEach(Control::draw); + GuiLighting.disable(); String header = String.format("%s/%s", page + 1, MathHelper.ceil(view.size() / displaySlots.size()) + 1); MinecraftClient.getInstance().fontRenderer.drawWithShadow(header, rect.x + (rect.width / 2) - (MinecraftClient.getInstance().fontRenderer.getStringWidth(header) / 2), rect.y + 10, -1); GlStateManager.popMatrix(); @@ -283,11 +318,38 @@ public class GuiItemList extends Drawable { stackList.stream().filter(itemStack -> filterItem(itemStack, arguments)).forEachOrdered(stacks::add); }); } - view.addAll(stacks.stream().distinct().collect(Collectors.toList())); + List workingItems = ClientListener.stackList == null ? new ArrayList<>() : ClientListener.stackList; + if (Core.runtimeConfig.craftableOnly) { + List workingRecipes = new ArrayList<>(); + REIRecipeManager.instance().findUsageForItems(getInventoryItemsTypes()).forEach(workingRecipes::add); + workingItems = new ArrayList<>(); + for(IRecipe workingRecipe : workingRecipes) { + List list = workingRecipe.getOutput(); + try { + workingItems.addAll((List) list); + } catch (Exception e) { + } + } + } + final List finalWorkingItems = workingItems; + view.addAll(stacks.stream().filter(itemStack -> { + for(ItemStack workingItem : finalWorkingItems) + if (itemStack.isEqualIgnoreTags(workingItem)) + return true; + return false; + }).distinct().collect(Collectors.toList())); page = 0; fillSlots(); } + private List getInventoryItemsTypes() { + List> field_7543 = ImmutableList.of(MinecraftClient.getInstance().player.inventory.main, MinecraftClient.getInstance().player.inventory.armor + , MinecraftClient.getInstance().player.inventory.offHand); + List inventoryStacks = new ArrayList<>(); + field_7543.forEach(inventoryStacks::addAll); + return inventoryStacks.stream().distinct().collect(Collectors.toList()); + } + private boolean filterItem(ItemStack itemStack, List arguments) { String mod = getMod(itemStack); List toolTipsList = REIRenderHelper.getOverlayedGui().getStackTooltip(itemStack); diff --git a/src/main/java/me/shedaniel/gui/REIRenderHelper.java b/src/main/java/me/shedaniel/gui/REIRenderHelper.java index 99f22c120..81d5be801 100755 --- a/src/main/java/me/shedaniel/gui/REIRenderHelper.java +++ b/src/main/java/me/shedaniel/gui/REIRenderHelper.java @@ -26,6 +26,7 @@ import java.util.stream.Collectors; * Created by James on 7/28/2018. */ public class REIRenderHelper { + static Point mouseLoc; static public GuiItemList reiGui; static ContainerGui overlayedGui; @@ -230,6 +231,10 @@ public class REIRenderHelper { reiGui.tick(); } + public static boolean isGuiVisible() { + return reiGui != null && reiGui.visible; + } + public static boolean recipeKeyBind() { if (!(MinecraftClient.getInstance().currentGui instanceof ContainerGui)) return false; @@ -271,4 +276,5 @@ public class REIRenderHelper { } return false; } + } diff --git a/src/main/java/me/shedaniel/gui/RecipeGui.java b/src/main/java/me/shedaniel/gui/RecipeGui.java index 11731b120..7e6acdef9 100755 --- a/src/main/java/me/shedaniel/gui/RecipeGui.java +++ b/src/main/java/me/shedaniel/gui/RecipeGui.java @@ -1,7 +1,7 @@ package me.shedaniel.gui; import com.mojang.blaze3d.platform.GlStateManager; -import me.shedaniel.api.DisplayCategoryCraftable; +import me.shedaniel.api.IDisplayCategoryCraftable; import me.shedaniel.api.IDisplayCategory; import me.shedaniel.api.IRecipe; import me.shedaniel.gui.widget.Button; @@ -166,12 +166,12 @@ public class RecipeGui extends ContainerGui { List newControls = new LinkedList<>(); selectedCategory.addWidget(newControls, 0); - if (selectedCategory instanceof DisplayCategoryCraftable) - ((DisplayCategoryCraftable) selectedCategory).registerAutoCraftButton(newControls, this, getPrevScreen(), recipe, 0); + 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 DisplayCategoryCraftable) - ((DisplayCategoryCraftable) selectedCategory).registerAutoCraftButton(newControls, this, getPrevScreen(), recipes.get(selectedCategory).get(recipePointer + 1), 1); + if (selectedCategory instanceof IDisplayCategoryCraftable) + ((IDisplayCategoryCraftable) selectedCategory).registerAutoCraftButton(newControls, this, getPrevScreen(), recipes.get(selectedCategory).get(recipePointer + 1), 1); } newControls.forEach(f -> f.move(left, top)); controls.addAll(newControls); @@ -283,4 +283,5 @@ public class RecipeGui extends ContainerGui { 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 e4339fd64..f87b72f73 100755 --- a/src/main/java/me/shedaniel/gui/widget/Button.java +++ b/src/main/java/me/shedaniel/gui/widget/Button.java @@ -17,7 +17,6 @@ public class Button extends Control { private String buttonText; protected static final Identifier BUTTON_TEXTURES = new Identifier("textures/gui/widgets.png"); - public Button(int x, int y, int width, int height, String buttonText) { super(x, y, width, height); this.buttonText = buttonText; @@ -32,7 +31,6 @@ public class Button extends Control { buttonText = text; } - @Override public void draw() { GlStateManager.pushMatrix(); diff --git a/src/main/java/me/shedaniel/gui/widget/Control.java b/src/main/java/me/shedaniel/gui/widget/Control.java index 9be17a0c2..18e89113f 100755 --- a/src/main/java/me/shedaniel/gui/widget/Control.java +++ b/src/main/java/me/shedaniel/gui/widget/Control.java @@ -1,7 +1,7 @@ package me.shedaniel.gui.widget; import com.mojang.blaze3d.platform.GlStateManager; -import me.shedaniel.api.TriBooleanProducer; +import me.shedaniel.api.TriBooleanSupplier; import me.shedaniel.gui.Drawable; import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.Tessellator; @@ -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) { @@ -55,7 +56,6 @@ public abstract class Control extends Drawable { p_drawRect_1_ = p_drawRect_3_; p_drawRect_3_ = lvt_5_3_; } - float lvt_5_3_1 = (float) (p_drawRect_4_ >> 24 & 255) / 255.0F; float lvt_6_1_ = (float) (p_drawRect_4_ >> 16 & 255) / 255.0F; float lvt_7_1_ = (float) (p_drawRect_4_ >> 8 & 255) / 255.0F; 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 d1a41ac59..6896163cf 100755 --- a/src/main/java/me/shedaniel/gui/widget/REISlot.java +++ b/src/main/java/me/shedaniel/gui/widget/REISlot.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; * Created by James on 7/28/2018. */ public class REISlot extends Control { + private static final Identifier RECIPE_GUI = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); private boolean cheatable = false; private List itemList = new LinkedList<>(); diff --git a/src/main/java/me/shedaniel/gui/widget/TextBox.java b/src/main/java/me/shedaniel/gui/widget/TextBox.java index 6329c5c23..566839eb2 100755 --- a/src/main/java/me/shedaniel/gui/widget/TextBox.java +++ b/src/main/java/me/shedaniel/gui/widget/TextBox.java @@ -81,4 +81,5 @@ public class TextBox extends Control implements IFocusable { public void tick() { textField.tick(); } + } diff --git a/src/main/java/me/shedaniel/gui/widget/WidgetArrow.java b/src/main/java/me/shedaniel/gui/widget/WidgetArrow.java index 524f1ce39..8c0229f36 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.render.GuiLighting; import net.minecraft.util.Identifier; public class WidgetArrow extends Control { + private static final Identifier RECIPE_GUI = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); private int progress = 0; private int updateTick = 0; @@ -45,4 +46,5 @@ public class WidgetArrow extends Control { progress = 0; } } + } -- cgit