Unknown пре 6 година
родитељ
комит
1cbf974068

+ 1 - 1
build.gradle

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

+ 5 - 2
src/main/java/me/shedaniel/rei/client/ClientHelper.java

@@ -103,8 +103,11 @@ public class ClientHelper implements ClientLoaded, ClientModInitializer {
         return map.keySet().size() > 0;
     }
     
-    public static boolean executeUsageKeyBind() {
-        return false;
+    public static boolean executeUsageKeyBind(ContainerGuiOverlay overlay, ItemStack stack, IMixinContainerGui parent) {
+        Map<IRecipeCategory, List<IRecipeDisplay>> map = RecipeHelper.getUsagesFor(stack);
+        if (map.keySet().size() > 0)
+            MinecraftClient.getInstance().openGui(new RecipeViewingWidget(overlay, MinecraftClient.getInstance().window, parent, map));
+        return map.keySet().size() > 0;
     }
     
     @Override

+ 27 - 0
src/main/java/me/shedaniel/rei/client/RecipeHelper.java

@@ -86,6 +86,33 @@ public class RecipeHelper implements RecipeSync {
         return recipeManager;
     }
     
+    public static Map<IRecipeCategory, List<IRecipeDisplay>> getUsagesFor(ItemStack stack) {
+        Map<Identifier, List<IRecipeDisplay>> categoriesMap = new HashMap<>();
+        categories.forEach(f -> categoriesMap.put(f.getIdentifier(), new LinkedList<>()));
+        for(List<IRecipeDisplay> value : recipeCategoryListMap.values())
+            for(IRecipeDisplay recipeDisplay : value) {
+                boolean found = false;
+                for(List<ItemStack> input : (List<List<ItemStack>>) recipeDisplay.getInput()) {
+                    for(ItemStack itemStack : input) {
+                        if (ItemStack.areEqualIgnoreTags(itemStack, stack)) {
+                            categoriesMap.get(recipeDisplay.getRecipeCategory()).add(recipeDisplay);
+                            if (found)
+                                break;
+                        }
+                    }
+                    if (found)
+                        break;
+                }
+            }
+        categoriesMap.keySet().removeIf(f -> categoriesMap.get(f).isEmpty());
+        Map<IRecipeCategory, List<IRecipeDisplay>> recipeCategoryListMap = Maps.newHashMap();
+        categories.forEach(category -> {
+            if (categoriesMap.containsKey(category.getIdentifier()))
+                recipeCategoryListMap.put(category, categoriesMap.get(category.getIdentifier()));
+        });
+        return recipeCategoryListMap;
+    }
+    
     @Override
     public void recipesLoaded(RecipeManager recipeManager) {
         this.recipeManager = recipeManager;

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

@@ -102,7 +102,7 @@ public abstract class ButtonWidget extends Drawable implements IWidget {
     
     @Override
     public boolean onMouseClick(int button, double mouseX, double mouseY) {
-        if (bounds.contains(mouseX, mouseY)) {
+        if (bounds.contains(mouseX, mouseY) && enabled) {
             MinecraftClient.getInstance().getSoundLoader().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F));
             onPressed(button, mouseX, mouseY);
             return true;

+ 68 - 16
src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidget.java

@@ -7,15 +7,17 @@ import me.shedaniel.rei.api.IRecipeDisplay;
 import me.shedaniel.rei.gui.ContainerGuiOverlay;
 import me.shedaniel.rei.listeners.IMixinContainerGui;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.ContainerGui;
+import net.minecraft.client.audio.PositionedSoundInstance;
 import net.minecraft.client.gui.Gui;
 import net.minecraft.client.gui.GuiEventListener;
 import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.util.Window;
+import net.minecraft.sound.SoundEvents;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.math.MathHelper;
 
 import java.awt.*;
+import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -28,6 +30,7 @@ public class RecipeViewingWidget extends Gui {
     public final int guiHeight = 158;
     
     private List<IWidget> widgets;
+    private List<TabWidget> tabs;
     private Window window;
     private Rectangle bounds;
     private Map<IRecipeCategory, List<IRecipeDisplay>> categoriesMap;
@@ -35,9 +38,11 @@ public class RecipeViewingWidget extends Gui {
     private IRecipeCategory selectedCategory;
     private IMixinContainerGui parent;
     private ContainerGuiOverlay overlay;
-    private int page;
+    private int page, categoryPages;
+    private ButtonWidget recipeBack, recipeNext, categoryBack, categoryNext;
     
     public RecipeViewingWidget(ContainerGuiOverlay overlay, Window window, IMixinContainerGui parent, Map<IRecipeCategory, List<IRecipeDisplay>> categoriesMap) {
+        this.categoryPages = 0;
         this.parent = parent;
         this.window = window;
         this.widgets = Lists.newArrayList();
@@ -46,10 +51,15 @@ public class RecipeViewingWidget extends Gui {
         this.categories = new LinkedList<>(categoriesMap.keySet());
         this.selectedCategory = categories.get(0);
         this.overlay = overlay;
+        this.tabs = new ArrayList<>();
     }
     
-    public ContainerGui getParent() {
-        return parent.getContainerGui();
+    public IMixinContainerGui getParent() {
+        return parent;
+    }
+    
+    public ContainerGuiOverlay getOverlay() {
+        return overlay;
     }
     
     @Override
@@ -67,30 +77,36 @@ public class RecipeViewingWidget extends Gui {
     @Override
     protected void onInitialized() {
         super.onInitialized();
+        this.tabs.clear();
         this.widgets.clear();
         this.bounds = new Rectangle(window.getScaledWidth() / 2 - guiWidth / 2, window.getScaledHeight() / 2 - guiHeight / 2, guiWidth, guiHeight);
         
-        widgets.add(new ButtonWidget((int) bounds.getX() + 5, (int) bounds.getY() + 5, 12, 12, "<") {
+        widgets.add(categoryBack = new ButtonWidget((int) bounds.getX() + 5, (int) bounds.getY() + 5, 12, 12, "<") {
             @Override
             public void onPressed(int button, double mouseX, double mouseY) {
             }
         });
-        widgets.add(new ButtonWidget((int) bounds.getX() + 159, (int) bounds.getY() + 5, 12, 12, ">") {
+        widgets.add(categoryNext = new ButtonWidget((int) bounds.getX() + 159, (int) bounds.getY() + 5, 12, 12, ">") {
             @Override
             public void onPressed(int button, double mouseX, double mouseY) {
             }
         });
+        categoryBack.enabled = categories.size() > 1;
+        categoryNext.enabled = categories.size() > 1;
         
-        widgets.add(new ButtonWidget((int) bounds.getX() + 5, (int) bounds.getY() + 21, 12, 12, "<") {
+        widgets.add(recipeBack = new ButtonWidget((int) bounds.getX() + 5, (int) bounds.getY() + 21, 12, 12, "<") {
             @Override
             public void onPressed(int button, double mouseX, double mouseY) {
             }
         });
-        widgets.add(new ButtonWidget((int) bounds.getX() + 159, (int) bounds.getY() + 21, 12, 12, ">") {
+        widgets.add(recipeNext = new ButtonWidget((int) bounds.getX() + 159, (int) bounds.getY() + 21, 12, 12, ">") {
             @Override
             public void onPressed(int button, double mouseX, double mouseY) {
             }
         });
+        recipeBack.enabled = categoriesMap.get(selectedCategory).size() > getRecipesPerPage();
+        recipeNext.enabled = categoriesMap.get(selectedCategory).size() > getRecipesPerPage();
+        
         widgets.add(new LabelWidget((int) bounds.getCenterX(), (int) bounds.getY() + 7, "") {
             @Override
             public void draw(int mouseX, int mouseY, float partialTicks) {
@@ -105,19 +121,45 @@ public class RecipeViewingWidget extends Gui {
                 super.draw(mouseX, mouseY, partialTicks);
             }
         });
+        for(int i = 0; i < 6; i++) {
+            int j = i + categoryPages * 6;
+            if (categories.size() > j) {
+                TabWidget tab;
+                tabs.add(tab = new TabWidget(i, this, new Rectangle(bounds.x + 4 + 28 * i, bounds.y - 28, 28, 28)) {
+                    @Override
+                    public boolean onMouseClick(int button, double mouseX, double mouseY) {
+                        if (getBounds().contains(mouseX, mouseY)) {
+                            MinecraftClient.getInstance().getSoundLoader().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F));
+                            if (getId() + categoryPages * 6 == categories.indexOf(selectedCategory))
+                                return false;
+                            selectedCategory = categories.get(getId() + categoryPages * 6);
+                            page = 0;
+                            RecipeViewingWidget.this.onInitialized();
+                            return true;
+                        }
+                        return false;
+                    }
+                });
+                tab.setItem(selectedCategory.getCategoryIcon(), selectedCategory.getCategoryName(), tab.getId() + categoryPages * 6 == categories.indexOf(selectedCategory));
+            }
+        }
+        
         overlay.onInitialized();
+        listeners.addAll(tabs);
         listeners.add(overlay);
         listeners.addAll(widgets);
     }
     
+    private int getRecipesPerPage() {
+        if (selectedCategory.usesFullPage())
+            return 1;
+        return 2;
+    }
+    
     @Override
     public void draw(int mouseX, int mouseY, float partialTicks) {
         drawBackground();
-        GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-        GuiLighting.disable();
-        this.client.getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
-        this.drawTexturedRect((int) bounds.getX(), (int) bounds.getY(), 0, 0, (int) bounds.getWidth(), (int) bounds.getHeight());
-        
+        tabs.stream().filter(TabWidget::isSelected).forEach(tabWidget -> tabWidget.draw(mouseX, mouseY, partialTicks));
         GuiLighting.disable();
         super.draw(mouseX, mouseY, partialTicks);
         widgets.forEach(widget -> {
@@ -127,12 +169,22 @@ public class RecipeViewingWidget extends Gui {
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         GuiLighting.disable();
         overlay.render(mouseX, mouseY, partialTicks);
+        tabs.stream().filter(tabWidget -> {
+            return !tabWidget.isSelected();
+        }).forEach(tabWidget -> tabWidget.draw(mouseX, mouseY, partialTicks));
+    }
+    
+    @Override
+    public void drawBackground() {
+        drawBackground(0);
+        GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
+        GuiLighting.disable();
+        this.client.getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
+        this.drawTexturedRect((int) bounds.getX(), (int) bounds.getY(), 0, 0, (int) bounds.getWidth(), (int) bounds.getHeight());
     }
     
     public int getTotalPages(IRecipeCategory category) {
-        if (category.usesFullPage())
-            return categoriesMap.get(category).size();
-        return MathHelper.ceil(categoriesMap.get(category).size() / 2.0);
+        return MathHelper.ceil(categoriesMap.get(category).size() / (double) getRecipesPerPage());
     }
     
     public Rectangle getBounds() {

+ 95 - 0
src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java

@@ -0,0 +1,95 @@
+package me.shedaniel.rei.gui.widget;
+
+import com.google.common.collect.Lists;
+import com.mojang.blaze3d.platform.GlStateManager;
+import me.shedaniel.rei.client.ClientHelper;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.Drawable;
+import net.minecraft.client.render.GuiLighting;
+import net.minecraft.client.render.item.ItemRenderer;
+import net.minecraft.item.ItemStack;
+
+import java.awt.*;
+import java.util.Arrays;
+import java.util.List;
+
+public class TabWidget extends Drawable implements HighlightableWidget {
+    
+    private boolean shown = false, selected = false;
+    private ItemStack item;
+    private int id;
+    private RecipeViewingWidget recipeViewingWidget;
+    private String categoryName;
+    private Rectangle bounds;
+    private ItemRenderer itemRenderer;
+    
+    public TabWidget(int id, RecipeViewingWidget recipeViewingWidget, Rectangle bounds) {
+        this.id = id;
+        this.recipeViewingWidget = recipeViewingWidget;
+        this.bounds = bounds;
+        this.itemRenderer = MinecraftClient.getInstance().getItemRenderer();
+    }
+    
+    public void setItem(ItemStack item, String categoryName, boolean selected) {
+        if (item == null) {
+            shown = false;
+            this.item = null;
+        } else {
+            shown = true;
+            this.item = item;
+        }
+        this.selected = selected;
+        this.categoryName = categoryName;
+    }
+    
+    public boolean isSelected() {
+        return selected;
+    }
+    
+    public int getId() {
+        return id;
+    }
+    
+    public boolean isShown() {
+        return shown;
+    }
+    
+    public ItemStack getItemStack() {
+        return item;
+    }
+    
+    @Override
+    public List<IWidget> getListeners() {
+        return Lists.newArrayList();
+    }
+    
+    @Override
+    public void draw(int mouseX, int mouseY, float partialTicks) {
+        if (shown) {
+            int l = (int) this.bounds.getCenterX() - 8, i1 = (int) this.bounds.getCenterY() - 6;
+            
+            GuiLighting.disable();
+            this.drawTexturedRect(bounds.x, bounds.y, selected ? 28 : 0, 158, 28, (selected ? 31 : 28));
+            this.zOffset = 100.0F;
+            this.itemRenderer.zOffset = 100.0F;
+            GuiLighting.enableForItems();
+            this.itemRenderer.renderItemAndGlowInGui(getItemStack(), l, i1);
+            this.itemRenderer.renderItemOverlaysInGUI(MinecraftClient.getInstance().fontRenderer, getItemStack(), l, i1);
+            GlStateManager.disableLighting();
+            this.itemRenderer.zOffset = 0.0F;
+            this.zOffset = 0.0F;
+            if (isHighlighted(mouseX, mouseY))
+                drawTooltip();
+        }
+    }
+    
+    private void drawTooltip() {
+        recipeViewingWidget.getOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(categoryName)));
+    }
+    
+    @Override
+    public Rectangle getBounds() {
+        return bounds;
+    }
+    
+}

+ 2 - 2
src/main/java/me/shedaniel/rei/mixin/MixinContainerGui.java

@@ -83,7 +83,7 @@ public class MixinContainerGui extends Gui implements IMixinContainerGui {
         return lastGui;
     }
     
-    // WIP into an inject
+    // TODO into an inject
     @Override
     public boolean mouseScrolled(double double_1) {
         for(GuiEventListener entry : this.getEntries())
@@ -92,7 +92,7 @@ public class MixinContainerGui extends Gui implements IMixinContainerGui {
         return false;
     }
     
-    // WIP into an inject
+    // TODO into an inject
     @Override
     public boolean charTyped(char char_1, int int_1) {
         for(GuiEventListener entry : this.getEntries())

BIN
src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png


+ 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",
+  "version": "2.0.0.26",
   "side": "client",
   "authors": [
     "Danielshe"