瀏覽代碼

Show Craftables Filter

Unknown 6 年之前
父節點
當前提交
aee1137515

+ 1 - 1
build.gradle

@@ -6,7 +6,7 @@ sourceCompatibility = 1.8
 targetCompatibility = 1.8
 
 archivesBaseName = "RoughlyEnoughItems"
-version = "2.0.0.34"
+version = "2.0.0.35"
 
 minecraft {
 }

+ 13 - 4
src/main/java/me/shedaniel/rei/client/ClientHelper.java

@@ -1,5 +1,6 @@
 package me.shedaniel.rei.client;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import io.netty.buffer.Unpooled;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
@@ -16,9 +17,7 @@ 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;
 import net.minecraft.enchantment.EnchantmentHelper;
@@ -32,9 +31,8 @@ import net.minecraft.util.PacketByteBuf;
 import net.minecraft.util.registry.Registry;
 
 import java.awt.*;
-import java.awt.event.KeyEvent;
+import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
@@ -126,6 +124,17 @@ public class ClientHelper implements ClientLoaded, ClientModInitializer {
         MinecraftClient.getInstance().openGui(new ConfigWidget(parent));
     }
     
+    public static List<ItemStack> getInventoryItemsTypes() {
+        List<DefaultedList<ItemStack>> field_7543 = ImmutableList.of(MinecraftClient.getInstance().player.inventory.main, MinecraftClient.getInstance().player.inventory.armor
+                , MinecraftClient.getInstance().player.inventory.offHand);
+        List<ItemStack> inventoryStacks = new ArrayList<>();
+        field_7543.forEach(itemStacks -> itemStacks.forEach(itemStack -> {
+            if (!itemStack.getItem().equals(Items.AIR))
+                inventoryStacks.add(itemStack);
+        }));
+        return inventoryStacks;
+    }
+    
     @Override
     public void clientLoaded() {
         Registry.ITEM.forEach(item -> {

+ 8 - 4
src/main/java/me/shedaniel/rei/client/ConfigHelper.java

@@ -67,18 +67,22 @@ public class ConfigHelper {
         config.itemListOrdering = ordering;
     }
     
-    public void setAscending(boolean ascending) {
-        config.isAscending = ascending;
-    }
-    
     public boolean isAscending() {
         return config.isAscending;
     }
     
+    public void setAscending(boolean ascending) {
+        config.isAscending = ascending;
+    }
+    
     public boolean craftableOnly() {
         return craftableOnly && config.enableCraftableOnlyButton;
     }
     
+    public void toggleCraftableOnly() {
+        craftableOnly = !craftableOnly;
+    }
+    
     public boolean showCraftableOnlyButton() {
         return config.enableCraftableOnlyButton;
     }

+ 9 - 0
src/main/java/me/shedaniel/rei/client/GuiHelper.java

@@ -1,15 +1,20 @@
 package me.shedaniel.rei.client;
 
+import com.google.common.collect.Lists;
 import me.shedaniel.rei.gui.ContainerGuiOverlay;
 import me.shedaniel.rei.gui.widget.TextFieldWidget;
 import me.shedaniel.rei.listeners.IMixinContainerGui;
 import net.minecraft.client.gui.ContainerGui;
+import net.minecraft.item.ItemStack;
+
+import java.util.List;
 
 public class GuiHelper {
     
     public static TextFieldWidget searchField;
     private static boolean overlayVisible = true;
     private static ContainerGuiOverlay overlay;
+    public static List<ItemStack> inventoryStacks = Lists.newArrayList();
     
     public static boolean isOverlayVisible() {
         return overlayVisible;
@@ -27,6 +32,10 @@ public class GuiHelper {
         return overlay;
     }
     
+    public static ContainerGuiOverlay getLastOverlay() {
+        return overlay;
+    }
+    
     public static void setOverlay(ContainerGuiOverlay overlay) {
         GuiHelper.overlay = overlay;
         overlay.onInitialized();

+ 42 - 3
src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java

@@ -18,7 +18,10 @@ import net.minecraft.util.math.MathHelper;
 
 import java.awt.*;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class ContainerGuiOverlay extends Gui {
     
@@ -113,18 +116,34 @@ public class ContainerGuiOverlay extends Gui {
         GuiHelper.searchField.setBounds(getTextFieldArea());
         this.widgets.add(GuiHelper.searchField);
         GuiHelper.searchField.setText(searchTerm);
+        if (RoughlyEnoughItemsCore.getConfigHelper().showCraftableOnlyButton())
+            this.widgets.add(new CraftableToggleButtonWidget(containerGui, getCraftableToggleArea()) {
+                @Override
+                public void onPressed(int button, double mouseX, double mouseY) {
+                    RoughlyEnoughItemsCore.getConfigHelper().toggleCraftableOnly();
+                    itemListOverlay.updateList(page, searchTerm);
+                }
+            });
         
         this.listeners.addAll(widgets);
     }
     
     private Rectangle getTextFieldArea() {
+        int widthRemoved = RoughlyEnoughItemsCore.getConfigHelper().showCraftableOnlyButton() ? 22 : 0;
         if (RoughlyEnoughItemsCore.getConfigHelper().sideSearchField())
-            return new Rectangle(rectangle.x + 2, window.getScaledHeight() - 22, rectangle.width - 6, 18);
+            return new Rectangle(rectangle.x + 2, window.getScaledHeight() - 22, rectangle.width - 6 - widthRemoved, 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);
+            return new Rectangle(widget.getBounds().x, window.getScaledHeight() - 22, widget.getBounds().width - widthRemoved, 18);
         }
-        return new Rectangle(containerGui.getContainerLeft(), window.getScaledHeight() - 22, containerGui.getContainerWidth(), 18);
+        return new Rectangle(containerGui.getContainerLeft(), window.getScaledHeight() - 22, containerGui.getContainerWidth() - widthRemoved, 18);
+    }
+    
+    private Rectangle getCraftableToggleArea() {
+        Rectangle searchBoxArea = getTextFieldArea();
+        searchBoxArea.setLocation(searchBoxArea.x + searchBoxArea.width + 4, searchBoxArea.y - 1);
+        searchBoxArea.setSize(20, 20);
+        return searchBoxArea;
     }
     
     private String getCheatModeText() {
@@ -140,8 +159,13 @@ public class ContainerGuiOverlay extends Gui {
     }
     
     public void render(int mouseX, int mouseY, float partialTicks) {
+        List<ItemStack> currentStacks = ClientHelper.getInventoryItemsTypes();
         if (getLeft() != lastLeft)
             onInitialized();
+        else if (RoughlyEnoughItemsCore.getConfigHelper().craftableOnly() && (!hasSameListContent(new LinkedList<>(GuiHelper.inventoryStacks), currentStacks) || (currentStacks.size() != GuiHelper.inventoryStacks.size()))) {
+            GuiHelper.inventoryStacks = ClientHelper.getInventoryItemsTypes();
+            itemListOverlay.updateList(page, searchTerm);
+        }
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         GuiLighting.disable();
         this.draw(mouseX, mouseY, partialTicks);
@@ -151,6 +175,21 @@ public class ContainerGuiOverlay extends Gui {
         GuiLighting.disable();
     }
     
+    private boolean hasSameListContent(List<ItemStack> list1, List<ItemStack> 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);
+    }
+    
     public void setContainerGui(IMixinContainerGui containerGui) {
         this.containerGui = containerGui;
     }

+ 59 - 0
src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java

@@ -0,0 +1,59 @@
+package me.shedaniel.rei.gui.widget;
+
+import com.mojang.blaze3d.platform.GlStateManager;
+import me.shedaniel.rei.RoughlyEnoughItemsCore;
+import me.shedaniel.rei.client.ClientHelper;
+import me.shedaniel.rei.client.GuiHelper;
+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.render.item.ItemRenderer;
+import net.minecraft.client.resource.language.I18n;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Identifier;
+
+import java.awt.*;
+import java.util.Arrays;
+
+public abstract class CraftableToggleButtonWidget extends ButtonWidget {
+    
+    protected static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
+    private ItemRenderer itemRenderer;
+    private IMixinContainerGui containerGui;
+    
+    public CraftableToggleButtonWidget(IMixinContainerGui containerGui, Rectangle rectangle) {
+        this(containerGui, rectangle.x, rectangle.y, rectangle.width, rectangle.height);
+        this.itemRenderer = MinecraftClient.getInstance().getItemRenderer();
+    }
+    
+    public CraftableToggleButtonWidget(IMixinContainerGui containerGui, int x, int y, int width, int height) {
+        super(x, y, width, height, "");
+        this.itemRenderer = MinecraftClient.getInstance().getItemRenderer();
+    }
+    
+    @Override
+    public void draw(int mouseX, int mouseY, float partialTicks) {
+        super.draw(mouseX, mouseY, partialTicks);
+        
+        GuiLighting.enableForItems();
+        this.itemRenderer.zOffset = 0.0F;
+        this.itemRenderer.renderItemAndGlowInGui(new ItemStack(Blocks.CRAFTING_TABLE), x + 2, y + 2);
+        this.itemRenderer.zOffset = 0.0F;
+        GuiLighting.disable();
+        MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
+        GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
+        this.zOffset = 100f;
+        this.drawTexturedRect(x, y, (56 + (RoughlyEnoughItemsCore.getConfigHelper().craftableOnly() ? 0 : 20)), 202, 20, 20);
+        this.zOffset = 0f;
+        if (getBounds().contains(mouseX, mouseY))
+            drawTooltip();
+    }
+    
+    private void drawTooltip() {
+        GuiHelper.getLastOverlay()
+                .addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(I18n.translate(RoughlyEnoughItemsCore.getConfigHelper().craftableOnly()
+                        ? "text.rei.showing_craftable" : "text.rei.showing_all"))));
+    }
+    
+}

+ 2 - 1
src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java

@@ -9,6 +9,7 @@ import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Drawable;
 import net.minecraft.client.item.TooltipOptions;
 import net.minecraft.client.network.ClientPlayerEntity;
+import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.item.ItemGroup;
 import net.minecraft.item.ItemStack;
@@ -57,7 +58,7 @@ public class ItemListOverlay extends Drawable implements IWidget {
         this.rectangle = rect;
         if (ClientHelper.getItemList().isEmpty())
             RoughlyEnoughItemsCore.getListeners(ClientLoaded.class).forEach(ClientLoaded::clientLoaded);
-        currentDisplayed = processSearchTerm(searchTerm, ClientHelper.getItemList(), Lists.newArrayList());
+        currentDisplayed = processSearchTerm(searchTerm, ClientHelper.getItemList(), GuiHelper.inventoryStacks);
         this.widgets.clear();
         this.page = page;
         calculateListSize(rect);

+ 6 - 0
src/main/java/me/shedaniel/rei/plugin/DefaultBrewingDisplay.java

@@ -1,8 +1,10 @@
 package me.shedaniel.rei.plugin;
 
+import com.google.common.collect.Lists;
 import me.shedaniel.rei.api.IRecipeDisplay;
 import net.minecraft.block.Blocks;
 import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
 import net.minecraft.recipe.Ingredient;
 import net.minecraft.recipe.Recipe;
 import net.minecraft.util.Identifier;
@@ -51,4 +53,8 @@ public class DefaultBrewingDisplay implements IRecipeDisplay {
         return stack;
     }
     
+    @Override
+    public List<List<ItemStack>> getRequiredItems() {
+        return Arrays.asList(Arrays.asList(new ItemStack(Items.AIR)));
+    }
 }

+ 1 - 1
src/main/resources/fabric.mod.json

@@ -2,7 +2,7 @@
   "id": "roughlyenoughitems",
   "name": "RoughlyEnoughItems",
   "description": "To allow players to view items and recipes.",
-  "version": "2.0.0.34",
+  "version": "2.0.0.35",
   "side": "client",
   "authors": [
     "Danielshe"