package crazypants.enderio.machine.capbank; import java.awt.Rectangle; import java.util.ArrayList; import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiButton; import net.minecraft.entity.Entity; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.EnumChatFormatting; import org.lwjgl.opengl.GL11; import com.enderio.core.client.gui.widget.GuiToolTip; import com.enderio.core.client.gui.widget.TextFieldEnder; import com.enderio.core.client.render.RenderUtil; import com.enderio.core.common.util.BlockCoord; import com.enderio.core.common.vecmath.VecmathUtil; import crazypants.enderio.EnderIO; import crazypants.enderio.gui.GuiContainerBaseEIO; import crazypants.enderio.gui.RedstoneModeButton; import crazypants.enderio.machine.IRedstoneModeControlable; import crazypants.enderio.machine.IoMode; import crazypants.enderio.machine.RedstoneControlMode; import crazypants.enderio.machine.capbank.network.CapBankClientNetwork; import crazypants.enderio.machine.capbank.packet.PacketGuiChange; import crazypants.enderio.machine.capbank.packet.PacketNetworkStateRequest; import crazypants.enderio.machine.gui.GuiButtonIoConfig; import crazypants.enderio.machine.gui.GuiOverlayIoConfig; import crazypants.enderio.machine.gui.GuiPoweredMachineBase; import crazypants.enderio.machine.power.PowerDisplayUtil; import crazypants.enderio.network.PacketHandler; public class GuiCapBank extends GuiContainerBaseEIO { private static final CapBankClientNetwork NULL_NETWORK = new CapBankClientNetwork(-1); protected static final int INPUT_BUTTON_ID = 18; protected static final int OUTPUT_BUTTON_ID = 37; protected static final int CONFIG_ID = 377996104; private static final int POWER_X = 11 + 18; private static final int POWER_Y = 9; private static final int POWER_WIDTH = 10; private static final int POWER_HEIGHT = 68; protected static final int BOTTOM_POWER_Y = POWER_Y + POWER_HEIGHT; private int inputX = 78 + 24; private int inputY = 18; private int outputX = 78 + 24; private int outputY = 36; private int rightMargin = 8 + 24; private final TileCapBank capBank; private RedstoneModeButton inputRsButton; private RedstoneModeButton outputRsButton; private TextFieldEnder maxInputTF; private TextFieldEnder maxOutputTF; private final GuiOverlayIoConfig configOverlay; private final GuiButtonIoConfig configB; private CapBankClientNetwork network; private int initialStateCount = -1; private boolean initState = true; private final ContainerCapBank container; public GuiCapBank(Entity player, InventoryPlayer playerInv, TileCapBank te) { super(new ContainerCapBank(playerInv, te), "capacitorBank"); capBank = te; container = (ContainerCapBank) inventorySlots; updateState(); xSize = 176 + 42; addToolTip(new GuiToolTip(new Rectangle(5, POWER_Y, POWER_WIDTH, POWER_HEIGHT), "") { @Override protected void updateText() { text.clear(); text.add(PowerDisplayUtil.formatPower(network.getEnergyStoredL()) + " " + PowerDisplayUtil.ofStr()); text.add(EnumChatFormatting.WHITE + PowerDisplayUtil.formatPower(network.getMaxEnergyStoredL()) + " " + EnumChatFormatting.GRAY + PowerDisplayUtil.abrevation()); float change = network.getAverageChangePerTick(); String color = EnumChatFormatting.WHITE.toString(); if(change > 0) { color = EnumChatFormatting.GREEN.toString() + "+"; } else if(change < 0) { color = EnumChatFormatting.RED.toString(); } text.add(String.format("%s%s%s" + PowerDisplayUtil.abrevation() + PowerDisplayUtil.perTickStr(), color, PowerDisplayUtil.formatPower(Math.round(change)), " " + EnumChatFormatting.GRAY.toString())); } }); int x = xSize - rightMargin - GuiPoweredMachineBase.BUTTON_SIZE - 21; int y = inputY; inputRsButton = new RedstoneModeButton(this, -1, x, y, new IRedstoneModeControlable() { @Override public void setRedstoneControlMode(RedstoneControlMode mode) { network.setInputControlMode(mode); sendUpdateToServer(); } @Override public RedstoneControlMode getRedstoneControlMode() { return network.getInputControlMode(); } }); inputRsButton.setTooltipKey("enderio.gui.capBank.inputRs"); y += 18; outputRsButton = new RedstoneModeButton(this, -1, x, y, new IRedstoneModeControlable() { @Override public void setRedstoneControlMode(RedstoneControlMode mode) { network.setOutputControlMode(mode); sendUpdateToServer(); } @Override public RedstoneControlMode getRedstoneControlMode() { return network.getOutputControlMode(); } }); outputRsButton.setTooltipKey("enderio.gui.capBank.outputRs"); List<BlockCoord> coords = new ArrayList<BlockCoord>(); if(network != null && network.getMembers().size() < 200) { for (TileCapBank cb : network.getMembers()) { coords.add(cb.getLocation()); } } if(coords.isEmpty()) { coords.add(te.getLocation()); } configOverlay = new GuiOverlayIoConfig(coords) { @Override protected String getLabelForMode(IoMode mode) { if(mode == IoMode.PUSH) { return EnderIO.lang.localize("gui.capBank.outputMode"); } else if(mode == IoMode.PULL) { return EnderIO.lang.localize("gui.capBank.inputMode"); } return super.getLabelForMode(mode); } }; addOverlay(configOverlay); y += 20; configB = new GuiButtonIoConfig(this, CONFIG_ID, x, y, te, configOverlay); FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; x = inputX - 24; y = inputY; maxInputTF = new TextFieldEnder(fontRenderer, x, y, 68, 16); maxInputTF.setMaxStringLength(10); maxInputTF.setCharFilter(TextFieldEnder.FILTER_NUMERIC); x = outputX - 24; y = outputY; maxOutputTF = new TextFieldEnder(fontRenderer, x, y, 68, 16); maxOutputTF.setMaxStringLength(10); maxOutputTF.setCharFilter(TextFieldEnder.FILTER_NUMERIC); textFields.add(maxInputTF); textFields.add(maxOutputTF); } @Override public void initGui() { super.initGui(); configB.onGuiInit(); inputRsButton.onGuiInit(); outputRsButton.onGuiInit(); } @Override protected void keyTyped(char par1, int par2) { super.keyTyped(par1, par2); updateInputOutput(); } private void updateInputOutput() { int input = PowerDisplayUtil.parsePower(maxInputTF); if(input >= 0 && network.getMaxInput() != input) { setMaxInput(input); } int output = PowerDisplayUtil.parsePower(maxOutputTF); if(output >= 0 && network.getMaxOutput() != output) { setMaxOutput(output); } } private void setMaxOutput(int output) { if(output != network.getMaxOutput()) { network.setMaxOutput(output); maxOutputTF.setText(PowerDisplayUtil.formatPower(network.getMaxOutput())); sendUpdateToServer(); } } private void setMaxInput(int input) { if(input != network.getMaxInput()) { network.setMaxInput(input); maxInputTF.setText(PowerDisplayUtil.formatPower(network.getMaxInput())); sendUpdateToServer(); } } protected void sendUpdateToServer() { if(network != NULL_NETWORK) { PacketHandler.INSTANCE.sendToServer(new PacketGuiChange(capBank)); } } @Override protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { requestStateUpdate(); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); bindGuiTexture(); int sx = (width - xSize) / 2; int sy = (height - ySize) / 2; drawTexturedModalRect(sx, sy, 0, 0, xSize - 21, ySize); if (container.hasBaublesSlots()) { drawTexturedModalRect(sx, sy + 83, 197, 83, 24, 77); } int i1 = getEnergyStoredScaled(POWER_HEIGHT); drawTexturedModalRect(sx + POWER_X, sy + BOTTOM_POWER_Y - i1, 176 + 21, 0, POWER_WIDTH, i1); for (int i = 0; i < buttonList.size(); ++i) { GuiButton guibutton = (GuiButton) buttonList.get(i); guibutton.drawButton(mc, 0, 0); } int midX = sx + xSize / 2; String str = EnderIO.lang.localize("gui.capBank.maxIo") + " " + PowerDisplayUtil.formatPower(network.getMaxIO()) + " " + PowerDisplayUtil.abrevation() + PowerDisplayUtil.perTickStr(); FontRenderer fontRenderer = getFontRenderer(); int swid = fontRenderer.getStringWidth(str); int x = midX - swid / 2; int y = guiTop + 5; drawString(fontRenderer, str, x, y, -1); str = EnderIO.lang.localize("gui.capBank.maxInput") + ":"; swid = fontRenderer.getStringWidth(str); x = guiLeft + inputX - swid - 3; y = guiTop + inputY + 2; drawString(fontRenderer, str, x, y, -1); str = EnderIO.lang.localize("gui.capBank.maxOutput") + ":"; swid = fontRenderer.getStringWidth(str); x = guiLeft + outputX - swid - 3; y = guiTop + outputY + 2; drawString(fontRenderer, str, x, y, -1); super.drawGuiContainerBackgroundLayer(par1, par2, par3); } @SuppressWarnings("rawtypes") @Override public void drawHoveringText(List par1List, int par2, int par3, FontRenderer font) { GL11.glPushAttrib(GL11.GL_ENABLE_BIT); GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); super.drawHoveringText(par1List, par2 + 24, par3, font); GL11.glPopAttrib(); GL11.glPopAttrib(); } @Override public int getGuiLeft() { return guiLeft + 24; } @Override public int getGuiTop() { return guiTop; } @Override public int getXSize() { return xSize - 42; } @Override public int getOverlayOffsetX() { return 21; } @Override public FontRenderer getFontRenderer() { return Minecraft.getMinecraft().fontRenderer; } private int getEnergyStoredScaled(int scale) { return (int) VecmathUtil.clamp(Math.round(scale * network.getEnergyStoredRatio()), 0, scale); } private void requestStateUpdate() { if(EnderIO.proxy.getTickCount() % 2 == 0) { if(!updateState()) { network.requestPowerUpdate(capBank, 2); } } } private boolean updateState() { if(!initState) { return false; } if(capBank.getNetwork() == null) { network = NULL_NETWORK; return true; } if(network == null || network == NULL_NETWORK) { network = (CapBankClientNetwork) capBank.getNetwork(); initialStateCount = network.getStateUpdateCount(); PacketHandler.INSTANCE.sendToServer(new PacketNetworkStateRequest(capBank)); return true; } if(network.getStateUpdateCount() == initialStateCount) { PacketHandler.INSTANCE.sendToServer(new PacketNetworkStateRequest(capBank)); return true; } if(network.getStateUpdateCount() > initialStateCount) { container.updateInventory(); updateFieldsFromState(); initState = false; return true; } return false; } private void updateFieldsFromState() { maxInputTF.setText(PowerDisplayUtil.formatPower(network.getMaxInput())); maxOutputTF.setText(PowerDisplayUtil.formatPower(network.getMaxOutput())); inputRsButton.setMode(network.getInputControlMode()); outputRsButton.setMode(network.getOutputControlMode()); } }