package me.shedaniel.rei.gui.widget; import com.google.common.collect.Lists; import me.shedaniel.rei.client.ClientHelper; import me.shedaniel.rei.client.GuiHelper; 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 net.minecraft.item.Items; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; import java.awt.*; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; public class ItemSlotWidget extends Drawable implements HighlightableWidget { private static final Identifier RECIPE_GUI = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); private List itemList = new LinkedList<>(); private boolean drawBackground, showToolTips, clickToMoreRecipes; private int x, y; public ItemSlotWidget(int x, int y, ItemStack itemStack, boolean drawBackground, boolean showToolTips) { this(x, y, Arrays.asList(itemStack), drawBackground, showToolTips); } public ItemSlotWidget(int x, int y, List itemList, boolean drawBackground, boolean showToolTips) { this.itemList = itemList; this.drawBackground = drawBackground; this.showToolTips = showToolTips; this.x = x; this.y = y; this.clickToMoreRecipes = false; } public ItemSlotWidget(int x, int y, List itemList, boolean drawBackground, boolean showToolTips, boolean clickToMoreRecipes) { this(x, y, itemList, drawBackground, showToolTips); this.clickToMoreRecipes = clickToMoreRecipes; } public boolean isDrawBackground() { return drawBackground; } @Override public List getListeners() { return new ArrayList<>(); } @Override public void draw(int mouseX, int mouseY, float partialTicks) { final ItemStack itemStack = getCurrentStack(); if (drawBackground) { MinecraftClient.getInstance().getTextureManager().bindTexture(RECIPE_GUI); drawTexturedRect(this.x - 1, this.y - 1, 0, 222, 18, 18); } if (itemStack.isEmpty()) return; GuiLighting.enableForItems(); ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer(); itemRenderer.zOffset = 200.0F; itemRenderer.renderItemAndGlowInGui(itemStack, x, y); itemRenderer.renderItemOverlaysInGUIWithText(MinecraftClient.getInstance().fontRenderer, itemStack, x, y, getItemCountOverlay(itemStack)); itemRenderer.zOffset = 0.0F; if (isHighlighted(mouseX, mouseY) && showToolTips) drawToolTip(itemStack); } protected void drawToolTip(ItemStack itemStack) { List toolTip = getTooltip(itemStack); GuiHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), toolTip)); } protected List getTooltip(ItemStack itemStack) { final String modString = "§9§o" + ClientHelper.getModFromItemStack(itemStack); MinecraftClient mc = MinecraftClient.getInstance(); List toolTip = Lists.newArrayList(); try { toolTip = GuiHelper.getLastOverlay().getStackTooltip(itemStack).stream().filter(s -> !s.equals(modString)).collect(Collectors.toList()); } catch (Exception e) { toolTip.add(itemStack.getDisplayName().getFormattedText()); } toolTip.addAll(getExtraToolTips(itemStack)); toolTip.add(modString); return toolTip; } protected List getExtraToolTips(ItemStack stack) { return Lists.newArrayList(); } protected String getItemCountOverlay(ItemStack currentStack) { return ""; } public ItemStack getCurrentStack() { if (itemList.size() == 0) return new ItemStack(Items.AIR); return itemList.get(MathHelper.floor((System.currentTimeMillis() / 500 % (double) itemList.size()) / 1f)); } public void setItemList(List itemList) { this.itemList = itemList; } @Override public Rectangle getBounds() { return new Rectangle(this.x - 1, this.y - 1, 18, 18); } @Override public boolean onMouseClick(int button, double mouseX, double mouseY) { if (!clickToMoreRecipes) return false; if (getBounds().contains(mouseX, mouseY)) { if (button == 0) return ClientHelper.executeRecipeKeyBind(GuiHelper.getLastOverlay(), getCurrentStack().copy()); else if (button == 1) return ClientHelper.executeUsageKeyBind(GuiHelper.getLastOverlay(), getCurrentStack().copy()); } return false; } }