aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java')
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java203
1 files changed, 203 insertions, 0 deletions
diff --git a/src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java
new file mode 100644
index 000000000..bbf0c6c08
--- /dev/null
+++ b/src/main/java/me/shedaniel/rei/gui/widget/SlotWidget.java
@@ -0,0 +1,203 @@
+package me.shedaniel.rei.gui.widget;
+
+import com.google.common.collect.Lists;
+import com.mojang.blaze3d.platform.GlStateManager;
+import me.shedaniel.cloth.api.ClientUtils;
+import me.shedaniel.rei.RoughlyEnoughItemsCore;
+import me.shedaniel.rei.api.ClientHelper;
+import me.shedaniel.rei.api.Renderable;
+import me.shedaniel.rei.api.Renderer;
+import me.shedaniel.rei.client.ScreenHelper;
+import me.shedaniel.rei.gui.renderables.ItemStackRenderer;
+import net.minecraft.client.gui.Element;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import net.minecraft.util.Identifier;
+import net.minecraft.util.math.MathHelper;
+
+import java.awt.*;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SlotWidget extends HighlightableWidget {
+
+ private static final Identifier RECIPE_GUI = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
+ private List<Renderer> renderers = new LinkedList<>();
+ private boolean drawBackground, showToolTips, clickToMoreRecipes, drawHighlightedBackground;
+ private int x, y;
+ private static final ItemStackRenderer TROPICAL_FISH_RENDERABLE = Renderable.fromItemStack(Items.TROPICAL_FISH.getDefaultStack());
+
+ public SlotWidget(int x, int y, ItemStack itemStack, boolean drawBackground, boolean showToolTips) {
+ this(x, y, Collections.singletonList(itemStack), drawBackground, showToolTips);
+ }
+
+ public SlotWidget(int x, int y, Collection<ItemStack> itemList, boolean drawBackground, boolean showToolTips) {
+ this(x, y, itemList.stream().map(Renderable::fromItemStack).collect(Collectors.toList()), drawBackground, showToolTips);
+ }
+
+ public SlotWidget(int x, int y, List<Renderer> renderers, boolean drawBackground, boolean showToolTips) {
+ this.renderers = renderers;
+ this.drawBackground = drawBackground;
+ this.showToolTips = showToolTips;
+ this.x = x;
+ this.y = y;
+ this.clickToMoreRecipes = false;
+ this.drawHighlightedBackground = true;
+ }
+
+ public SlotWidget(int x, int y, List<ItemStack> itemList, boolean drawBackground, boolean showToolTips, boolean clickToMoreRecipes) {
+ this(x, y, itemList, drawBackground, showToolTips);
+ this.clickToMoreRecipes = clickToMoreRecipes;
+ }
+
+ public boolean isShowToolTips() {
+ return showToolTips;
+ }
+
+ public void setShowToolTips(boolean showToolTips) {
+ this.showToolTips = showToolTips;
+ }
+
+ public boolean isClickToMoreRecipes() {
+ return clickToMoreRecipes;
+ }
+
+ public void setClickToMoreRecipes(boolean clickToMoreRecipes) {
+ this.clickToMoreRecipes = clickToMoreRecipes;
+ }
+
+ public boolean isDrawHighlightedBackground() {
+ return drawHighlightedBackground;
+ }
+
+ public void setDrawHighlightedBackground(boolean drawHighlightedBackground) {
+ this.drawHighlightedBackground = drawHighlightedBackground;
+ }
+
+ @Override
+ public List<? extends Element> children() {
+ return Collections.emptyList();
+ }
+
+ public boolean isDrawBackground() {
+ return drawBackground;
+ }
+
+ public void setDrawBackground(boolean drawBackground) {
+ this.drawBackground = drawBackground;
+ }
+
+ @Override
+ public void render(int mouseX, int mouseY, float delta) {
+ Renderer renderer = getCurrentRenderer();
+ if (drawBackground) {
+ minecraft.getTextureManager().bindTexture(RECIPE_GUI);
+ blit(this.x - 1, this.y - 1, 0, 222, 18, 18);
+ }
+ boolean highlighted = isHighlighted(mouseX, mouseY);
+ if (drawHighlightedBackground && highlighted) {
+ GlStateManager.disableLighting();
+ GlStateManager.disableDepthTest();
+ GlStateManager.colorMask(true, true, true, false);
+ fillGradient(x, y, x + 16, y + 16, -2130706433, -2130706433);
+ GlStateManager.colorMask(true, true, true, true);
+ GlStateManager.enableLighting();
+ GlStateManager.enableDepthTest();
+ }
+ if (isCurrentRendererItem() && !getCurrentItemStack().isEmpty()) {
+ if (RoughlyEnoughItemsCore.getConfigManager().getConfig().aprilFoolsFish2019 && !highlighted)
+ renderer = TROPICAL_FISH_RENDERABLE;
+ renderer.setBlitOffset(200);
+ renderer.render(x + 8, y + 6, mouseX, mouseY, delta);
+ if (!getCurrentItemStack().isEmpty() && highlighted && showToolTips)
+ queueTooltip(getCurrentItemStack(), delta);
+ } else {
+ renderer.setBlitOffset(200);
+ renderer.render(x + 8, y + 6, mouseX, mouseY, delta);
+ }
+ }
+
+ protected void queueTooltip(ItemStack itemStack, float delta) {
+ ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getTooltip(itemStack)));
+ }
+
+ protected List<String> getTooltip(ItemStack itemStack) {
+ final String modString = ClientHelper.getInstance().getFormattedModFromItem(itemStack.getItem());
+ List<String> toolTip = Lists.newArrayList(ItemListOverlay.tryGetItemStackToolTip(itemStack, true));
+ toolTip.addAll(getExtraToolTips(itemStack));
+ boolean alreadyHasMod = false;
+ for(String s : toolTip)
+ if (s.equalsIgnoreCase(modString)) {
+ alreadyHasMod = true;
+ break;
+ }
+ if (!alreadyHasMod)
+ toolTip.add(modString);
+ return toolTip;
+ }
+
+ protected List<String> getExtraToolTips(ItemStack stack) {
+ return Collections.emptyList();
+ }
+
+ protected String getItemCountOverlay(ItemStack currentStack) {
+ return "";
+ }
+
+ public ItemStack getCurrentItemStack() {
+ if (getCurrentRenderer() instanceof ItemStackRenderer)
+ return ((ItemStackRenderer) getCurrentRenderer()).getItemStack();
+ return ItemStack.EMPTY;
+ }
+
+ public Renderer getCurrentRenderer() {
+ if (renderers.size() == 0)
+ return Renderable.empty();
+ return renderers.get(MathHelper.floor((System.currentTimeMillis() / 500 % (double) renderers.size()) / 1f));
+ }
+
+ public void setItemList(List<ItemStack> itemList) {
+ this.setRenderers(itemList.stream().map(Renderable::fromItemStack).collect(Collectors.toList()));
+ }
+
+ public void setRenderers(List<Renderer> renderers) {
+ this.renderers = renderers;
+ }
+
+ @Override
+ public Rectangle getBounds() {
+ return new Rectangle(this.x - 1, this.y - 1, 18, 18);
+ }
+
+ @Override
+ public boolean mouseClicked(double mouseX, double mouseY, int button) {
+ if (!clickToMoreRecipes)
+ return false;
+ if (isCurrentRendererItem() && getBounds().contains(mouseX, mouseY))
+ if (button == 0)
+ return ClientHelper.getInstance().executeRecipeKeyBind(getCurrentItemStack());
+ else if (button == 1)
+ return ClientHelper.getInstance().executeUsageKeyBind(getCurrentItemStack());
+ return false;
+ }
+
+ public boolean isCurrentRendererItem() {
+ return getCurrentRenderer() instanceof ItemStackRenderer;
+ }
+
+ @Override
+ public boolean keyPressed(int int_1, int int_2, int int_3) {
+ if (!clickToMoreRecipes)
+ return false;
+ if (isCurrentRendererItem() && getBounds().contains(ClientUtils.getMouseLocation()))
+ if (ClientHelper.getInstance().getRecipeKeyBinding().matchesKey(int_1, int_2))
+ return ClientHelper.getInstance().executeRecipeKeyBind(getCurrentItemStack());
+ else if (ClientHelper.getInstance().getUsageKeyBinding().matchesKey(int_1, int_2))
+ return ClientHelper.getInstance().executeUsageKeyBind(getCurrentItemStack());
+ return false;
+ }
+
+}