diff options
| author | Unknown <shekwancheung0528@gmail.com> | 2019-01-11 12:09:50 +0800 |
|---|---|---|
| committer | Unknown <shekwancheung0528@gmail.com> | 2019-01-11 12:09:50 +0800 |
| commit | def24dd1d0ebd6e12a3a459ece05c0fc94aae4de (patch) | |
| tree | 0472186115f5da4d53c953daf0df6858e03d1a82 /src | |
| parent | ff3c2799a766babb69d772f15958d7a0bf50868c (diff) | |
| download | RoughlyEnoughItems-def24dd1d0ebd6e12a3a459ece05c0fc94aae4de.tar.gz RoughlyEnoughItems-def24dd1d0ebd6e12a3a459ece05c0fc94aae4de.tar.bz2 RoughlyEnoughItems-def24dd1d0ebd6e12a3a459ece05c0fc94aae4de.zip | |
Tabs & Item Usages
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/me/shedaniel/rei/client/ClientHelper.java | 7 | ||||
| -rw-r--r-- | src/main/java/me/shedaniel/rei/client/RecipeHelper.java | 27 | ||||
| -rw-r--r-- | src/main/java/me/shedaniel/rei/gui/widget/ButtonWidget.java | 2 | ||||
| -rw-r--r-- | src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidget.java | 84 | ||||
| -rw-r--r-- | src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java | 95 | ||||
| -rw-r--r-- | src/main/java/me/shedaniel/rei/mixin/MixinContainerGui.java | 4 | ||||
| -rwxr-xr-x | src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png | bin | 6214 -> 6902 bytes | |||
| -rwxr-xr-x | src/main/resources/fabric.mod.json | 2 |
8 files changed, 199 insertions, 22 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()) diff --git a/src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png b/src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png Binary files differindex d7afd7940..1cff3266b 100755 --- a/src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png +++ b/src/main/resources/assets/roughlyenoughitems/textures/gui/recipecontainer.png diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index b1b53a82e..6a9a8295c 100755 --- a/src/main/resources/fabric.mod.json +++ b/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" |
