package mekanism.client.gui; import java.io.IOException; import java.util.Set; import mekanism.api.Coord4D; import mekanism.client.render.MekanismRenderer; import mekanism.client.sound.SoundHandler; import mekanism.common.Mekanism; import mekanism.common.Upgrade; import mekanism.common.base.IUpgradeTile; import mekanism.common.block.states.BlockStateMachine.MachineType; import mekanism.common.inventory.container.ContainerUpgradeManagement; import mekanism.common.network.PacketRemoveUpgrade.RemoveUpgradeMessage; import mekanism.common.network.PacketSimpleGui.SimpleGuiMessage; import mekanism.common.util.LangUtils; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.init.SoundEvents; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiUpgradeManagement extends GuiMekanism { public IUpgradeTile tileEntity; public Upgrade selectedType; public boolean isDragging = false; public int dragOffset = 0; public int supportedIndex; public int delay; public float scroll; public GuiUpgradeManagement(InventoryPlayer inventory, IUpgradeTile tile) { super(new ContainerUpgradeManagement(inventory, tile)); tileEntity = tile; } @Override public void updateScreen() { super.updateScreen(); if(delay < 40) { delay++; } else { delay = 0; supportedIndex = ++supportedIndex%tileEntity.getComponent().getSupportedTypes().size(); } } @Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { int xAxis = (mouseX - (width - xSize) / 2); int yAxis = (mouseY - (height - ySize) / 2); mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.GUI, "GuiUpgradeManagement.png")); GL11.glColor4f(1, 1, 1, 1); drawTexturedModalRect(84, 8+getScroll(), 202, 0, 4, 4); fontRendererObj.drawString(LangUtils.localize("container.inventory"), 8, (ySize - 96) + 2, 0x404040); fontRendererObj.drawString(LangUtils.localize("gui.upgrades.supported") + ":", 26, 59, 0x404040); if(selectedType == null) { renderText(LangUtils.localize("gui.upgrades.noSelection") + ".", 92, 8, 0.8F, true); } else { int amount = tileEntity.getComponent().getUpgrades(selectedType); renderText(selectedType.getName() + " " + LangUtils.localize("gui.upgrade"), 92, 8, 0.6F, true); renderText(LangUtils.localize("gui.upgrades.amount") + ": " + amount + "/" + selectedType.getMax(), 92, 16, 0.6F, true); int text = 0; for(String s : selectedType.getInfo((TileEntity)tileEntity)) { renderText(s, 92, 22+(6*text++), 0.6F, true); } } if(!tileEntity.getComponent().getSupportedTypes().isEmpty()) { Upgrade[] supported = tileEntity.getComponent().getSupportedTypes().toArray(new Upgrade[tileEntity.getComponent().getSupportedTypes().size()]); if(supported.length > supportedIndex) { renderUpgrade(supported[supportedIndex], 80, 57, 0.8F, true); fontRendererObj.drawString(supported[supportedIndex].getName(), 96, 59, 0x404040); } } Upgrade[] upgrades = getCurrentUpgrades().toArray(new Upgrade[getCurrentUpgrades().size()]); for(int i = 0; i < 4; i++) { int index = getUpgradeIndex()+i; if(index > upgrades.length-1) { break; } Upgrade upgrade = upgrades[index]; int xPos = 25; int yPos = 7 + (i*12); int yRender = 0; fontRendererObj.drawString(upgrade.getName(), xPos + 12, yPos + 2, 0x404040); renderUpgrade(upgrade, xPos + 2, yPos + 2, 0.5F, true); if(xAxis >= xPos && xAxis <= xPos+58 && yAxis >= yPos && yAxis <= yPos+12) { drawHoveringText(MekanismUtils.splitTooltip(upgrade.getDescription(), upgrade.getStack()), xAxis, yAxis); } } super.drawGuiContainerForegroundLayer(mouseX, mouseY); } private void renderText(String text, int x, int y, float size, boolean scale) { GlStateManager.pushMatrix(); GlStateManager.scale(size, size, size); fontRendererObj.drawString(text, scale ? (int)((1F/size)*x) : x, scale ? (int)((1F/size)*y) : y, 0x00CD00); GlStateManager.popMatrix(); } private void renderUpgrade(Upgrade type, int x, int y, float size, boolean scale) { GlStateManager.pushMatrix(); GlStateManager.scale(size, size, size); RenderHelper.enableGUIStandardItemLighting(); itemRender.renderItemAndEffectIntoGUI(type.getStack(), scale ? (int)((1F/size)*x) : x, scale ? (int)((1F/size)*y) : y); RenderHelper.disableStandardItemLighting(); GlStateManager.popMatrix(); } @Override protected void drawGuiContainerBackgroundLayer(float partialTick, int mouseX, int mouseY) { mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.GUI, "GuiUpgradeManagement.png")); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); int guiWidth = (width - xSize) / 2; int guiHeight = (height - ySize) / 2; drawTexturedModalRect(guiWidth, guiHeight, 0, 0, xSize, ySize); int xAxis = (mouseX - (width - xSize) / 2); int yAxis = (mouseY - (height - ySize) / 2); if(xAxis >= 6 && xAxis <= 20 && yAxis >= 6 && yAxis <= 20) { drawTexturedModalRect(guiWidth + 6, guiHeight + 6, 176, 0, 14, 14); } else { drawTexturedModalRect(guiWidth + 6, guiHeight + 6, 176, 14, 14, 14); } if(selectedType == null) { drawTexturedModalRect(guiWidth + 136, guiHeight + 57, 176 + 14, 24, 12, 12); } else if(xAxis >= 136 && xAxis <= 148 && yAxis >= 57 && yAxis <= 69) { drawTexturedModalRect(guiWidth + 136, guiHeight + 57, 176 + 14, 0, 12, 12); } else { drawTexturedModalRect(guiWidth + 136, guiHeight + 57, 176 + 14, 12, 12, 12); } int displayInt = tileEntity.getComponent().getScaledUpgradeProgress(14); drawTexturedModalRect(guiWidth + 154, guiHeight + 26, 176, 28, 10, displayInt); if(selectedType != null && tileEntity.getComponent().getUpgrades(selectedType) == 0) { selectedType = null; } Upgrade[] upgrades = getCurrentUpgrades().toArray(new Upgrade[getCurrentUpgrades().size()]); for(int i = 0; i < 4; i++) { int index = getUpgradeIndex()+i; if(index > upgrades.length-1) { break; } Upgrade upgrade = upgrades[index]; int xPos = 25; int yPos = 7 + (i*12); int yRender = 0; if(upgrade == selectedType) { yRender = 166 + 24; } else if(xAxis >= xPos && xAxis <= xPos+58 && yAxis >= yPos && yAxis <= yPos+12) { yRender = 166; } else { yRender = 166 + 12; } MekanismRenderer.color(upgrade.getColor(), 1.0F, 2.5F); drawTexturedModalRect(guiWidth + xPos, guiHeight + yPos, 0, yRender, 58, 12); MekanismRenderer.resetColor(); } super.drawGuiContainerBackgroundLayer(partialTick, mouseX, mouseY); } private Set<Upgrade> getCurrentUpgrades() { return tileEntity.getComponent().getInstalledTypes(); } public int getScroll() { return Math.max(Math.min((int)(scroll*42), 42), 0); } public int getUpgradeIndex() { if(getCurrentUpgrades().size() <= 4) { return 0; } return (int)((getCurrentUpgrades().size()*scroll) - ((4F/(float)getCurrentUpgrades().size()))*scroll); } @Override protected void mouseClickMove(int mouseX, int mouseY, int button, long ticks) { super.mouseClickMove(mouseX, mouseY, button, ticks); int xAxis = (mouseX - (width - xSize) / 2); int yAxis = (mouseY - (height - ySize) / 2); if(isDragging) { scroll = Math.min(Math.max((float)(yAxis-8-dragOffset)/42F, 0), 1); } } @Override protected void mouseReleased(int mouseX, int mouseY, int type) { super.mouseReleased(mouseX, mouseY, type); if(type == 0 && isDragging) { dragOffset = 0; isDragging = false; } } @Override protected void mouseClicked(int mouseX, int mouseY, int button) throws IOException { super.mouseClicked(mouseX, mouseY, button); int xAxis = (mouseX - (width - xSize) / 2); int yAxis = (mouseY - (height - ySize) / 2); TileEntity tile = (TileEntity)tileEntity; if(button == 0) { if(xAxis >= 84 && xAxis <= 88 && yAxis >= getScroll()+8 && yAxis <= getScroll()+8+4) { if(getCurrentUpgrades().size()>4) { dragOffset = yAxis - (getScroll()+8); isDragging = true; } else { scroll = 0; } } if(xAxis >= 6 && xAxis <= 20 && yAxis >= 6 && yAxis <= 20) { int guiId = MachineType.get(tile.getBlockType(), tile.getBlockMetadata()).guiId; SoundHandler.playSound(SoundEvents.UI_BUTTON_CLICK); Mekanism.packetHandler.sendToServer(new SimpleGuiMessage(Coord4D.get(tile), 0, guiId)); } if(selectedType != null && xAxis >= 136 && xAxis <= 148 && yAxis >= 57 && yAxis <= 69) { SoundHandler.playSound(SoundEvents.UI_BUTTON_CLICK); Mekanism.packetHandler.sendToServer(new RemoveUpgradeMessage(Coord4D.get(tile), selectedType.ordinal())); } int counter = 0; for(Upgrade upgrade : getCurrentUpgrades()) { int xPos = 25; int yPos = 7 + (counter++*12); int yRender = 0; if(xAxis >= xPos && xAxis <= xPos+58 && yAxis >= yPos && yAxis <= yPos+12) { selectedType = upgrade; break; } } } } }