package openmods.gui.component; import com.google.common.base.Function; import com.google.common.base.Objects; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import java.util.Iterator; import java.util.List; import java.util.Random; import javax.annotation.Nullable; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; import openmods.utils.CollectionUtils; import org.lwjgl.opengl.GL11; public class GuiComponentCraftingGrid extends GuiComponentSprite { private static final int UPDATE_DELAY = 20; private static final Random rnd = new Random(); private static final Function<ItemStack, ItemStack[]> EXPAND_TRANSFORM = new Function<ItemStack, ItemStack[]>() { @Override @Nullable public ItemStack[] apply(@Nullable ItemStack input) { return input != null? new ItemStack[] { input.copy() } : null; } }; private final ItemStack[][] items; private final ItemStack[] selectedItems; private int changeCountdown = UPDATE_DELAY; public GuiComponentCraftingGrid(int x, int y, ItemStack[] items, IIcon background, ResourceLocation backgroundTexture) { this(x, y, CollectionUtils.transform(items, EXPAND_TRANSFORM), background, backgroundTexture); } public GuiComponentCraftingGrid(int x, int y, ItemStack[][] items, IIcon icon, ResourceLocation texture) { super(x, y, icon, texture); Preconditions.checkNotNull(items, "No items in grid"); this.items = items; this.selectedItems = new ItemStack[items.length]; selectItems(); } @Override public boolean isTicking() { return true; } @Override public void tick() { if (changeCountdown-- <= 0) { selectItems(); changeCountdown = UPDATE_DELAY; } } @Override public void render(Minecraft minecraft, int offsetX, int offsetY, int mouseX, int mouseY) { super.render(minecraft, offsetX, offsetY, mouseX, mouseY); final int gridOffsetX = 1; final int gridOffsetY = 1; final int itemBoxSize = 19; for (int i = 0; i < items.length; i++) { ItemStack input = selectedItems[i]; if (input != null) { int row = (i % 3); int column = i / 3; int itemX = offsetX + gridOffsetX + (row * itemBoxSize); int itemY = offsetY + gridOffsetY + (column * itemBoxSize); drawItemStack(input, x + itemX, y + itemY, ""); } } } private void selectItems() { for (int i = 0; i < items.length; i++) { ItemStack[] slotItems = items[i]; if (slotItems.length == 0) selectedItems[i] = null; else { final int choice = rnd.nextInt(slotItems.length); selectedItems[i] = slotItems[choice]; } } } @Override public void renderOverlay(Minecraft minecraft, int offsetX, int offsetY, int mouseX, int mouseY) { super.renderOverlay(minecraft, offsetX, offsetY, mouseX, mouseY); final int relativeMouseX = mouseX + offsetX - x; final int relativeMouseY = mouseY + offsetY - y; final int gridOffsetX = 1; final int gridOffsetY = 1; final int itemBoxSize = 19; if (isMouseOver(mouseX, mouseY)) { ItemStack tooltip = null; // so lazy for (int i = 0; i < selectedItems.length; i++) { int row = (i % 3); int column = i / 3; int itemX = offsetX + gridOffsetX + (row * itemBoxSize); int itemY = offsetY + gridOffsetY + (column * itemBoxSize); if (relativeMouseX > itemX - 2 && relativeMouseX < itemX - 2 + itemBoxSize && relativeMouseY > itemY - 2 && relativeMouseY < itemY - 2 + itemBoxSize) { tooltip = selectedItems[i]; break; } } if (tooltip != null) { drawItemStackTooltip(tooltip, relativeMouseX + 25, relativeMouseY + 30); } } } protected void drawItemStackTooltip(ItemStack stack, int x, int y) { final Minecraft mc = Minecraft.getMinecraft(); FontRenderer font = Objects.firstNonNull(stack.getItem().getFontRenderer(stack), mc.fontRenderer); GL11.glColor3f(1, 1, 1); GL11.glDisable(GL11.GL_LIGHTING); @SuppressWarnings("unchecked") List<String> list = stack.getTooltip(mc.thePlayer, mc.gameSettings.advancedItemTooltips); List<String> colored = Lists.newArrayListWithCapacity(list.size()); Iterator<String> it = list.iterator(); colored.add(getRarityColor(stack) + it.next()); while (it.hasNext()) colored.add(EnumChatFormatting.GRAY + it.next()); drawHoveringText(colored, x, y, font); } private static EnumChatFormatting getRarityColor(ItemStack stack) { return stack.getRarity().rarityColor; } }