From 289a2ee227450e1eecaece1f30111aa737d55465 Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Sat, 2 Nov 2013 01:31:32 -0400 Subject: [PATCH] Configurable machine output colors --- common/mekanism/api/IEjector.java | 4 ++ .../mekanism/client/gui/GuiConfiguration.java | 49 +++++++++++++++--- .../mekanism/common/TileComponentEjector.java | 41 ++++++++++++++- .../network/PacketConfigurationUpdate.java | 14 ++++- .../assets/mekanism/gui/GuiCompressor.png | Bin 5205 -> 4832 bytes .../assets/mekanism/gui/GuiConfiguration.png | Bin 4360 -> 4437 bytes 6 files changed, 99 insertions(+), 9 deletions(-) diff --git a/common/mekanism/api/IEjector.java b/common/mekanism/api/IEjector.java index 2e7821115..46a0fda8c 100644 --- a/common/mekanism/api/IEjector.java +++ b/common/mekanism/api/IEjector.java @@ -4,6 +4,10 @@ public interface IEjector { public void onOutput(); + public EnumColor getColor(); + + public void setColor(EnumColor color); + public boolean isEjecting(); public void setEjecting(boolean eject); diff --git a/common/mekanism/client/gui/GuiConfiguration.java b/common/mekanism/client/gui/GuiConfiguration.java index 4b774370d..0a550e67b 100644 --- a/common/mekanism/client/gui/GuiConfiguration.java +++ b/common/mekanism/client/gui/GuiConfiguration.java @@ -1,5 +1,6 @@ package mekanism.client.gui; +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -7,11 +8,13 @@ import mekanism.api.EnumColor; import mekanism.api.IConfigurable; import mekanism.api.Object3D; import mekanism.api.SideData; +import mekanism.client.render.MekanismRenderer; import mekanism.common.PacketHandler; import mekanism.common.PacketHandler.Transmission; import mekanism.common.block.BlockMachine.MachineType; import mekanism.common.inventory.container.ContainerNull; import mekanism.common.network.PacketConfigurationUpdate; +import mekanism.common.network.PacketTileEntity; import mekanism.common.network.PacketConfigurationUpdate.ConfigurationPacket; import mekanism.common.network.PacketSimpleGui; import mekanism.common.tileentity.TileEntityContainerBlock; @@ -21,6 +24,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; import universalelectricity.core.electricity.ElectricityDisplay; import universalelectricity.core.electricity.ElectricityDisplay.ElectricUnit; @@ -39,12 +43,12 @@ public class GuiConfiguration extends GuiMekanism configurable = tile; - positions.put(0, new GuiPos(81, 63)); - positions.put(1, new GuiPos(81, 33)); - positions.put(2, new GuiPos(81, 48)); - positions.put(3, new GuiPos(66, 63)); - positions.put(4, new GuiPos(66, 48)); - positions.put(5, new GuiPos(96, 48)); + positions.put(0, new GuiPos(110, 63)); + positions.put(1, new GuiPos(110, 33)); + positions.put(2, new GuiPos(110, 48)); + positions.put(3, new GuiPos(95, 63)); + positions.put(4, new GuiPos(95, 48)); + positions.put(5, new GuiPos(125, 48)); } @Override @@ -116,6 +120,22 @@ public class GuiConfiguration extends GuiMekanism fontRenderer.drawString("Configuration", 60, 5, 0x404040); fontRenderer.drawString("Eject: " + ejecting, 53, 17, 0x00CD00); + fontRenderer.drawString("Color:", 38, 37, 0x404040); + + if(configurable.getEjector().getColor() != null) + { + GL11.glPushMatrix(); + GL11.glColor4f(1, 1, 1, 1); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + + mc.getTextureManager().bindTexture(MekanismRenderer.getColorResource(configurable.getEjector().getColor())); + itemRenderer.renderIcon(44, 48, MekanismRenderer.getColorIcon(configurable.getEjector().getColor()), 16, 16); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glPopMatrix(); + } + for(int i = 0; i < positions.size(); i++) { int x = positions.get(i).xPos; @@ -128,6 +148,17 @@ public class GuiConfiguration extends GuiMekanism drawCreativeTabHoveringText(data.color != null ? data.color.getName() : "None", xAxis, yAxis); } } + + if(xAxis >= 44 && xAxis <= 60 && yAxis >= 48 && yAxis <= 64) + { + if(configurable.getEjector().getColor() != null) + { + drawCreativeTabHoveringText(configurable.getEjector().getColor().getName(), xAxis, yAxis); + } + else { + drawCreativeTabHoveringText("None", xAxis, yAxis); + } + } } @Override @@ -167,6 +198,12 @@ public class GuiConfiguration extends GuiMekanism PacketHandler.sendPacket(Transmission.SERVER, new PacketConfigurationUpdate().setParams(ConfigurationPacket.EJECT, Object3D.get(tile))); } + if(xAxis >= 44 && xAxis <= 60 && yAxis >= 48 && yAxis <= 64) + { + mc.sndManager.playSoundFX("random.click", 1.0F, 1.0F); + PacketHandler.sendPacket(Transmission.SERVER, new PacketConfigurationUpdate().setParams(ConfigurationPacket.EJECT_COLOR, Object3D.get((TileEntity)configurable))); + } + for(int i = 0; i < positions.size(); i++) { int x = positions.get(i).xPos; diff --git a/common/mekanism/common/TileComponentEjector.java b/common/mekanism/common/TileComponentEjector.java index 96ad29b18..643b46c34 100644 --- a/common/mekanism/common/TileComponentEjector.java +++ b/common/mekanism/common/TileComponentEjector.java @@ -3,6 +3,7 @@ package mekanism.common; import java.util.ArrayList; import java.util.List; +import mekanism.api.EnumColor; import mekanism.api.IConfigurable; import mekanism.api.IEjector; import mekanism.api.Object3D; @@ -25,6 +26,8 @@ public class TileComponentEjector implements ITileComponent, IEjector public boolean ejecting; + public EnumColor ejectColor; + public SideData sideData; public int[] trackers; @@ -99,7 +102,7 @@ public class TileComponentEjector implements ITileComponent, IEjector } else if(tile instanceof TileEntityLogisticalTransporter) { - if(TransporterUtils.insert(tileEntity, (TileEntityLogisticalTransporter)tile, stack, null)) + if(TransporterUtils.insert(tileEntity, (TileEntityLogisticalTransporter)tile, stack, ejectColor)) { stack = null; } @@ -131,6 +134,18 @@ public class TileComponentEjector implements ITileComponent, IEjector { ejecting = eject; } + + @Override + public void setColor(EnumColor color) + { + ejectColor = color; + } + + @Override + public EnumColor getColor() + { + return ejectColor; + } @Override public void tick() {} @@ -140,6 +155,11 @@ public class TileComponentEjector implements ITileComponent, IEjector { ejecting = nbtTags.getBoolean("ejecting"); + if(nbtTags.hasKey("ejectColor")) + { + ejectColor = TransporterUtils.colors.get(nbtTags.getInteger("ejectColor")); + } + for(int i = 0; i < sideData.availableSlots.length; i++) { trackers[i] = nbtTags.getInteger("tracker" + i); @@ -150,12 +170,23 @@ public class TileComponentEjector implements ITileComponent, IEjector public void read(ByteArrayDataInput dataStream) { ejecting = dataStream.readBoolean(); + + int c = dataStream.readInt(); + + if(c != -1) + { + ejectColor = TransporterUtils.colors.get(c); + } + else { + ejectColor = null; + } } @Override public void write(NBTTagCompound nbtTags) { nbtTags.setBoolean("ejecting", ejecting); + nbtTags.setInteger("ejectColor", TransporterUtils.colors.indexOf(ejectColor)); for(int i = 0; i < sideData.availableSlots.length; i++) { @@ -167,5 +198,13 @@ public class TileComponentEjector implements ITileComponent, IEjector public void write(ArrayList data) { data.add(ejecting); + + if(ejectColor != null) + { + data.add(TransporterUtils.colors.indexOf(ejectColor)); + } + else { + data.add(-1); + } } } diff --git a/common/mekanism/common/network/PacketConfigurationUpdate.java b/common/mekanism/common/network/PacketConfigurationUpdate.java index fefe60f88..b93a6a053 100644 --- a/common/mekanism/common/network/PacketConfigurationUpdate.java +++ b/common/mekanism/common/network/PacketConfigurationUpdate.java @@ -9,6 +9,7 @@ import mekanism.common.ITileNetwork; import mekanism.common.PacketHandler; import mekanism.common.PacketHandler.Transmission; import mekanism.common.util.MekanismUtils; +import mekanism.common.util.TransporterUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -59,7 +60,6 @@ public class PacketConfigurationUpdate implements IMekanismPacket { IConfigurable config = (IConfigurable)tile; config.getEjector().setEjecting(!config.getEjector().isEjecting()); - PacketHandler.sendPacket(Transmission.CLIENTS_RANGE, new PacketTileEntity().setParams(object3D, ((ITileNetwork)tile).getNetworkedData(new ArrayList())), object3D, 50D); } } else if(packetType == ConfigurationPacket.SIDE_DATA) @@ -74,6 +74,16 @@ public class PacketConfigurationUpdate implements IMekanismPacket PacketHandler.sendPacket(Transmission.CLIENTS_RANGE, new PacketTileEntity().setParams(object3D, ((ITileNetwork)tile).getNetworkedData(new ArrayList())), object3D, 50D); } } + else if(packetType == ConfigurationPacket.EJECT_COLOR) + { + TileEntity tile = object3D.getTileEntity(world); + + if(tile instanceof IConfigurable) + { + IConfigurable config = (IConfigurable)tile; + config.getEjector().setColor(TransporterUtils.increment(config.getEjector().getColor())); + } + } } @Override @@ -95,6 +105,6 @@ public class PacketConfigurationUpdate implements IMekanismPacket public static enum ConfigurationPacket { - EJECT, SIDE_DATA + EJECT, SIDE_DATA, EJECT_COLOR } } diff --git a/resources/assets/mekanism/gui/GuiCompressor.png b/resources/assets/mekanism/gui/GuiCompressor.png index 19c5861b5113cf07a51c2afb270b52045827bc5b..9f9aa800afd0ff9a4d7f10f1f687a5a1e9086b86 100644 GIT binary patch delta 3762 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 delta 4138 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 B9@YQ= delta 2571 zcmb_edpO(Y7yl-LqE(f-7hzSjC5*aXVry5o3ez9fSfbS*btz3LrER`aYf)9vDwZ^2 zb!j*Es!~DHX=s;Ov{4Lc2(4=pG{hxj+4KDV{r$J|*LmLOocH~l&*wSsIq%JL&6`fa zK$_n%pHo*LLf*;z{e1?&#Hjee5hLnNCJu2)ZR0mmVI>Jol)>aVT74U8-ye3JCgpQ> zATPD-?%ixYK7Gv0#Vjg2`oLDy(qAP5gyc;j&ro_NExcu{wtoJj^$1loN1*$oPj-d! z9JVBg_U14y%=IW|b$J?8;Pc_|(1uARCJ2O(AB@$5u(8Grh&&|KDog1ph6v4jz zDBJj4`B6j9wn}xcNtMS^^pZII>?eA2H&wTk+_q68TS#Ukn}U)S=h2^D3Ix|qW5xng z?DxzTZwm;r&(7aE+|Cw&ZaGiR;saR|jgQcdf-)%2$0Xa^-=p+Cs?Ix8Vr4R_&E5W# zYHnl0sV*p}m+-+IGZwROW%@sHct2FZIdh3Lhe13J#UUHmIXi3Qo z7u;En*<2fY?>M&D^8C4zt|1=Zg|N&US?@BHfgJ@D3MI~~DB{B1*0qT75uZa5_DWAG z;Et2$U@I?nrr!!SJRD}Rushp=Xhx)yGXjXF;K*}4y&n+)l7mYvO{@h9nQ z{Gi7wXKd<)lrK-{0L3j4i7KEdZ8Sb+SIbr0`uDi&#k!>&&o$+W5otSq9|ltd#4qd< zx;{niB*{aRvmA9U4nL3Li9(aC43aHy*p|yjFI?ST9j=XI z`#Db6w|yYb+u=>*FI7#e+V})IPyTGGCVtvloLZxe8hJsRTnZm(1rvrf`DZFH-m;~h z5Oy0mS!m;k*3-_2`c@#%q2Zy7&6d#>^ZW$w-uX#z*cHPd2r$F?F`xQXH~wCm#J+3=Q<(ONBX7{jfE1&1b| zXE(!E+>>`RMH7YDtjxqhpPy7?8>XAuM`ANFHuCTp&q;+D5s~S%(VC#FM85bc4400vVXGd@I&JvG7*?|{H(jbfV80$c(aS8P>Ho28QK7%?>X%wrI_0%- zPKqX6R>eo|&E;lg3p)D#N_LGgetV0Y4+~BapC4<6oel1@1VRKqcyrVRsR)kdn){Ll zvJ{mh8l!?@XN&9h=!l!0?8&*XcxF{Ne2YtH5J^%;4d;#OP*SQ> zNi@*+K;F3@MA~WlNWVbrH0Q8bYnH4o*$TTEgITfM(|jp-TvWa)D*@)`G;HR~w3J*` z(mS_KoP3Q@&+|RW!4b78uP>DElUM=l+2UyZ}zOeq%AZkHml;4({ZjOFXpY@>bR!2MD7PXR#e zDkZ6vLGpht{*&rHx6sJ&x&#k$7rox&aWkt7dDJgiiZvc8M8_GK-L*4Z3sTAfFTjU1EWTu+RUac^n#j1n*?Mos~xmUgrqAuZ4XOJ zK6s_CuKqGs|EkC2+RE(GuV@OPvQ7ozYMoJ zf`EJ>0^Y-|tPzlZBSgXf|E>|Kj4uFf5?zADuid!{>YL~mZLbs1)jGRel>eCrM3l8c zqTwNnTLHSkSy5D!GPObt=C9@pR8PMTsDLV-xDhn)SXd4J zuX6MkxpYV@`Dw~jZvjl2hfPCVtbxV2$;s5(@W!+-8|^3I6N+u*ZM$fp?L%+a_)|Y7 z_4e4Waj*{P{YIY1iQPifq(kqMG~ousmM@pUGpg!{J8xM=fWrKa2OVqpI_k#X`nd*g