Ver código fonte

Custom Ordering works

Unknown 6 anos atrás
pai
commit
41f73b4416

+ 1 - 1
build.gradle

@@ -17,7 +17,7 @@ dependencies {
 	modCompile "net.fabricmc:fabric-loader:0.3.1.84"
 
 	// Fabric API. This is technically optional, but you probably want it anyway.
-	modCompile "net.fabricmc:fabric:0.1.2.63"
+	modCompile "net.fabricmc:fabric:0.1.3.68"
 }
 
 // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task

+ 20 - 10
src/main/java/me/shedaniel/api/IDisplayCategory.java

@@ -2,6 +2,7 @@ package me.shedaniel.api;
 
 import me.shedaniel.gui.widget.Control;
 import me.shedaniel.gui.widget.REISlot;
+import net.minecraft.client.gui.Gui;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 
@@ -10,22 +11,31 @@ import java.util.List;
 /**
  * Created by James on 8/7/2018.
  */
-public interface IDisplayCategory<T extends IRecipe> {
-    public String getId();
+public abstract class IDisplayCategory<T extends IRecipe> {
+    public abstract String getId();
     
-    public String getDisplayName();
+    public abstract String getDisplayName();
     
-    public void addRecipe(T recipe);
+    public abstract void addRecipe(T recipe);
     
-    public void resetRecipes();
+    public abstract void resetRecipes();
     
-    public List<REISlot> setupDisplay(int number);
+    public abstract List<REISlot> setupDisplay(int number);
     
-    public boolean canDisplay(T recipe);
+    public abstract boolean canDisplay(T recipe);
     
-    public void drawExtras();
+    public abstract void drawExtras();
     
-    public void addWidget(List<Control> controls, int number);
+    public abstract void addWidget(List<Control> controls, int number);
+    
+    public abstract ItemStack getCategoryIcon();
+    
+    public boolean canAutoCraft(Class<? extends Gui> guiClass, T recipe) {
+        return false;
+    }
+    
+    public boolean performAutoCraft(Gui guiClass, T recipe) {
+    
+    }
     
-    public ItemStack getCategoryIcon();
 }

+ 6 - 1
src/main/java/me/shedaniel/api/IREIPlugin.java

@@ -7,5 +7,10 @@ import me.shedaniel.listenerdefinitions.IEvent;
  */
 public interface IREIPlugin extends IEvent {
     
-    public void register();
+    public void registerCategories();
+    
+    public void registerRecipes();
+    
+    public void registerSpecialGuiExclusion();
+    
 }

+ 6 - 5
src/main/java/me/shedaniel/gui/ConfigGui.java

@@ -75,7 +75,7 @@ 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) {
-                int index = Arrays.asList(REIItemListOrdering.values()).indexOf(Core.config.itemListOrdering);
+                int index = Arrays.asList(REIItemListOrdering.values()).indexOf(Core.config.itemListOrdering) + 1;
                 if (index >= REIItemListOrdering.values().length) {
                     index = 0;
                     Core.config.isAscending = !Core.config.isAscending;
@@ -83,6 +83,7 @@ public class ConfigGui extends Gui {
                 Core.config.itemListOrdering = REIItemListOrdering.values()[index];
                 try {
                     Core.saveConfig();
+                    REIRenderHelper.reiGui.updateView();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
@@ -102,13 +103,13 @@ public class ConfigGui extends Gui {
         drawBackground();
         super.draw(mouseX, mouseY, partialTicks);
         String text = I18n.translate("key.rei.recipe") + ": ";
-        drawString(MinecraftClient.getInstance().fontRenderer, text, parent.width / 2 - 40 - MinecraftClient.getInstance().fontRenderer.getStringWidth(text), 30 + 6, -1);
+        drawString(MinecraftClient.getInstance().fontRenderer, text, parent.width / 2 - 25 - MinecraftClient.getInstance().fontRenderer.getStringWidth(text), 30 + 6, -1);
         text = I18n.translate("key.rei.use") + ": ";
-        drawString(MinecraftClient.getInstance().fontRenderer, text, parent.width / 2 - 40 - MinecraftClient.getInstance().fontRenderer.getStringWidth(text), 60 + 6, -1);
+        drawString(MinecraftClient.getInstance().fontRenderer, text, parent.width / 2 - 25 - MinecraftClient.getInstance().fontRenderer.getStringWidth(text), 60 + 6, -1);
         text = I18n.translate("key.rei.hide") + ": ";
-        drawString(MinecraftClient.getInstance().fontRenderer, text, parent.width / 2 - 40 - MinecraftClient.getInstance().fontRenderer.getStringWidth(text), 90 + 6, -1);
+        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 - 110 - MinecraftClient.getInstance().fontRenderer.getStringWidth(text), 150 + 6, -1);
+        drawString(MinecraftClient.getInstance().fontRenderer, text, parent.width / 2 - 95 - MinecraftClient.getInstance().fontRenderer.getStringWidth(text), 150 + 6, -1);
     }
     
     @Override

+ 27 - 6
src/main/java/me/shedaniel/gui/GuiItemList.java

@@ -3,16 +3,20 @@ package me.shedaniel.gui;
 import com.mojang.blaze3d.platform.GlStateManager;
 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.impl.REIRecipeManager;
 import me.shedaniel.listenerdefinitions.IMixinContainerGui;
+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.resource.language.I18n;
 import net.minecraft.client.util.Window;
+import net.minecraft.item.ItemGroup;
 import net.minecraft.item.ItemStack;
 import net.minecraft.text.TextComponent;
 import net.minecraft.text.TranslatableTextComponent;
@@ -21,8 +25,7 @@ import net.minecraft.util.math.MathHelper;
 import net.minecraft.util.registry.Registry;
 
 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;
@@ -118,7 +121,7 @@ public class GuiItemList extends Drawable {
     private Rectangle getSearchBoxArea() {
         int ch = ((IMixinContainerGui) overlayedGui).getContainerHeight(), cw = ((IMixinContainerGui) overlayedGui).getContainerWidth();
         if (Core.centreSearchBox) {
-            if (ch + 4 + 18 > rect.height) //Will be out of bounds
+            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);
         }
@@ -162,9 +165,10 @@ public class GuiItemList extends Drawable {
         while (true) {
             REISlot slot = new REISlot(x + xOffset, y + yOffset);
             slot.setCheatable(true);
+            if (REIRecipeManager.instance().canAddSlot(MinecraftClient.getInstance().currentGui.getClass(), slot.rect))
+                displaySlots.add(slot);
             xOffset += 18;
             currentX++;
-            displaySlots.add(slot);
             if (currentX >= perRow) {
                 xOffset = 0;
                 yOffset += 18;
@@ -247,7 +251,23 @@ public class GuiItemList extends Drawable {
         List<ItemStack> stacks = new ArrayList<>();
         if (ClientListener.stackList == null && !Registry.ITEM.isEmpty())
             Core.getListeners(ClientListener.class).forEach(ClientListener::onDoneLoading);
-        if (ClientListener.stackList != null)
+        if (ClientListener.stackList != null) {
+            List<ItemStack> stackList = new LinkedList<>(ClientListener.stackList);
+            List<ItemGroup> itemGroups = new LinkedList<>(Arrays.asList(ItemGroup.GROUPS));
+            FabricCreativeGuiComponents.COMMON_GROUPS.forEach(itemGroups::add);
+            itemGroups.add(null);
+            if (Core.config.itemListOrdering != REIItemListOrdering.REGISTRY)
+                Collections.sort(stackList, (itemStack, t1) -> {
+                    switch (Core.config.itemListOrdering) {
+                        case NAME:
+                            return itemStack.getDisplayName().getFormattedText().compareToIgnoreCase(t1.getDisplayName().getFormattedText());
+                        case ITEM_GROUPS:
+                            return itemGroups.indexOf(itemStack.getItem().getItemGroup()) - itemGroups.indexOf(t1.getItem().getItemGroup());
+                    }
+                    return 0;
+                });
+            if (!Core.config.isAscending)
+                Collections.reverse(stackList);
             Arrays.stream(searchText.split("\\|")).forEachOrdered(s -> {
                 List<SearchArgument> arguments = new ArrayList<>();
                 while (s.startsWith(" ")) s = s.substring(1);
@@ -264,8 +284,9 @@ public class GuiItemList extends Drawable {
                     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);
+                stackList.stream().filter(itemStack -> filterItem(itemStack, arguments)).forEachOrdered(stacks::add);
             });
+        }
         view.addAll(stacks.stream().distinct().collect(Collectors.toList()));
         page = 0;
         fillSlots();

+ 26 - 4
src/main/java/me/shedaniel/impl/REIRecipeManager.java

@@ -7,14 +7,17 @@ import me.shedaniel.api.IRecipe;
 import me.shedaniel.api.IRecipeManager;
 import me.shedaniel.gui.RecipeGui;
 import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.Gui;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.recipe.RecipeManager;
+import net.minecraft.util.BooleanBiFunction;
 
-import java.util.HashMap;
-import java.util.LinkedList;
+import java.awt.*;
+import java.util.*;
 import java.util.List;
-import java.util.Map;
+import java.util.function.BooleanSupplier;
+import java.util.function.Function;
 
 /**
  * Created by James on 8/7/2018.
@@ -23,12 +26,14 @@ public class REIRecipeManager implements IRecipeManager {
     private Map<String, List<IRecipe>> recipeList;
     private List<IDisplayCategory> displayAdapters;
     public static RecipeManager recipeManager;
+    private Map<Class<? extends Gui>, List<Function<Rectangle, Boolean>>> guiExcludeMap;
     
     private static REIRecipeManager myInstance;
     
     private REIRecipeManager() {
         recipeList = new HashMap<>();
         displayAdapters = new LinkedList<>();
+        guiExcludeMap = new HashMap<>();
     }
     
     public List<IDisplayCategory> getDisplayAdapters() {
@@ -43,6 +48,22 @@ public class REIRecipeManager implements IRecipeManager {
         return myInstance;
     }
     
+    public void addExclusionOnGui(Class<? extends Gui> guiClass, Function<Rectangle, Boolean>... functions) {
+        List<Function<Rectangle, Boolean>> list = guiExcludeMap.containsKey(guiClass) ? new LinkedList<>(guiExcludeMap.get(guiClass)) : new ArrayList<>();
+        list.addAll(Arrays.asList(functions));
+        guiExcludeMap.put(guiClass, list);
+    }
+    
+    public boolean canAddSlot(Class<? extends Gui> guiClass, Rectangle slotRect) {
+        if (!guiExcludeMap.containsKey(guiClass))
+            return true;
+        for(Function<Rectangle, Boolean> rectangleBooleanFunction : guiExcludeMap.get(guiClass)) {
+            if (!rectangleBooleanFunction.apply(slotRect))
+                return false;
+        }
+        return true;
+    }
+    
     @Override
     public void addRecipe(String id, IRecipe recipe) {
         if (recipeList.containsKey(id)) {
@@ -136,7 +157,8 @@ public class REIRecipeManager implements IRecipeManager {
         recipeList.clear();
         displayAdapters.clear();
         REIRecipeManager.instance().recipeManager = manager;
-        Core.getListeners(IREIPlugin.class).forEach(IREIPlugin::register);
+        Core.getListeners(IREIPlugin.class).forEach(IREIPlugin::registerCategories);
+        Core.getListeners(IREIPlugin.class).forEach(IREIPlugin::registerRecipes);
     }
     
     public void displayRecipesFor(ItemStack stack) {