From e6ed263aa3b01b89368ef32c0151fc1ddaa9e9e2 Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Tue, 12 Nov 2013 18:42:55 -0500 Subject: [PATCH] More bin work! :D --- .../client/render/tileentity/RenderBin.java | 103 ++++++------ common/mekanism/common/block/BlockBasic.java | 148 ++++++++++++++++-- .../mekanism/common/block/BlockMachine.java | 2 +- .../common/inventory/InventoryBin.java | 2 +- .../common/item/ItemConfigurator.java | 9 +- .../common/tileentity/TileEntityBin.java | 99 +++++++++++- .../textures/blocks/{Bin.png => BinFront.png} | Bin 1432 -> 1770 bytes .../mekanism/textures/blocks/BinFrontOn.png | Bin 0 -> 1772 bytes .../mekanism/textures/blocks/BinSide.png | Bin 0 -> 1856 bytes .../mekanism/textures/blocks/BinTop.png | Bin 1971 -> 1785 bytes .../mekanism/textures/blocks/BinTopOn.png | Bin 0 -> 1792 bytes 11 files changed, 289 insertions(+), 74 deletions(-) rename resources/assets/mekanism/textures/blocks/{Bin.png => BinFront.png} (61%) create mode 100644 resources/assets/mekanism/textures/blocks/BinFrontOn.png create mode 100644 resources/assets/mekanism/textures/blocks/BinSide.png create mode 100644 resources/assets/mekanism/textures/blocks/BinTopOn.png diff --git a/common/mekanism/client/render/tileentity/RenderBin.java b/common/mekanism/client/render/tileentity/RenderBin.java index 1c9e0b64a..778ec9251 100644 --- a/common/mekanism/client/render/tileentity/RenderBin.java +++ b/common/mekanism/client/render/tileentity/RenderBin.java @@ -49,64 +49,61 @@ public class RenderBin extends TileEntitySpecialRenderer amount = Integer.toString(itemStack.stackSize); } - for(ForgeDirection side : MekanismUtils.SIDE_DIRS) + Object3D obj = Object3D.get(tileEntity).getFromSide(ForgeDirection.getOrientation(tileEntity.facing)); + + if(tileEntity.worldObj.isBlockSolidOnSide(obj.xCoord, obj.yCoord, obj.zCoord, ForgeDirection.getOrientation(tileEntity.facing).getOpposite())) { - Object3D obj = Object3D.get(tileEntity).getFromSide(side); - - if(tileEntity.worldObj.isBlockSolidOnSide(obj.xCoord, obj.yCoord, obj.zCoord, side.getOpposite())) + return; + } + + doLight(tileEntity.worldObj, obj); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240); + + if(itemStack != null) + { + GL11.glPushMatrix(); + + switch(ForgeDirection.getOrientation(tileEntity.facing)) { - continue; + case NORTH: + GL11.glTranslated(x + 0.73, y + 0.83, z - 0.01); + break; + case SOUTH: + GL11.glTranslated(x + 0.27, y + 0.83, z + 1.01); + GL11.glRotatef(180, 0, 1, 0); + break; + case WEST: + GL11.glTranslated(x - 0.01, y + 0.83, z + 0.27); + GL11.glRotatef(90, 0, 1, 0); + break; + case EAST: + GL11.glTranslated(x + 1.01, y + 0.83, z + 0.73); + GL11.glRotatef(-90, 0, 1, 0); + break; + } + + float scale = 0.03125F; + float scaler = 0.9F; + + GL11.glScalef(scale*scaler, scale*scaler, 0); + GL11.glRotatef(180, 0, 0, 1); + + TextureManager renderEngine = Minecraft.getMinecraft().renderEngine; + + GL11.glDisable(2896); + + if(!ForgeHooksClient.renderInventoryItem(renderBlocks, renderEngine, itemStack, true, 0.0F, 0.0F, 0.0F)) + { + renderItem.renderItemIntoGUI(getFontRenderer(), renderEngine, itemStack, 0, 0); } - doLight(tileEntity.worldObj, obj); - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240); + GL11.glEnable(2896); + GL11.glPopMatrix(); + } - if(itemStack != null) - { - GL11.glPushMatrix(); - - switch(side) - { - case NORTH: - GL11.glTranslated(x + 0.73, y + 0.83, z - 0.01); - break; - case SOUTH: - GL11.glTranslated(x + 0.27, y + 0.83, z + 1.01); - GL11.glRotatef(180, 0, 1, 0); - break; - case WEST: - GL11.glTranslated(x - 0.01, y + 0.83, z + 0.27); - GL11.glRotatef(90, 0, 1, 0); - break; - case EAST: - GL11.glTranslated(x + 1.01, y + 0.83, z + 0.73); - GL11.glRotatef(-90, 0, 1, 0); - break; - } - - float scale = 0.03125F; - float scaler = 0.9F; - - GL11.glScalef(scale*scaler, scale*scaler, 0); - GL11.glRotatef(180, 0, 0, 1); - - TextureManager renderEngine = Minecraft.getMinecraft().renderEngine; - - GL11.glDisable(2896); - - if(!ForgeHooksClient.renderInventoryItem(renderBlocks, renderEngine, itemStack, true, 0.0F, 0.0F, 0.0F)) - { - renderItem.renderItemIntoGUI(getFontRenderer(), renderEngine, itemStack, 0, 0); - } - - GL11.glEnable(2896); - GL11.glPopMatrix(); - } - - if(amount != "") - { - renderText(amount, side, 0.02F, x, y - 0.31F, z); - } + if(amount != "") + { + renderText(amount, ForgeDirection.getOrientation(tileEntity.facing), 0.02F, x, y - 0.31F, z); } } } diff --git a/common/mekanism/common/block/BlockBasic.java b/common/mekanism/common/block/BlockBasic.java index f63ffe435..3f2f8578d 100644 --- a/common/mekanism/common/block/BlockBasic.java +++ b/common/mekanism/common/block/BlockBasic.java @@ -5,26 +5,31 @@ import java.util.List; import mekanism.api.Object3D; import mekanism.client.ClientProxy; +import mekanism.common.IActiveState; +import mekanism.common.IBoundingBlock; import mekanism.common.Mekanism; import mekanism.common.PacketHandler; import mekanism.common.PacketHandler.Transmission; import mekanism.common.inventory.InventoryBin; import mekanism.common.network.PacketTileEntity; +import mekanism.common.tileentity.TileEntityBasicBlock; import mekanism.common.tileentity.TileEntityBin; import mekanism.common.tileentity.TileEntityDynamicTank; import mekanism.common.tileentity.TileEntityDynamicValve; +import mekanism.common.util.MekanismUtils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EnumCreatureType; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; +import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -53,7 +58,7 @@ import cpw.mods.fml.relauncher.SideOnly; */ public class BlockBasic extends Block { - public Icon[] icons = new Icon[256]; + public Icon[][] icons = new Icon[256][6]; public BlockBasic(int id) { @@ -81,25 +86,72 @@ public class BlockBasic extends Block @SideOnly(Side.CLIENT) public void registerIcons(IconRegister register) { - icons[0] = register.registerIcon("mekanism:OsmiumBlock"); - icons[1] = register.registerIcon("mekanism:BronzeBlock"); - icons[2] = register.registerIcon("mekanism:RefinedObsidian"); - icons[3] = register.registerIcon("mekanism:CoalBlock"); - icons[4] = register.registerIcon("mekanism:RefinedGlowstone"); - icons[5] = register.registerIcon("mekanism:SteelBlock"); - icons[6] = register.registerIcon("mekanism:Bin"); //TODO texture - icons[7] = register.registerIcon("mekanism:TeleporterFrame"); - icons[8] = register.registerIcon("mekanism:SteelCasing"); - icons[9] = register.registerIcon("mekanism:DynamicTank"); - icons[10] = register.registerIcon("mekanism:DynamicGlass"); - icons[11] = register.registerIcon("mekanism:DynamicValve"); + icons[0][0] = register.registerIcon("mekanism:OsmiumBlock"); + icons[1][0] = register.registerIcon("mekanism:BronzeBlock"); + icons[2][0] = register.registerIcon("mekanism:RefinedObsidian"); + icons[3][0] = register.registerIcon("mekanism:CoalBlock"); + icons[4][0] = register.registerIcon("mekanism:RefinedGlowstone"); + icons[5][0] = register.registerIcon("mekanism:SteelBlock"); + icons[6][0] = register.registerIcon("mekanism:BinSide"); + icons[6][1] = register.registerIcon("mekanism:BinTop"); + icons[6][2] = register.registerIcon("mekanism:BinFront"); + icons[6][3] = register.registerIcon("mekanism:BinTopOn"); + icons[6][4] = register.registerIcon("mekanism:BinFrontOn"); + icons[7][0] = register.registerIcon("mekanism:TeleporterFrame"); + icons[8][0] = register.registerIcon("mekanism:SteelCasing"); + icons[9][0] = register.registerIcon("mekanism:DynamicTank"); + icons[10][0] = register.registerIcon("mekanism:DynamicGlass"); + icons[11][0] = register.registerIcon("mekanism:DynamicValve"); } + @Override + @SideOnly(Side.CLIENT) + public Icon getBlockTexture(IBlockAccess world, int x, int y, int z, int side) + { + int metadata = world.getBlockMetadata(x, y, z); + + if(metadata != 6) + { + return getIcon(side, metadata); + } + else { + TileEntityBasicBlock tileEntity = (TileEntityBasicBlock)world.getBlockTileEntity(x, y, z); + + if(side == 0 || side == 1) + { + return MekanismUtils.isActive(world, x, y, z) ? icons[6][3] : icons[6][1]; + } + else if(side == tileEntity.facing) + { + return MekanismUtils.isActive(world, x, y, z) ? icons[6][4] : icons[6][2]; + } + else { + return icons[6][0]; + } + } + } + @Override @SideOnly(Side.CLIENT) public Icon getIcon(int side, int meta) { - return icons[meta]; + if(meta != 6) + { + return icons[meta][0]; + } + else { + if(side == 0 || side == 1) + { + return icons[6][1]; + } + else if(side == 3) + { + return icons[6][2]; + } + else { + return icons[6][0]; + } + } } @Override @@ -156,6 +208,23 @@ public class BlockBasic extends Block return super.canCreatureSpawn(type, world, x, y, z); } + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) + { + int meta = world.getBlockMetadata(x, y, z); + + if(!world.isRemote && meta == 6) + { + TileEntityBin bin = (TileEntityBin)world.getBlockTileEntity(x, y, z); + + if(bin.getStack() != null) + { + world.spawnEntityInWorld(new EntityItem(world, player.posX, player.posY, player.posZ, bin.getStack().copy())); + bin.setInventorySlotContents(0, null); + } + } + } + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer entityplayer, int i1, float f1, float f2, float f3) { @@ -357,7 +426,16 @@ public class BlockBasic extends Block @Override public int getLightValue(IBlockAccess world, int x, int y, int z) { + TileEntity tileEntity = world.getBlockTileEntity(x, y, z); int metadata = world.getBlockMetadata(x, y, z); + + if(tileEntity instanceof IActiveState) + { + if(((IActiveState)tileEntity).getActive() && ((IActiveState)tileEntity).lightUpdate()) + { + return 15; + } + } switch(metadata) { @@ -399,10 +477,48 @@ public class BlockBasic extends Block @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entityliving, ItemStack itemstack) { + if(world.getBlockTileEntity(x, y, z) instanceof TileEntityBasicBlock) + { + TileEntityBasicBlock tileEntity = (TileEntityBasicBlock)world.getBlockTileEntity(x, y, z); + int side = MathHelper.floor_double((entityliving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; + int height = Math.round(entityliving.rotationPitch); + int change = 3; + + if(tileEntity.canSetFacing(0) && tileEntity.canSetFacing(1)) + { + if(height >= 65) + { + change = 1; + } + else if(height <= -65) + { + change = 0; + } + } + + if(change != 0 && change != 1) + { + switch(side) + { + case 0: change = 2; break; + case 1: change = 5; break; + case 2: change = 3; break; + case 3: change = 4; break; + } + } + + tileEntity.setFacing((short)change); + + if(tileEntity instanceof IBoundingBlock) + { + ((IBoundingBlock)tileEntity).onPlace(); + } + } + world.markBlockForRenderUpdate(x, y, z); world.updateAllLightTypes(x, y, z); - if(world.getBlockTileEntity(x, y, z) != null && !world.isRemote) + if(!world.isRemote && world.getBlockTileEntity(x, y, z) != null) { TileEntity tileEntity = world.getBlockTileEntity(x, y, z); diff --git a/common/mekanism/common/block/BlockMachine.java b/common/mekanism/common/block/BlockMachine.java index 5024f24bd..93e469774 100644 --- a/common/mekanism/common/block/BlockMachine.java +++ b/common/mekanism/common/block/BlockMachine.java @@ -148,7 +148,7 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entityliving, ItemStack itemstack) { TileEntityBasicBlock tileEntity = (TileEntityBasicBlock)world.getBlockTileEntity(x, y, z); - int side = MathHelper.floor_double((double)(entityliving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; + int side = MathHelper.floor_double((entityliving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; int height = Math.round(entityliving.rotationPitch); int change = 3; diff --git a/common/mekanism/common/inventory/InventoryBin.java b/common/mekanism/common/inventory/InventoryBin.java index c30c1adc3..24ca64ace 100644 --- a/common/mekanism/common/inventory/InventoryBin.java +++ b/common/mekanism/common/inventory/InventoryBin.java @@ -40,7 +40,7 @@ public class InventoryBin public ItemStack add(ItemStack stack) { - if(stack != null && stack.stackSize > 0) + if(stack != null && stack.stackSize > 0 && stack.isStackable()) { if(getItemType() == null) { diff --git a/common/mekanism/common/item/ItemConfigurator.java b/common/mekanism/common/item/ItemConfigurator.java index 3ff103b39..040f80865 100644 --- a/common/mekanism/common/item/ItemConfigurator.java +++ b/common/mekanism/common/item/ItemConfigurator.java @@ -12,6 +12,7 @@ import mekanism.common.PacketHandler; import mekanism.common.PacketHandler.Transmission; import mekanism.common.network.PacketTileEntity; import mekanism.common.tileentity.TileEntityBasicBlock; +import mekanism.common.tileentity.TileEntityBin; import mekanism.common.tileentity.TileEntityContainerBlock; import mekanism.common.tileentity.TileEntityElectricChest; import mekanism.common.tileentity.TileEntityElectricPump; @@ -21,7 +22,6 @@ import mekanism.common.util.MekanismUtils; import mekanism.common.util.TransporterUtils; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -77,6 +77,13 @@ public class ItemConfigurator extends ItemEnergized player.sendChatToPlayer(ChatMessageComponent.createFromText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " Color bumped to: " + (transporter.color != null ? transporter.color.getName() : EnumColor.BLACK + "None"))); return true; } + else if(world.getBlockTileEntity(x, y, z) instanceof TileEntityBin) + { + TileEntityBin bin = (TileEntityBin)world.getBlockTileEntity(x, y, z); + bin.setActive(!bin.getActive()); + world.playSoundEffect(x, y, z, "random.click", 0.3F, 1); + return true; + } } else if(world.getBlockTileEntity(x, y, z) instanceof ITransmitter) { diff --git a/common/mekanism/common/tileentity/TileEntityBin.java b/common/mekanism/common/tileentity/TileEntityBin.java index c81a5c3a4..2d5baa414 100644 --- a/common/mekanism/common/tileentity/TileEntityBin.java +++ b/common/mekanism/common/tileentity/TileEntityBin.java @@ -2,16 +2,34 @@ package mekanism.common.tileentity; import java.util.ArrayList; +import mekanism.api.Object3D; +import mekanism.common.IActiveState; +import mekanism.common.PacketHandler; +import mekanism.common.PacketHandler.Transmission; +import mekanism.common.network.PacketTileEntity; +import mekanism.common.util.MekanismUtils; +import mekanism.common.util.TransporterUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.ForgeDirection; import com.google.common.io.ByteArrayDataInput; -public class TileEntityBin extends TileEntityBasicBlock implements ISidedInventory +public class TileEntityBin extends TileEntityBasicBlock implements ISidedInventory, IActiveState { + public boolean isActive; + + public boolean clientActive; + + public final int MAX_DELAY = 10; + + public int delayTicks; + public int itemCount; + public ItemStack itemType; public ItemStack getStack() @@ -28,13 +46,35 @@ public class TileEntityBin extends TileEntityBasicBlock implements ISidedInvento } @Override - public void onUpdate() {} + public void onUpdate() + { + if(!worldObj.isRemote) + { + delayTicks = Math.max(0, delayTicks-1); + + if(getStack() != null && isActive && delayTicks == 0) + { + TileEntity tile = Object3D.get(this).getFromSide(ForgeDirection.getOrientation(0)).getTileEntity(worldObj); + + if(tile instanceof TileEntityLogisticalTransporter) + { + TileEntityLogisticalTransporter transporter = (TileEntityLogisticalTransporter)tile; + + if(TransporterUtils.insert(this, transporter, getStack(), null)) + { + setInventorySlotContents(0, null); + } + } + } + } + } @Override public void writeToNBT(NBTTagCompound nbtTags) { super.writeToNBT(nbtTags); + nbtTags.setBoolean("isActive", isActive); nbtTags.setInteger("itemCount", itemCount); if(itemCount > 0) @@ -48,6 +88,7 @@ public class TileEntityBin extends TileEntityBasicBlock implements ISidedInvento { super.readFromNBT(nbtTags); + isActive = nbtTags.getBoolean("isActive"); itemCount = nbtTags.getInteger("itemCount"); if(itemCount > 0) @@ -61,6 +102,7 @@ public class TileEntityBin extends TileEntityBasicBlock implements ISidedInvento { super.getNetworkedData(data); + data.add(isActive); data.add(itemCount); if(itemCount > 0) @@ -77,12 +119,15 @@ public class TileEntityBin extends TileEntityBasicBlock implements ISidedInvento { super.handlePacketData(dataStream); + isActive = dataStream.readBoolean(); itemCount = dataStream.readInt(); if(itemCount > 0) { itemType = new ItemStack(dataStream.readInt(), 0, dataStream.readInt()); } + + MekanismUtils.updateBlock(worldObj, xCoord, yCoord, zCoord); } @Override @@ -169,6 +214,19 @@ public class TileEntityBin extends TileEntityBasicBlock implements ISidedInvento setItemCount(itemCount + itemstack.stackSize); } } + + onInventoryChanged(); + } + + @Override + public void onInventoryChanged() + { + super.onInventoryChanged(); + + if(!worldObj.isRemote) + { + PacketHandler.sendPacket(Transmission.ALL_CLIENTS, new PacketTileEntity().setParams(Object3D.get(this), getNetworkedData(new ArrayList()))); + } } public void setItemType(ItemStack stack) @@ -253,4 +311,41 @@ public class TileEntityBin extends TileEntityBasicBlock implements ISidedInvento { return itemType != null && itemType.isItemEqual(itemstack); } + + @Override + public boolean canSetFacing(int facing) + { + return facing != 0 && facing != 1; + } + + @Override + public void setActive(boolean active) + { + isActive = active; + + if(clientActive != active) + { + PacketHandler.sendPacket(Transmission.ALL_CLIENTS, new PacketTileEntity().setParams(Object3D.get(this), getNetworkedData(new ArrayList()))); + + clientActive = active; + } + } + + @Override + public boolean getActive() + { + return isActive; + } + + @Override + public boolean renderUpdate() + { + return true; + } + + @Override + public boolean lightUpdate() + { + return true; + } } \ No newline at end of file diff --git a/resources/assets/mekanism/textures/blocks/Bin.png b/resources/assets/mekanism/textures/blocks/BinFront.png similarity index 61% rename from resources/assets/mekanism/textures/blocks/Bin.png rename to resources/assets/mekanism/textures/blocks/BinFront.png index 2b21badfd60f6349839c4c1805688d0e1cd162b9..984fcb4844231b02056a49782aefb1157013d2b5 100644 GIT binary patch delta 676 zcmV;V0$cr<3+fH9Qv`nkfk{L`R9Fe!SIcTDK@jaxqY}YHMMM)&LJYW8QQQiy{Rn@@ zAMpbOx31z&B9SNxBBHJYmH3D;#y*!bWXxc^*SQR&q5D*|HPz*ro~~*oolft>zHPT# z32OWJ_<+p$-414g^E6y8mkkTrNa%cXtQ0+wH)gsDsgogJfW{*}$4# z7j^R)n9t{kY&04HqtPgkOh7qva5|l$-|xdqy7^lBLmEyrZaz_1~49vh3qn`$=ixz}V@12AHtfAL{srQ&wG@q8o_0a`4^#U_1cG8y=-R4TyN*VjMmU^H>~ zmJN9#va&HMCo~!j{LRB`c(fkK=kqEz{5(k|k8l>HG-Tkk_j5jmFzMbG9!LnGaiqBRsTwsr{7_d)wk^OrX{=XS8#iK zd-&X0`Z0eB?}mv)0*mkl!#aU`;P>8)$N=jCa?Koj0_T72?f4TcQyX;YfnF8>0000< KMNUMnLSTZs7DopF delta 335 zcmV-V0kHn+4VVkCQv`njFG)l}R9Fe^mpcxFFbsxi)dL_Vj=^P^ShyU=;4(~1NU$KW zv^A0~1BoF~aE3MuPHgjkaS|SnqA1=;#P$O1zVD+Td*5rRHjx5W>u)`8?aWONH za|56)4s#%Y7~&g%Koxbq4OPH7Gf+ZwfWt9#d76bN0s&|WFUvyg>Px`IfkG8vFAe~- z1kkywnS@bGwE`&0uYZ8kJ#h9q<>mCTMF8nT!XzebHXc9EGj&A(jB1(&O{Z&FmWOyQ z4$j}&g!|d6R=`Ijt_ENe2Y^eP5CVOgB#igF1W;8K#wR{Ujgk$9(bkLdsa diff --git a/resources/assets/mekanism/textures/blocks/BinFrontOn.png b/resources/assets/mekanism/textures/blocks/BinFrontOn.png new file mode 100644 index 0000000000000000000000000000000000000000..4278df44ed05db4c52f224fb86c7f3f30612ec6d GIT binary patch literal 1772 zcmV4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER0007mNklEE0R*?MbSH|Uq97tFvk+AL|Hgbn6kT>Vl?AFfbGY7FetK$Xu~c^*=$B8!C(;h_Vxz+j5;_y*>MJr z$0NMy>mply23D&TGMi4Pz;HMWBqm_I*cpvRHX4l(rCzT~qN&dSy%U}#Z-O95GE~Cg zbNKy!gxc@-z)Gb8RG$IbvuRb*9?e&-QcbVdvqqzVaKr#rPt_R^6PV3rj0>-7T&N}} z!9u&;X3OOg!sBw`YmJMTfD#k^OAH;IR4f(?o(}{9K#fMZ+<5GCI*qvHav8W@um8-0 zUd8T1HKZMpPBu!_gl4mezjA zk~n6wSym_%#Ia(rDC(an`Fx(yjz_+kOa?0LJF+Y7*Uu*7qEvenPe)YJyT6~5PQ~}* z&)A_*h}CK}iEFi5mDsWjNId?tq2ZN^3$KP$5#P@li^blXf2H%?@4oTVHy3`>;v)MM zeEaeJ{<)XzNAU!@8^+^tOhPvpIw#N?__{YEVt~#C#5LU$X#C6Gj(-F3(i+GifU~y% O000098^C5 literal 0 HcmV?d00001 diff --git a/resources/assets/mekanism/textures/blocks/BinSide.png b/resources/assets/mekanism/textures/blocks/BinSide.png new file mode 100644 index 0000000000000000000000000000000000000000..286ea845de6536b9fdfe3203fbe9f56a3e3f93bf GIT binary patch literal 1856 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 Ef{OO3@c;k- diff --git a/resources/assets/mekanism/textures/blocks/BinTopOn.png b/resources/assets/mekanism/textures/blocks/BinTopOn.png new file mode 100644 index 0000000000000000000000000000000000000000..8d8ea5a3cb33e39ce26d50e05a8ee3f7fa210da4 GIT binary patch literal 1792 zcmV+b2mknqP)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER0007)NklwM>s7ycUG?gf@bK_( zki9*--R_9@XTRU0&i2Cr-DGTM$HiiS>h0~Vs6X|V%O%>^>osUHnZWIK3(8SSSSb1J zcs!2kXfy&f8V%U%^+2=P47yw{kVUOlL)C7#g9?QLqzC5nIb@D&u~;D2>vd3i4~)lS zSi+eG0s+X4Mg!!GBasMX7K6b6Rfod?4u?Z97K?$K%?4~Xo1*qgr2?62NqP?`m8WGu zi#nYSEOa`ZU@#a2v)L@@^?E^r!2ou{Mo6%^5Y_r)wdaPQlp8BDb zuu$rBI(**e^MPu$8syqYCX*ub+U>STroc5p`N+v+BIEAjn&9rD{Jsr;S3Ix(`1bw0 z=_1+sbozZCbyiNNQ@nq9c>(Y5??HOvBjropX|-B(YqeTnE|(LjNxuvDPiUzi2qFuw z6*#`z?Z!~6)e6jHGNAMxV9e&KWQ@MKxw&@o&{wHcU_PG*=>eXe(tCi@e0_aIH5?9u zJOdc%*zaFiDwUvej0wkwXG*`{hb+AZn5i&kdpw?#WxrxMgewY;`}p{XQBtWCIGfEt z={<0M8Zsg>v$Tw+Am|y2KWah)%ka2)F8UEw*n-TXjZ$`|l7(aN*{^@4K iJEG)kK=|)($3Fq