| package mekanism.client.gui; |
| |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.UUID; |
| |
| import mekanism.api.Coord4D; |
| import mekanism.api.EnumColor; |
| import mekanism.client.MekanismClient; |
| import mekanism.client.gui.element.GuiPowerBar; |
| import mekanism.client.gui.element.GuiPowerBar.IPowerInfoHandler; |
| import mekanism.client.gui.element.GuiRedstoneControl; |
| import mekanism.client.gui.element.GuiScrollList; |
| import mekanism.client.gui.element.GuiSlot; |
| import mekanism.client.gui.element.GuiSlot.SlotOverlay; |
| import mekanism.client.gui.element.GuiSlot.SlotType; |
| import mekanism.client.gui.element.GuiUpgradeTab; |
| import mekanism.client.sound.SoundHandler; |
| import mekanism.common.Mekanism; |
| import mekanism.common.frequency.Frequency; |
| import mekanism.common.frequency.FrequencyManager; |
| import mekanism.common.inventory.container.ContainerNull; |
| import mekanism.common.inventory.container.ContainerTeleporter; |
| import mekanism.common.item.ItemPortableTeleporter; |
| import mekanism.common.network.PacketPortableTeleporter.PortableTeleporterMessage; |
| import mekanism.common.network.PacketPortableTeleporter.PortableTeleporterPacketType; |
| import mekanism.common.network.PacketTileEntity.TileEntityMessage; |
| import mekanism.common.security.IOwnerItem; |
| import mekanism.common.tile.TileEntityTeleporter; |
| import mekanism.common.util.LangUtils; |
| import mekanism.common.util.MekanismUtils; |
| import mekanism.common.util.MekanismUtils.ResourceType; |
| import net.minecraft.client.gui.GuiButton; |
| import net.minecraft.client.gui.GuiTextField; |
| import net.minecraft.entity.player.EntityPlayer; |
| import net.minecraft.entity.player.InventoryPlayer; |
| import net.minecraft.init.SoundEvents; |
| import net.minecraft.item.ItemStack; |
| import net.minecraft.util.EnumHand; |
| import net.minecraft.util.ResourceLocation; |
| import net.minecraftforge.fml.relauncher.Side; |
| import net.minecraftforge.fml.relauncher.SideOnly; |
| |
| import org.lwjgl.input.Keyboard; |
| import org.lwjgl.opengl.GL11; |
| |
| @SideOnly(Side.CLIENT) |
| public class GuiTeleporter extends GuiMekanism |
| { |
| public EnumHand currentHand; |
| |
| public ResourceLocation resource; |
| |
| public TileEntityTeleporter tileEntity; |
| public ItemStack itemStack = ItemStack.EMPTY; |
| |
| public EntityPlayer entityPlayer; |
| |
| public GuiButton publicButton; |
| public GuiButton privateButton; |
| |
| public GuiButton setButton; |
| public GuiButton deleteButton; |
| |
| public GuiButton teleportButton; |
| |
| public GuiScrollList scrollList; |
| |
| public GuiTextField frequencyField; |
| |
| public boolean privateMode; |
| |
| public Frequency clientFreq; |
| public byte clientStatus; |
| |
| public List<Frequency> clientPublicCache = new ArrayList<Frequency>(); |
| public List<Frequency> clientPrivateCache = new ArrayList<Frequency>(); |
| |
| public boolean isInit = true; |
| |
| public GuiTeleporter(InventoryPlayer inventory, TileEntityTeleporter tentity) |
| { |
| super(tentity, new ContainerTeleporter(inventory, tentity)); |
| tileEntity = tentity; |
| resource = MekanismUtils.getResource(ResourceType.GUI, "GuiTeleporter.png"); |
| |
| guiElements.add(new GuiRedstoneControl(this, tileEntity, resource)); |
| guiElements.add(new GuiUpgradeTab(this, tileEntity, resource)); |
| guiElements.add(new GuiPowerBar(this, new IPowerInfoHandler() { |
| @Override |
| public String getTooltip() |
| { |
| return MekanismUtils.getEnergyDisplay(getEnergy()); |
| } |
| |
| @Override |
| public double getLevel() |
| { |
| return getEnergy()/getMaxEnergy(); |
| } |
| }, resource, 158, 26)); |
| guiElements.add(new GuiSlot(SlotType.NORMAL, this, resource, 152, 6).with(SlotOverlay.POWER)); |
| guiElements.add(scrollList = new GuiScrollList(this, resource, 28, 37, 120, 4)); |
| |
| if(tileEntity.frequency != null) |
| { |
| privateMode = !tileEntity.frequency.publicFreq; |
| } |
| |
| ySize+=64; |
| } |
| |
| public GuiTeleporter(EntityPlayer player, EnumHand hand, ItemStack stack) |
| { |
| super(new ContainerNull()); |
| currentHand = hand; |
| itemStack = stack; |
| entityPlayer = player; |
| resource = MekanismUtils.getResource(ResourceType.GUI, "GuiPortableTeleporter.png"); |
| |
| guiElements.add(new GuiPowerBar(this, new IPowerInfoHandler() { |
| @Override |
| public String getTooltip() |
| { |
| return MekanismUtils.getEnergyDisplay(getEnergy()); |
| } |
| |
| @Override |
| public double getLevel() |
| { |
| return getEnergy()/getMaxEnergy(); |
| } |
| }, resource, 158, 26)); |
| guiElements.add(scrollList = new GuiScrollList(this, resource, 28, 37, 120, 4)); |
| |
| ItemPortableTeleporter item = (ItemPortableTeleporter)itemStack.getItem(); |
| |
| if(item.getFrequency(stack) != null) |
| { |
| privateMode = item.isPrivateMode(itemStack); |
| setFrequency(item.getFrequency(stack)); |
| } |
| else { |
| Mekanism.packetHandler.sendToServer(new PortableTeleporterMessage(PortableTeleporterPacketType.DATA_REQUEST, currentHand, clientFreq)); |
| } |
| |
| ySize = 175; |
| } |
| |
| @Override |
| public void initGui() |
| { |
| super.initGui(); |
| |
| int guiWidth = (width - xSize) / 2; |
| int guiHeight = (height - ySize) / 2; |
| |
| buttonList.clear(); |
| |
| publicButton = new GuiButton(0, guiWidth + 27, guiHeight + 14, 60, 20, LangUtils.localize("gui.public")); |
| privateButton = new GuiButton(1, guiWidth + 89, guiHeight + 14, 60, 20, LangUtils.localize("gui.private")); |
| |
| setButton = new GuiButton(2, guiWidth + 27, guiHeight + 116, 60, 20, LangUtils.localize("gui.set")); |
| deleteButton = new GuiButton(3, guiWidth + 89, guiHeight + 116, 60, 20, LangUtils.localize("gui.delete")); |
| |
| if(!itemStack.isEmpty()) |
| { |
| teleportButton = new GuiButton(4, guiWidth + 42, guiHeight + 140, 92, 20, LangUtils.localize("gui.teleport")); |
| } |
| |
| frequencyField = new GuiTextField(5, fontRendererObj, guiWidth + 50, guiHeight + 104, 86, 11); |
| frequencyField.setMaxStringLength(FrequencyManager.MAX_FREQ_LENGTH); |
| |
| frequencyField.setEnableBackgroundDrawing(false); |
| |
| updateButtons(); |
| |
| buttonList.add(publicButton); |
| buttonList.add(privateButton); |
| buttonList.add(setButton); |
| buttonList.add(deleteButton); |
| |
| if(!itemStack.isEmpty()) |
| { |
| buttonList.add(teleportButton); |
| |
| if(!isInit) |
| { |
| Mekanism.packetHandler.sendToServer(new PortableTeleporterMessage(PortableTeleporterPacketType.DATA_REQUEST, currentHand, clientFreq)); |
| } |
| else { |
| isInit = false; |
| } |
| } |
| } |
| |
| public void setFrequency(String freq) |
| { |
| if(freq.isEmpty()) |
| { |
| return; |
| } |
| |
| if(tileEntity != null) |
| { |
| ArrayList data = new ArrayList(); |
| data.add(0); |
| data.add(freq); |
| data.add(!privateMode); |
| |
| Mekanism.packetHandler.sendToServer(new TileEntityMessage(Coord4D.get(tileEntity), data)); |
| } |
| else { |
| Frequency newFreq = new Frequency(freq, null).setPublic(!privateMode); |
| |
| Mekanism.packetHandler.sendToServer(new PortableTeleporterMessage(PortableTeleporterPacketType.SET_FREQ, currentHand, newFreq)); |
| } |
| } |
| |
| public String getSecurity(Frequency freq) |
| { |
| return !freq.publicFreq ? EnumColor.DARK_RED + LangUtils.localize("gui.private") : LangUtils.localize("gui.public"); |
| } |
| |
| public void updateButtons() |
| { |
| if(getOwner() == null) |
| { |
| return; |
| } |
| |
| List<String> text = new ArrayList<String>(); |
| |
| if(privateMode) |
| { |
| for(Frequency freq : getPrivateCache()) |
| { |
| text.add(freq.name); |
| } |
| } |
| else { |
| for(Frequency freq : getPublicCache()) |
| { |
| text.add(freq.name + " (" + freq.clientOwner + ")"); |
| } |
| } |
| |
| scrollList.setText(text); |
| |
| if(privateMode) |
| { |
| publicButton.enabled = true; |
| privateButton.enabled = false; |
| } |
| else { |
| publicButton.enabled = false; |
| privateButton.enabled = true; |
| } |
| |
| if(scrollList.hasSelection()) |
| { |
| Frequency freq = privateMode ? getPrivateCache().get(scrollList.selected) : getPublicCache().get(scrollList.selected); |
| |
| if(getFrequency() == null || !getFrequency().equals(freq)) |
| { |
| setButton.enabled = true; |
| } |
| else { |
| setButton.enabled = false; |
| } |
| |
| if(getOwner().equals(freq.ownerUUID)) |
| { |
| deleteButton.enabled = true; |
| } |
| else { |
| deleteButton.enabled = false; |
| } |
| } |
| else { |
| setButton.enabled = false; |
| deleteButton.enabled = false; |
| } |
| |
| if(!itemStack.isEmpty()) |
| { |
| if(clientFreq != null && clientStatus == 1) |
| { |
| teleportButton.enabled = true; |
| } |
| else { |
| teleportButton.enabled = false; |
| } |
| } |
| } |
| |
| @Override |
| public void updateScreen() |
| { |
| super.updateScreen(); |
| |
| updateButtons(); |
| |
| frequencyField.updateCursorCounter(); |
| } |
| |
| @Override |
| public void mouseClicked(int mouseX, int mouseY, int button) throws IOException |
| { |
| super.mouseClicked(mouseX, mouseY, button); |
| |
| updateButtons(); |
| |
| frequencyField.mouseClicked(mouseX, mouseY, button); |
| |
| if(button == 0) |
| { |
| int xAxis = (mouseX - (width - xSize) / 2); |
| int yAxis = (mouseY - (height - ySize) / 2); |
| |
| if(xAxis >= 137 && xAxis <= 148 && yAxis >= 103 && yAxis <= 114) |
| { |
| setFrequency(frequencyField.getText()); |
| frequencyField.setText(""); |
| SoundHandler.playSound(SoundEvents.UI_BUTTON_CLICK); |
| } |
| } |
| } |
| |
| @Override |
| public void keyTyped(char c, int i) throws IOException |
| { |
| if(!frequencyField.isFocused() || i == Keyboard.KEY_ESCAPE) |
| { |
| super.keyTyped(c, i); |
| } |
| |
| if(i == Keyboard.KEY_RETURN) |
| { |
| if(frequencyField.isFocused()) |
| { |
| setFrequency(frequencyField.getText()); |
| frequencyField.setText(""); |
| } |
| } |
| |
| if(Character.isDigit(c) || Character.isLetter(c) || isTextboxKey(c, i) || FrequencyManager.SPECIAL_CHARS.contains(c)) |
| { |
| frequencyField.textboxKeyTyped(c, i); |
| } |
| |
| updateButtons(); |
| } |
| |
| @Override |
| protected void actionPerformed(GuiButton guibutton) throws IOException |
| { |
| super.actionPerformed(guibutton); |
| |
| if(guibutton.id == 0) |
| { |
| privateMode = false; |
| } |
| else if(guibutton.id == 1) |
| { |
| privateMode = true; |
| } |
| else if(guibutton.id == 2) |
| { |
| int selection = scrollList.getSelection(); |
| |
| if(selection != -1) |
| { |
| Frequency freq = privateMode ? getPrivateCache().get(selection) : getPublicCache().get(selection); |
| setFrequency(freq.name); |
| } |
| } |
| else if(guibutton.id == 3) |
| { |
| int selection = scrollList.getSelection(); |
| |
| if(selection != -1) |
| { |
| Frequency freq = privateMode ? getPrivateCache().get(selection) : getPublicCache().get(selection); |
| |
| if(tileEntity != null) |
| { |
| ArrayList data = new ArrayList(); |
| data.add(1); |
| data.add(freq.name); |
| data.add(freq.publicFreq); |
| |
| Mekanism.packetHandler.sendToServer(new TileEntityMessage(Coord4D.get(tileEntity), data)); |
| } |
| else { |
| Mekanism.packetHandler.sendToServer(new PortableTeleporterMessage(PortableTeleporterPacketType.DEL_FREQ, currentHand, freq)); |
| Mekanism.packetHandler.sendToServer(new PortableTeleporterMessage(PortableTeleporterPacketType.DATA_REQUEST, currentHand, null)); |
| } |
| |
| scrollList.selected = -1; |
| } |
| } |
| else if(guibutton.id == 4) |
| { |
| if(clientFreq != null && clientStatus == 1) |
| { |
| mc.setIngameFocus(); |
| Mekanism.packetHandler.sendToServer(new PortableTeleporterMessage(PortableTeleporterPacketType.TELEPORT, currentHand, clientFreq)); |
| } |
| } |
| |
| updateButtons(); |
| } |
| |
| @Override |
| protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) |
| { |
| int xAxis = (mouseX-(width-xSize)/2); |
| int yAxis = (mouseY-(height-ySize)/2); |
| |
| fontRendererObj.drawString(getName(), (xSize/2)-(fontRendererObj.getStringWidth(getName())/2), 4, 0x404040); |
| fontRendererObj.drawString(LangUtils.localize("gui.owner") + ": " + (getOwnerUsername() != null ? getOwnerUsername() : LangUtils.localize("gui.none")), 8, !itemStack.isEmpty() ? ySize-12 : (ySize-96)+4, 0x404040); |
| |
| fontRendererObj.drawString(LangUtils.localize("gui.freq") + ":", 32, 81, 0x404040); |
| fontRendererObj.drawString(LangUtils.localize("gui.security") + ":", 32, 91, 0x404040); |
| |
| fontRendererObj.drawString(" " + (getFrequency() != null ? getFrequency().name : EnumColor.DARK_RED + LangUtils.localize("gui.none")), 32 + fontRendererObj.getStringWidth(LangUtils.localize("gui.freq") + ":"), 81, 0x797979); |
| fontRendererObj.drawString(" " + (getFrequency() != null ? getSecurity(getFrequency()) : EnumColor.DARK_RED + LangUtils.localize("gui.none")), 32 + fontRendererObj.getStringWidth(LangUtils.localize("gui.security") + ":"), 91, 0x797979); |
| |
| String str = LangUtils.localize("gui.set") + ":"; |
| renderScaledText(str, 27, 104, 0x404040, 20); |
| |
| if(xAxis >= 6 && xAxis <= 24 && yAxis >= 6 && yAxis <= 24) |
| { |
| if(getFrequency() == null) |
| { |
| drawCreativeTabHoveringText(EnumColor.DARK_RED + LangUtils.localize("gui.teleporter.noFreq"), xAxis, yAxis); |
| } |
| else { |
| drawCreativeTabHoveringText(getStatusDisplay(), xAxis, yAxis); |
| } |
| } |
| |
| super.drawGuiContainerForegroundLayer(mouseX, mouseY); |
| } |
| |
| @Override |
| protected void drawGuiContainerBackgroundLayer(float partialTick, int mouseX, int mouseY) |
| { |
| mc.renderEngine.bindTexture(resource); |
| 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 >= 137 && xAxis <= 148 && yAxis >= 103 && yAxis <= 114) |
| { |
| drawTexturedModalRect(guiWidth + 137, guiHeight + 103, xSize, 0, 11, 11); |
| } |
| else { |
| drawTexturedModalRect(guiWidth + 137, guiHeight + 103, xSize, 11, 11, 11); |
| } |
| |
| int y = getFrequency() == null ? 94 : (getStatus() == 2 ? 22 : (getStatus() == 3 ? 40 : |
| (getStatus() == 4 ? 58 : 76))); |
| |
| drawTexturedModalRect(guiWidth + 6, guiHeight + 6, 176, y, 18, 18); |
| |
| super.drawGuiContainerBackgroundLayer(partialTick, mouseX, mouseY); |
| |
| frequencyField.drawTextBox(); |
| } |
| |
| public String getStatusDisplay() |
| { |
| switch(getStatus()) |
| { |
| case 1: |
| return EnumColor.DARK_GREEN + LangUtils.localize("gui.teleporter.ready"); |
| case 2: |
| return EnumColor.DARK_RED + LangUtils.localize("gui.teleporter.noFrame"); |
| case 3: |
| return EnumColor.DARK_RED + LangUtils.localize("gui.teleporter.noLink"); |
| case 4: |
| return EnumColor.DARK_RED + LangUtils.localize("gui.teleporter.needsEnergy"); |
| } |
| |
| return EnumColor.DARK_RED + LangUtils.localize("gui.teleporter.noLink"); |
| } |
| |
| private UUID getOwner() |
| { |
| if(tileEntity != null) |
| { |
| return tileEntity.getSecurity().getOwnerUUID(); |
| } |
| else { |
| return ((IOwnerItem)itemStack.getItem()).getOwnerUUID(itemStack); |
| } |
| } |
| |
| private String getOwnerUsername() |
| { |
| if(tileEntity != null) |
| { |
| return tileEntity.getSecurity().getClientOwner(); |
| } |
| else { |
| return MekanismClient.clientUUIDMap.get(((IOwnerItem)itemStack.getItem()).getOwnerUUID(itemStack)); |
| } |
| } |
| |
| private byte getStatus() |
| { |
| return tileEntity != null ? tileEntity.status : clientStatus; |
| } |
| |
| private List<Frequency> getPublicCache() |
| { |
| return tileEntity != null ? tileEntity.publicCache : clientPublicCache; |
| } |
| |
| private List<Frequency> getPrivateCache() |
| { |
| return tileEntity != null ? tileEntity.privateCache : clientPrivateCache; |
| } |
| |
| private Frequency getFrequency() |
| { |
| return tileEntity != null ? tileEntity.frequency : clientFreq; |
| } |
| |
| private String getName() |
| { |
| return tileEntity != null ? tileEntity.getName() : itemStack.getDisplayName(); |
| } |
| |
| private double getEnergy() |
| { |
| if(!itemStack.isEmpty()) |
| { |
| return ((ItemPortableTeleporter)itemStack.getItem()).getEnergy(itemStack); |
| } |
| |
| return tileEntity.getEnergy(); |
| } |
| |
| private double getMaxEnergy() |
| { |
| if(!itemStack.isEmpty()) |
| { |
| return ((ItemPortableTeleporter)itemStack.getItem()).getMaxEnergy(itemStack); |
| } |
| |
| return tileEntity.getMaxEnergy(); |
| } |
| } |