aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/me')
-rw-r--r--src/main/java/me/shedaniel/rei/client/ClientHelper.java7
-rw-r--r--src/main/java/me/shedaniel/rei/client/RecipeHelper.java27
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java2
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidget.java84
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java95
-rw-r--r--src/main/java/me/shedaniel/rei/mixin/MixinContainerGui.java4
6 files changed, 198 insertions, 21 deletions
diff --git a/src/main/java/me/shedaniel/rei/client/ClientHelper.java b/src/main/java/me/shedaniel/rei/client/ClientHelper.java
index 8c1cd472e..8a7386a66 100644
--- a/src/main/java/me/shedaniel/rei/client/ClientHelper.java
+++ b/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
diff --git a/src/main/java/me/shedaniel/rei/client/RecipeHelper.java b/src/main/java/me/shedaniel/rei/client/RecipeHelper.java
index 74780846c..ead30fdfa 100644
--- a/src/main/java/me/shedaniel/rei/client/RecipeHelper.java
+++ b/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;
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 beffbc700..2a69df8ff 100644
--- a/src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java
+++ b/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;
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 d83522175..9be303102 100644
--- a/src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidget.java
+++ b/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() {
diff --git a/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java
new file mode 100644
index 000000000..d9a35c934
--- /dev/null
+++ b/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;
+ }
+
+}
diff --git a/src/main/java/me/shedaniel/rei/mixin/MixinContainerGui.java b/src/main/java/me/shedaniel/rei/mixin/MixinContainerGui.java
index cff7f2e7b..a1f4fc6d6 100644
--- a/src/main/java/me/shedaniel/rei/mixin/MixinContainerGui.java
+++ b/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())