diff options
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.java | 203 |
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; + } + +} |
