package crazypants.enderio.machine.hypercube; import java.awt.Color; import java.awt.Rectangle; import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiButton; import org.lwjgl.opengl.GL11; import com.enderio.core.api.client.gui.IGuiOverlay; import com.enderio.core.api.client.gui.ListSelectionListener; import com.enderio.core.client.gui.button.IconButton; import com.enderio.core.client.gui.button.ToggleButton; import com.enderio.core.client.gui.widget.GuiScrollableList; import com.enderio.core.client.gui.widget.GuiToolTip; import com.enderio.core.client.gui.widget.TextFieldEnder; import com.enderio.core.client.render.ColorUtil; import com.enderio.core.client.render.RenderUtil; import com.enderio.core.common.util.BlockCoord; import com.enderio.core.common.util.PlayerUtil; import crazypants.enderio.EnderIO; import crazypants.enderio.gui.GuiContainerBaseEIO; import crazypants.enderio.gui.IconEIO; import crazypants.enderio.gui.RedstoneModeButton; import crazypants.enderio.machine.hypercube.TileHyperCube.IoMode; import crazypants.enderio.machine.hypercube.TileHyperCube.SubChannel; import crazypants.enderio.machine.power.PowerDisplayUtil; import crazypants.enderio.network.PacketHandler; public class GuiHyperCube extends GuiContainerBaseEIO { protected static final int POWER_INPUT_BUTTON_ID = 1; protected static final int POWER_OUTPUT_BUTTON_ID = 2; protected static final int ADD_BUTTON_ID = 3; protected static final int PRIVATE_BUTTON_ID = 4; protected static final int SELECT_PRIVATE_BUTTON_ID = 5; protected static final int SELECT_PUBLIC_BUTTON_ID = 6; protected static final int DELETE_PRIVATE_BUTTON_ID = 7; protected static final int DELETE_PUBLIC_BUTTON_ID = 8; protected static final int POWER_MODE_BUTTON_ID = 9; protected static final int FLUID_MODE_BUTTON_ID = 10; private static final int ITEM_MODE_BUTTON_ID = 11; private static final int POWER_X = 227; private static final int POWER_Y = 46; private static final int POWER_WIDTH = 10; private static final int POWER_HEIGHT = 66; protected static final int BOTTOM_POWER_Y = POWER_Y + POWER_HEIGHT; private final TileHyperCube cube; private IconButton addButton; private ToggleButton privateButton; private TextFieldEnder newChannelTF; private GuiChannelList publicChannelList; private GuiChannelList privateChannelList; private ListSelectionListener<Channel> selectionListener; private IconButton selectPublicB; private IconButton deletePublicB; private IconButton selectPrivateB; private IconButton deletePrivateB; private IconButton powerB; private IconButton fluidB; private IconButton itemB; private RedstoneModeButton rsB; public GuiHyperCube(TileHyperCube te) { super(new ContainerHyperCube(), "hyperCube"); this.cube = te; xSize = 245; ySize = 145; addToolTip(new GuiToolTip(new Rectangle(POWER_X, POWER_Y, POWER_WIDTH, POWER_HEIGHT), "") { @Override protected void updateText() { text.clear(); text.add(PowerDisplayUtil.formatPower(cube.getEnergyStored()) + " / " + PowerDisplayUtil.formatPower(cube.getMaxEnergyStored()) + " " + PowerDisplayUtil.abrevation()); } }); addButton = new IconButton(this, ADD_BUTTON_ID, 137, 12, IconEIO.PLUS); addButton.setToolTip(EnderIO.lang.localize("gui.trans.addChannel")); addButton.enabled = false; privateButton = new ToggleButton(this, PRIVATE_BUTTON_ID, 118, 12, IconEIO.LOCK_UNLOCKED, IconEIO.LOCK_LOCKED); privateButton.setSelectedToolTip(EnderIO.lang.localize("gui.trans.privateChannel")); privateButton.setUnselectedToolTip(EnderIO.lang.localize("gui.trans.publicChannel")); deletePublicB = new IconButton(this, DELETE_PUBLIC_BUTTON_ID, 74, 117, IconEIO.MINUS); deletePublicB.setToolTip(EnderIO.lang.localize("gui.trans.deleteChannel")); selectPublicB = new IconButton(this, SELECT_PUBLIC_BUTTON_ID, 95, 117, IconEIO.TICK); selectPublicB.setToolTip(EnderIO.lang.localize("gui.trans.activateChannel")); deletePrivateB = new IconButton(this, DELETE_PRIVATE_BUTTON_ID, 183, 117, IconEIO.MINUS); deletePrivateB.setToolTip(EnderIO.lang.localize("gui.trans.deleteChannel")); selectPrivateB = new IconButton(this, SELECT_PRIVATE_BUTTON_ID, 204, 117, IconEIO.TICK); selectPrivateB.setToolTip(EnderIO.lang.localize("gui.trans.activateChannel")); int x = 163; int y = 12; itemB = new IconButton(this, ITEM_MODE_BUTTON_ID, x, y, IconEIO.WRENCH_OVERLAY_ITEM); itemB.setIconMargin(3, 3); x += 18; powerB = new IconButton(this, POWER_MODE_BUTTON_ID, x, y, IconEIO.WRENCH_OVERLAY_POWER); powerB.setIconMargin(3, 3); x += 18; fluidB = new IconButton(this, FLUID_MODE_BUTTON_ID, x, y, IconEIO.WRENCH_OVERLAY_FLUID); fluidB.setIconMargin(3, 3); x += 24; rsB = new RedstoneModeButton(this, 99, x, y, te, new BlockCoord(te)); updateIoButtons(); int w = 104; int h = 68; x = 7; y = 45; Channel activeChannel = cube.getChannel(); publicChannelList = new GuiChannelList(this, w, h, x, y); publicChannelList.setChannels(ClientChannelRegister.instance.getPublicChannels()); publicChannelList.setShowSelectionBox(true); publicChannelList.setScrollButtonIds(100, 101); publicChannelList.setActiveChannel(isPublic(activeChannel) ? activeChannel : null); x = x + 5 + w; privateChannelList = new GuiChannelList(this, w, h, x, y); privateChannelList.setChannels(ClientChannelRegister.instance.getPrivateChannels()); privateChannelList.setShowSelectionBox(true); privateChannelList.setScrollButtonIds(102, 103); privateChannelList.setActiveChannel(isPrivate(activeChannel) ? activeChannel : null); selectionListener = new ListSelectionListener<Channel>() { @Override public void selectionChanged(GuiScrollableList<Channel> list, int selectedIndex) { Channel selected = list.getSelectedElement(); if(selected != null) { GuiChannelList clear = list == publicChannelList ? privateChannelList : publicChannelList; clear.setSelection(-1); } } }; publicChannelList.addSelectionListener(selectionListener); privateChannelList.addSelectionListener(selectionListener); y = 12; x = 8; newChannelTF = new TextFieldEnder(Minecraft.getMinecraft().fontRenderer, x, y, 103, 16); newChannelTF.setCanLoseFocus(false); newChannelTF.setMaxStringLength(32); newChannelTF.setFocused(true); textFields.add(newChannelTF); } private void updateIoButtons() { IoMode mode = cube.getModeForChannel(SubChannel.POWER); if(mode.isRecieveEnabled() || mode.isSendEnabled()) { powerB.setIcon(IconEIO.WRENCH_OVERLAY_POWER); } else { powerB.setIcon(IconEIO.WRENCH_OVERLAY_POWER_OFF); } powerB.setToolTip(EnderIO.lang.localize("gui.trans.powerMode"), mode.getLocalisedName()); mode = cube.getModeForChannel(SubChannel.FLUID); if(mode.isRecieveEnabled() || mode.isSendEnabled()) { fluidB.setIcon(IconEIO.WRENCH_OVERLAY_FLUID); } else { fluidB.setIcon(IconEIO.WRENCH_OVERLAY_FLUID_OFF); } fluidB.setToolTip(EnderIO.lang.localize("gui.trans.fluidMode"), mode.getLocalisedName()); mode = cube.getModeForChannel(SubChannel.ITEM); if(mode.isRecieveEnabled() || mode.isSendEnabled()) { itemB.setIcon(IconEIO.WRENCH_OVERLAY_ITEM); } else { itemB.setIcon(IconEIO.WRENCH_OVERLAY_ITEM_OFF); } itemB.setToolTip(EnderIO.lang.localize("gui.trans.itemMode"), mode.getLocalisedName()); } private boolean isPublic(Channel chan) { if(chan == null) { return false; } return chan.isPublic(); } private boolean isPrivate(Channel chan) { if(chan == null) { return false; } return !chan.isPublic(); } @Override public void initGui() { super.initGui(); buttonList.clear(); privateButton.onGuiInit(); addButton.onGuiInit(); selectPrivateB.onGuiInit(); selectPublicB.onGuiInit(); deletePrivateB.onGuiInit(); deletePublicB.onGuiInit(); powerB.onGuiInit(); fluidB.onGuiInit(); itemB.onGuiInit(); publicChannelList.onGuiInit(this); privateChannelList.onGuiInit(this); rsB.onGuiInit(); } @Override protected void actionPerformed(GuiButton par1GuiButton) { if(par1GuiButton.id == FLUID_MODE_BUTTON_ID) { IoMode curMode = cube.getModeForChannel(SubChannel.FLUID); IoMode nextMode = curMode.next(); cube.setModeForChannel(SubChannel.FLUID, nextMode); updateIoButtons(); PacketHandler.INSTANCE.sendToServer(new PacketClientState(cube)); } else if(par1GuiButton.id == POWER_MODE_BUTTON_ID) { IoMode curMode = cube.getModeForChannel(SubChannel.POWER); IoMode nextMode = curMode.next(); cube.setModeForChannel(SubChannel.POWER, nextMode); updateIoButtons(); PacketHandler.INSTANCE.sendToServer(new PacketClientState(cube)); } else if(par1GuiButton.id == ITEM_MODE_BUTTON_ID) { IoMode curMode = cube.getModeForChannel(SubChannel.ITEM); IoMode nextMode = curMode.next(); cube.setModeForChannel(SubChannel.ITEM, nextMode); updateIoButtons(); PacketHandler.INSTANCE.sendToServer(new PacketClientState(cube)); } else if(par1GuiButton.id == ADD_BUTTON_ID) { Channel c; if(privateButton.isSelected()) { c = new Channel(newChannelTF.getText(), PlayerUtil.getPlayerUUID(Minecraft.getMinecraft().thePlayer.getGameProfile().getName())); } else { c = new Channel(newChannelTF.getText(), null); } ClientChannelRegister.instance.addChannel(c); PacketHandler.INSTANCE.sendToServer(new PacketAddRemoveChannel(true, c)); setActiveChannel(c); if(privateButton.isSelected()) { privateChannelList.setSelection(c); } else { publicChannelList.setSelection(c); } } else if(par1GuiButton.id == SELECT_PUBLIC_BUTTON_ID || par1GuiButton.id == SELECT_PRIVATE_BUTTON_ID) { Channel c = (par1GuiButton.id == SELECT_PUBLIC_BUTTON_ID) ? publicChannelList.getSelectedElement() : privateChannelList.getSelectedElement(); if(c != null) { setActiveChannel(c); } } else if(par1GuiButton.id == DELETE_PRIVATE_BUTTON_ID || par1GuiButton.id == DELETE_PUBLIC_BUTTON_ID) { Channel c = (par1GuiButton.id == DELETE_PUBLIC_BUTTON_ID) ? publicChannelList.getSelectedElement() : privateChannelList.getSelectedElement(); if(c != null) { if(c.equals(cube.getChannel())) { setActiveChannel(null); } ClientChannelRegister.instance.channelRemoved(c); PacketHandler.INSTANCE.sendToServer(new PacketAddRemoveChannel(false, c)); } } } private void setActiveChannel(Channel c) { cube.setChannel(c); publicChannelList.setActiveChannel(isPublic(c) ? c : null); privateChannelList.setActiveChannel(isPrivate(c) ? c : null); PacketHandler.INSTANCE.sendToServer(new PacketClientState(cube)); } @Override public boolean doesGuiPauseGame() { return false; } @Override protected void keyTyped(char par1, int par2) { super.keyTyped(par1, par2); if(par2 == 1) { for (IGuiOverlay overlay : overlays) { if(overlay.isVisible()) { overlay.setVisible(false); return; } } this.mc.thePlayer.closeScreen(); } addButton.enabled = newChannelTF.getText().trim().length() > 0; } @Override protected void drawGuiContainerBackgroundLayer(float partialTick, int mouseX, int mouseY) { super.drawGuiContainerBackgroundLayer(partialTick, mouseX, mouseY); 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, this.xSize, this.ySize); int i1 = cube.getEnergyStoredScaled(POWER_HEIGHT); drawTexturedModalRect(sx + POWER_X, sy + BOTTOM_POWER_Y - i1, 245, 0, POWER_WIDTH, i1); boolean chanSel = publicChannelList.getSelectedElement() != null; selectPublicB.enabled = chanSel; deletePublicB.enabled = chanSel; chanSel = privateChannelList.getSelectedElement() != null; selectPrivateB.enabled = chanSel; deletePrivateB.enabled = chanSel; publicChannelList.drawScreen(mouseX, mouseY, partialTick); privateChannelList.drawScreen(mouseX, mouseY, partialTick); for (int i = 0; i < buttonList.size(); ++i) { GuiButton guibutton = (GuiButton) this.buttonList.get(i); guibutton.drawButton(this.mc, 0, 0); } int x = guiLeft + 12; int y = guiTop + 35; int rgb = ColorUtil.getRGB(Color.white); drawString(getFontRenderer(), EnderIO.lang.localize("gui.trans.publicHeading"), x, y, rgb); x += 109; drawString(getFontRenderer(), EnderIO.lang.localize("gui.trans.privateHeading"), x, y, rgb); IoMode fluidMode = cube.getModeForChannel(SubChannel.FLUID); IoMode powerMode = cube.getModeForChannel(SubChannel.POWER); IoMode itemMode = cube.getModeForChannel(SubChannel.ITEM); x = 163; if(itemMode.isRecieveEnabled()) { IconEIO.map.render(IconEIO.INPUT_OLD, guiLeft + x + 15, guiTop + 4 + 7, -15, -7, 0, true); } x += 18; if(powerMode.isRecieveEnabled()) { IconEIO.map.render(IconEIO.INPUT_OLD, guiLeft + x + 15, guiTop + 4 + 7, -15, -7, 0, true); } x += 18; if(fluidMode.isRecieveEnabled()) { IconEIO.map.render(IconEIO.INPUT_OLD, guiLeft + x + 15, guiTop + 4 + 7, -15, -7, 0, true); } x = 163; if(itemMode.isSendEnabled()) { IconEIO.map.render(IconEIO.OUTPUT_OLD, guiLeft + x, guiTop + 29, 15, 7, 0, true); } x += 18; if(powerMode.isSendEnabled()) { IconEIO.map.render(IconEIO.OUTPUT_OLD, guiLeft + x, guiTop + 29, 15, 7, 0, true); } x += 18; if(fluidMode.isSendEnabled()) { IconEIO.map.render(IconEIO.OUTPUT_OLD, guiLeft + x, guiTop + 29, 15, 7, 0, true); } } @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, par3, font); GL11.glPopAttrib(); GL11.glPopAttrib(); } @Override public int getGuiLeft() { return guiLeft; } @Override public int getGuiTop() { return guiTop; } @Override public int getXSize() { return xSize; } @Override public FontRenderer getFontRenderer() { return Minecraft.getMinecraft().fontRenderer; } @Override public int getOverlayOffsetX() { return 0; } }