From 8d3dfc0c2cd0a0263591d2b96159640bf3cc4bcc Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Tue, 3 Mar 2015 13:16:58 -0500 Subject: [PATCH] Work on EIM interface --- .../java/mekanism/client/ClientProxy.java | 3 + .../client/gui/GuiInductionMatrix.java | 111 ++++++++++++++++ .../java/mekanism/common/CommonProxy.java | 3 + .../mekanism/common/block/BlockBasic.java | 15 ++- .../container/ContainerDynamicTank.java | 9 +- .../container/ContainerInductionMatrix.java | 124 ++++++++++++++++++ .../common/tile/TileEntityInductionPort.java | 27 +++- .../java/mekanism/common/util/LangUtils.java | 5 + .../assets/mekanism/gui/GuiGasTank.png | Bin 2368 -> 3809 bytes .../mekanism/gui/GuiInductionMatrix.png | Bin 0 -> 3982 bytes .../resources/assets/mekanism/lang/en_US.lang | 1 + ...ort-ctm.png => InductionPortInput-ctm.png} | Bin 1745 -> 1727 bytes ...ductionPort.png => InductionPortInput.png} | Bin 1392 -> 1388 bytes .../blocks/ctm/InductionPortOutput-ctm.png | Bin 0 -> 1726 bytes .../blocks/ctm/InductionPortOutput.png | Bin 0 -> 1386 bytes 15 files changed, 287 insertions(+), 11 deletions(-) create mode 100644 src/main/java/mekanism/client/gui/GuiInductionMatrix.java create mode 100644 src/main/java/mekanism/common/inventory/container/ContainerInductionMatrix.java create mode 100644 src/main/resources/assets/mekanism/gui/GuiInductionMatrix.png rename src/main/resources/assets/mekanism/textures/blocks/ctm/{InductionPort-ctm.png => InductionPortInput-ctm.png} (58%) rename src/main/resources/assets/mekanism/textures/blocks/ctm/{InductionPort.png => InductionPortInput.png} (73%) create mode 100644 src/main/resources/assets/mekanism/textures/blocks/ctm/InductionPortOutput-ctm.png create mode 100644 src/main/resources/assets/mekanism/textures/blocks/ctm/InductionPortOutput.png diff --git a/src/main/java/mekanism/client/ClientProxy.java b/src/main/java/mekanism/client/ClientProxy.java index 4ffeff1b3..66819f7ac 100644 --- a/src/main/java/mekanism/client/ClientProxy.java +++ b/src/main/java/mekanism/client/ClientProxy.java @@ -32,6 +32,7 @@ import mekanism.client.gui.GuiEntangledBlock; import mekanism.client.gui.GuiFactory; import mekanism.client.gui.GuiFluidicPlenisher; import mekanism.client.gui.GuiGasTank; +import mekanism.client.gui.GuiInductionMatrix; import mekanism.client.gui.GuiLaserAmplifier; import mekanism.client.gui.GuiLaserTractorBeam; import mekanism.client.gui.GuiMetallurgicInfuser; @@ -500,6 +501,8 @@ public class ClientProxy extends CommonProxy return new GuiSolarNeutronActivator(player.inventory, (TileEntitySolarNeutronActivator)tileEntity); case 48: return new GuiAmbientAccumulator(player, (TileEntityAmbientAccumulator)tileEntity); + case 49: + return new GuiInductionMatrix(player.inventory, (TileEntityInductionCasing)tileEntity); } return null; diff --git a/src/main/java/mekanism/client/gui/GuiInductionMatrix.java b/src/main/java/mekanism/client/gui/GuiInductionMatrix.java new file mode 100644 index 000000000..5b6b71434 --- /dev/null +++ b/src/main/java/mekanism/client/gui/GuiInductionMatrix.java @@ -0,0 +1,111 @@ +package mekanism.client.gui; + +import mekanism.client.render.MekanismRenderer; +import mekanism.common.content.tank.TankUpdateProtocol; +import mekanism.common.inventory.container.ContainerInductionMatrix; +import mekanism.common.tile.TileEntityInductionCasing; +import mekanism.common.util.LangUtils; +import mekanism.common.util.MekanismUtils; +import mekanism.common.util.MekanismUtils.ResourceType; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraftforge.fluids.FluidStack; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GuiInductionMatrix extends GuiMekanism +{ + public TileEntityInductionCasing tileEntity; + + public GuiInductionMatrix(InventoryPlayer inventory, TileEntityInductionCasing tentity) + { + super(tentity, new ContainerInductionMatrix(inventory, tentity)); + tileEntity = tentity; + guiElements.add(new GuiContainerEditMode(this, tileEntity, MekanismUtils.getResource(ResourceType.GUI, "GuiInductionMatrix.png"))); + } + + @Override + protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) + { + int xAxis = (mouseX - (width - xSize) / 2); + int yAxis = (mouseY - (height - ySize) / 2); + + fontRendererObj.drawString(tileEntity.getInventoryName(), 45, 6, 0x404040); + fontRendererObj.drawString(MekanismUtils.localize("container.inventory"), 8, (ySize - 94) + 2, 0x404040); + /*fontRendererObj.drawString(MekanismUtils.localize("gui.volume") + ": " + tileEntity.clientCapacity/TankUpdateProtocol.FLUID_PER_TANK, 53, 26, 0x00CD00); + fontRendererObj.drawString(tileEntity.structure.fluidStored != null ? LangUtils.localizeFluidStack(tileEntity.structure.fluidStored) + ":" : MekanismUtils.localize("gui.noFluid"), 53, 44, 0x00CD00); + + if(tileEntity.structure.fluidStored != null) + { + fontRendererObj.drawString(tileEntity.structure.fluidStored.amount + "mB", 53, 53, 0x00CD00); + } + + if(xAxis >= 7 && xAxis <= 39 && yAxis >= 14 && yAxis <= 72) + { + drawCreativeTabHoveringText(tileEntity.structure.fluidStored != null ? LangUtils.localizeFluidStack(tileEntity.structure.fluidStored) + ": " + tileEntity.structure.fluidStored.amount + "mB" : MekanismUtils.localize("gui.empty"), xAxis, yAxis); + }*/ + + super.drawGuiContainerForegroundLayer(mouseX, mouseY); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float partialTick, int mouseX, int mouseY) + { + super.drawGuiContainerBackgroundLayer(partialTick, mouseX, mouseY); + + mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.GUI, "GuiInductionMatrix.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); + + /*if(tileEntity.getScaledFluidLevel(58) > 0) + { + displayGauge(7, 14, tileEntity.getScaledFluidLevel(58), tileEntity.structure.fluidStored, 0); + displayGauge(23, 14, tileEntity.getScaledFluidLevel(58), tileEntity.structure.fluidStored, 1); + }*/ + } + + public void displayGauge(int xPos, int yPos, int scale, FluidStack fluid, int side /*0-left, 1-right*/) + { + if(fluid == null) + { + return; + } + + int guiWidth = (width - xSize) / 2; + int guiHeight = (height - ySize) / 2; + + int start = 0; + + while(true) + { + int renderRemaining = 0; + + if(scale > 16) + { + renderRemaining = 16; + scale -= 16; + } + else { + renderRemaining = scale; + scale = 0; + } + + mc.renderEngine.bindTexture(MekanismRenderer.getBlocksTexture()); + drawTexturedModelRectFromIcon(guiWidth + xPos, guiHeight + yPos + 58 - renderRemaining - start, fluid.getFluid().getIcon(), 16, 16 - (16 - renderRemaining)); + start+=16; + + if(renderRemaining == 0 || scale == 0) + { + break; + } + } + + mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.GUI, "GuiInductionMatrix.png")); + drawTexturedModalRect(guiWidth + xPos, guiHeight + yPos, 176, side == 0 ? 0 : 54, 16, 54); + } +} diff --git a/src/main/java/mekanism/common/CommonProxy.java b/src/main/java/mekanism/common/CommonProxy.java index 890c880a9..2249c73d4 100644 --- a/src/main/java/mekanism/common/CommonProxy.java +++ b/src/main/java/mekanism/common/CommonProxy.java @@ -31,6 +31,7 @@ import mekanism.common.inventory.container.ContainerFactory; import mekanism.common.inventory.container.ContainerFilter; import mekanism.common.inventory.container.ContainerFluidicPlenisher; import mekanism.common.inventory.container.ContainerGasTank; +import mekanism.common.inventory.container.ContainerInductionMatrix; import mekanism.common.inventory.container.ContainerLaserAmplifier; import mekanism.common.inventory.container.ContainerLaserTractorBeam; import mekanism.common.inventory.container.ContainerMetallurgicInfuser; @@ -481,6 +482,8 @@ public class CommonProxy return new ContainerSolarNeutronActivator(player.inventory, (TileEntitySolarNeutronActivator)tileEntity); case 48: return new ContainerNull(player, (TileEntityContainerBlock)tileEntity); + case 49: + return new ContainerInductionMatrix(player.inventory, (TileEntityInductionCasing)tileEntity); } return null; diff --git a/src/main/java/mekanism/common/block/BlockBasic.java b/src/main/java/mekanism/common/block/BlockBasic.java index d09670cac..f480124f7 100644 --- a/src/main/java/mekanism/common/block/BlockBasic.java +++ b/src/main/java/mekanism/common/block/BlockBasic.java @@ -179,13 +179,15 @@ public class BlockBasic extends Block implements IBlockCTM, ICustomBlockIcon //ctms[1][0] = new CTMData("ctm/SteamBoiler", this, Arrays.asList(1, 2)).registerIcons(register); //ctms[2][0] = new CTMData("ctm/BoilerValve", this, Arrays.asList(2, 1)).registerIcons(register); ctms[1][0] = new CTMData("ctm/InductionCasing", this, Arrays.asList(1, 2)).registerIcons(register); - ctms[2][0] = new CTMData("ctm/InductionPort", this, Arrays.asList(2, 1)).registerIcons(register); + ctms[2][0] = new CTMData("ctm/InductionPortInput", this, Arrays.asList(2, 1)).registerIcons(register); + ctms[2][1] = new CTMData("ctm/InductionPortOutput", this, Arrays.asList(2, 1)).registerIcons(register); icons[0][0] = ctms[0][0].mainTextureData.icon; //icons[1][0] = ctms[1][0].mainTextureData.icon; //icons[2][0] = ctms[2][0].mainTextureData.icon; icons[1][0] = ctms[1][0].mainTextureData.icon; icons[2][0] = ctms[2][0].mainTextureData.icon; + icons[2][1] = ctms[2][1].mainTextureData.icon; icons[3][0] = register.registerIcon("mekanism:InductionCellBasic"); icons[3][1] = register.registerIcon("mekanism:InductionCellAdvanced"); icons[3][2] = register.registerIcon("mekanism:InductionCellElite"); @@ -243,12 +245,15 @@ public class BlockBasic extends Block implements IBlockCTM, ICustomBlockIcon case BASIC_BLOCK_2: switch(meta) { + case 2: + TileEntityInductionPort tileEntity = (TileEntityInductionPort)world.getTileEntity(x, y, z); + return icons[meta][tileEntity.mode ? 1 : 0]; case 3: - TileEntityInductionCell tileEntity = (TileEntityInductionCell)world.getTileEntity(x, y, z); - return icons[meta][tileEntity.tier.ordinal()]; - case 4: - TileEntityInductionProvider tileEntity1 = (TileEntityInductionProvider)world.getTileEntity(x, y, z); + TileEntityInductionCell tileEntity1 = (TileEntityInductionCell)world.getTileEntity(x, y, z); return icons[meta][tileEntity1.tier.ordinal()]; + case 4: + TileEntityInductionProvider tileEntity2 = (TileEntityInductionProvider)world.getTileEntity(x, y, z); + return icons[meta][tileEntity2.tier.ordinal()]; default: return getIcon(side, meta); } diff --git a/src/main/java/mekanism/common/inventory/container/ContainerDynamicTank.java b/src/main/java/mekanism/common/inventory/container/ContainerDynamicTank.java index 93057f6c9..0c4eb8c19 100644 --- a/src/main/java/mekanism/common/inventory/container/ContainerDynamicTank.java +++ b/src/main/java/mekanism/common/inventory/container/ContainerDynamicTank.java @@ -2,7 +2,6 @@ package mekanism.common.inventory.container; import mekanism.common.inventory.slot.SlotOutput; import mekanism.common.tile.TileEntityDynamicTank; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; @@ -21,15 +20,15 @@ public class ContainerDynamicTank extends Container addSlotToContainer(new SlotOutput(tentity, 1, 146, 51)); int slotX; - for(slotX = 0; slotX < 3; ++slotX) + for(slotX = 0; slotX < 3; slotX++) { - for(int slotY = 0; slotY < 9; ++slotY) + for(int slotY = 0; slotY < 9; slotY++) { addSlotToContainer(new Slot(inventory, slotY + slotX * 9 + 9, 8 + slotY * 18, 84 + slotX * 18)); } } - for(slotX = 0; slotX < 9; ++slotX) + for(slotX = 0; slotX < 9; slotX++) { addSlotToContainer(new Slot(inventory, slotX, 8 + slotX * 18, 142)); } @@ -81,7 +80,7 @@ public class ContainerDynamicTank extends Container } } else { - if(slotID >= 2 && slotID <= 8) + if(slotID >= 2 && slotID <= 28) { if(!mergeItemStack(slotStack, 29, inventorySlots.size(), false)) { diff --git a/src/main/java/mekanism/common/inventory/container/ContainerInductionMatrix.java b/src/main/java/mekanism/common/inventory/container/ContainerInductionMatrix.java new file mode 100644 index 000000000..4bf4adbf1 --- /dev/null +++ b/src/main/java/mekanism/common/inventory/container/ContainerInductionMatrix.java @@ -0,0 +1,124 @@ +package mekanism.common.inventory.container; + +import mekanism.common.inventory.slot.SlotEnergy.SlotCharge; +import mekanism.common.inventory.slot.SlotEnergy.SlotDischarge; +import mekanism.common.tile.TileEntityInductionCasing; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidContainerRegistry; + +public class ContainerInductionMatrix extends Container +{ + private TileEntityInductionCasing tileEntity; + + public ContainerInductionMatrix(InventoryPlayer inventory, TileEntityInductionCasing tentity) + { + tileEntity = tentity; + addSlotToContainer(new SlotCharge(tentity, 0, 146, 20)); + addSlotToContainer(new SlotDischarge(tentity, 1, 146, 51)); + int slotX; + + for(slotX = 0; slotX < 3; slotX++) + { + for(int slotY = 0; slotY < 9; slotY++) + { + addSlotToContainer(new Slot(inventory, slotY + slotX * 9 + 9, 8 + slotY * 18, 84 + slotX * 18)); + } + } + + for(slotX = 0; slotX < 9; slotX++) + { + addSlotToContainer(new Slot(inventory, slotX, 8 + slotX * 18, 142)); + } + + tileEntity.open(inventory.player); + tileEntity.openInventory(); + } + + @Override + public void onContainerClosed(EntityPlayer entityplayer) + { + super.onContainerClosed(entityplayer); + + tileEntity.close(entityplayer); + tileEntity.closeInventory(); + } + + @Override + public boolean canInteractWith(EntityPlayer entityplayer) + { + return tileEntity.isUseableByPlayer(entityplayer); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slotID) + { + ItemStack stack = null; + Slot currentSlot = (Slot)inventorySlots.get(slotID); + + if(currentSlot != null && currentSlot.getHasStack()) + { + ItemStack slotStack = currentSlot.getStack(); + stack = slotStack.copy(); + + if(FluidContainerRegistry.isEmptyContainer(slotStack) || FluidContainerRegistry.isFilledContainer(slotStack)) + { + if(slotID != 0 && slotID != 1) + { + if(!mergeItemStack(slotStack, 0, 1, false)) + { + return null; + } + } + else { + if(!mergeItemStack(slotStack, 2, inventorySlots.size(), true)) + { + return null; + } + } + } + else { + if(slotID >= 2 && slotID <= 28) + { + if(!mergeItemStack(slotStack, 29, inventorySlots.size(), false)) + { + return null; + } + } + else if(slotID > 28) + { + if(!mergeItemStack(slotStack, 2, 28, false)) + { + return null; + } + } + else { + if(!mergeItemStack(slotStack, 2, inventorySlots.size(), true)) + { + return null; + } + } + } + + if(slotStack.stackSize == 0) + { + currentSlot.putStack((ItemStack)null); + } + else { + currentSlot.onSlotChanged(); + } + + if(slotStack.stackSize == stack.stackSize) + { + return null; + } + + currentSlot.onPickupFromSlot(player, slotStack); + } + + return stack; + } +} diff --git a/src/main/java/mekanism/common/tile/TileEntityInductionPort.java b/src/main/java/mekanism/common/tile/TileEntityInductionPort.java index 3dc8ecbe2..8cc0ee66b 100644 --- a/src/main/java/mekanism/common/tile/TileEntityInductionPort.java +++ b/src/main/java/mekanism/common/tile/TileEntityInductionPort.java @@ -13,14 +13,19 @@ import io.netty.buffer.ByteBuf; import java.util.ArrayList; import mekanism.api.Coord4D; +import mekanism.api.EnumColor; +import mekanism.api.IConfigurable; import mekanism.api.MekanismConfig.general; import mekanism.api.energy.ICableOutputter; import mekanism.api.energy.IStrictEnergyAcceptor; import mekanism.api.energy.IStrictEnergyStorage; import mekanism.api.transmitters.IGridTransmitter; +import mekanism.common.util.LangUtils; import mekanism.common.util.MekanismUtils; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.ForgeDirection; import cofh.api.energy.IEnergyHandler; @@ -34,7 +39,7 @@ import cpw.mods.fml.common.Optional.Method; @Interface(iface = "ic2.api.tile.IEnergyStorage", modid = "IC2"), @Interface(iface = "cofh.api.energy.IEnergyHandler", modid = "CoFHAPI|energy"), }) -public class TileEntityInductionPort extends TileEntityInductionCasing implements IStrictEnergyStorage, IEnergyHandler, IEnergySink, IEnergySource, IEnergyStorage, IStrictEnergyAcceptor, ICableOutputter +public class TileEntityInductionPort extends TileEntityInductionCasing implements IStrictEnergyStorage, IEnergyHandler, IEnergySink, IEnergySource, IEnergyStorage, IStrictEnergyAcceptor, ICableOutputter, IConfigurable { public boolean ic2Registered = false; @@ -393,4 +398,24 @@ public class TileEntityInductionPort extends TileEntityInductionCasing implement return toUse; } + + @Override + public boolean onSneakRightClick(EntityPlayer player, int side) + { + if(!worldObj.isRemote) + { + mode = !mode; + String modeText = " " + (mode ? EnumColor.DARK_RED : EnumColor.DARK_GREEN) + LangUtils.transOutputInput(mode) + "."; + player.addChatMessage(new ChatComponentText(MekanismUtils.localize("tooltip.inductionPortMode") + modeText)); + markDirty(); + } + + return true; + } + + @Override + public boolean onRightClick(EntityPlayer player, int side) + { + return false; + } } diff --git a/src/main/java/mekanism/common/util/LangUtils.java b/src/main/java/mekanism/common/util/LangUtils.java index 9ecc8e864..c3369c35c 100644 --- a/src/main/java/mekanism/common/util/LangUtils.java +++ b/src/main/java/mekanism/common/util/LangUtils.java @@ -15,6 +15,11 @@ public final class LangUtils { return MekanismUtils.localize("tooltip." + (b ? "yes" : "no")); } + + public static String transOutputInput(boolean b) + { + return MekanismUtils.localize("gui." + (b ? "output" : "input")); + } public static String localizeFluidStack(FluidStack fluidStack) { diff --git a/src/main/resources/assets/mekanism/gui/GuiGasTank.png b/src/main/resources/assets/mekanism/gui/GuiGasTank.png index 8ea40c5432e1c8f0b2ae5f02fe59babb3c0464a1..d878c5167a338c920ae0b2719ae8dfb712f276d9 100644 GIT binary patch delta 2794 zcmb`HX;c$g9>rf31tusM0tzT#fM!uUKnnuX5K=lQDu&>&xUfn)vWUVcDu$&hv;zu) zAkfgLBnldKLxX?;O%xHA5zt68i0mR;lzrc(=F6NjbLK-IkM*fe)vH_g{_pQS3AI~0 z*$PT5weFU~sQ0^L0Z=U3Yrn%a9QxeOOj2cSSmoOol*772u990t^V6eR1FG)h-A+yF zq2O4GN-)|WZ>aTgjml|o(H=$7wFY-rrPVMY;k37qQ5mk-4y%X-KILEVR?bK`d&$8+jR96^lz}g zzyIJf(W9e+jiS$N?ntM2y#=OONTTiqQa}2m?dnR z9ejIko!<{OOeT+>;iyab-kGBy?D#O(qUJ;i*y+0!WM!7_rP74!Dd2>n5vkm0v_1l0 z*O7_2$cf;4QZ~=-CL?;W>Yzs=iK20kwh;_A4JvE3cGO%jpXk_W@9Y8hl0RsIUhN}| zNDn+{1L7h(w3%-$A}Bywbi%w$bbh2m)?FJ{*)TKz)05Wf^CQ3eXo#lvCHfeH4Pt2j z(Rm+n^vx$0PTS&AqZLPqm51m3F@3X(5&@fce317!l$)v`>8=f9!56q;_1NUVo7YU; zFHC2uDjw{RAw zKaVN9kEM7&JC-vr zmTp^>vkHBo@yuO-&P%)6Dkd4g!y5%3qh!UXWCqNu59adVT*0y+dcKqA^y(U7w=}iD zh<`0LNGyF?8m{2%=XNE(Op;UA);g5Lb81sowH`FbYhwqFAfzh>H1OcQ$ zBhoPR9puUpVlqd(d_6iJ5xtT7R^E~~9g=Ml^+BNHV+r2wvs*u5efF}}iU~yIb_`fq z4hFK2<7>I6k;t`tjE+d|dkuDm4f}Lh9+}rcSAMkG1hz-kKg2Gy1sNB9$#AsGRrQ`Caam!K)h)RM10lNa21NPn;cT-&P)vpo=m@}x*-{bv!OL11rBgC zNoz?HcbE-2wNc?cj{9RkNv&0lEK{X`g=3yhd}P$*1`6eWmvCkE zcpx30oLRJlk-M9dmGJUwSLD0 z6l_!4KfSatv+DJD->ZyOUXAG@LgLHuBWsLDi3h zP>kSQ*9Fq^m_PYg4a`6AN@@ITQs|g^l_&5BT(cs!g5s>2^|?U^f^NUF%^9vGJa)6D z_V71AkTWZPO&U=x>>KXFpyusHfvd|FIRi5S4vh}it4M(g1vICZME@Ye&`DMB_%J*fZurdLk0hlP@feH6AnS@_n_b!YS zMp*VL_sozyB}jj&81y3|B9U;DBPEW$L@B<0^4qmxFJczz^cDj%q7}2!m@H+k2~kVJ zFT>PKqL$1VQ;Y0 zUa+bvk0TR`W& zB+%-Uw}`}G6@sld(qGU%BE&en!H#>0U~3@Ik$;+K_yVNFL+w#uKUr?z`~U}eHFzwW zrbh#MocGi`Pg=DOPRz8q?~E32@qjFmbnGA!A67)?mLlsD>R2tW`nE0cPSsXq!`|@Z zMd=lZ8ZlP2f&gWNqe#NDL$g${%oucR{g}$5;NI=Jid+_)LA4naTD{+e7E70pi-b%gMfE Ir*F)^0Iir^-2eap delta 1342 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 SG@rTv0000cC%aA&7Mi< zllTZeKwm&a5Cmas29>6^;UxJ_(wPKCn=H$J{?DWdJ@f5wIQ)o!<#;@b)oK+ag5`24 z-h(KQNHp^iOFhfPVzE%9ilR{JoE4qEml;r1l_);H#p!hVyK;Y;?HgOC?_~zapvtcg zA!-m+ea&kSzRQrl7XaJs*0*0pPp9u?2`JHwtdanX>;v&04(S=tw~bIDMQwGQ`Xm5y z8`wxZm&1t@fH_M#E~yYX6c$-#F6S?beRz>3%YqJhdSk z(E7#zq?zmW+UtL5I-T~mqZ^U>Rsf`-%jKf@n$2cPox6h4cRB~0&u1ZjLKTF*6M#_0 zk-FAPKn5|N&ylehkA={;2H<#A0PcOhF*$Ta>l*>!I^hkO z?Y491lL2ftn{GVXx_teGEL{2|0J=9SNRvZjaq35Z4oH6hhNfLC?P&(Y@<|W*Ofz7J zOf2ou&wxzk$YU;V^*i^V{~!?>KItgz8f0H$1C=zP#HQ2t@(j@B=P3qU`{?w&EP=8t z6%Toyi}iY~v~gB+`d$EVnsXi7%Mx%6lJoBq08YC9VQkVi*td;P%%QeAPJI#p&ip(D zB&R+JKofr?M}EE;n{wsQHv%AoMCa!z#@l_+`o;icFv$FT+Z^>Csc!{928znhQ%!gK zq4b^30f_v3*O*Biq3;C1B-pX`wO#_!5F$VC0tTUP4FHv&w*`RGw*r97&)Wb%>Kg+< z=jTlUp!JOaaOCGr0C4D&0dVE#sQ|e2(;Fe`C-63^{h~hzB>=BFwW+?+44{&F)qc^> kfJ}aUJ#-26^?B+07t}P=KL@YsxBvhE07*qoM6N<$f})IG!2kdN diff --git a/src/main/resources/assets/mekanism/textures/blocks/ctm/InductionPort.png b/src/main/resources/assets/mekanism/textures/blocks/ctm/InductionPortInput.png similarity index 73% rename from src/main/resources/assets/mekanism/textures/blocks/ctm/InductionPort.png rename to src/main/resources/assets/mekanism/textures/blocks/ctm/InductionPortInput.png index 469a9faf23e6abae44e9d75b245fab99c50729fc..33d963e1109447fe243dcd66a36f4317866fbd07 100644 GIT binary patch delta 342 zcmV-c0jd7*3hWB7AOwFmNklfu4%%_V39zA-*P^Vo2cfjOlbKz{dH~?f@%Jw|CrSIk5!`XCkKtx0Y+(L8) z6S@Gs`J)aXDh*)EM#MxFEUV#DOOyjZ*=Xs~rTEOjkju%*!4QALCP0(}U>g7Y`2%C( zrCC^rHnbdxVW&2;}ayy0U!fEfBuYO zE-x=H3ZGaGMdiT9j~^L8m=Zvd11PZ=rkCs}02#o~&kr+)Y?^EbkQ?XdE+xwW)_i)usx6)0|B=jU6 z!2@^!5kU}yHjxgPs9};&voRp!Op^J}i3xhCs_K)bDe={4UDv*}iFj~&ggUP>Ns>g8 zVvNoHRf_(}X_|(x$BVRWJKLqqAr%mU@8_Km4$^RY;~>xu0my&z9Q0Q9kR@2DE&?Y2 z>K)kHMvE%$-ojSf9l$$K0Ad@JWvR=v>MM$37267+0AS)YO>nEVl;YFkNB$(oany)G%cVI1xCp~s>m?8g z;y8vp*47%pcFj^%QY!$Pw_Ozm-x$DjpM%hzH3Bd>;r0a8I2s_!GIg%j7oT64h62!i s(O^V$W4xaOC%{>OvjX!u;PVgp3!(EnqNNL&S^xk507*qoM6N<$g5j>91poj5 diff --git a/src/main/resources/assets/mekanism/textures/blocks/ctm/InductionPortOutput-ctm.png b/src/main/resources/assets/mekanism/textures/blocks/ctm/InductionPortOutput-ctm.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a60289d0250484a0ec22555a0826e63c314edd GIT binary patch literal 1726 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