From 9043e129380e26588f4f65c05c2c38bc54f9f4dd Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Thu, 12 Mar 2015 11:18:12 -0500 Subject: [PATCH] Work on new Portable Teleporter GUI - going to basically be a clone of the regular teleporter GUI without an inventory view --- .../java/mekanism/client/ClientProxy.java | 5 +- .../client/gui/GuiPortableTeleporter.java | 137 ------------------ .../mekanism/client/gui/GuiTeleporter.java | 136 +++++++++++++++-- .../inventory/container/ContainerNull.java | 16 +- .../common/tile/TileEntityTeleporter.java | 17 --- .../mekanism/gui/GuiPortableTeleporter.png | Bin 3723 -> 4567 bytes 6 files changed, 136 insertions(+), 175 deletions(-) delete mode 100644 src/main/java/mekanism/client/gui/GuiPortableTeleporter.java diff --git a/src/main/java/mekanism/client/ClientProxy.java b/src/main/java/mekanism/client/ClientProxy.java index 6acaf1448..6602ff899 100644 --- a/src/main/java/mekanism/client/ClientProxy.java +++ b/src/main/java/mekanism/client/ClientProxy.java @@ -16,7 +16,6 @@ import mekanism.client.gui.GuiChemicalInjectionChamber; import mekanism.client.gui.GuiChemicalOxidizer; import mekanism.client.gui.GuiChemicalWasher; import mekanism.client.gui.GuiCombiner; -import mekanism.client.gui.GuiSideConfiguration; import mekanism.client.gui.GuiCredits; import mekanism.client.gui.GuiCrusher; import mekanism.client.gui.GuiDictionary; @@ -42,7 +41,6 @@ import mekanism.client.gui.GuiPRC; import mekanism.client.gui.GuiPasswordEnter; import mekanism.client.gui.GuiPasswordModify; import mekanism.client.gui.GuiPortableTank; -import mekanism.client.gui.GuiPortableTeleporter; import mekanism.client.gui.GuiPrecisionSawmill; import mekanism.client.gui.GuiPurificationChamber; import mekanism.client.gui.GuiRobitCrafting; @@ -53,6 +51,7 @@ import mekanism.client.gui.GuiRobitSmelting; import mekanism.client.gui.GuiRotaryCondensentrator; import mekanism.client.gui.GuiSeismicReader; import mekanism.client.gui.GuiSeismicVibrator; +import mekanism.client.gui.GuiSideConfiguration; import mekanism.client.gui.GuiSolarEvaporationController; import mekanism.client.gui.GuiSolarNeutronActivator; import mekanism.client.gui.GuiTeleporter; @@ -419,7 +418,7 @@ public class ClientProxy extends CommonProxy if(itemStack != null && itemStack.getItem() instanceof ItemPortableTeleporter) { - return new GuiPortableTeleporter(player, itemStack); + return new GuiTeleporter(player, itemStack); } case 15: return new GuiPurificationChamber(player.inventory, (TileEntityAdvancedElectricMachine)tileEntity); diff --git a/src/main/java/mekanism/client/gui/GuiPortableTeleporter.java b/src/main/java/mekanism/client/gui/GuiPortableTeleporter.java deleted file mode 100644 index 4db74cdf1..000000000 --- a/src/main/java/mekanism/client/gui/GuiPortableTeleporter.java +++ /dev/null @@ -1,137 +0,0 @@ -package mekanism.client.gui; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import mekanism.client.sound.SoundHandler; -import mekanism.common.Mekanism; -import mekanism.common.item.ItemPortableTeleporter; -import mekanism.common.network.PacketDigitUpdate.DigitUpdateMessage; -import mekanism.common.network.PacketPortableTeleport.PortableTeleportMessage; -import mekanism.common.util.MekanismUtils; -import mekanism.common.util.MekanismUtils.ResourceType; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import org.lwjgl.opengl.GL11; - -@SideOnly(Side.CLIENT) -public class GuiPortableTeleporter extends GuiScreen -{ - public EntityPlayer entityPlayer; - public ItemStack itemStack; - - public int xSize = 176; - public int ySize = 166; - - public GuiPortableTeleporter(EntityPlayer player, ItemStack itemstack) - { - entityPlayer = player; - itemStack = itemstack; - } - - @Override - public void initGui() - { - buttonList.clear(); - buttonList.add(new GuiButton(0, 173, 105, 80, 20, MekanismUtils.localize("gui.teleport"))); - } - - @Override - public void drawScreen(int mouseX, int mouseY, float partialTick) - { - if(mc.thePlayer.getCurrentEquippedItem() != null && mc.thePlayer.getCurrentEquippedItem().getItem() instanceof ItemPortableTeleporter) - { - itemStack = mc.thePlayer.getCurrentEquippedItem(); - } - - mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.GUI, "GuiPortableTeleporter.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 displayInt; - - displayInt = getYAxisForNumber(((ItemPortableTeleporter)itemStack.getItem()).getDigit(itemStack, 0)); - drawTexturedModalRect(guiWidth+23, guiHeight+44, 176, displayInt, 13, 13); - - displayInt = getYAxisForNumber(((ItemPortableTeleporter)itemStack.getItem()).getDigit(itemStack, 1)); - drawTexturedModalRect(guiWidth+62, guiHeight+44, 176, displayInt, 13, 13); - - displayInt = getYAxisForNumber(((ItemPortableTeleporter)itemStack.getItem()).getDigit(itemStack, 2)); - drawTexturedModalRect(guiWidth+101, guiHeight+44, 176, displayInt, 13, 13); - - displayInt = getYAxisForNumber(((ItemPortableTeleporter)itemStack.getItem()).getDigit(itemStack, 3)); - drawTexturedModalRect(guiWidth+140, guiHeight+44, 176, displayInt, 13, 13); - - ItemPortableTeleporter item = (ItemPortableTeleporter)itemStack.getItem(); - - ((GuiButton)buttonList.get(0)).xPosition = guiWidth+48; - ((GuiButton)buttonList.get(0)).yPosition = guiHeight+68; - - fontRendererObj.drawString(MekanismUtils.localize("gui.portableTeleporter"), guiWidth+39, guiHeight+6, 0x404040); - fontRendererObj.drawString(item.getStatusAsString(item.getStatus(itemStack)), guiWidth+53, guiHeight+19, 0x00CD00); - - super.drawScreen(mouseX, mouseY, partialTick); - } - - @Override - protected void actionPerformed(GuiButton guibutton) - { - if(guibutton.id == 0) - { - Mekanism.packetHandler.sendToServer(new PortableTeleportMessage()); - mc.setIngameFocus(); - } - } - - @Override - protected void mouseClicked(int mouseX, int mouseY, int button) - { - super.mouseClicked(mouseX, mouseY, button); - - int xAxis = (mouseX-(width-xSize)/2); - int yAxis = (mouseY-(height-ySize)/2); - - handleButtonClick(xAxis, yAxis, button, 0, 23, 37, 44, 58); - handleButtonClick(xAxis, yAxis, button, 1, 62, 76, 44, 58); - handleButtonClick(xAxis, yAxis, button, 2, 101, 115, 44, 58); - handleButtonClick(xAxis, yAxis, button, 3, 140, 154, 44, 58); - } - - private void handleButtonClick(int xAxis, int yAxis, int mouseButton, int clickedButtonIndex, int xmin, int xmax, int ymin, int ymax) - { - if(xAxis > xmin && xAxis < xmax && yAxis > ymin && yAxis < ymax) - { - int currentDigit = ((ItemPortableTeleporter)itemStack.getItem()).getDigit(itemStack, clickedButtonIndex); - int updatedDigit = getUpdatedNumber(currentDigit, mouseButton); - Mekanism.packetHandler.sendToServer(new DigitUpdateMessage(clickedButtonIndex, updatedDigit)); - ((ItemPortableTeleporter)itemStack.getItem()).setDigit(itemStack, clickedButtonIndex, updatedDigit); - SoundHandler.playSound("gui.button.press"); - } - } - - public int getUpdatedNumber(int i, int mouseButton) - { - if(mouseButton == 1) //right click - { - return (i-1+10)%10; //add 10 to ensure postive result - } - else - { - return (i+1)%10; - } - } - - public int getYAxisForNumber(int i) - { - return i*13; - } - - @Override - public boolean doesGuiPauseGame() - { - return false; - } -} diff --git a/src/main/java/mekanism/client/gui/GuiTeleporter.java b/src/main/java/mekanism/client/gui/GuiTeleporter.java index c643f7e77..e8c163e94 100644 --- a/src/main/java/mekanism/client/gui/GuiTeleporter.java +++ b/src/main/java/mekanism/client/gui/GuiTeleporter.java @@ -6,6 +6,7 @@ import java.util.List; import mekanism.api.Coord4D; import mekanism.api.EnumColor; import mekanism.client.gui.element.GuiPowerBar; +import mekanism.client.gui.element.GuiPowerBar.IPowerInfoHandler; import mekanism.client.gui.element.GuiScrollList; import mekanism.client.gui.element.GuiSlot; import mekanism.client.gui.element.GuiSlot.SlotOverlay; @@ -13,14 +14,19 @@ import mekanism.client.gui.element.GuiSlot.SlotType; import mekanism.client.sound.SoundHandler; import mekanism.common.Mekanism; import mekanism.common.frequency.Frequency; +import mekanism.common.inventory.container.ContainerNull; import mekanism.common.inventory.container.ContainerTeleporter; +import mekanism.common.item.ItemPortableTeleporter; import mekanism.common.network.PacketTileEntity.TileEntityMessage; import mekanism.common.tile.TileEntityTeleporter; 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.item.ItemStack; +import net.minecraft.util.ResourceLocation; import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; @@ -33,7 +39,12 @@ public class GuiTeleporter extends GuiMekanism { public static int MAX_LENGTH = 16; + public ResourceLocation resource; + public TileEntityTeleporter tileEntity; + public ItemStack itemStack; + + public EntityPlayer entityPlayer; public GuiButton publicButton; public GuiButton privateButton; @@ -51,14 +62,52 @@ public class GuiTeleporter extends GuiMekanism { super(tentity, new ContainerTeleporter(inventory, tentity)); tileEntity = tentity; + resource = MekanismUtils.getResource(ResourceType.GUI, "GuiTeleporter.png"); - guiElements.add(new GuiPowerBar(this, tileEntity, MekanismUtils.getResource(ResourceType.GUI, "GuiTeleporter.png"), 158, 26)); - guiElements.add(new GuiSlot(SlotType.NORMAL, this, MekanismUtils.getResource(ResourceType.GUI, "GuiTeleporter.png"), 152, 6).with(SlotOverlay.POWER)); - guiElements.add(scrollList = new GuiScrollList(this, MekanismUtils.getResource(ResourceType.GUI, "GuiTeleporter.png"), 28, 37, 120, 4)); + 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)); ySize+=64; } + public GuiTeleporter(EntityPlayer player, ItemStack stack) + { + super(new ContainerNull()); + 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)); + + ySize = 147; + } + @Override public void initGui() { @@ -109,7 +158,7 @@ public class GuiTeleporter extends GuiMekanism public void updateButtons() { - if(tileEntity.owner == null) + if(getOwner() == null) { return; } @@ -146,7 +195,7 @@ public class GuiTeleporter extends GuiMekanism { Frequency freq = privateMode ? tileEntity.privateCache.get(scrollList.selected) : tileEntity.publicCache.get(scrollList.selected); - if(tileEntity.frequency == null || !tileEntity.frequency.equals(freq)) + if(getFrequency() == null || !getFrequency().equals(freq)) { setButton.enabled = true; } @@ -154,7 +203,7 @@ public class GuiTeleporter extends GuiMekanism setButton.enabled = false; } - if(tileEntity.owner.equals(freq.owner)) + if(getOwner().equals(freq.owner)) { deleteButton.enabled = true; } @@ -277,26 +326,26 @@ public class GuiTeleporter extends GuiMekanism int xAxis = (mouseX-(width-xSize)/2); int yAxis = (mouseY-(height-ySize)/2); - fontRendererObj.drawString(tileEntity.getInventoryName(), (xSize/2)-(fontRendererObj.getStringWidth(tileEntity.getInventoryName())/2), 4, 0x404040); - fontRendererObj.drawString(MekanismUtils.localize("gui.owner") + ": " + (tileEntity.owner != null ? tileEntity.owner : MekanismUtils.localize("gui.none")), 8, (ySize-96)+4, 0x404040); + fontRendererObj.drawString(getInventoryName(), (xSize/2)-(fontRendererObj.getStringWidth(getInventoryName())/2), 4, 0x404040); + fontRendererObj.drawString(MekanismUtils.localize("gui.owner") + ": " + (getOwner() != null ? getOwner() : MekanismUtils.localize("gui.none")), 8, (ySize-96)+4, 0x404040); fontRendererObj.drawString(MekanismUtils.localize("gui.freq") + ":", 32, 81, 0x404040); fontRendererObj.drawString(MekanismUtils.localize("gui.security") + ":", 32, 91, 0x404040); - fontRendererObj.drawString(" " + (tileEntity.frequency != null ? tileEntity.frequency.name : EnumColor.DARK_RED + MekanismUtils.localize("gui.none")), 32 + fontRendererObj.getStringWidth(MekanismUtils.localize("gui.freq") + ":"), 81, 0x797979); - fontRendererObj.drawString(" " + (tileEntity.frequency != null ? getSecurity(tileEntity.frequency) : EnumColor.DARK_RED + MekanismUtils.localize("gui.none")), 32 + fontRendererObj.getStringWidth(MekanismUtils.localize("gui.security") + ":"), 91, 0x797979); + fontRendererObj.drawString(" " + (getFrequency() != null ? getFrequency().name : EnumColor.DARK_RED + MekanismUtils.localize("gui.none")), 32 + fontRendererObj.getStringWidth(MekanismUtils.localize("gui.freq") + ":"), 81, 0x797979); + fontRendererObj.drawString(" " + (getFrequency() != null ? getSecurity(getFrequency()) : EnumColor.DARK_RED + MekanismUtils.localize("gui.none")), 32 + fontRendererObj.getStringWidth(MekanismUtils.localize("gui.security") + ":"), 91, 0x797979); String str = MekanismUtils.localize("gui.set") + ":"; renderScaledText(str, 27, 104, 0x404040, 20); if(xAxis >= 6 && xAxis <= 24 && yAxis >= 6 && yAxis <= 24) { - if(tileEntity.frequency == null) + if(getFrequency() == null) { drawCreativeTabHoveringText(EnumColor.DARK_RED + MekanismUtils.localize("gui.teleporter.noFreq"), xAxis, yAxis); } else { - drawCreativeTabHoveringText(tileEntity.getStatusDisplay(), xAxis, yAxis); + drawCreativeTabHoveringText(getStatusDisplay(), xAxis, yAxis); } } @@ -306,7 +355,7 @@ public class GuiTeleporter extends GuiMekanism @Override protected void drawGuiContainerBackgroundLayer(float partialTick, int mouseX, int mouseY) { - mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.GUI, "GuiTeleporter.png")); + mc.renderEngine.bindTexture(resource); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); int guiWidth = (width-xSize)/2; int guiHeight = (height-ySize)/2; @@ -323,8 +372,8 @@ public class GuiTeleporter extends GuiMekanism drawTexturedModalRect(guiWidth + 137, guiHeight + 103, xSize, 11, 11, 11); } - int y = tileEntity.frequency == null ? 94 : (tileEntity.status == 2 ? 22 : (tileEntity.status == 3 ? 40 : - (tileEntity.status == 4 ? 58 : 76))); + int y = getFrequency() == null ? 94 : (getStatus() == 2 ? 22 : (getStatus() == 3 ? 40 : + (getStatus() == 4 ? 58 : 76))); drawTexturedModalRect(guiWidth + 6, guiHeight + 6, 176, y, 18, 18); @@ -332,4 +381,61 @@ public class GuiTeleporter extends GuiMekanism frequencyField.drawTextBox(); } + + public String getStatusDisplay() + { + switch(getStatus()) + { + case 1: + return EnumColor.DARK_GREEN + MekanismUtils.localize("gui.teleporter.ready"); + case 2: + return EnumColor.DARK_RED + MekanismUtils.localize("gui.teleporter.noFrame"); + case 3: + return EnumColor.DARK_RED + MekanismUtils.localize("gui.teleporter.noLink"); + case 4: + return EnumColor.DARK_RED + MekanismUtils.localize("gui.teleporter.needsEnergy"); + } + + return EnumColor.DARK_RED + MekanismUtils.localize("gui.teleporter.noLink"); + } + + private String getOwner() + { + return tileEntity != null ? tileEntity.owner : entityPlayer.getCommandSenderName(); + } + + private byte getStatus() + { + return tileEntity.status; + } + + private Frequency getFrequency() + { + return tileEntity.frequency; + } + + private String getInventoryName() + { + return tileEntity != null ? tileEntity.getInventoryName() : itemStack.getDisplayName(); + } + + private double getEnergy() + { + if(itemStack != null) + { + return ((ItemPortableTeleporter)itemStack.getItem()).getEnergy(itemStack); + } + + return tileEntity.getEnergy(); + } + + private double getMaxEnergy() + { + if(itemStack != null) + { + return ((ItemPortableTeleporter)itemStack.getItem()).getMaxEnergy(itemStack); + } + + return tileEntity.getMaxEnergy(); + } } diff --git a/src/main/java/mekanism/common/inventory/container/ContainerNull.java b/src/main/java/mekanism/common/inventory/container/ContainerNull.java index e330bc472..fcb31a793 100644 --- a/src/main/java/mekanism/common/inventory/container/ContainerNull.java +++ b/src/main/java/mekanism/common/inventory/container/ContainerNull.java @@ -16,19 +16,29 @@ public class ContainerNull extends Container tileEntity.open(player); tileEntity.openInventory(); } + + public ContainerNull() {} @Override public void onContainerClosed(EntityPlayer entityplayer) { super.onContainerClosed(entityplayer); - tileEntity.close(entityplayer); - tileEntity.closeInventory(); + if(tileEntity != null) + { + tileEntity.close(entityplayer); + tileEntity.closeInventory(); + } } @Override public boolean canInteractWith(EntityPlayer entityplayer) { - return tileEntity.isUseableByPlayer(entityplayer); + if(tileEntity != null) + { + return tileEntity.isUseableByPlayer(entityplayer); + } + + return true; } } diff --git a/src/main/java/mekanism/common/tile/TileEntityTeleporter.java b/src/main/java/mekanism/common/tile/TileEntityTeleporter.java index 16b520b55..1368d8c16 100644 --- a/src/main/java/mekanism/common/tile/TileEntityTeleporter.java +++ b/src/main/java/mekanism/common/tile/TileEntityTeleporter.java @@ -187,23 +187,6 @@ public class TileEntityTeleporter extends TileEntityElectricBlock implements IPe } } - public String getStatusDisplay() - { - switch(status) - { - case 1: - return EnumColor.DARK_GREEN + MekanismUtils.localize("gui.teleporter.ready"); - case 2: - return EnumColor.DARK_RED + MekanismUtils.localize("gui.teleporter.noFrame"); - case 3: - return EnumColor.DARK_RED + MekanismUtils.localize("gui.teleporter.noLink"); - case 4: - return EnumColor.DARK_RED + MekanismUtils.localize("gui.teleporter.needsEnergy"); - } - - return EnumColor.DARK_RED + MekanismUtils.localize("gui.teleporter.noLink"); - } - @Override public void onChunkUnload() { diff --git a/src/main/resources/assets/mekanism/gui/GuiPortableTeleporter.png b/src/main/resources/assets/mekanism/gui/GuiPortableTeleporter.png index 9f9c5c399bb024b5228bd148aeb0fd33f03b1985..18668ef5559a0ecd758b269c507b8016cabf4f5b 100644 GIT binary patch literal 4567 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