From d4d7e88c4e098b6079055e02cafeaec5f1c254eb Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Sat, 7 Mar 2015 19:09:23 -0500 Subject: [PATCH] Developed and implemented the foundation for Item/Gas/Energy/Fluid/Heat dynamic side configuration. As of now, only items are supported, and the actual config GUI has not been changed. Only gameplay difference is three new configurator modes. --- .../api/transmitters/TransmissionType.java | 26 +++- .../java/mekanism/client/ClientProxy.java | 4 +- .../mekanism/client/MekanismKeyHandler.java | 11 +- .../mekanism/client/gui/GuiConfigTypeTab.java | 5 + .../mekanism/client/gui/GuiConfiguration.java | 27 ++-- .../java/mekanism/client/gui/GuiMekanism.java | 9 +- .../client/render/MekanismRenderer.java | 10 ++ .../tileentity/RenderConfigurableMachine.java | 93 +++++++++---- .../common/base/IInvConfiguration.java | 37 ----- .../common/base/ISideConfiguration.java | 29 ++++ .../mekanism/common/block/BlockMachine.java | 12 +- .../transporter/TransporterManager.java | 10 +- .../common/item/ItemBlockMachine.java | 12 +- .../common/item/ItemConfigurator.java | 129 +++++++++++------- .../network/PacketConfigurationUpdate.java | 23 ++-- .../network/PacketConfiguratorState.java | 15 +- .../TileEntityAdvancedElectricMachine.java | 24 ++-- .../tile/TileEntityAdvancedFactory.java | 22 ++- .../common/tile/TileEntityBasicMachine.java | 53 ++----- .../common/tile/TileEntityChanceMachine.java | 21 +-- .../tile/TileEntityChemicalCrystallizer.java | 78 +++-------- .../tile/TileEntityElectricMachine.java | 22 +-- .../common/tile/TileEntityEliteFactory.java | 22 ++- .../common/tile/TileEntityFactory.java | 71 +++------- .../tile/TileEntityMetallurgicInfuser.java | 72 ++++------ .../mekanism/common/tile/TileEntityPRC.java | 18 ++- .../tile/component/TileComponentConfig.java | 116 ++++++++++++++++ .../tile/component/TileComponentEjector.java | 14 +- .../mekanism/common/util/InventoryUtils.java | 6 +- .../mekanism/common/util/MekanismUtils.java | 25 ++-- .../assets/mekanism/gui/GuiRobitMain.png | Bin 11233 -> 11181 bytes .../mekanism/gui/elements/GuiFluidsTab.png | Bin 0 -> 3435 bytes .../mekanism/gui/elements/GuiGasesTab.png | Bin 0 -> 3440 bytes .../mekanism/gui/elements/GuiHeatTab.png | Bin 2598 -> 3580 bytes .../mekanism/gui/elements/GuiItemsTab.png | Bin 0 -> 3341 bytes .../blocks/models/PressurizedTube.png | Bin 1956 -> 1940 bytes .../textures/blocks/overlay/EnergyOverlay.png | Bin 0 -> 1190 bytes .../textures/blocks/overlay/FluidsOverlay.png | Bin 0 -> 1202 bytes .../textures/blocks/overlay/GasesOverlay.png | Bin 0 -> 1212 bytes .../textures/blocks/overlay/HeatOverlay.png | Bin 0 -> 1167 bytes .../textures/blocks/overlay/ItemsOverlay.png | Bin 0 -> 1250 bytes 41 files changed, 563 insertions(+), 453 deletions(-) create mode 100644 src/main/java/mekanism/client/gui/GuiConfigTypeTab.java delete mode 100644 src/main/java/mekanism/common/base/IInvConfiguration.java create mode 100644 src/main/java/mekanism/common/base/ISideConfiguration.java create mode 100644 src/main/java/mekanism/common/tile/component/TileComponentConfig.java create mode 100644 src/main/resources/assets/mekanism/gui/elements/GuiFluidsTab.png create mode 100644 src/main/resources/assets/mekanism/gui/elements/GuiGasesTab.png create mode 100644 src/main/resources/assets/mekanism/gui/elements/GuiItemsTab.png create mode 100644 src/main/resources/assets/mekanism/textures/blocks/overlay/EnergyOverlay.png create mode 100644 src/main/resources/assets/mekanism/textures/blocks/overlay/FluidsOverlay.png create mode 100644 src/main/resources/assets/mekanism/textures/blocks/overlay/GasesOverlay.png create mode 100644 src/main/resources/assets/mekanism/textures/blocks/overlay/HeatOverlay.png create mode 100644 src/main/resources/assets/mekanism/textures/blocks/overlay/ItemsOverlay.png diff --git a/src/main/java/mekanism/api/transmitters/TransmissionType.java b/src/main/java/mekanism/api/transmitters/TransmissionType.java index 9cfc5ba99..0c145b837 100644 --- a/src/main/java/mekanism/api/transmitters/TransmissionType.java +++ b/src/main/java/mekanism/api/transmitters/TransmissionType.java @@ -1,28 +1,40 @@ package mekanism.api.transmitters; import mekanism.api.gas.IGasTransmitter; - +import mekanism.common.util.MekanismUtils; import net.minecraft.tileentity.TileEntity; public enum TransmissionType { - ENERGY("EnergyNetwork"), - FLUID("FluidNetwork"), - GAS("GasNetwork"), - ITEM("InventoryNetwork"), - HEAT("HeatNetwork"); + ENERGY("EnergyNetwork", "Energy"), + FLUID("FluidNetwork", "Fluids"), + GAS("GasNetwork", "Gases"), + ITEM("InventoryNetwork", "Items"), + HEAT("HeatNetwork", "Heat"); private String name; + private String transmission; - private TransmissionType(String n) + private TransmissionType(String n, String t) { name = n; + transmission = t; } public String getName() { return name; } + + public String getTransmission() + { + return transmission; + } + + public String localize() + { + return MekanismUtils.localize("transmission." + getTransmission()); + } public static boolean checkTransmissionType(TileEntity sideTile, TransmissionType type) { diff --git a/src/main/java/mekanism/client/ClientProxy.java b/src/main/java/mekanism/client/ClientProxy.java index 2a8bdd4dd..26b64efdc 100644 --- a/src/main/java/mekanism/client/ClientProxy.java +++ b/src/main/java/mekanism/client/ClientProxy.java @@ -104,7 +104,7 @@ import mekanism.common.Mekanism; import mekanism.common.MekanismBlocks; import mekanism.common.MekanismItems; import mekanism.common.base.IElectricChest; -import mekanism.common.base.IInvConfiguration; +import mekanism.common.base.ISideConfiguration; import mekanism.common.base.IUpgradeTile; import mekanism.common.block.BlockMachine.MachineType; import mekanism.common.entity.EntityBabySkeleton; @@ -404,7 +404,7 @@ public class ClientProxy extends CommonProxy case 8: return new GuiEnergyCube(player.inventory, (TileEntityEnergyCube)tileEntity); case 9: - return new GuiConfiguration(player, (IInvConfiguration)tileEntity); + return new GuiConfiguration(player, (ISideConfiguration)tileEntity); case 10: return new GuiGasTank(player.inventory, (TileEntityGasTank)tileEntity); case 11: diff --git a/src/main/java/mekanism/client/MekanismKeyHandler.java b/src/main/java/mekanism/client/MekanismKeyHandler.java index 4132a76d5..43d835c5f 100644 --- a/src/main/java/mekanism/client/MekanismKeyHandler.java +++ b/src/main/java/mekanism/client/MekanismKeyHandler.java @@ -7,6 +7,7 @@ import mekanism.common.Mekanism; import mekanism.common.block.BlockMachine.MachineType; import mekanism.common.item.ItemBlockMachine; import mekanism.common.item.ItemConfigurator; +import mekanism.common.item.ItemConfigurator.ConfiguratorMode; import mekanism.common.item.ItemElectricBow; import mekanism.common.item.ItemJetpack; import mekanism.common.item.ItemJetpack.JetpackMode; @@ -22,13 +23,15 @@ import mekanism.common.network.PacketScubaTankData.ScubaTankPacket; import mekanism.common.network.PacketWalkieTalkieState.WalkieTalkieStateMessage; import mekanism.common.util.LangUtils; import mekanism.common.util.MekanismUtils; - import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ChatComponentText; + +import org.lwjgl.input.Keyboard; + import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.common.FMLCommonHandler; @@ -37,8 +40,6 @@ import cpw.mods.fml.common.gameevent.InputEvent; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import org.lwjgl.input.Keyboard; - @SideOnly(Side.CLIENT) public class MekanismKeyHandler extends MekKeyHandler { @@ -75,11 +76,13 @@ public class MekanismKeyHandler extends MekKeyHandler ItemStack toolStack = player.getCurrentEquippedItem(); Item item = StackUtils.getItem(toolStack); + if(player.isSneaking() && item instanceof ItemConfigurator) { ItemConfigurator configurator = (ItemConfigurator)item; - configurator.setState(toolStack, (byte) (configurator.getState(toolStack) < 3 ? configurator.getState(toolStack) + 1 : 0)); + int toSet = configurator.getState(toolStack).ordinal() < ConfiguratorMode.values().length-1 ? configurator.getState(toolStack).ordinal() + 1 : 0; + configurator.setState(toolStack, ConfiguratorMode.values()[toSet]); Mekanism.packetHandler.sendToServer(new ConfiguratorStateMessage(configurator.getState(toolStack))); player.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism] " + EnumColor.GREY + MekanismUtils.localize("tooltip.configureState") + ": " + configurator.getColor(configurator.getState(toolStack)) + configurator.getStateDisplay(configurator.getState(toolStack)))); } diff --git a/src/main/java/mekanism/client/gui/GuiConfigTypeTab.java b/src/main/java/mekanism/client/gui/GuiConfigTypeTab.java new file mode 100644 index 000000000..3bf683b89 --- /dev/null +++ b/src/main/java/mekanism/client/gui/GuiConfigTypeTab.java @@ -0,0 +1,5 @@ +package mekanism.client.gui; + +public class GuiConfigTypeTab { + +} diff --git a/src/main/java/mekanism/client/gui/GuiConfiguration.java b/src/main/java/mekanism/client/gui/GuiConfiguration.java index 100e477c9..7581b7d98 100644 --- a/src/main/java/mekanism/client/gui/GuiConfiguration.java +++ b/src/main/java/mekanism/client/gui/GuiConfiguration.java @@ -5,11 +5,12 @@ import java.util.Map; import mekanism.api.Coord4D; import mekanism.api.EnumColor; +import mekanism.api.transmitters.TransmissionType; import mekanism.client.render.MekanismRenderer; import mekanism.client.sound.SoundHandler; import mekanism.common.Mekanism; import mekanism.common.SideData; -import mekanism.common.base.IInvConfiguration; +import mekanism.common.base.ISideConfiguration; import mekanism.common.block.BlockMachine.MachineType; import mekanism.common.inventory.container.ContainerNull; import mekanism.common.network.PacketConfigurationUpdate.ConfigurationPacket; @@ -18,17 +19,17 @@ import mekanism.common.network.PacketSimpleGui.SimpleGuiMessage; import mekanism.common.tile.TileEntityContainerBlock; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + @SideOnly(Side.CLIENT) public class GuiConfiguration extends GuiMekanism { @@ -36,9 +37,9 @@ public class GuiConfiguration extends GuiMekanism public Map inputPosMap = new HashMap(); - public IInvConfiguration configurable; + public ISideConfiguration configurable; - public GuiConfiguration(EntityPlayer player, IInvConfiguration tile) + public GuiConfiguration(EntityPlayer player, ISideConfiguration tile) { super(new ContainerNull(player, (TileEntityContainerBlock)tile)); @@ -108,7 +109,7 @@ public class GuiConfiguration extends GuiMekanism int x = slotPosMap.get(i).xPos; int y = slotPosMap.get(i).yPos; - SideData data = configurable.getSideData().get(configurable.getConfiguration()[i]); + SideData data = configurable.getConfig().getOutput(TransmissionType.ITEM, i); if(data.color != EnumColor.GREY) { @@ -182,7 +183,7 @@ public class GuiConfiguration extends GuiMekanism int x = slotPosMap.get(i).xPos; int y = slotPosMap.get(i).yPos; - SideData data = configurable.getSideData().get(configurable.getConfiguration()[i]); + SideData data = configurable.getConfig().getOutput(TransmissionType.ITEM, i); if(xAxis >= x && xAxis <= x+14 && yAxis >= y && yAxis <= y+14) { @@ -262,13 +263,13 @@ public class GuiConfiguration extends GuiMekanism if(xAxis >= 156 && xAxis <= 170 && yAxis >= 6 && yAxis <= 20) { SoundHandler.playSound("gui.button.press"); - Mekanism.packetHandler.sendToServer(new ConfigurationUpdateMessage(ConfigurationPacket.EJECT, Coord4D.get(tile), 0, 0)); + Mekanism.packetHandler.sendToServer(new ConfigurationUpdateMessage(ConfigurationPacket.EJECT, Coord4D.get(tile), 0, 0, null)); } if(xAxis >= 156 && xAxis <= 170 && yAxis >= 21 && yAxis <= 35) { SoundHandler.playSound("gui.button.press"); - Mekanism.packetHandler.sendToServer(new ConfigurationUpdateMessage(ConfigurationPacket.STRICT_INPUT, Coord4D.get(tile), 0, 0)); + Mekanism.packetHandler.sendToServer(new ConfigurationUpdateMessage(ConfigurationPacket.STRICT_INPUT, Coord4D.get(tile), 0, 0, null)); } } @@ -280,7 +281,7 @@ public class GuiConfiguration extends GuiMekanism if(xAxis >= 80 && xAxis <= 96 && yAxis >= 49 && yAxis <= 65) { SoundHandler.playSound("gui.button.press"); - Mekanism.packetHandler.sendToServer(new ConfigurationUpdateMessage(ConfigurationPacket.EJECT_COLOR, Coord4D.get(tile), button, 0)); + Mekanism.packetHandler.sendToServer(new ConfigurationUpdateMessage(ConfigurationPacket.EJECT_COLOR, Coord4D.get(tile), button, 0, null)); } for(int i = 0; i < slotPosMap.size(); i++) @@ -291,7 +292,7 @@ public class GuiConfiguration extends GuiMekanism if(xAxis >= x && xAxis <= x+14 && yAxis >= y && yAxis <= y+14) { SoundHandler.playSound("gui.button.press"); - Mekanism.packetHandler.sendToServer(new ConfigurationUpdateMessage(ConfigurationPacket.SIDE_DATA, Coord4D.get(tile), button, i)); + Mekanism.packetHandler.sendToServer(new ConfigurationUpdateMessage(ConfigurationPacket.SIDE_DATA, Coord4D.get(tile), button, i, TransmissionType.ITEM)); } } @@ -303,7 +304,7 @@ public class GuiConfiguration extends GuiMekanism if(xAxis >= x && xAxis <= x+14 && yAxis >= y && yAxis <= y+14) { SoundHandler.playSound("gui.button.press"); - Mekanism.packetHandler.sendToServer(new ConfigurationUpdateMessage(ConfigurationPacket.INPUT_COLOR, Coord4D.get(tile), button, i)); + Mekanism.packetHandler.sendToServer(new ConfigurationUpdateMessage(ConfigurationPacket.INPUT_COLOR, Coord4D.get(tile), button, i, null)); } } } diff --git a/src/main/java/mekanism/client/gui/GuiMekanism.java b/src/main/java/mekanism/client/gui/GuiMekanism.java index c3c3ec966..ef92e504a 100644 --- a/src/main/java/mekanism/client/gui/GuiMekanism.java +++ b/src/main/java/mekanism/client/gui/GuiMekanism.java @@ -5,8 +5,9 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import mekanism.api.transmitters.TransmissionType; import mekanism.common.SideData; -import mekanism.common.base.IInvConfiguration; +import mekanism.common.base.ISideConfiguration; import mekanism.common.item.ItemConfigurator; import mekanism.common.tile.TileEntityContainerBlock; import net.minecraft.client.gui.FontRenderer; @@ -70,7 +71,7 @@ public abstract class GuiMekanism extends GuiContainer implements IGuiWrapper element.renderForeground(xAxis, yAxis); } - if(tileEntity instanceof IInvConfiguration) + if(tileEntity instanceof ISideConfiguration) { Slot hovering = null; @@ -108,9 +109,9 @@ public abstract class GuiMekanism extends GuiContainer implements IGuiWrapper { if(slot.slotNumber < tileEntity.getSizeInventory()) { - IInvConfiguration config = (IInvConfiguration)tileEntity; + ISideConfiguration config = (ISideConfiguration)tileEntity; - for(SideData data : config.getSideData()) + for(SideData data : config.getConfig().getOutputs(TransmissionType.ITEM)) { for(int id : data.availableSlots) { diff --git a/src/main/java/mekanism/client/render/MekanismRenderer.java b/src/main/java/mekanism/client/render/MekanismRenderer.java index 91c473a5a..dbf71adab 100644 --- a/src/main/java/mekanism/client/render/MekanismRenderer.java +++ b/src/main/java/mekanism/client/render/MekanismRenderer.java @@ -1,12 +1,15 @@ package mekanism.client.render; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import mekanism.api.EnumColor; import mekanism.api.gas.Gas; import mekanism.api.gas.GasRegistry; import mekanism.api.gas.OreGas; +import mekanism.api.transmitters.TransmissionType; import mekanism.client.render.tileentity.RenderConfigurableMachine; import mekanism.client.render.tileentity.RenderDynamicTank; import mekanism.client.render.tileentity.RenderPortableTank; @@ -52,6 +55,8 @@ public class MekanismRenderer public static IIcon energyIcon; public static IIcon heatIcon; + public static Map overlays = new HashMap(); + private static float lightmapLastX; private static float lightmapLastY; private static boolean optifineBreak = false; @@ -73,6 +78,11 @@ public class MekanismRenderer colors[color.ordinal()] = event.map.registerIcon("mekanism:overlay/overlay_" + color.unlocalizedName); } + for(TransmissionType type : TransmissionType.values()) + { + overlays.put(type, event.map.registerIcon("mekanism:overlay/" + type.getTransmission() + "Overlay")); + } + energyIcon = event.map.registerIcon("mekanism:LiquidEnergy"); heatIcon = event.map.registerIcon("mekanism:LiquidHeat"); diff --git a/src/main/java/mekanism/client/render/tileentity/RenderConfigurableMachine.java b/src/main/java/mekanism/client/render/tileentity/RenderConfigurableMachine.java index 7911a3747..4fb89ae0a 100644 --- a/src/main/java/mekanism/client/render/tileentity/RenderConfigurableMachine.java +++ b/src/main/java/mekanism/client/render/tileentity/RenderConfigurableMachine.java @@ -4,13 +4,13 @@ import java.util.HashMap; import mekanism.api.Coord4D; import mekanism.api.EnumColor; +import mekanism.api.transmitters.TransmissionType; import mekanism.client.render.MekanismRenderer; import mekanism.client.render.MekanismRenderer.DisplayInteger; import mekanism.client.render.MekanismRenderer.Model3D; -import mekanism.common.base.IInvConfiguration; +import mekanism.common.base.ISideConfiguration; import mekanism.common.item.ItemConfigurator; import mekanism.common.util.MekanismUtils; - import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; @@ -18,22 +18,23 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import codechicken.lib.math.MathHelper; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import org.lwjgl.opengl.GL11; - @SideOnly(Side.CLIENT) public class RenderConfigurableMachine extends TileEntitySpecialRenderer { private Minecraft mc = FMLClientHandler.instance().getClient(); - private HashMap> cachedOverlays = new HashMap>(); + private HashMap> cachedOverlays = new HashMap>(); public RenderConfigurableMachine() { @@ -43,10 +44,10 @@ public class RenderConfigurableMachine extends TileEntitySpecialRenderer @Override public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float partialTick) { - renderAModelAt((IInvConfiguration)tileEntity, x, y, z, partialTick); + renderAModelAt((ISideConfiguration)tileEntity, x, y, z, partialTick); } - public void renderAModelAt(IInvConfiguration configurable, double x, double y, double z, float partialTick) + public void renderAModelAt(ISideConfiguration configurable, double x, double y, double z, float partialTick) { GL11.glPushMatrix(); @@ -56,29 +57,33 @@ public class RenderConfigurableMachine extends TileEntitySpecialRenderer ItemStack itemStack = player.getCurrentEquippedItem(); MovingObjectPosition pos = player.rayTrace(8.0D, 1.0F); - if(pos != null && itemStack != null && itemStack.getItem() instanceof ItemConfigurator && ((ItemConfigurator)itemStack.getItem()).getState(itemStack) == 0) + if(pos != null && itemStack != null && itemStack.getItem() instanceof ItemConfigurator && ((ItemConfigurator)itemStack.getItem()).getState(itemStack).isConfigurating()) { int xPos = MathHelper.floor_double(pos.blockX); int yPos = MathHelper.floor_double(pos.blockY); int zPos = MathHelper.floor_double(pos.blockZ); Coord4D obj = new Coord4D(xPos, yPos, zPos, tileEntity.getWorldObj().provider.dimensionId); + TransmissionType type = ((ItemConfigurator)itemStack.getItem()).getState(itemStack).getTransmission(); - if(xPos == tileEntity.xCoord && yPos == tileEntity.yCoord && zPos == tileEntity.zCoord) + if(configurable.getConfig().supports(type)) { - EnumColor color = configurable.getSideData().get(configurable.getConfiguration()[MekanismUtils.getBaseOrientation(pos.sideHit, configurable.getOrientation())]).color; - - push(); - - GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.4F); - - bindTexture(MekanismRenderer.getBlocksTexture()); - GL11.glTranslatef((float)x, (float)y, (float)z); - - int display = getOverlayDisplay(world, ForgeDirection.getOrientation(pos.sideHit), color).display; - GL11.glCallList(display); - - pop(); + if(xPos == tileEntity.xCoord && yPos == tileEntity.yCoord && zPos == tileEntity.zCoord) + { + EnumColor color = configurable.getConfig().getOutput(type, pos.sideHit, configurable.getOrientation()).color; + + push(); + + MekanismRenderer.color(color, 0.4F); + + bindTexture(MekanismRenderer.getBlocksTexture()); + GL11.glTranslatef((float)x, (float)y, (float)z); + + int display = getOverlayDisplay(world, ForgeDirection.getOrientation(pos.sideHit), TransmissionType.ITEM).display; + GL11.glCallList(display); + + pop(); + } } } @@ -103,26 +108,26 @@ public class RenderConfigurableMachine extends TileEntitySpecialRenderer MekanismRenderer.blendOn(); } - private DisplayInteger getOverlayDisplay(World world, ForgeDirection side, EnumColor color) + private DisplayInteger getOverlayDisplay(World world, ForgeDirection side, TransmissionType type) { - if(cachedOverlays.containsKey(side) && cachedOverlays.get(side).containsKey(color)) + if(cachedOverlays.containsKey(side) && cachedOverlays.get(side).containsKey(type)) { - return cachedOverlays.get(side).get(color); + return cachedOverlays.get(side).get(type); } Model3D toReturn = new Model3D(); toReturn.baseBlock = Blocks.stone; - toReturn.setTexture(MekanismRenderer.getColorIcon(color)); + toReturn.setTexture(MekanismRenderer.overlays.get(type)); DisplayInteger display = DisplayInteger.createAndStart(); if(cachedOverlays.containsKey(side)) { - cachedOverlays.get(side).put(color, display); + cachedOverlays.get(side).put(type, display); } else { - HashMap map = new HashMap(); - map.put(color, display); + HashMap map = new HashMap(); + map.put(type, display); cachedOverlays.put(side, map); } @@ -205,4 +210,32 @@ public class RenderConfigurableMachine extends TileEntitySpecialRenderer return display; } + + public static class OverlayRenderData + { + public EnumColor color; + public TransmissionType type; + + public OverlayRenderData(EnumColor c, TransmissionType t) + { + color = c; + type = t; + } + + @Override + public boolean equals(Object data) + { + return data instanceof OverlayRenderData && ((OverlayRenderData)data).color == color && + ((OverlayRenderData)data).type == type; + } + + @Override + public int hashCode() + { + int code = 1; + code = 31 * code + color.ordinal(); + code = 31 * code + type.ordinal(); + return code; + } + } } \ No newline at end of file diff --git a/src/main/java/mekanism/common/base/IInvConfiguration.java b/src/main/java/mekanism/common/base/IInvConfiguration.java deleted file mode 100644 index e58235088..000000000 --- a/src/main/java/mekanism/common/base/IInvConfiguration.java +++ /dev/null @@ -1,37 +0,0 @@ -package mekanism.common.base; - -import java.util.ArrayList; - -import mekanism.common.SideData; - -/** - * Implement this if your TileEntity is capable of being modified by a Configurator in it's 'modify' mode. - * @author AidanBrady - * - */ -public interface IInvConfiguration -{ - /** - * Gets an ArrayList of side data this machine contains. - * @return - */ - public ArrayList getSideData(); - - /** - * Gets this machine's configuration as a byte[] -- each byte matching with the index of the defined SideData. - * @return - */ - public byte[] getConfiguration(); - - /** - * Gets this machine's current orientation. - * @return - */ - public int getOrientation(); - - /** - * Gets this machine's ejector. - * @return - */ - public IEjector getEjector(); -} diff --git a/src/main/java/mekanism/common/base/ISideConfiguration.java b/src/main/java/mekanism/common/base/ISideConfiguration.java new file mode 100644 index 000000000..d1d4a5dfd --- /dev/null +++ b/src/main/java/mekanism/common/base/ISideConfiguration.java @@ -0,0 +1,29 @@ +package mekanism.common.base; + +import mekanism.common.tile.component.TileComponentConfig; + +/** + * Implement this if your TileEntity is capable of being modified by a Configurator in it's 'modify' mode. + * @author AidanBrady + * + */ +public interface ISideConfiguration +{ + /** + * Gets the tile's configuration component. + * @return the tile's configuration component + */ + public TileComponentConfig getConfig(); + + /** + * Gets this machine's current orientation. + * @return machine's current orientation + */ + public int getOrientation(); + + /** + * Gets this machine's ejector. + * @return + */ + public IEjector getEjector(); +} diff --git a/src/main/java/mekanism/common/block/BlockMachine.java b/src/main/java/mekanism/common/block/BlockMachine.java index 1ad9b5ca3..6dc6ee712 100644 --- a/src/main/java/mekanism/common/block/BlockMachine.java +++ b/src/main/java/mekanism/common/block/BlockMachine.java @@ -13,6 +13,7 @@ import mekanism.api.MekanismConfig.machines; import mekanism.api.MekanismConfig.usage; import mekanism.api.energy.IEnergizedItem; import mekanism.api.energy.IStrictEnergyStorage; +import mekanism.api.transmitters.TransmissionType; import mekanism.client.ClientProxy; import mekanism.common.ItemAttacher; import mekanism.common.Mekanism; @@ -22,7 +23,7 @@ import mekanism.common.base.IBoundingBlock; import mekanism.common.base.IElectricChest; import mekanism.common.base.IFactory; import mekanism.common.base.IFactory.RecipeType; -import mekanism.common.base.IInvConfiguration; +import mekanism.common.base.ISideConfiguration; import mekanism.common.base.IRedstoneControl; import mekanism.common.base.ISpecialBounds; import mekanism.common.base.ISustainedData; @@ -896,18 +897,15 @@ public class BlockMachine extends BlockContainer implements ISpecialBounds, IPer ((IUpgradeTile)tileEntity).getComponent().write(itemStack.stackTagCompound); } - if(tileEntity instanceof IInvConfiguration) + if(tileEntity instanceof ISideConfiguration) { - IInvConfiguration config = (IInvConfiguration)tileEntity; + ISideConfiguration config = (ISideConfiguration)tileEntity; itemStack.stackTagCompound.setBoolean("hasSideData", true); itemStack.stackTagCompound.setBoolean("ejecting", config.getEjector().isEjecting()); - for(int i = 0; i < 6; i++) - { - itemStack.stackTagCompound.setByte("config"+i, config.getConfiguration()[i]); - } + config.getConfig().write(itemStack.stackTagCompound); } if(tileEntity instanceof ISustainedData) diff --git a/src/main/java/mekanism/common/content/transporter/TransporterManager.java b/src/main/java/mekanism/common/content/transporter/TransporterManager.java index c09d28af2..4d1de653e 100644 --- a/src/main/java/mekanism/common/content/transporter/TransporterManager.java +++ b/src/main/java/mekanism/common/content/transporter/TransporterManager.java @@ -7,7 +7,7 @@ import java.util.Set; import mekanism.api.Coord4D; import mekanism.api.EnumColor; -import mekanism.common.base.IInvConfiguration; +import mekanism.common.base.ISideConfiguration; import mekanism.common.content.transporter.TransporterStack.Path; import mekanism.common.tile.TileEntityBin; import mekanism.common.util.InventoryUtils; @@ -96,9 +96,9 @@ public class TransporterManager { ItemStack toInsert = stack.itemStack.copy(); - if(stack.pathType != Path.HOME && inv instanceof IInvConfiguration) + if(stack.pathType != Path.HOME && inv instanceof ISideConfiguration) { - IInvConfiguration config = (IInvConfiguration)inv; + ISideConfiguration config = (ISideConfiguration)inv; int tileSide = config.getOrientation(); EnumColor configColor = config.getEjector().getInputColor(ForgeDirection.getOrientation(MekanismUtils.getBaseOrientation(side, tileSide)).getOpposite()); @@ -242,9 +242,9 @@ public class TransporterManager return itemStack; } - if(tileEntity instanceof IInvConfiguration) + if(tileEntity instanceof ISideConfiguration) { - IInvConfiguration config = (IInvConfiguration)tileEntity; + ISideConfiguration config = (ISideConfiguration)tileEntity; int tileSide = config.getOrientation(); EnumColor configColor = config.getEjector().getInputColor(ForgeDirection.getOrientation(MekanismUtils.getBaseOrientation(side, tileSide)).getOpposite()); diff --git a/src/main/java/mekanism/common/item/ItemBlockMachine.java b/src/main/java/mekanism/common/item/ItemBlockMachine.java index ef3cf39a7..83bca485d 100644 --- a/src/main/java/mekanism/common/item/ItemBlockMachine.java +++ b/src/main/java/mekanism/common/item/ItemBlockMachine.java @@ -14,7 +14,7 @@ import mekanism.common.Mekanism; import mekanism.common.Upgrade; import mekanism.common.base.IElectricChest; import mekanism.common.base.IFactory; -import mekanism.common.base.IInvConfiguration; +import mekanism.common.base.ISideConfiguration; import mekanism.common.base.IRedstoneControl; import mekanism.common.base.IRedstoneControl.RedstoneControl; import mekanism.common.base.ISustainedData; @@ -270,18 +270,14 @@ public class ItemBlockMachine extends ItemBlock implements IEnergizedItem, ISpec } } - if(tileEntity instanceof IInvConfiguration) + if(tileEntity instanceof ISideConfiguration) { - IInvConfiguration config = (IInvConfiguration)tileEntity; + ISideConfiguration config = (ISideConfiguration)tileEntity; if(stack.stackTagCompound != null && stack.stackTagCompound.hasKey("hasSideData")) { config.getEjector().setEjecting(stack.stackTagCompound.getBoolean("ejecting")); - - for(int i = 0; i < 6; i++) - { - config.getConfiguration()[i] = stack.stackTagCompound.getByte("config"+i); - } + config.getConfig().read(stack.stackTagCompound); } } diff --git a/src/main/java/mekanism/common/item/ItemConfigurator.java b/src/main/java/mekanism/common/item/ItemConfigurator.java index 326d91020..770d7afd2 100644 --- a/src/main/java/mekanism/common/item/ItemConfigurator.java +++ b/src/main/java/mekanism/common/item/ItemConfigurator.java @@ -10,8 +10,9 @@ import mekanism.api.EnumColor; import mekanism.api.IConfigurable; import mekanism.api.IMekWrench; import mekanism.api.Range4D; +import mekanism.api.transmitters.TransmissionType; import mekanism.common.Mekanism; -import mekanism.common.base.IInvConfiguration; +import mekanism.common.base.ISideConfiguration; import mekanism.common.network.PacketTileEntity.TileEntityMessage; import mekanism.common.tile.TileEntityBasicBlock; import mekanism.common.tile.TileEntityElectricChest; @@ -49,7 +50,7 @@ public class ItemConfigurator extends ItemEnergized implements IMekWrench, ITool public void addInformation(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag) { super.addInformation(itemstack, entityplayer, list, flag); - list.add(EnumColor.PINK + MekanismUtils.localize("gui.state") + ": " + EnumColor.GREY + getStateDisplay(getState(itemstack))); + list.add(EnumColor.PINK + MekanismUtils.localize("gui.state") + ": " + getColor(getState(itemstack)) + getStateDisplay(getState(itemstack))); } @Override @@ -60,23 +61,23 @@ public class ItemConfigurator extends ItemEnergized implements IMekWrench, ITool Block block = world.getBlock(x, y, z); TileEntity tile = world.getTileEntity(x, y, z); - if(getState(stack) == 0) //Configurate + if(getState(stack).isConfigurating()) //Configurate { - if(tile instanceof IInvConfiguration) + if(tile instanceof ISideConfiguration && ((ISideConfiguration)tile).getConfig().supports(getState(stack).getTransmission())) { - IInvConfiguration config = (IInvConfiguration)tile; + ISideConfiguration config = (ISideConfiguration)tile; if(!player.isSneaking()) { - player.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " " + MekanismUtils.localize("tooltip.configurator.viewColor") + ": " + config.getSideData().get(config.getConfiguration()[MekanismUtils.getBaseOrientation(side, config.getOrientation())]).color.getName())); + player.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " " + MekanismUtils.localize("tooltip.configurator.viewColor") + ": " + config.getConfig().getOutput(getState(stack).getTransmission(), side, config.getOrientation()).color.getName())); return true; } else { if(getEnergy(stack) >= ENERGY_PER_CONFIGURE) { setEnergy(stack, getEnergy(stack) - ENERGY_PER_CONFIGURE); - MekanismUtils.incrementOutput(config, MekanismUtils.getBaseOrientation(side, config.getOrientation())); - player.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " " + MekanismUtils.localize("tooltip.configurator.toggleColor") + ": " + config.getSideData().get(config.getConfiguration()[MekanismUtils.getBaseOrientation(side, config.getOrientation())]).color.getName())); + MekanismUtils.incrementOutput(config, getState(stack).getTransmission(), MekanismUtils.getBaseOrientation(side, config.getOrientation())); + player.addChatMessage(new ChatComponentText(EnumColor.DARK_BLUE + "[Mekanism]" + EnumColor.GREY + " " + MekanismUtils.localize("tooltip.configurator.toggleColor") + ": " + config.getConfig().getOutput(getState(stack).getTransmission(), side, config.getOrientation()).color.getName())); if(config instanceof TileEntityBasicBlock) { @@ -101,7 +102,7 @@ public class ItemConfigurator extends ItemEnergized implements IMekWrench, ITool } } } - else if(getState(stack) == 1) //Empty + else if(getState(stack) == ConfiguratorMode.EMPTY) //Empty { if(tile instanceof IInventory) { @@ -161,7 +162,7 @@ public class ItemConfigurator extends ItemEnergized implements IMekWrench, ITool } } } - else if(getState(stack) == 2) //Rotate + else if(getState(stack) == ConfiguratorMode.ROTATE) //Rotate { ForgeDirection axis = ForgeDirection.getOrientation(side); List l = Arrays.asList(block.getValidRotations(world, x, y, z)); @@ -177,7 +178,7 @@ public class ItemConfigurator extends ItemEnergized implements IMekWrench, ITool return true; } - else if(getState(stack) == 3) //Wrench + else if(getState(stack) == ConfiguratorMode.WRENCH) //Wrench { return false; } @@ -186,65 +187,39 @@ public class ItemConfigurator extends ItemEnergized implements IMekWrench, ITool return false; } - public String getStateDisplay(int state) + public String getStateDisplay(ConfiguratorMode mode) { - switch(state) - { - case 0: - return MekanismUtils.localize("tooltip.configurator.configurate"); - case 1: - return MekanismUtils.localize("tooltip.configurator.empty"); - case 2: - return MekanismUtils.localize("tooltip.configurator.rotate"); - case 3: - return MekanismUtils.localize("tooltip.configurator.wrench"); - } - - return "unknown"; + return mode.getName(); } - public EnumColor getColor(int state) + public EnumColor getColor(ConfiguratorMode mode) { - switch(state) - { - case 0: - return EnumColor.BRIGHT_GREEN; - case 1: - return EnumColor.AQUA; - case 2: - return EnumColor.YELLOW; - case 3: - return EnumColor.PINK; - } - - return EnumColor.GREY; + return mode.getColor(); } - public void setState(ItemStack itemstack, byte state) + public void setState(ItemStack itemstack, ConfiguratorMode state) { if(itemstack.stackTagCompound == null) { itemstack.setTagCompound(new NBTTagCompound()); } - itemstack.stackTagCompound.setByte("state", state); + itemstack.stackTagCompound.setInteger("state", state.ordinal()); } - public byte getState(ItemStack itemstack) + public ConfiguratorMode getState(ItemStack itemstack) { if(itemstack.stackTagCompound == null) { - return 0; + return ConfiguratorMode.CONFIGURATE_ITEMS; } - byte state = 0; - if(itemstack.stackTagCompound.getTag("state") != null) { - state = itemstack.stackTagCompound.getByte("state"); + return ConfiguratorMode.values()[itemstack.stackTagCompound.getInteger("state")]; } - return state; + return ConfiguratorMode.CONFIGURATE_ITEMS; } @Override @@ -267,13 +242,13 @@ public class ItemConfigurator extends ItemEnergized implements IMekWrench, ITool @Override public boolean canUseWrench(EntityPlayer player, int x, int y, int z) { - return getState(player.getCurrentEquippedItem()) == 3; + return getState(player.getCurrentEquippedItem()) == ConfiguratorMode.WRENCH; } @Override public boolean doesSneakBypassUse(World world, int x, int y, int z, EntityPlayer player) { - return getState(player.getCurrentEquippedItem()) == 3; + return getState(player.getCurrentEquippedItem()) == ConfiguratorMode.WRENCH; } @Override @@ -284,4 +259,60 @@ public class ItemConfigurator extends ItemEnergized implements IMekWrench, ITool @Override public void toolUsed(ItemStack item, EntityLivingBase user, int x, int y, int z) {} + + public static enum ConfiguratorMode + { + CONFIGURATE_ITEMS("configurate", "(" + TransmissionType.ITEM.getName() + ")", EnumColor.BRIGHT_GREEN, true), + CONFIGURATE_FLUIDS("configurate", "(" + TransmissionType.FLUID.getName() + ")", EnumColor.BRIGHT_GREEN, true), + CONFIGURATE_GASES("configurate", "(" + TransmissionType.GAS.getName() + ")", EnumColor.BRIGHT_GREEN, true), + CONFIGURATE_ENERGY("configurate", "(" + TransmissionType.ENERGY.getName() + ")", EnumColor.BRIGHT_GREEN, true), + EMPTY("empty", "", EnumColor.DARK_RED, false), + ROTATE("rotate", "", EnumColor.YELLOW, false), + WRENCH("wrench", "", EnumColor.PINK, false); + + private String name; + private String info; + private EnumColor color; + private boolean configurating; + + private ConfiguratorMode(String s, String s1, EnumColor c, boolean b) + { + name = s; + info = s1; + color = c; + configurating = b; + } + + public String getName() + { + return MekanismUtils.localize("tooltip.configurator." + name) + info; + } + + public EnumColor getColor() + { + return color; + } + + public boolean isConfigurating() + { + return configurating; + } + + public TransmissionType getTransmission() + { + switch(this) + { + case CONFIGURATE_ITEMS: + return TransmissionType.ITEM; + case CONFIGURATE_FLUIDS: + return TransmissionType.FLUID; + case CONFIGURATE_GASES: + return TransmissionType.GAS; + case CONFIGURATE_ENERGY: + return TransmissionType.ENERGY; + } + + return null; + } + } } diff --git a/src/main/java/mekanism/common/network/PacketConfigurationUpdate.java b/src/main/java/mekanism/common/network/PacketConfigurationUpdate.java index f78a40567..baddf35fa 100644 --- a/src/main/java/mekanism/common/network/PacketConfigurationUpdate.java +++ b/src/main/java/mekanism/common/network/PacketConfigurationUpdate.java @@ -1,19 +1,21 @@ package mekanism.common.network; +import io.netty.buffer.ByteBuf; + import java.util.ArrayList; import mekanism.api.Coord4D; import mekanism.api.Range4D; +import mekanism.api.transmitters.TransmissionType; import mekanism.common.Mekanism; import mekanism.common.PacketHandler; -import mekanism.common.base.IInvConfiguration; +import mekanism.common.base.ISideConfiguration; import mekanism.common.base.ITileNetwork; import mekanism.common.network.PacketConfigurationUpdate.ConfigurationUpdateMessage; import mekanism.common.network.PacketTileEntity.TileEntityMessage; import mekanism.common.tile.TileEntityBasicBlock; import mekanism.common.util.MekanismUtils; import mekanism.common.util.TransporterUtils; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.tileentity.TileEntity; @@ -22,8 +24,6 @@ import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; -import io.netty.buffer.ByteBuf; - public class PacketConfigurationUpdate implements IMessageHandler { @Override @@ -31,9 +31,9 @@ public class PacketConfigurationUpdate implements IMessageHandler { @Override @@ -20,7 +19,7 @@ public class PacketConfiguratorState implements IMessageHandler, OUTPUT extends MachineOutput, RECIPE extends MachineRecipe> extends TileEntityNoisyElectricBlock implements IElectricMachine, IPeripheral, IInvConfiguration, IUpgradeTile, IRedstoneControl +public abstract class TileEntityBasicMachine, OUTPUT extends MachineOutput, RECIPE extends MachineRecipe> extends TileEntityNoisyElectricBlock implements IElectricMachine, IPeripheral, ISideConfiguration, IUpgradeTile, IRedstoneControl { - /** This machine's side configuration. */ - public byte[] sideConfig; - - /** An arraylist of SideData for this machine. */ - public ArrayList sideOutputs = new ArrayList(); - /** How much energy this machine uses per tick, un-upgraded. */ public double BASE_ENERGY_PER_TICK; @@ -77,6 +70,7 @@ public abstract class TileEntityBasicMachine, public TileComponentUpgrade upgradeComponent; public TileComponentEjector ejectorComponent; + public TileComponentConfig configComponent; /** * The foundation of all machines - a simple tile entity with a facing, active state, initialized state, sound effect, and animated texture. @@ -136,14 +130,6 @@ public abstract class TileEntityBasicMachine, operatingTicks = nbtTags.getInteger("operatingTicks"); clientActive = isActive = nbtTags.getBoolean("isActive"); controlType = RedstoneControl.values()[nbtTags.getInteger("controlType")]; - - if(nbtTags.hasKey("sideDataStored")) - { - for(int i = 0; i < 6; i++) - { - sideConfig[i] = nbtTags.getByte("config"+i); - } - } } @Override @@ -154,13 +140,6 @@ public abstract class TileEntityBasicMachine, nbtTags.setInteger("operatingTicks", operatingTicks); nbtTags.setBoolean("isActive", isActive); nbtTags.setInteger("controlType", controlType.ordinal()); - - nbtTags.setBoolean("sideDataStored", true); - - for(int i = 0; i < 6; i++) - { - nbtTags.setByte("config"+i, sideConfig[i]); - } } @Override @@ -173,11 +152,6 @@ public abstract class TileEntityBasicMachine, ticksRequired = dataStream.readInt(); controlType = RedstoneControl.values()[dataStream.readInt()]; - for(int i = 0; i < 6; i++) - { - sideConfig[i] = dataStream.readByte(); - } - if(updateDelay == 0 && clientActive != isActive) { updateDelay = general.UPDATE_DELAY; @@ -195,7 +169,6 @@ public abstract class TileEntityBasicMachine, data.add(isActive); data.add(ticksRequired); data.add(controlType.ordinal()); - data.add(sideConfig); return data; } @@ -275,19 +248,13 @@ public abstract class TileEntityBasicMachine, @Override public int[] getAccessibleSlotsFromSide(int side) { - return sideOutputs.get(sideConfig[MekanismUtils.getBaseOrientation(side, facing)]).availableSlots; + return configComponent.getOutput(TransmissionType.ITEM, side, facing).availableSlots; } @Override - public ArrayList getSideData() + public TileComponentConfig getConfig() { - return sideOutputs; - } - - @Override - public byte[] getConfiguration() - { - return sideConfig; + return configComponent; } @Override diff --git a/src/main/java/mekanism/common/tile/TileEntityChanceMachine.java b/src/main/java/mekanism/common/tile/TileEntityChanceMachine.java index 3d32ae37c..3fcb61663 100644 --- a/src/main/java/mekanism/common/tile/TileEntityChanceMachine.java +++ b/src/main/java/mekanism/common/tile/TileEntityChanceMachine.java @@ -3,45 +3,46 @@ package mekanism.common.tile; import java.util.Map; import mekanism.api.EnumColor; +import mekanism.api.transmitters.TransmissionType; import mekanism.common.MekanismItems; import mekanism.common.SideData; import mekanism.common.recipe.RecipeHandler; import mekanism.common.recipe.inputs.ItemStackInput; import mekanism.common.recipe.machines.ChanceMachineRecipe; import mekanism.common.recipe.outputs.ChanceOutput; +import mekanism.common.tile.component.TileComponentConfig; import mekanism.common.tile.component.TileComponentEjector; import mekanism.common.tile.component.TileComponentUpgrade; import mekanism.common.util.ChargeUtils; import mekanism.common.util.InventoryUtils; import mekanism.common.util.MekanismUtils; - import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import cpw.mods.fml.common.Optional.Method; - import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.peripheral.IComputerAccess; - public abstract class TileEntityChanceMachine> extends TileEntityBasicMachine { public TileEntityChanceMachine(String soundPath, String name, ResourceLocation location, double perTick, int ticksRequired, double maxEnergy) { super(soundPath, name, location, perTick, ticksRequired, maxEnergy); - sideOutputs.add(new SideData(EnumColor.GREY, InventoryUtils.EMPTY)); - sideOutputs.add(new SideData(EnumColor.DARK_RED, new int[] {0})); - sideOutputs.add(new SideData(EnumColor.DARK_GREEN, new int[] {1})); - sideOutputs.add(new SideData(EnumColor.DARK_BLUE, new int[] {2, 4})); - sideOutputs.add(new SideData(EnumColor.ORANGE, new int[] {3})); + configComponent = new TileComponentConfig(this, TransmissionType.ITEM); + + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.GREY, InventoryUtils.EMPTY)); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.DARK_RED, new int[] {0})); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.DARK_GREEN, new int[] {1})); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.DARK_BLUE, new int[] {2, 4})); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.ORANGE, new int[] {3})); - sideConfig = new byte[] {2, 1, 0, 0, 4, 3}; + configComponent.setConfig(TransmissionType.ITEM, new byte[] {2, 1, 0, 0, 4, 3}); inventory = new ItemStack[5]; upgradeComponent = new TileComponentUpgrade(this, 3); - ejectorComponent = new TileComponentEjector(this, sideOutputs.get(3)); + ejectorComponent = new TileComponentEjector(this, configComponent.getOutputs(TransmissionType.ITEM).get(3)); } @Override diff --git a/src/main/java/mekanism/common/tile/TileEntityChemicalCrystallizer.java b/src/main/java/mekanism/common/tile/TileEntityChemicalCrystallizer.java index ca82743c9..8b8d673fe 100644 --- a/src/main/java/mekanism/common/tile/TileEntityChemicalCrystallizer.java +++ b/src/main/java/mekanism/common/tile/TileEntityChemicalCrystallizer.java @@ -16,13 +16,14 @@ import mekanism.api.gas.GasTransmission; import mekanism.api.gas.IGasHandler; import mekanism.api.gas.IGasItem; import mekanism.api.gas.ITubeConnection; +import mekanism.api.transmitters.TransmissionType; import mekanism.common.Mekanism; import mekanism.common.SideData; import mekanism.common.Upgrade; import mekanism.common.base.IDropperHandler; import mekanism.common.base.IEjector; -import mekanism.common.base.IInvConfiguration; import mekanism.common.base.IRedstoneControl; +import mekanism.common.base.ISideConfiguration; import mekanism.common.base.ISustainedData; import mekanism.common.base.IUpgradeTile; import mekanism.common.block.BlockMachine.MachineType; @@ -30,6 +31,7 @@ import mekanism.common.network.PacketTileEntity.TileEntityMessage; import mekanism.common.recipe.RecipeHandler; import mekanism.common.recipe.inputs.GasInput; import mekanism.common.recipe.machines.CrystallizerRecipe; +import mekanism.common.tile.component.TileComponentConfig; import mekanism.common.tile.component.TileComponentEjector; import mekanism.common.tile.component.TileComponentUpgrade; import mekanism.common.util.ChargeUtils; @@ -43,14 +45,10 @@ import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidRegistry; -public class TileEntityChemicalCrystallizer extends TileEntityNoisyElectricBlock implements IGasHandler, ITubeConnection, IRedstoneControl, IInvConfiguration, IUpgradeTile, ISustainedData, IDropperHandler +public class TileEntityChemicalCrystallizer extends TileEntityNoisyElectricBlock implements IGasHandler, ITubeConnection, IRedstoneControl, ISideConfiguration, IUpgradeTile, ISustainedData, IDropperHandler { public static final int MAX_GAS = 10000; - - public byte[] sideConfig = new byte[] {0, 3, 0, 0, 1, 2}; - - public ArrayList sideOutputs = new ArrayList(); - + public GasTank inputTank = new GasTank(MAX_GAS); public int updateDelay; @@ -80,20 +78,27 @@ public class TileEntityChemicalCrystallizer extends TileEntityNoisyElectricBlock /** This machine's current RedstoneControl type. */ public RedstoneControl controlType = RedstoneControl.DISABLED; + public TileComponentUpgrade upgradeComponent; public TileComponentEjector ejectorComponent; - public TileComponentUpgrade upgradeComponent = new TileComponentUpgrade(this, 3); + public TileComponentConfig configComponent; public TileEntityChemicalCrystallizer() { super("crystallizer", "ChemicalCrystallizer", MachineType.CHEMICAL_CRYSTALLIZER.baseEnergy); - sideOutputs.add(new SideData(EnumColor.GREY, InventoryUtils.EMPTY)); - sideOutputs.add(new SideData(EnumColor.PURPLE, new int[] {0})); - sideOutputs.add(new SideData(EnumColor.DARK_BLUE, new int[] {1})); - sideOutputs.add(new SideData(EnumColor.DARK_GREEN, new int[] {2})); - + configComponent = new TileComponentConfig(this, TransmissionType.ITEM); + + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.GREY, InventoryUtils.EMPTY)); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.PURPLE, new int[] {0})); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.DARK_BLUE, new int[] {1})); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.DARK_GREEN, new int[] {2})); + + configComponent.setConfig(TransmissionType.ITEM, new byte[] {0, 3, 0, 0, 1, 2}); + inventory = new ItemStack[4]; - ejectorComponent = new TileComponentEjector(this, sideOutputs.get(2)); + + upgradeComponent = new TileComponentUpgrade(this, 3); + ejectorComponent = new TileComponentEjector(this, configComponent.getOutputs(TransmissionType.ITEM).get(2)); } @Override @@ -218,12 +223,6 @@ public class TileEntityChemicalCrystallizer extends TileEntityNoisyElectricBlock isActive = dataStream.readBoolean(); operatingTicks = dataStream.readInt(); - - for(int i = 0; i < 6; i++) - { - sideConfig[i] = dataStream.readByte(); - } - controlType = RedstoneControl.values()[dataStream.readInt()]; if(dataStream.readBoolean()) @@ -245,7 +244,6 @@ public class TileEntityChemicalCrystallizer extends TileEntityNoisyElectricBlock data.add(isActive); data.add(operatingTicks); - data.add(sideConfig); data.add(controlType.ordinal()); if(inputTank.getGas() != null) @@ -271,14 +269,6 @@ public class TileEntityChemicalCrystallizer extends TileEntityNoisyElectricBlock controlType = RedstoneControl.values()[nbtTags.getInteger("controlType")]; inputTank.read(nbtTags.getCompoundTag("rightTank")); - - if(nbtTags.hasKey("sideDataStored")) - { - for(int i = 0; i < 6; i++) - { - sideConfig[i] = nbtTags.getByte("config"+i); - } - } } @Override @@ -293,11 +283,6 @@ public class TileEntityChemicalCrystallizer extends TileEntityNoisyElectricBlock nbtTags.setTag("rightTank", inputTank.write(new NBTTagCompound())); nbtTags.setBoolean("sideDataStored", true); - - for(int i = 0; i < 6; i++) - { - nbtTags.setByte("config"+i, sideConfig[i]); - } } @Override @@ -434,32 +419,13 @@ public class TileEntityChemicalCrystallizer extends TileEntityNoisyElectricBlock @Override public int[] getAccessibleSlotsFromSide(int side) { - if(side == MekanismUtils.getLeft(facing).ordinal()) - { - return new int[] {0}; - } - else if(side == MekanismUtils.getRight(facing).ordinal()) - { - return new int[] {1}; - } - else if(side == 0 || side == 1) - { - return new int[2]; - } - - return InventoryUtils.EMPTY; + return configComponent.getOutput(TransmissionType.ITEM, side, facing).availableSlots; } @Override - public ArrayList getSideData() + public TileComponentConfig getConfig() { - return sideOutputs; - } - - @Override - public byte[] getConfiguration() - { - return sideConfig; + return configComponent; } @Override diff --git a/src/main/java/mekanism/common/tile/TileEntityElectricMachine.java b/src/main/java/mekanism/common/tile/TileEntityElectricMachine.java index 74e19bb4e..1fd07b4dc 100644 --- a/src/main/java/mekanism/common/tile/TileEntityElectricMachine.java +++ b/src/main/java/mekanism/common/tile/TileEntityElectricMachine.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import mekanism.api.Coord4D; import mekanism.api.EnumColor; import mekanism.api.Range4D; +import mekanism.api.transmitters.TransmissionType; import mekanism.common.Mekanism; import mekanism.common.MekanismBlocks; import mekanism.common.MekanismItems; @@ -16,6 +17,7 @@ import mekanism.common.recipe.RecipeHandler; import mekanism.common.recipe.inputs.ItemStackInput; import mekanism.common.recipe.machines.BasicMachineRecipe; import mekanism.common.recipe.outputs.ItemStackOutput; +import mekanism.common.tile.component.TileComponentConfig; import mekanism.common.tile.component.TileComponentEjector; import mekanism.common.tile.component.TileComponentUpgrade; import mekanism.common.util.ChargeUtils; @@ -44,18 +46,20 @@ public abstract class TileEntityElectricMachine sideOutputs = new ArrayList(); - /** An int[] used to track all current operations' progress. */ public int[] progress; @@ -114,21 +110,27 @@ public class TileEntityFactory extends TileEntityNoisyElectricBlock implements I /** This machine's current RedstoneControl type. */ public RedstoneControl controlType = RedstoneControl.DISABLED; - public TileComponentUpgrade upgradeComponent = new TileComponentUpgrade(this, 0); + public TileComponentUpgrade upgradeComponent; public TileComponentEjector ejectorComponent; + public TileComponentConfig configComponent; public TileEntityFactory() { this(FactoryTier.BASIC, MachineType.BASIC_FACTORY); + + configComponent = new TileComponentConfig(this, TransmissionType.ITEM); - sideOutputs.add(new SideData(EnumColor.GREY, InventoryUtils.EMPTY)); - sideOutputs.add(new SideData(EnumColor.ORANGE, new int[] {0})); - sideOutputs.add(new SideData(EnumColor.DARK_GREEN, new int[] {1})); - sideOutputs.add(new SideData(EnumColor.PURPLE, new int[] {4})); - sideOutputs.add(new SideData(EnumColor.DARK_RED, new int[] {5, 6, 7})); - sideOutputs.add(new SideData(EnumColor.DARK_BLUE, new int[] {8, 9, 10})); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.GREY, InventoryUtils.EMPTY)); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.ORANGE, new int[] {0})); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.DARK_GREEN, new int[] {1})); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.PURPLE, new int[] {4})); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.DARK_RED, new int[] {5, 6, 7})); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.DARK_BLUE, new int[] {8, 9, 10})); + + configComponent.setConfig(TransmissionType.ITEM, new byte[] {5, 4, 0, 3, 2, 1}); - ejectorComponent = new TileComponentEjector(this, sideOutputs.get(5)); + upgradeComponent = new TileComponentUpgrade(this, 0); + ejectorComponent = new TileComponentEjector(this, configComponent.getOutputs(TransmissionType.ITEM).get(5)); } public TileEntityFactory(FactoryTier type, MachineType machine) @@ -157,7 +159,6 @@ public class TileEntityFactory extends TileEntityNoisyElectricBlock implements I factory.redstone = redstone; factory.redstoneLastTick = redstoneLastTick; factory.doAutoSync = doAutoSync; - factory.components = components; //Electric factory.electricityStored = electricityStored; @@ -168,7 +169,6 @@ public class TileEntityFactory extends TileEntityNoisyElectricBlock implements I factory.sound = sound; //Factory - factory.sideConfig = sideConfig; for(int i = 0; i < tier.processes; i++) { @@ -189,7 +189,7 @@ public class TileEntityFactory extends TileEntityNoisyElectricBlock implements I factory.upgradeComponent.tileEntity = factory; factory.ejectorComponent = ejectorComponent; factory.ejectorComponent.tileEntity = factory; - factory.ejectorComponent.sideData = factory.sideOutputs.get(5); + factory.ejectorComponent.sideData = factory.configComponent.getOutputs(TransmissionType.ITEM).get(5); factory.ejectorComponent.trackers = new int[factory.ejectorComponent.sideData.availableSlots.length]; for(int i = 0; i < tier.processes+5; i++) @@ -676,11 +676,6 @@ public class TileEntityFactory extends TileEntityNoisyElectricBlock implements I progress[i] = dataStream.readInt(); } - for(int i = 0; i < 6; i++) - { - sideConfig[i] = dataStream.readByte(); - } - if(dataStream.readBoolean()) { gasTank.setGas(new GasStack(dataStream.readInt(), dataStream.readInt())); @@ -727,14 +722,6 @@ public class TileEntityFactory extends TileEntityNoisyElectricBlock implements I progress[i] = nbtTags.getInteger("progress" + i); } - if(nbtTags.hasKey("sideDataStored")) - { - for(int i = 0; i < 6; i++) - { - sideConfig[i] = nbtTags.getByte("config"+i); - } - } - gasTank.read(nbtTags.getCompoundTag("gasTank")); } @@ -754,13 +741,6 @@ public class TileEntityFactory extends TileEntityNoisyElectricBlock implements I nbtTags.setInteger("progress" + i, progress[i]); } - nbtTags.setBoolean("sideDataStored", true); - - for(int i = 0; i < 6; i++) - { - nbtTags.setByte("config"+i, sideConfig[i]); - } - nbtTags.setTag("gasTank", gasTank.write(new NBTTagCompound())); } @@ -776,7 +756,6 @@ public class TileEntityFactory extends TileEntityNoisyElectricBlock implements I data.add(sorting); data.add(upgraded); data.add(progress); - data.add(sideConfig); if(gasTank.getGas() != null) { @@ -909,7 +888,7 @@ public class TileEntityFactory extends TileEntityNoisyElectricBlock implements I @Override public int[] getAccessibleSlotsFromSide(int side) { - return sideOutputs.get(sideConfig[MekanismUtils.getBaseOrientation(side, facing)]).availableSlots; + return configComponent.getOutput(TransmissionType.ITEM, side, facing).availableSlots; } @Override @@ -919,15 +898,9 @@ public class TileEntityFactory extends TileEntityNoisyElectricBlock implements I } @Override - public ArrayList getSideData() + public TileComponentConfig getConfig() { - return sideOutputs; - } - - @Override - public byte[] getConfiguration() - { - return sideConfig; + return configComponent; } @Override diff --git a/src/main/java/mekanism/common/tile/TileEntityMetallurgicInfuser.java b/src/main/java/mekanism/common/tile/TileEntityMetallurgicInfuser.java index 6e83fa87b..8160f7810 100644 --- a/src/main/java/mekanism/common/tile/TileEntityMetallurgicInfuser.java +++ b/src/main/java/mekanism/common/tile/TileEntityMetallurgicInfuser.java @@ -1,5 +1,7 @@ package mekanism.common.tile; +import io.netty.buffer.ByteBuf; + import java.util.ArrayList; import mekanism.api.Coord4D; @@ -9,6 +11,7 @@ import mekanism.api.MekanismConfig.usage; import mekanism.api.Range4D; import mekanism.api.infuse.InfuseObject; import mekanism.api.infuse.InfuseRegistry; +import mekanism.api.transmitters.TransmissionType; import mekanism.common.InfuseStorage; import mekanism.common.Mekanism; import mekanism.common.MekanismItems; @@ -16,8 +19,8 @@ import mekanism.common.PacketHandler; import mekanism.common.SideData; import mekanism.common.Upgrade; import mekanism.common.base.IEjector; -import mekanism.common.base.IInvConfiguration; import mekanism.common.base.IRedstoneControl; +import mekanism.common.base.ISideConfiguration; import mekanism.common.base.IUpgradeTile; import mekanism.common.block.BlockMachine.MachineType; import mekanism.common.network.PacketTileEntity.TileEntityMessage; @@ -25,33 +28,24 @@ import mekanism.common.recipe.RecipeHandler; import mekanism.common.recipe.RecipeHandler.Recipe; import mekanism.common.recipe.inputs.InfusionInput; import mekanism.common.recipe.machines.MetallurgicInfuserRecipe; +import mekanism.common.tile.component.TileComponentConfig; import mekanism.common.tile.component.TileComponentEjector; import mekanism.common.tile.component.TileComponentUpgrade; import mekanism.common.util.ChargeUtils; import mekanism.common.util.InventoryUtils; import mekanism.common.util.MekanismUtils; - import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import cpw.mods.fml.common.Optional.Interface; import cpw.mods.fml.common.Optional.Method; - -import io.netty.buffer.ByteBuf; - import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IPeripheral; @Interface(iface = "dan200.computercraft.api.peripheral.IPeripheral", modid = "ComputerCraft") -public class TileEntityMetallurgicInfuser extends TileEntityNoisyElectricBlock implements IPeripheral, IInvConfiguration, IUpgradeTile, IRedstoneControl +public class TileEntityMetallurgicInfuser extends TileEntityNoisyElectricBlock implements IPeripheral, ISideConfiguration, IUpgradeTile, IRedstoneControl { - /** This machine's side configuration. */ - public byte[] sideConfig = new byte[] {2, 1, 0, 5, 3, 4}; - - /** An arraylist of SideData for this machine. */ - public ArrayList sideOutputs = new ArrayList(); - /** The maxiumum amount of infuse this machine can store. */ public int MAX_INFUSE = 1000; @@ -86,22 +80,29 @@ public class TileEntityMetallurgicInfuser extends TileEntityNoisyElectricBlock i /** This machine's current RedstoneControl type. */ public RedstoneControl controlType = RedstoneControl.DISABLED; - public TileComponentUpgrade upgradeComponent = new TileComponentUpgrade(this, 4); + public TileComponentUpgrade upgradeComponent; public TileComponentEjector ejectorComponent; + public TileComponentConfig configComponent; public TileEntityMetallurgicInfuser() { super("metalinfuser", "MetallurgicInfuser", MachineType.METALLURGIC_INFUSER.baseEnergy); - sideOutputs.add(new SideData(EnumColor.GREY, InventoryUtils.EMPTY)); - sideOutputs.add(new SideData(EnumColor.ORANGE, new int[] {0})); - sideOutputs.add(new SideData(EnumColor.PURPLE, new int[] {1})); - sideOutputs.add(new SideData(EnumColor.DARK_RED, new int[] {2})); - sideOutputs.add(new SideData(EnumColor.DARK_BLUE, new int[] {3})); - sideOutputs.add(new SideData(EnumColor.DARK_GREEN, new int[] {4})); + configComponent = new TileComponentConfig(this, TransmissionType.ITEM); + + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.GREY, InventoryUtils.EMPTY)); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.ORANGE, new int[] {0})); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.PURPLE, new int[] {1})); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.DARK_RED, new int[] {2})); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.DARK_BLUE, new int[] {3})); + configComponent.addOutput(TransmissionType.ITEM, new SideData(EnumColor.DARK_GREEN, new int[] {4})); + + configComponent.setConfig(TransmissionType.ITEM, new byte[] {2, 1, 0, 5, 3, 4}); inventory = new ItemStack[5]; - ejectorComponent = new TileComponentEjector(this, sideOutputs.get(4)); + + upgradeComponent = new TileComponentUpgrade(this, 3); + ejectorComponent = new TileComponentEjector(this, configComponent.getOutputs(TransmissionType.ITEM).get(4)); } @Override @@ -295,14 +296,6 @@ public class TileEntityMetallurgicInfuser extends TileEntityNoisyElectricBlock i infuseStored.amount = nbtTags.getInteger("infuseStored"); controlType = RedstoneControl.values()[nbtTags.getInteger("controlType")]; infuseStored.type = InfuseRegistry.get(nbtTags.getString("type")); - - if(nbtTags.hasKey("sideDataStored")) - { - for(int i = 0; i < 6; i++) - { - sideConfig[i] = nbtTags.getByte("config"+i); - } - } } @Override @@ -324,11 +317,6 @@ public class TileEntityMetallurgicInfuser extends TileEntityNoisyElectricBlock i } nbtTags.setBoolean("sideDataStored", true); - - for(int i = 0; i < 6; i++) - { - nbtTags.setByte("config"+i, sideConfig[i]); - } } @Override @@ -348,11 +336,6 @@ public class TileEntityMetallurgicInfuser extends TileEntityNoisyElectricBlock i controlType = RedstoneControl.values()[dataStream.readInt()]; infuseStored.type = InfuseRegistry.get(PacketHandler.readString(dataStream)); - for(int i = 0; i < 6; i++) - { - sideConfig[i] = dataStream.readByte(); - } - if(updateDelay == 0 && clientActive != isActive) { updateDelay = general.UPDATE_DELAY; @@ -379,7 +362,6 @@ public class TileEntityMetallurgicInfuser extends TileEntityNoisyElectricBlock i data.add("null"); } - data.add(sideConfig); return data; } @@ -443,7 +425,7 @@ public class TileEntityMetallurgicInfuser extends TileEntityNoisyElectricBlock i @Override public int[] getAccessibleSlotsFromSide(int side) { - return sideOutputs.get(sideConfig[MekanismUtils.getBaseOrientation(side, facing)]).availableSlots; + return configComponent.getOutput(TransmissionType.ITEM, side, facing).availableSlots; } @Override @@ -473,15 +455,9 @@ public class TileEntityMetallurgicInfuser extends TileEntityNoisyElectricBlock i } @Override - public ArrayList getSideData() + public TileComponentConfig getConfig() { - return sideOutputs; - } - - @Override - public byte[] getConfiguration() - { - return sideConfig; + return configComponent; } @Override diff --git a/src/main/java/mekanism/common/tile/TileEntityPRC.java b/src/main/java/mekanism/common/tile/TileEntityPRC.java index e02c5836a..d44ce797a 100644 --- a/src/main/java/mekanism/common/tile/TileEntityPRC.java +++ b/src/main/java/mekanism/common/tile/TileEntityPRC.java @@ -14,6 +14,7 @@ import mekanism.api.gas.GasStack; import mekanism.api.gas.GasTank; import mekanism.api.gas.IGasHandler; import mekanism.api.gas.ITubeConnection; +import mekanism.api.transmitters.TransmissionType; import mekanism.common.SideData; import mekanism.common.Upgrade; import mekanism.common.base.IDropperHandler; @@ -24,6 +25,7 @@ import mekanism.common.recipe.RecipeHandler; import mekanism.common.recipe.inputs.PressurizedInput; import mekanism.common.recipe.machines.PressurizedRecipe; import mekanism.common.recipe.outputs.PressurizedProducts; +import mekanism.common.tile.component.TileComponentConfig; import mekanism.common.tile.component.TileComponentEjector; import mekanism.common.tile.component.TileComponentUpgrade; import mekanism.common.util.ChargeUtils; @@ -57,18 +59,20 @@ public class TileEntityPRC extends TileEntityBasicMachine sideConfigs = new ArrayList(); + public List> sideOutputs = new ArrayList>(); + + public List transmissions = new ArrayList(); + + public TileComponentConfig(TileEntityContainerBlock tile, TransmissionType... types) + { + tileEntity = tile; + transmissions = Arrays.asList(types); + + tile.components.add(this); + } + + public void setConfig(TransmissionType type, byte[] config) + { + sideConfigs.set(type.ordinal(), config); + } + + public void addOutput(TransmissionType type, SideData data) + { + if(sideOutputs.get(type.ordinal()) == null) + { + sideOutputs.set(type.ordinal(), new ArrayList()); + } + + sideOutputs.get(type.ordinal()).add(data); + } + + public ArrayList getOutputs(TransmissionType type) + { + return sideOutputs.get(type.ordinal()); + } + + public byte[] getConfig(TransmissionType type) + { + return sideConfigs.get(type.ordinal()); + } + + public SideData getOutput(TransmissionType type, int side, int facing) + { + return getOutputs(type).get(getConfig(type)[MekanismUtils.getBaseOrientation(side, facing)]); + } + + public SideData getOutput(TransmissionType type, int side) + { + return getOutputs(type).get(getConfig(type)[side]); + } + + public boolean supports(TransmissionType type) + { + return transmissions.contains(type); + } + + @Override + public void tick() {} + + @Override + public void read(NBTTagCompound nbtTags) + { + if(nbtTags.getBoolean("sideDataStored")) + { + for(TransmissionType type : transmissions) + { + sideConfigs.set(type.ordinal(), nbtTags.getByteArray("config" + type.ordinal())); + } + } + } + + @Override + public void read(ByteBuf dataStream) + { + for(TransmissionType type : transmissions) + { + dataStream.readBytes(sideConfigs.get(type.ordinal())); + } + } + + @Override + public void write(NBTTagCompound nbtTags) + { + for(TransmissionType type : transmissions) + { + nbtTags.setByteArray("config" + type.ordinal(), sideConfigs.get(type.ordinal())); + } + + nbtTags.setBoolean("sideDataStored", true); + } + + @Override + public void write(ArrayList data) + { + for(TransmissionType type : transmissions) + { + data.add(sideConfigs.get(type.ordinal())); + } + } +} diff --git a/src/main/java/mekanism/common/tile/component/TileComponentEjector.java b/src/main/java/mekanism/common/tile/component/TileComponentEjector.java index 7ac35160c..f51e34d4e 100644 --- a/src/main/java/mekanism/common/tile/component/TileComponentEjector.java +++ b/src/main/java/mekanism/common/tile/component/TileComponentEjector.java @@ -1,29 +1,29 @@ package mekanism.common.tile.component; +import io.netty.buffer.ByteBuf; + import java.util.ArrayList; import java.util.List; import mekanism.api.Coord4D; import mekanism.api.EnumColor; +import mekanism.api.transmitters.TransmissionType; import mekanism.common.SideData; import mekanism.common.base.IEjector; -import mekanism.common.base.IInvConfiguration; import mekanism.common.base.ILogisticalTransporter; +import mekanism.common.base.ISideConfiguration; import mekanism.common.base.ITileComponent; import mekanism.common.content.transporter.TransporterManager; import mekanism.common.tile.TileEntityContainerBlock; import mekanism.common.util.InventoryUtils; import mekanism.common.util.MekanismUtils; import mekanism.common.util.TransporterUtils; - import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -import io.netty.buffer.ByteBuf; - public class TileComponentEjector implements ITileComponent, IEjector { public TileEntityContainerBlock tileEntity; @@ -91,11 +91,11 @@ public class TileComponentEjector implements ITileComponent, IEjector List outputSides = new ArrayList(); - IInvConfiguration configurable = (IInvConfiguration)tileEntity; + ISideConfiguration configurable = (ISideConfiguration)tileEntity; - for(int i = 0; i < configurable.getConfiguration().length; i++) + for(int i = 0; i < configurable.getConfig().getConfig(TransmissionType.ITEM).length; i++) { - if(configurable.getConfiguration()[i] == configurable.getSideData().indexOf(sideData)) + if(configurable.getConfig().getConfig(TransmissionType.ITEM)[i] == configurable.getConfig().getOutputs(TransmissionType.ITEM).indexOf(sideData)) { outputSides.add(ForgeDirection.getOrientation(MekanismUtils.getBaseOrientation(i, tileEntity.facing))); } diff --git a/src/main/java/mekanism/common/util/InventoryUtils.java b/src/main/java/mekanism/common/util/InventoryUtils.java index 119eb1a50..d355df309 100644 --- a/src/main/java/mekanism/common/util/InventoryUtils.java +++ b/src/main/java/mekanism/common/util/InventoryUtils.java @@ -2,7 +2,7 @@ package mekanism.common.util; import mekanism.api.EnumColor; import mekanism.api.util.StackUtils; -import mekanism.common.base.IInvConfiguration; +import mekanism.common.base.ISideConfiguration; import mekanism.common.content.transporter.Finder; import mekanism.common.content.transporter.InvStack; import mekanism.common.tile.TileEntityBin; @@ -366,9 +366,9 @@ public final class InventoryUtils return ((TileEntityLogisticalSorter)tileEntity).canSendHome(itemStack); } - if(!force && tileEntity instanceof IInvConfiguration) + if(!force && tileEntity instanceof ISideConfiguration) { - IInvConfiguration config = (IInvConfiguration)tileEntity; + ISideConfiguration config = (ISideConfiguration)tileEntity; int tileSide = config.getOrientation(); EnumColor configColor = config.getEjector().getInputColor(ForgeDirection.getOrientation(MekanismUtils.getBaseOrientation(side, tileSide)).getOpposite()); diff --git a/src/main/java/mekanism/common/util/MekanismUtils.java b/src/main/java/mekanism/common/util/MekanismUtils.java index 4dfd51254..c658ba429 100644 --- a/src/main/java/mekanism/common/util/MekanismUtils.java +++ b/src/main/java/mekanism/common/util/MekanismUtils.java @@ -23,6 +23,7 @@ import mekanism.api.MekanismConfig.client; import mekanism.api.MekanismConfig.general; import mekanism.api.gas.Gas; import mekanism.api.gas.GasStack; +import mekanism.api.transmitters.TransmissionType; import mekanism.api.util.UnitDisplayUtils; import mekanism.api.util.UnitDisplayUtils.ElectricUnit; import mekanism.api.util.UnitDisplayUtils.TemperatureUnit; @@ -39,9 +40,9 @@ import mekanism.common.Version; import mekanism.common.base.IActiveState; import mekanism.common.base.IFactory; import mekanism.common.base.IFactory.RecipeType; -import mekanism.common.base.IInvConfiguration; import mekanism.common.base.IModule; import mekanism.common.base.IRedstoneControl; +import mekanism.common.base.ISideConfiguration; import mekanism.common.base.IUpgradeTile; import mekanism.common.inventory.container.ContainerElectricChest; import mekanism.common.item.ItemBlockBasic; @@ -580,20 +581,21 @@ public final class MekanismUtils /** * Increments the output type of a machine's side. * @param config - configurable machine + * @param type - the TransmissionType to modify * @param side - side to increment output of */ - public static void incrementOutput(IInvConfiguration config, int side) + public static void incrementOutput(ISideConfiguration config, TransmissionType type, int side) { - int max = config.getSideData().size()-1; - int current = config.getSideData().indexOf(config.getSideData().get(config.getConfiguration()[side])); + int max = config.getConfig().getOutputs(type).size()-1; + int current = config.getConfig().getOutputs(type).indexOf(config.getConfig().getOutputs(type).get(config.getConfig().getConfig(type)[side])); if(current < max) { - config.getConfiguration()[side] = (byte)(current+1); + config.getConfig().getConfig(type)[side] = (byte)(current+1); } else if(current == max) { - config.getConfiguration()[side] = 0; + config.getConfig().getConfig(type)[side] = 0; } TileEntity tile = (TileEntity)config; @@ -605,20 +607,21 @@ public final class MekanismUtils /** * Decrements the output type of a machine's side. * @param config - configurable machine + * @param type - the TransmissionType to modify * @param side - side to increment output of */ - public static void decrementOutput(IInvConfiguration config, int side) + public static void decrementOutput(ISideConfiguration config, TransmissionType type, int side) { - int max = config.getSideData().size()-1; - int current = config.getSideData().indexOf(config.getSideData().get(config.getConfiguration()[side])); + int max = config.getConfig().getOutputs(type).size()-1; + int current = config.getConfig().getOutputs(type).indexOf(config.getConfig().getOutputs(type).get(config.getConfig().getConfig(type)[side])); if(current > 0) { - config.getConfiguration()[side] = (byte)(current-1); + config.getConfig().getConfig(type)[side] = (byte)(current-1); } else if(current == 0) { - config.getConfiguration()[side] = (byte)max; + config.getConfig().getConfig(type)[side] = (byte)max; } TileEntity tile = (TileEntity)config; diff --git a/src/main/resources/assets/mekanism/gui/GuiRobitMain.png b/src/main/resources/assets/mekanism/gui/GuiRobitMain.png index d1ffd3d842f7acc603a19e1088ba3bd24e57f3a9..a01146df77bf57477f6d35bfe67f3c1e45be3ff1 100644 GIT binary patch delta 1038 zcmV+p1o8XfSFKl&BYy+%X+uL$Nkc;*P;zf(X>4Tx062|}Ro!pfR1`mnZ(O7nKcKOW z4i$^9Ra0BJ8yc;~21%2p=|UR0&DbiW$#rfTQ`a`O(`{9s_5yDV_yd5l2Of}kLK+Oj z_Ok5(v`JGz71bo9J#^YYXp{DWs&KBaQ@dTpxRI}aIp=pi?|;!XK*v{_pO}_ARv`(`K_~P;r>1*Ox?C;-F2;pN*27;R!QM9q+Ux&wbylgT10KeMtdQo=mnqksdx=&F5&oys0TJd`E>GI|#kK((J)n0eU)DVBJ zYq?3pFC)I@_!%aD74f~sTqTWoFF^8{ntPr?L_-if$s_=TxZzG%&qCb(^K zdCoqnhMa4x{ z6hi)zV+ON`xsmg3L#>3I8=9NTb3f!hwJM>{)UK+QWxX9ld>D=;G@xL^4DLEuumLit zkcSMu9e;39Qv(A`lu*=Clo*MpVGd>OdF6n^am1Jntk;<}MrqIC5$=Q>n{*R}?8oOI zDUw5En2dl--Xw34!z7E+5pr%d2c?H4INKjdmEV*< zl@;X+<-BrtTbJ8*N%&OwR`^l)PWWE<8D!y-a9Q|CxFUQbT#TL7ym&1JoWQ-+)%LMCuYy_wP6ZWs zL5D3kvu*xEYtl=GNMYO54zpQqF~pph71JP#d&LoPNE~Olm7ll=btAavwoIM=mAd9q7A z>MqdgAh7QszoH+g!S^k(^Lixn-v&7J7v5PnBH45U;A;<{`?W~chj-$$p8;Grpf}uw z@Xk*pegW`m`}gsGT^YQaZZ(?^@V@H!1YqOiX7iurW^?09^uGph$@~{t0C9K{wF2RW Ivrz<)CyE6OjsO4v delta 1090 zcmV-I1ikyMSK(KXBYy-WX+uL$Nkc;*P;zf(X>4Tx05}naRo`#hR1`jmZ&IWdKOk5~ zhl<6oRa0BJ8yc;~21%2p?MfD<>DVeH9(p*dx19w`~g7O0}n_%Aq@s% zd)fBDv`JHkDym6Hd+5XuAtvnwRpGmKVkc9?T=n|PIo~$m6N9yl%7qB(zDb{1JtYOPA!qk%@Qub75C2T;T?(y%k7cw{!aEIzj}+@(TO5Y zz-|>CeHr)+QOwk9wo4Sh2mAPGw+7tv9PraN1Olr9mwlWPc+tlvJx(D%369Vz>lLjC zyaqhH*k&)cVSir(7|4_1Rc;%)B4&}Zt&(AK&*3kRaknx54=$T^^z2=OSo@r%xnsBw ziQX&rRKAHn*R}K<@Jp~?uenKKe+BrD`qF#?cpp*psgiwk-seYOU#%402HpjG(Qu~= zP5WwfF?$>svC;J<>zK$RIM;P&60@WifbUlLwAf?lk$1u(mFRYq89Q?S8HyrsX^MVnpsf`{W6(5UXREr zZM&7ilpo6ux^|%%%N9z;(dj0Ct!8>>5!%=VyPg-?ke}Vs>~sbgdDuU^Ixpr19NS&g zQew8Fz<)>RL_{M_7A<1csY*MfP@XcB#Jxr~JS8&7goVS)VKE|4(h_Xlc{z{c$ApZs z7riZ_QKdV_uW-M~u~8PF3UX~a6)MwxDE0Ha zPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiSBY#iOF*IB46Cei@XmvNzKBsGIKkN=X z$_Bgm&h5TyYjpf^^Nrn$ZO1mSZpOC4_}H(pE&Od#0y|)Oik6|u@OHupcq1J>TmjQ1 z4eM{2+Oeah>iL1tBPPK=$Ue-{x#7^N{-XY=Zm3_V7u4T7YJ?d(rX+nTeJlMa zeSar?Fa1o4bXmG0{UlwLzL72kIlJ$@pC#CPuU}yk-HKgk)oY(MCsR(!d*m18l>EH> zvOF8G6uDm>lc(gp@azfp%?$k=y%=-~vuaJXdoA$<7&H$h2Au}i##F_Gt8^Aw+nR IvmFGGC#mflcK`qY diff --git a/src/main/resources/assets/mekanism/gui/elements/GuiFluidsTab.png b/src/main/resources/assets/mekanism/gui/elements/GuiFluidsTab.png new file mode 100644 index 0000000000000000000000000000000000000000..2a1c1ad6454bc8252a820bb09e9f8cb742b18670 GIT binary patch literal 3435 zcmeH~`9IW)_s8F}5K@RimS!aT)?!P8v72i*gvPF9Qr2ROWpJ~Uy>Q(k?xif1v1W^L zzeJ_1V{0&$WH-hP#{O~tjql_Bbj}awyw2mi9?$c`d17mAc7{ic2LOOGXmewG005n& zAb^YWB)Eo@`2qlB17~Dpi#9Ss*oFl9;_lx80PVCi$H_pdgOL7{K-Uss{i5phv#=DB zBL>?fF802Q6aD=4lA&1B_c6tiFOLGmFr%6uh8{Q;Zi54P*^t_u&te-}CMGil9morp2wRF^fdJz7VcQAJ9N`JH438L!bAY+H}(>%*rUt z%e`?^io4H1j)f|H6KUP-stQ)^N-!Jg@R0gvO6$~*mE+JyH_J;QmtGm(chZf%z`(_3 zm*1%5Lrj_OZYaG5>UU62Y^YGf0-TS;u ziTHYH8@rXb$=HTpj8YRW-Umga(qMIc_c@!q*eEmFR!au{<;+-yizQ)ZWcrv>gq|3ov zScdkwIKT0ApFc`aO7}P$%0Hq~>+nnLC27Yu+#<_@9#RJf;eZn#Z#}7WVESpbPg?BKL<8{dj4Zb zIQ9=}7@F95B2=l8ScigCisV zL5oClFDm71txLd_&ip*s5F#b=lR&V!#NEc6!p2jNq#GALSQZ@R@%W{}NTG;49nH7j z2vYqKsA$5EyCQ34Yx%)xCn8*k?$cB&~FB z{`v(MpS!XjOrP`8KpBrpisy>et~-4RxFa{Sc$@ir>R$BVYm7FyFblQQ_|7b%vC5m) z6e<_Fz3Q^PF)g2xfs=Ha3A@oF`&>E2X8k7>N32H_Sm#PgAiu`!GF~oA1%shs{K=f2 zF1v-uh#I4t3pciwhRpm0O(B%8*x0a^9ILL{cSGN?kL}saHTdg1D=>7K-+81)R*@*A zt+& zZU8&(NqWwAc-MvGR7vS(#vi1Xu>~%EkBZ5*l4Jhu<-EG}2N2f`&6SRAzItG*cV)pw zO7YlFyGLo;+lF-{V2}JDZKW={Kf34AFq+~927xtrvMX+?iAfefRHdPc&!9+Td2e1u@nC60^zz{lhcR-5+nWu?`3NES z5w_%iD};!eJtE*u{+vj?LYQt$b@68DC|$V}QoA&p|Jymc6VHVF>OhOXEYc^}y~p4U z`(KTYmmhV?BLP~W|zB(p%M44=)@?(yjPbah1HdP*9>kZ8V;+Wj(I^Z(lrML8$igg_r zJY9C2e4JX-(b0kFUPYihwcd5VLxuWB`{GE_f z;v}y5fp+vKk0=FsQ|{s!7XFB~sob7(KwtP<6-gpBFNyFSl(azSX1qpd``)`%{dbIZqrgsf|Mo1v+uEKcRz7LJs}xio4${MFaL5Ij zK*c0M6J+AC5LTIGve@MlFK%dg#{DBcOBcW4X~fgQ%|B-98Ty_o+Yp-1+??;JFSm{n zC@WAqXKnrckk%U6u#LQNQsZ94P(V4bC@ZDj-Iy2#f%(g-S}EG%GT~^7K?m^XF5@EP zYzy0e2%xt9h+5ujtQ&;q=!nHRG)W)V?ZK(#HQnZjb>YspQOLm)d{NWN zy`QDFReiF7Xy*j7p`B?K`Pm8R6OM zrkyXlAb6r58Mi6qx$mks`%RRiQ+*n#OGpI|)5i^B+XKL98NlF#{v^kk!vRHml};ByTY@yv<2EO<7C6A$y71Me#m<38 zE5Xs#q*K}$BCx`-G~!h~1P4R!!A`i8C-M~`#mr$R``?mFt`pEYCT-DNeWAJFG);iy zLGGO*6Uhfb;!rNv%61d|158_U^DFiHHQ(kpsj{e800f3|@gx3A{xjh}68^tjL3<92 a4No$B3;86>dHUpu0?;Pb#+8Pi@&5zvRUO3u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/mekanism/gui/elements/GuiGasesTab.png b/src/main/resources/assets/mekanism/gui/elements/GuiGasesTab.png new file mode 100644 index 0000000000000000000000000000000000000000..2bac68734d3d53630bf382d95aa8ea4348643e25 GIT binary patch literal 3440 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 Yz$IR`@UGRxBLx5;?wIJ+>A1xH11aJw3IG5A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/mekanism/gui/elements/GuiHeatTab.png b/src/main/resources/assets/mekanism/gui/elements/GuiHeatTab.png index ca54790d665541919a89398ea940f53c5ad08e9c..691a64f26cefca23461fead2ca6ea9beb8bf23b8 100644 GIT binary patch literal 3580 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 E0Nsd)$p8QV literal 2598 zcmds1i8I@Y7ym|)7Ny6Qx~eT*gpFFXG%74wLaL3TRYzCVv5vTpI-;vfvC0y(?owBj zI)ZhERY!_Cf)Gc7O4>#!AqiQs`uj6}@0j=IGxKKNXWpAn((PL}kBiBP0RV8^(!vY{ z0HDJb1RNDTEKWg{9sqD;+uPLiwxy}*`P)Hg4{zVc01!b*#g3wXczkvM-p>B`_Lx4{ z7L?MH1dmJqrTJmHs7ZMHQ1k5}k2$xwmoHgsa|`vP+0BC4E#>Qhv_-gst+!V#`v&$Ar80EZWy$_Z!JcnaI!W8?6+0K?u5zH#*NZ5jp^4! z+kE&C;T7pRhS%rB^hoK?sFl;1=|myt9W^N6Y-F1xznE(R+)7b zK3A3kLbBedW<7e4g<6DE)A1`Go-GVG2}X68&DlFwKtA!W{xa>hw@~z{e2P%OxH+UK zcc-McttIY?)ybkTc#r;|?kg5>y&B0s&3W6^s&b`hA?A7K;D36?^)dhC$r&k3m5&bV zO4+#$KZboS5-v>K9!XG8NdDJr(*5<(?YQQuak=NaP4PYR7J;uAW~CVYLbFQ3F%p*87~S0{0Qn08B!af4Ot%qQH%l2Qj^G$Gi* zM@yw%Kc~i99ZO0yTY6LIF6w#4Nj52YMY80@`$s4Li0>5p5%ss?qg=Pn!DQ!)8l2<{ z^)_oKW9}{MZMMy5iCxs#d%qawXYd+*hY^;?aCWrNgeY9Vw6!-im4>4_Su+l|79xw= zcAtB;uBjS;gghvNEaHLI2&UzAZ=iF26q7=+Vk^YXNAEn?D~WX`lu^fIt{vTXh%s>; zL#OxlmA!D6PKr-dvCy~R1b}kVAyC57xHawE?R?Iy@NoY%jf(X_Zo9e#rhR_X zdp$P&23w@@p^;~oyJRSDc*oXnbK^5I zX)97JjMGn7l3cWTW7F#=qs-^Z?&yl$kQ|!v*p}_=H&G^UdirXM-6*Q>Q!}ayOWZ9yhO@H*|oY7$LYw@Djqi&|zg*saq?A$ne z4|BPFQbHWMgVZ;$wrozpQ%X)FOvBotYo1En%Z!dr$Q8VOL(*QkpFnuz#-Th9BS% z*+X<)@yaG?C)BZkkNbSC)~6hJ%-(kAi^98hS*tDuwel$PB|Ez^Z^Yg~Z}H_9kNN`< z)YR7DQzAyY5;O!fjQ(3xR7wbQb34M4H0hmttvb_)q+5oCAZ;sfIECnD3sSSAc$fhY z!bBdsjI^Xm-PdH28fXg!DXZnAq9zxvY@&%z4-_01R)1W$*NNQXSAfdc=-Ry)19!(@ zw2K;%{OS)Ml-8mFi;Q2-lJI%NE*$001Lv!s*o5c;)ifpdrmqvap&Tjcyp3togxE<` z9TQaS{WE!|EMIAgz^A9E5aEIY+OVNXUSGql1?*dUjT(`51)yJ>Ell;SP>!~{WOEL# zAHMkYjTKeu3;)6)TR)~|j#Z6_%yl)_P@obASPLYFwk^S|$qHEXq8(zObQJ%b(C^GsK-a-mFeZ?PWdLzDxhLS}Ha`b*E3%svU_CAdO@m!$^lidtEl_b617*WCu3mi|aSb@3Z6t64;_DOkCt6Tzz7B}yrW1$5;l6wBzQPEA>l$a~`?n61@+%6E%(kIkh-k zYb^$2FPN%!u*@heE!~|7YPBZmRxz(JcO3usv?KCQuS)UPSS&yPVr)n3{@#3K3>95? zMqhC^ubjBN{R%`|W&pLi;xEh9RaI3Ph^N7KzHIY0Hv^?p`Z^%MT7c-c2mT9fdYG=j zmHzy7t(>8^_SJ`xpP%pb)69+pZLN}k+>uE!_h0NVzz_;{waPxxXy+}lK!CH5F-e#0 zi&0;lpQbfd9bA^U0`!E60UO~QRs*ehg%G7Y<`H>&Uy7^(C@3nfvgTS2zJ9|jLt18# ku!zw^sr!GmqGtk-ir!ZQ?zj5q-#J>E-!iNH<>BxD0fyPshX4Qo diff --git a/src/main/resources/assets/mekanism/gui/elements/GuiItemsTab.png b/src/main/resources/assets/mekanism/gui/elements/GuiItemsTab.png new file mode 100644 index 0000000000000000000000000000000000000000..795251c4b5ac1fcfafc5c34cbcc2d729a2c4fd1c GIT binary patch literal 3341 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/mekanism/textures/blocks/overlay/ItemsOverlay.png b/src/main/resources/assets/mekanism/textures/blocks/overlay/ItemsOverlay.png new file mode 100644 index 0000000000000000000000000000000000000000..e29835979995014ba8b0b7538f7384f3f36d947c GIT binary patch literal 1250 zcmV<81ReW{P)4Tx062|}Ro!pfR1`mnZ(O7nKcKOW4i$^9Ra0BJ8yc;~21%2p=|UR0&DbiW z$#rfTQ`a`O(`{9s_5yDV_yd5l2Of}kLK+Oj_Ok5(v`JGz71bo9J#^YYXp{DWs&KBa zQ@dTpxRI}aIp=pi@6k0t$5)!;m`NF6-tt{FpOKHBn3g+MAqmexC-gw4rh87hTrL7G z#)U`L!(So6-Zux@>;H3gR;i~0B%VTSS3P|m@o9jRsXML@Al^p#@G0Lx-0?i(9WEw_ zSYddU<1E8793KxjQ|c&UmW!mTC>k>?{om1c9S zUx<6_jj_!T&^M{wWM#>IBbOSf*xP<^F{$j$aOQ5Y{cT zROCL1M7^NKKL z&(yA}mSw#iM0^;IB{ZO5!wl{^Sg-*ysE~&Yz8!E;Qv(A`lu*=Clo*MpVGd>OdF6n^ zam1Jntk;<}MrqIC5$=Q>n{*R}?8oOIDUw5En2dl--Xw34!z7E+5pr-OgyQ-soSab)C%saskMla`aQLVzg0+MZf20tJU&K{hZoBrUc+U4e9&3o zw|KmGEe4#xz17wBu{f`SS_4i66?j31EjY7n{zGfhONK~c+td!TS#B}JoR}5UAd7p& z5phTyXSkK0xCeD3xaYP^o&J~#Xp9xFb0C;HHml5fA<%h1eR|qw7wxF+oNL9T1Aits?sKNIwvGaN)^WO$I^cUV)HzL_| z1K?{9p!>B*)`xfEv!4N6IG{J&h49W#Bz^(#YWw%`e_a{8n{G9m5AeR~_yl0%<7V@p zbROeu@?Nj$FXw4Y2+&UicIrzriu!2cXzII%Q_#?*IS* M07*qoM6N<$f(wOVGXMYp literal 0 HcmV?d00001