From 51289b82c2293dc73ac1c2184a2557be41f4bf08 Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Fri, 25 Oct 2013 00:23:38 -0400 Subject: [PATCH] Made base code for Logistical Sorter, this may end up being more complex than the transporters themselves. --- common/mekanism/client/ClientProxy.java | 4 + common/mekanism/client/gui/GuiGasTank.java | 4 +- .../client/gui/GuiLogisticalSorter.java | 53 +++++++++++ common/mekanism/common/CommonProxy.java | 4 + common/mekanism/common/Mekanism.java | 5 + .../mekanism/common/block/BlockMachine.java | 48 +++++++++- .../container/ContainerLogisticalSorter.java | 86 ++++++++++++++++++ .../common/item/ItemBlockMachine.java | 4 + .../TileEntityLogisticalSorter.java | 13 +++ .../common/block/BlockGenerator.java | 2 +- resources/assets/mekanism/lang/en_US.lang | 1 + .../blocks/LogisticalSorterBackOff.png | Bin 0 -> 2228 bytes .../blocks/LogisticalSorterBackOn.png | Bin 0 -> 2234 bytes .../blocks/LogisticalSorterFrontOff.png | Bin 0 -> 2295 bytes .../blocks/LogisticalSorterFrontOn.png | Bin 0 -> 2304 bytes .../blocks/LogisticalSorterSideOff.png | Bin 0 -> 2294 bytes .../blocks/LogisticalSorterSideOn.png | Bin 0 -> 4258 bytes .../blocks/LogisticalSorterSideOn.png.mcmeta | 5 + .../blocks/MetallurgicInfuserBackOn.png | Bin 3050 -> 4311 bytes 19 files changed, 221 insertions(+), 8 deletions(-) create mode 100644 common/mekanism/client/gui/GuiLogisticalSorter.java create mode 100644 common/mekanism/common/inventory/container/ContainerLogisticalSorter.java create mode 100644 common/mekanism/common/tileentity/TileEntityLogisticalSorter.java create mode 100644 resources/assets/mekanism/textures/blocks/LogisticalSorterBackOff.png create mode 100644 resources/assets/mekanism/textures/blocks/LogisticalSorterBackOn.png create mode 100644 resources/assets/mekanism/textures/blocks/LogisticalSorterFrontOff.png create mode 100644 resources/assets/mekanism/textures/blocks/LogisticalSorterFrontOn.png create mode 100644 resources/assets/mekanism/textures/blocks/LogisticalSorterSideOff.png create mode 100644 resources/assets/mekanism/textures/blocks/LogisticalSorterSideOn.png create mode 100644 resources/assets/mekanism/textures/blocks/LogisticalSorterSideOn.png.mcmeta diff --git a/common/mekanism/client/ClientProxy.java b/common/mekanism/client/ClientProxy.java index 33560b6b1..3000e8d8a 100644 --- a/common/mekanism/client/ClientProxy.java +++ b/common/mekanism/client/ClientProxy.java @@ -17,6 +17,7 @@ import mekanism.client.gui.GuiEnergyCube; import mekanism.client.gui.GuiEnrichmentChamber; import mekanism.client.gui.GuiFactory; import mekanism.client.gui.GuiGasTank; +import mekanism.client.gui.GuiLogisticalSorter; import mekanism.client.gui.GuiMetallurgicInfuser; import mekanism.client.gui.GuiOsmiumCompressor; import mekanism.client.gui.GuiPasswordEnter; @@ -77,6 +78,7 @@ import mekanism.common.tileentity.TileEntityEnergyCube; import mekanism.common.tileentity.TileEntityEnrichmentChamber; import mekanism.common.tileentity.TileEntityFactory; import mekanism.common.tileentity.TileEntityGasTank; +import mekanism.common.tileentity.TileEntityLogisticalSorter; import mekanism.common.tileentity.TileEntityLogisticalTransporter; import mekanism.common.tileentity.TileEntityMechanicalPipe; import mekanism.common.tileentity.TileEntityMetallurgicInfuser; @@ -348,6 +350,8 @@ public class ClientProxy extends CommonProxy } case 25: return new GuiRobitRepair(player.inventory, world, x); + case 26: + return new GuiLogisticalSorter(player.inventory, (TileEntityLogisticalSorter)tileEntity); } return null; diff --git a/common/mekanism/client/gui/GuiGasTank.java b/common/mekanism/client/gui/GuiGasTank.java index 7982fc1fa..2128c7c4f 100644 --- a/common/mekanism/client/gui/GuiGasTank.java +++ b/common/mekanism/client/gui/GuiGasTank.java @@ -41,9 +41,9 @@ public class GuiGasTank extends GuiMekanism } @Override - protected void drawGuiContainerBackgroundLayer(float par1, int mouseX, int mouseY) + protected void drawGuiContainerBackgroundLayer(float partialTick, int mouseX, int mouseY) { - super.drawGuiContainerBackgroundLayer(par1, mouseX, mouseY); + super.drawGuiContainerBackgroundLayer(partialTick, mouseX, mouseY); mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.GUI, "GuiGasTank.png")); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); diff --git a/common/mekanism/client/gui/GuiLogisticalSorter.java b/common/mekanism/client/gui/GuiLogisticalSorter.java new file mode 100644 index 000000000..e67ca5351 --- /dev/null +++ b/common/mekanism/client/gui/GuiLogisticalSorter.java @@ -0,0 +1,53 @@ +package mekanism.client.gui; + +import mekanism.common.inventory.container.ContainerLogisticalSorter; +import mekanism.common.tileentity.TileEntityLogisticalSorter; +import mekanism.common.util.MekanismUtils; +import mekanism.common.util.MekanismUtils.ResourceType; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.StatCollector; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GuiLogisticalSorter extends GuiMekanism +{ + public TileEntityLogisticalSorter tileEntity; + + public GuiLogisticalSorter(InventoryPlayer inventory, TileEntityLogisticalSorter tentity) + { + super(new ContainerLogisticalSorter(inventory, tentity)); + tileEntity = tentity; + guiElements.add(new GuiRedstoneControl(this, tileEntity, MekanismUtils.getResource(ResourceType.GUI, "GuiGasTank.png"))); + } + + @Override + protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) + { + super.drawGuiContainerForegroundLayer(mouseX, mouseY); + + int xAxis = (mouseX - (width - xSize) / 2); + int yAxis = (mouseY - (height - ySize) / 2); + + fontRenderer.drawString("Logistical Sorter", 43, 6, 0x404040); + fontRenderer.drawString(StatCollector.translateToLocal("container.inventory"), 8, ySize - 96 + 2, 0x404040); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float partialTick, int mouseX, int mouseY) + { + super.drawGuiContainerBackgroundLayer(partialTick, mouseX, mouseY); + + mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.GUI, "GuiLogisticalSorter.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 xAxis = mouseX - guiWidth; + int yAxis = mouseY - guiHeight; + } +} \ No newline at end of file diff --git a/common/mekanism/common/CommonProxy.java b/common/mekanism/common/CommonProxy.java index d111bc92c..703155bda 100644 --- a/common/mekanism/common/CommonProxy.java +++ b/common/mekanism/common/CommonProxy.java @@ -9,6 +9,7 @@ import mekanism.common.inventory.container.ContainerElectricPump; import mekanism.common.inventory.container.ContainerEnergyCube; import mekanism.common.inventory.container.ContainerFactory; import mekanism.common.inventory.container.ContainerGasTank; +import mekanism.common.inventory.container.ContainerLogisticalSorter; import mekanism.common.inventory.container.ContainerMetallurgicInfuser; import mekanism.common.inventory.container.ContainerRobitCrafting; import mekanism.common.inventory.container.ContainerRobitInventory; @@ -32,6 +33,7 @@ import mekanism.common.tileentity.TileEntityEnergyCube; import mekanism.common.tileentity.TileEntityEnrichmentChamber; import mekanism.common.tileentity.TileEntityFactory; import mekanism.common.tileentity.TileEntityGasTank; +import mekanism.common.tileentity.TileEntityLogisticalSorter; import mekanism.common.tileentity.TileEntityLogisticalTransporter; import mekanism.common.tileentity.TileEntityMechanicalPipe; import mekanism.common.tileentity.TileEntityMetallurgicInfuser; @@ -280,6 +282,8 @@ public class CommonProxy } case 25: return new ContainerRobitRepair(player.inventory, world); + case 26: + return new ContainerLogisticalSorter(player.inventory, (TileEntityLogisticalSorter)tileEntity); } return null; diff --git a/common/mekanism/common/Mekanism.java b/common/mekanism/common/Mekanism.java index ab5de9c2e..6d3a1a6b8 100644 --- a/common/mekanism/common/Mekanism.java +++ b/common/mekanism/common/Mekanism.java @@ -75,6 +75,7 @@ import mekanism.common.tileentity.TileEntityBoundingBlock; import mekanism.common.tileentity.TileEntityControlPanel; import mekanism.common.tileentity.TileEntityEnergyCube; import mekanism.common.tileentity.TileEntityGasTank; +import mekanism.common.tileentity.TileEntityLogisticalSorter; import mekanism.common.tileentity.TileEntityTeleporter; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; @@ -408,6 +409,9 @@ public class Mekanism CraftingManager.getInstance().getRecipeList().add(new MekanismRecipe(new ItemStack(WalkieTalkie), new Object[] { " O", "SCS", " S ", Character.valueOf('O'), "ingotOsmium", Character.valueOf('S'), "ingotSteel", Character.valueOf('C'), "circuitBasic" })); + CraftingManager.getInstance().getRecipeList().add(new MekanismRecipe(new ItemStack(MachineBlock, 1, 15), new Object[] { + "IPI", "ICI", "III", Character.valueOf('I'), Item.ingotIron, Character.valueOf('P'), Block.pistonBase, Character.valueOf('C'), "circuitBasic" + })); //Factory Recipes CraftingManager.getInstance().getRecipeList().add(new MekanismRecipe(MekanismUtils.getFactory(FactoryTier.BASIC, RecipeType.SMELTING), new Object[] { @@ -1024,6 +1028,7 @@ public class Mekanism GameRegistry.registerTileEntity(TileEntityControlPanel.class, "ControlPanel"); GameRegistry.registerTileEntity(TileEntityGasTank.class, "GasTank"); GameRegistry.registerTileEntity(TileEntityTeleporter.class, "MekanismTeleporter"); + GameRegistry.registerTileEntity(TileEntityLogisticalSorter.class, "LogisticalSorter"); //Load tile entities that have special renderers. proxy.registerSpecialTileEntities(); diff --git a/common/mekanism/common/block/BlockMachine.java b/common/mekanism/common/block/BlockMachine.java index 3edce02bd..52db146cb 100644 --- a/common/mekanism/common/block/BlockMachine.java +++ b/common/mekanism/common/block/BlockMachine.java @@ -34,6 +34,7 @@ import mekanism.common.tileentity.TileEntityEliteFactory; import mekanism.common.tileentity.TileEntityEnergizedSmelter; import mekanism.common.tileentity.TileEntityEnrichmentChamber; import mekanism.common.tileentity.TileEntityFactory; +import mekanism.common.tileentity.TileEntityLogisticalSorter; import mekanism.common.tileentity.TileEntityMetallurgicInfuser; import mekanism.common.tileentity.TileEntityOsmiumCompressor; import mekanism.common.tileentity.TileEntityPurificationChamber; @@ -80,6 +81,7 @@ import cpw.mods.fml.relauncher.SideOnly; * 12: Electric Pump * 13: Electric Chest * 14: Chargepad + * 15: Logistical Sorter * @author AidanBrady * */ @@ -136,6 +138,12 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds icons[10][1] = register.registerIcon("mekanism:EnergizedSmelterFrontOn"); icons[10][2] = register.registerIcon("mekanism:SteelCasing"); icons[11][0] = register.registerIcon("mekanism:Teleporter"); + icons[15][0] = register.registerIcon("mekanism:LogisticalSorterSideOn"); + icons[15][1] = register.registerIcon("mekanism:LogisticalSorterSideOff"); + icons[15][2] = register.registerIcon("mekanism:LogisticalSorterFrontOn"); + icons[15][3] = register.registerIcon("mekanism:LogisticalSorterFrontOff"); + icons[15][4] = register.registerIcon("mekanism:LogisticalSorterBackOn"); + icons[15][5] = register.registerIcon("mekanism:LogisticalSorterBackOff"); } @Override @@ -174,22 +182,22 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds float iRandom = 0.52F; float jRandom = random.nextFloat() * 0.6F - 0.3F; - if (tileEntity.facing == 4) + if(tileEntity.facing == 4) { world.spawnParticle("smoke", (double)(xRandom - iRandom), (double)yRandom, (double)(zRandom + jRandom), 0.0D, 0.0D, 0.0D); world.spawnParticle("reddust", (double)(xRandom - iRandom), (double)yRandom, (double)(zRandom + jRandom), 0.0D, 0.0D, 0.0D); } - else if (tileEntity.facing == 5) + else if(tileEntity.facing == 5) { world.spawnParticle("smoke", (double)(xRandom + iRandom), (double)yRandom, (double)(zRandom + jRandom), 0.0D, 0.0D, 0.0D); world.spawnParticle("reddust", (double)(xRandom + iRandom), (double)yRandom, (double)(zRandom + jRandom), 0.0D, 0.0D, 0.0D); } - else if (tileEntity.facing == 2) + else if(tileEntity.facing == 2) { world.spawnParticle("smoke", (double)(xRandom + jRandom), (double)yRandom, (double)(zRandom - iRandom), 0.0D, 0.0D, 0.0D); world.spawnParticle("reddust", (double)(xRandom + jRandom), (double)yRandom, (double)(zRandom - iRandom), 0.0D, 0.0D, 0.0D); } - else if (tileEntity.facing == 3) + else if(tileEntity.facing == 3) { world.spawnParticle("smoke", (double)(xRandom + jRandom), (double)yRandom, (double)(zRandom + iRandom), 0.0D, 0.0D, 0.0D); world.spawnParticle("reddust", (double)(xRandom + jRandom), (double)yRandom, (double)(zRandom + iRandom), 0.0D, 0.0D, 0.0D); @@ -341,6 +349,20 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds { return icons[11][0]; } + else if(meta == 15) + { + if(side == 1) + { + return icons[15][3]; + } + else if(side == 0) + { + return icons[15][5]; + } + else { + return icons[15][1]; + } + } return null; } @@ -478,6 +500,20 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds { return icons[11][0]; } + else if(metadata == 15) + { + if(side == tileEntity.facing) + { + return MekanismUtils.isActive(world, x, y, z) ? icons[15][2] : icons[15][3]; + } + else if(side == ForgeDirection.getOrientation(tileEntity.facing).getOpposite().ordinal()) + { + return MekanismUtils.isActive(world, x, y, z) ? icons[15][4] : icons[15][5]; + } + else { + return MekanismUtils.isActive(world, x, y, z) ? icons[15][0] : icons[15][1]; + } + } return null; } @@ -519,6 +555,7 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds list.add(new ItemStack(i, 1, 12)); list.add(new ItemStack(i, 1, 13)); list.add(new ItemStack(i, 1, 14)); + list.add(new ItemStack(i, 1, 15)); } @Override @@ -808,7 +845,8 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds TELEPORTER(11, 13, 5000000, TileEntityTeleporter.class, false), ELECTRIC_PUMP(12, 17, 10000, TileEntityElectricPump.class, true), ELECTRIC_CHEST(13, -1, 12000, TileEntityElectricChest.class, true), - CHARGEPAD(14, -1, 9000, TileEntityChargepad.class, true); + CHARGEPAD(14, -1, 9000, TileEntityChargepad.class, true), + LOGISTICAL_SORTER(15, 26, 12000, TileEntityLogisticalSorter.class, false); public int meta; public int guiId; diff --git a/common/mekanism/common/inventory/container/ContainerLogisticalSorter.java b/common/mekanism/common/inventory/container/ContainerLogisticalSorter.java new file mode 100644 index 000000000..10a06264a --- /dev/null +++ b/common/mekanism/common/inventory/container/ContainerLogisticalSorter.java @@ -0,0 +1,86 @@ +package mekanism.common.inventory.container; + +import mekanism.api.gas.EnumGas; +import mekanism.common.inventory.slot.SlotStorageTank; +import mekanism.common.tileentity.TileEntityLogisticalSorter; +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; + +public class ContainerLogisticalSorter extends Container +{ + private TileEntityLogisticalSorter tileEntity; + + public ContainerLogisticalSorter(InventoryPlayer inventory, TileEntityLogisticalSorter tentity) + { + tileEntity = tentity; + addSlotToContainer(new SlotStorageTank(tentity, EnumGas.NONE, true, 0, 8, 8)); + addSlotToContainer(new SlotStorageTank(tentity, EnumGas.NONE, true, 1, 8, 40)); + + 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.openChest(); + tileEntity.playersUsing.add(inventory.player); + } + + @Override + public void onContainerClosed(EntityPlayer entityplayer) + { + super.onContainerClosed(entityplayer); + tileEntity.closeChest(); + tileEntity.playersUsing.remove(entityplayer); + } + + @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(); + + //TODO + + 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/common/mekanism/common/item/ItemBlockMachine.java b/common/mekanism/common/item/ItemBlockMachine.java index a2843eabd..4bf3a26ad 100644 --- a/common/mekanism/common/item/ItemBlockMachine.java +++ b/common/mekanism/common/item/ItemBlockMachine.java @@ -63,6 +63,7 @@ import cpw.mods.fml.relauncher.SideOnly; * 12: Electric Pump * 13: Electric Chest * 14: Chargepad + * 15: Logistical Sorter * @author AidanBrady * */ @@ -136,6 +137,9 @@ public class ItemBlockMachine extends ItemBlock implements IEnergizedItem, IItem case 14: name = "Chargepad"; break; + case 15: + name = "LogisticalSorter"; + break; default: name = "Unknown"; break; diff --git a/common/mekanism/common/tileentity/TileEntityLogisticalSorter.java b/common/mekanism/common/tileentity/TileEntityLogisticalSorter.java new file mode 100644 index 000000000..c913d1007 --- /dev/null +++ b/common/mekanism/common/tileentity/TileEntityLogisticalSorter.java @@ -0,0 +1,13 @@ +package mekanism.common.tileentity; + +import mekanism.common.block.BlockMachine.MachineType; +import net.minecraft.item.ItemStack; + +public class TileEntityLogisticalSorter extends TileEntityElectricBlock +{ + public TileEntityLogisticalSorter() + { + super("LogisticalSorter", MachineType.LOGISTICAL_SORTER.baseEnergy); + inventory = new ItemStack[1]; + } +} diff --git a/common/mekanism/generators/common/block/BlockGenerator.java b/common/mekanism/generators/common/block/BlockGenerator.java index 8d4d00d4f..7f24ad037 100644 --- a/common/mekanism/generators/common/block/BlockGenerator.java +++ b/common/mekanism/generators/common/block/BlockGenerator.java @@ -413,7 +413,7 @@ public class BlockGenerator extends BlockContainer implements ISpecialBounds } } - if (tileEntity != null) + if(tileEntity != null) { if(!entityplayer.isSneaking()) { diff --git a/resources/assets/mekanism/lang/en_US.lang b/resources/assets/mekanism/lang/en_US.lang index f0555219c..ea6dff815 100644 --- a/resources/assets/mekanism/lang/en_US.lang +++ b/resources/assets/mekanism/lang/en_US.lang @@ -58,6 +58,7 @@ tile.MachineBlock.Teleporter.name=Teleporter tile.MachineBlock.ElectricPump.name=Electric Pump tile.MachineBlock.ElectricChest.name=Electric Chest tile.MachineBlock.Chargepad.name=Chargepad +tile.MachineBlock.LogisticalSorter.name=Logistical Sorter //Ore Block tile.OreBlock.OsmiumOre.name=Osmium Ore diff --git a/resources/assets/mekanism/textures/blocks/LogisticalSorterBackOff.png b/resources/assets/mekanism/textures/blocks/LogisticalSorterBackOff.png new file mode 100644 index 0000000000000000000000000000000000000000..345110a6d3eaf1817a9b2151d14f29c3269c55ee GIT binary patch literal 2228 zcmV;l2ut^gP)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)UmlaER000C_NklI$2Vj>EI z2qwZLCT70IyuyH)p{Z|SWM-sBf`WmVOyU@bf}*I17Y26y3jVhCY>$_P#Y*vrd{-QC@};QRY~-)}S;HaIxwb16hd zcXzkrDwT?lIeCf%V@d&`Z3m>`e_(ZWHOq$Qa=24Pv%kM@D=RBmhMu0DEdJ@~$=dB@ z88XODS)u~W(AebUWVR478dzLh^x`WPVonw~>I3i^P&gC`a$bbl*;%{1y!1jO@8mxk z3@^o}?qNI1Oo&_2#7ko2r)oi0FwY5>t?fQ!^6W?uh+Hp;kdT8 z=Isa{#tTRb=_{2=?_Gd$fh;Vpl~3WnGGe?=Ptl`Grz$l-B+@y+=ETH=7n2xTt(IGg zVg3F6Lfh@_ZJNi)z`#ISax7zb3^xX`j*k9<1LZR_Gxq%a?BS6VynrF5MSGu(3O5}g zKpx6v7<$t|M80BsamY};f_A5x_KRcW)t=fD11M4;9Yk0bd;6y+T;#_YfL5g_(M4oE z0>1P1!77DEI4%+*!%g>H;0!??O1HMQoSij5N{IkQcn!!JiV&*=N()!ZC|Il>hM(Q%y9 zib{n?fDgnuZ`mU)v?ss`_f>$m7zLE`py7NGq!&^2T$@S@Yp!1U7(fu-?d|QQO9lss z7zIW&af*n_c=&iF!3$hpU%z(&)>5syOf*8soLf@HpqN}jFVK09LI4`}^}yl1Dd0|d ze0=mS0GEzpJV06Q4X2#pp&k>wbOpV=z3!Qcv#+l&T|zl|L`aZs!=HFb3%W%gKWdoj^(f!g&i) zXn>w$2%Mjv_ts*MoFf3`7;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)UmlaER000D0NkljH9EYEbZjv#0CZitWv4i+S-~mjI_(kOFKS3w!y){v=6Pkgm!Ol&kcaTTCF-= ze}BIX4GsBRwD7I3uQOPRz|72yjg5^tviRBE-LBrZf_W1Z{*VorB_~z!u_YV#Ztgo-n z=TeA_QmN#)$;n9{bMh1k#*_j=+YCs<|3JN7&$8jU9Bx(7Y;A4X{QP{Dp`)WCi@(3W zw`O};h77V*mZ$(TG&V9ak}X7x25PmM7hkaubF#ouAAr|@!l6iz^CC=4OxW4knHM5? zC;!o4cqu-04|BQ*$jKw!hlhur29JQ0Q=LSFoD*8ASgn^U#As-)5a}4&cV%TI$-@D3 z$Z;=15GZ0(#voic@UcZT*C<2cnm#8b7$6`*K-A$yhym&Xm;~Th9~~W8xm>oz#YJts zIxa0Oc{{>~@dDC9`r6yuU%CM00$EsGE1$x@XT*4&o}x#WPE~4vNThRs&Eer;FD5ZO zKR>&r7}nF%BeY#zU8Q-P^!E0qCC4&`$8cj1>*(kgI8Z)5K5h>W4;~&#!3!8-TD14p zsBqH}0_34whM_kdMC2>B7l#bhD`r|UhSzpF@Pck(m{k}v9~{a!bN_Z0ccf< z5?w^rBj7uY4^}BW!YwQ;7?I(o`zUaRAP=RhtEes_}U!d zih}4k&S^!Z!Xv;3;+(hakrvt$;DmcGz*~$0%6ZUmz6jEbD0;36tEcb>}&hSu=30}H_uC6ZkOvTyV-JLF>oID~VNVnna?5uGA zjC%RRjh&qxUvkJSFE7WfG=J;#Bu(igBsYX72Wp$#-e+*6KHUX`Hs(GG=FO-70Tmnj zR5?W^90KtQP(Apf@S$d)a|768!k-L~d&8lG{Oace0sO4c6;!=|C?Xhxbb#gLL5EHt zr2yf)1t~N@&oKl}O-*@gu}97kfN~7k-rn|#$77W0@WC*;2RYEHGtk3akbcdCP-s|d zu2D42M(6-}*NhIlWTwkV#4r~HMVy#LqY*rGQXcWli)+#S0Va#i_@%07*qo IM6N<$g8xV_EC2ui literal 0 HcmV?d00001 diff --git a/resources/assets/mekanism/textures/blocks/LogisticalSorterFrontOff.png b/resources/assets/mekanism/textures/blocks/LogisticalSorterFrontOff.png new file mode 100644 index 0000000000000000000000000000000000000000..65ea02b174aa7ca4d6112bbb8fdde31ffdef671e GIT binary patch literal 2295 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 Q+yDRo07*qoM6N<$f(58ll>h($ literal 0 HcmV?d00001 diff --git a/resources/assets/mekanism/textures/blocks/LogisticalSorterSideOn.png b/resources/assets/mekanism/textures/blocks/LogisticalSorterSideOn.png new file mode 100644 index 0000000000000000000000000000000000000000..8165e457c05e5a2aac8fa77c093bca9c86b44ce0 GIT binary patch literal 4258 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 B@B07%