From e7a31005bc867372a638c723c5b670161cb4139a Mon Sep 17 00:00:00 2001 From: Aidan Brady Date: Mon, 22 Apr 2013 20:14:00 -0400 Subject: [PATCH] v5.5.4 Release *New texture for the Pressurized Tube. *Gas is now displayed in Pressurized Tubes. *Updated GasTransferProtocol for new standards. *FINALLY THE RELEASE! WOOHOO! --- .../mods/mekanism/render/PressurizedTube.png | Bin 13703 -> 15495 bytes .../textures/items/LiquidHydrogen.png | Bin 0 -> 9895 bytes .../textures/items/LiquidHydrogen.txt | 32 +++ .../mekanism/textures/items/LiquidOxygen.png | Bin 0 -> 14326 bytes .../mekanism/textures/items/LiquidOxygen.txt | 32 +++ src/minecraft/mekanism/api/EnumGas.java | 19 +- .../mekanism/api/GasTransferProtocol.java | 31 ++- .../mekanism/api/IPressurizedTube.java | 6 + .../client/RenderPressurizedTube.java | 239 +++++++++++++++++- .../mekanism/client/RenderUniversalCable.java | 6 +- .../mekanism/common/BlockTransmitter.java | 2 +- .../common/EnergyTransferProtocol.java | 3 +- .../mekanism/common/EnumPacketType.java | 5 +- .../common/LiquidTransferProtocol.java | 9 +- src/minecraft/mekanism/common/Mekanism.java | 21 ++ .../mekanism/common/PacketHandler.java | 57 ++++- .../common/TileEntityMechanicalPipe.java | 9 +- .../common/TileEntityPressurizedTube.java | 38 ++- .../common/TileEntityUniversalCable.java | 15 +- .../mekanism/nei/NEIMekanismConfig.java | 2 + 20 files changed, 490 insertions(+), 36 deletions(-) create mode 100644 bin/minecraft/mods/mekanism/textures/items/LiquidHydrogen.png create mode 100644 bin/minecraft/mods/mekanism/textures/items/LiquidHydrogen.txt create mode 100644 bin/minecraft/mods/mekanism/textures/items/LiquidOxygen.png create mode 100644 bin/minecraft/mods/mekanism/textures/items/LiquidOxygen.txt diff --git a/bin/minecraft/mods/mekanism/render/PressurizedTube.png b/bin/minecraft/mods/mekanism/render/PressurizedTube.png index 011001f2e9decfabd493ec7bc24152d2dfcf5e2d..f0aebe3a20dc90845bb5aa02218e6f28dc02c102 100644 GIT binary patch literal 15495 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 literal 13703 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 Z2LSha><2>(nvMVf002ovPDHLkV1i>=-tGVZ literal 0 HcmV?d00001 diff --git a/bin/minecraft/mods/mekanism/textures/items/LiquidHydrogen.txt b/bin/minecraft/mods/mekanism/textures/items/LiquidHydrogen.txt new file mode 100644 index 000000000..0af6f629f --- /dev/null +++ b/bin/minecraft/mods/mekanism/textures/items/LiquidHydrogen.txt @@ -0,0 +1,32 @@ +0*2 +1*2 +2*2 +3*2 +4*2 +5*2 +6*2 +7*2 +8*2 +9*2 +10*2 +11*2 +12*2 +13*2 +14*2 +15*2 +16*2 +17*2 +18*2 +19*2 +20*2 +21*2 +22*2 +23*2 +24*2 +25*2 +26*2 +27*2 +28*2 +29*2 +30*2 +31*2 \ No newline at end of file diff --git a/bin/minecraft/mods/mekanism/textures/items/LiquidOxygen.png b/bin/minecraft/mods/mekanism/textures/items/LiquidOxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..8ace07917702d94045d050d8ce9cbb79ebc7b574 GIT binary patch literal 14326 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 literal 0 HcmV?d00001 diff --git a/bin/minecraft/mods/mekanism/textures/items/LiquidOxygen.txt b/bin/minecraft/mods/mekanism/textures/items/LiquidOxygen.txt new file mode 100644 index 000000000..0af6f629f --- /dev/null +++ b/bin/minecraft/mods/mekanism/textures/items/LiquidOxygen.txt @@ -0,0 +1,32 @@ +0*2 +1*2 +2*2 +3*2 +4*2 +5*2 +6*2 +7*2 +8*2 +9*2 +10*2 +11*2 +12*2 +13*2 +14*2 +15*2 +16*2 +17*2 +18*2 +19*2 +20*2 +21*2 +22*2 +23*2 +24*2 +25*2 +26*2 +27*2 +28*2 +29*2 +30*2 +31*2 \ No newline at end of file diff --git a/src/minecraft/mekanism/api/EnumGas.java b/src/minecraft/mekanism/api/EnumGas.java index b43edfb30..aa133036a 100644 --- a/src/minecraft/mekanism/api/EnumGas.java +++ b/src/minecraft/mekanism/api/EnumGas.java @@ -1,5 +1,7 @@ package mekanism.api; +import net.minecraft.item.Item; + /** * The gasses currently available in Mekanism. * @author AidanBrady @@ -7,11 +9,13 @@ package mekanism.api; */ public enum EnumGas { - NONE("None"), - OXYGEN("Oxygen"), - HYDROGEN("Hydrogen"); + NONE("None", null, null), + OXYGEN("Oxygen", null, null), + HYDROGEN("Hydrogen", null, null); public String name; + public Item gasItem; + public String texturePath; public static EnumGas getFromName(String gasName) { @@ -27,8 +31,15 @@ public enum EnumGas return NONE; } - private EnumGas(String s) + public boolean hasTexture() + { + return gasItem != null && texturePath != null; + } + + private EnumGas(String s, Item item, String path) { name = s; + gasItem = item; + texturePath = path; } } diff --git a/src/minecraft/mekanism/api/GasTransferProtocol.java b/src/minecraft/mekanism/api/GasTransferProtocol.java index 82444b94e..4c39f3ee2 100644 --- a/src/minecraft/mekanism/api/GasTransferProtocol.java +++ b/src/minecraft/mekanism/api/GasTransferProtocol.java @@ -4,6 +4,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import cpw.mods.fml.common.FMLCommonHandler; + +import mekanism.common.PacketHandler; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; @@ -70,7 +73,10 @@ public class GasTransferProtocol } } - iteratedTubes.add(tile); + if(!iteratedTubes.contains(tile)) + { + iteratedTubes.add(tile); + } TileEntity[] tubes = GasTransmission.getConnectedTubes(tile); @@ -86,6 +92,22 @@ public class GasTransferProtocol } } + /** + * Updates the client-side tubes for rendering. + */ + public void clientUpdate() + { + loopThrough(pointer); + + for(TileEntity tileEntity : iteratedTubes) + { + if(tileEntity instanceof IPressurizedTube) + { + ((IPressurizedTube)tileEntity).onTransfer(transferType); + } + } + } + /** * Runs the protocol and distributes the gas. * @return rejected gas @@ -96,6 +118,8 @@ public class GasTransferProtocol Collections.shuffle(availableAcceptors); + int prevSending = gasToSend; + if(!availableAcceptors.isEmpty()) { int divider = availableAcceptors.size(); @@ -116,6 +140,11 @@ public class GasTransferProtocol } } + if(prevSending > gasToSend && FMLCommonHandler.instance().getEffectiveSide().isServer()) + { + PacketHandler.sendGasTransferUpdate(pointer, transferType); + } + return gasToSend; } } diff --git a/src/minecraft/mekanism/api/IPressurizedTube.java b/src/minecraft/mekanism/api/IPressurizedTube.java index eebb07cb7..8d603993f 100644 --- a/src/minecraft/mekanism/api/IPressurizedTube.java +++ b/src/minecraft/mekanism/api/IPressurizedTube.java @@ -9,4 +9,10 @@ public interface IPressurizedTube * @return if the tube can transfer gas */ public boolean canTransferGas(TileEntity fromTile); + + /** + * Called when a gas is transferred through this tube. + * @param type - the type of gas transferred + */ + public void onTransfer(EnumGas type); } diff --git a/src/minecraft/mekanism/client/RenderPressurizedTube.java b/src/minecraft/mekanism/client/RenderPressurizedTube.java index d985ed0ec..d22eeee6d 100644 --- a/src/minecraft/mekanism/client/RenderPressurizedTube.java +++ b/src/minecraft/mekanism/client/RenderPressurizedTube.java @@ -1,25 +1,36 @@ package mekanism.client; import java.util.Arrays; +import java.util.HashMap; + +import mekanism.api.EnumGas; +import mekanism.api.GasTransmission; +import mekanism.api.ITubeConnection; +import mekanism.client.ObjectRenderer.Object3D; +import mekanism.common.TileEntityPressurizedTube; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; import org.lwjgl.opengl.GL11; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import net.minecraftforge.common.ForgeDirection; - -import mekanism.api.GasTransmission; -import mekanism.api.ITubeConnection; -import mekanism.common.TileEntityPressurizedTube; -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.tileentity.TileEntity; - @SideOnly(Side.CLIENT) public class RenderPressurizedTube extends TileEntitySpecialRenderer { private ModelTransmitter model = new ModelTransmitter(); + private HashMap> cachedGasses = new HashMap>(); + + private static final int stages = 40; + + private static final double offset = 0.015; + @Override public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float partialTick) { @@ -33,6 +44,8 @@ public class RenderPressurizedTube extends TileEntitySpecialRenderer GL11.glTranslatef((float)x + 0.5F, (float)y + 1.5F, (float)z + 0.5F); GL11.glScalef(1.0F, -1F, -1F); + boolean[] connectable = new boolean[] {false, false, false, false, false, false}; + ITubeConnection[] connections = GasTransmission.getConnections(tileEntity); for(ITubeConnection connection : connections) @@ -43,12 +56,220 @@ public class RenderPressurizedTube extends TileEntitySpecialRenderer if(connection.canTubeConnect(ForgeDirection.getOrientation(side).getOpposite())) { - model.renderSide(ForgeDirection.getOrientation(side)); + connectable[side] = true; } } } + for(int i = 0; i < 6; i++) + { + if(connectable[i]) + { + model.renderSide(ForgeDirection.getOrientation(i)); + } + } + model.Center.render(0.0625F); GL11.glPopMatrix(); + + if(tileEntity.gasScale > 0 && tileEntity.refGas != null && tileEntity.refGas.hasTexture()) + { + GL11.glPushMatrix(); + GL11.glDisable(2896); + bindTextureByName(tileEntity.refGas.texturePath); + GL11.glTranslatef((float)x, (float)y, (float)z); + + for(int i = 0; i < 6; i++) + { + if(connectable[i]) + { + int[] displayList = getListAndRender(ForgeDirection.getOrientation(i), tileEntity.refGas, tileEntity.worldObj); + GL11.glCallList(displayList[Math.max(3, (int)((float)tileEntity.gasScale*(stages-1)))]); + } + } + + int[] displayList = getListAndRender(ForgeDirection.UNKNOWN, tileEntity.refGas, tileEntity.worldObj); + GL11.glCallList(displayList[Math.max(3, (int)((float)tileEntity.gasScale*(stages-1)))]); + + GL11.glEnable(2896); + GL11.glPopMatrix(); + } + } + + private int[] getListAndRender(ForgeDirection side, EnumGas type, World world) + { + if(cachedGasses.containsKey(side) && cachedGasses.get(side).containsKey(type)) + { + return cachedGasses.get(side).get(type); + } + + Object3D toReturn = new Object3D(); + toReturn.baseBlock = Block.waterStill; + toReturn.texture = type.gasItem.getIconFromDamage(0); + + int[] displays = new int[stages]; + + if(cachedGasses.containsKey(side)) + { + cachedGasses.get(side).put(type, displays); + } + else { + HashMap map = new HashMap(); + map.put(type, displays); + cachedGasses.put(side, map); + } + + switch(side) + { + case UNKNOWN: + { + for(int i = 0; i < stages; i++) + { + displays[i] = GLAllocation.generateDisplayLists(1); + GL11.glNewList(displays[i], 4864); + + toReturn.minX = 0.3 + offset; + toReturn.minY = 0.3 + offset; + toReturn.minZ = 0.3 + offset; + + toReturn.maxX = 0.7 - offset; + toReturn.maxY = 0.3 - offset + ((float)i / (float)100); + toReturn.maxZ = 0.7 - offset; + + ObjectRenderer.renderObject(toReturn, world, 0, 0, 0, false, true); + GL11.glEndList(); + } + + return displays; + } + case DOWN: + { + for(int i = 0; i < stages; i++) + { + displays[i] = GLAllocation.generateDisplayLists(1); + GL11.glNewList(displays[i], 4864); + + toReturn.minX = 0.5 + offset - ((float)i / (float)100)/2; + toReturn.minY = 0.0; + toReturn.minZ = 0.5 + offset - ((float)i / (float)100)/2; + + toReturn.maxX = 0.5 - offset + ((float)i / (float)100)/2; + toReturn.maxY = 0.3 + offset; + toReturn.maxZ = 0.5 - offset + ((float)i / (float)100)/2; + + ObjectRenderer.renderObject(toReturn, world, 0, 0, 0, false, true); + GL11.glEndList(); + } + + return displays; + } + case UP: + { + for(int i = 0; i < stages; i++) + { + displays[i] = GLAllocation.generateDisplayLists(1); + GL11.glNewList(displays[i], 4864); + + toReturn.minX = 0.5 + offset - ((float)i / (float)100)/2; + toReturn.minY = 0.3 - offset + ((float)i / (float)100); + toReturn.minZ = 0.5 + offset - ((float)i / (float)100)/2; + + toReturn.maxX = 0.5 - offset + ((float)i / (float)100)/2; + toReturn.maxY = 1.0; + toReturn.maxZ = 0.5 - offset + ((float)i / (float)100)/2; + + ObjectRenderer.renderObject(toReturn, world, 0, 0, 0, false, true); + GL11.glEndList(); + } + + return displays; + } + case NORTH: + { + for(int i = 0; i < stages; i++) + { + displays[i] = GLAllocation.generateDisplayLists(1); + GL11.glNewList(displays[i], 4864); + + toReturn.minX = 0.3 + offset; + toReturn.minY = 0.3 + offset; + toReturn.minZ = 0.0; + + toReturn.maxX = 0.7 - offset; + toReturn.maxY = 0.3 - offset + ((float)i / (float)100); + toReturn.maxZ = 0.3 + offset; + + ObjectRenderer.renderObject(toReturn, world, 0, 0, 0, false, true); + GL11.glEndList(); + } + + return displays; + } + case SOUTH: + { + for(int i = 0; i < stages; i++) + { + displays[i] = GLAllocation.generateDisplayLists(1); + GL11.glNewList(displays[i], 4864); + + toReturn.minX = 0.3 + offset; + toReturn.minY = 0.3 + offset; + toReturn.minZ = 0.7 - offset; + + toReturn.maxX = 0.7 - offset; + toReturn.maxY = 0.3 - offset + ((float)i / (float)100); + toReturn.maxZ = 1.0; + + ObjectRenderer.renderObject(toReturn, world, 0, 0, 0, false, true); + GL11.glEndList(); + } + + return displays; + } + case WEST: + { + for(int i = 0; i < stages; i++) + { + displays[i] = GLAllocation.generateDisplayLists(1); + GL11.glNewList(displays[i], 4864); + + toReturn.minX = 0.0; + toReturn.minY = 0.3 + offset; + toReturn.minZ = 0.3 + offset; + + toReturn.maxX = 0.3 + offset; + toReturn.maxY = 0.3 - offset + ((float)i / (float)100); + toReturn.maxZ = 0.7 - offset; + + ObjectRenderer.renderObject(toReturn, world, 0, 0, 0, false, true); + GL11.glEndList(); + } + + return displays; + } + case EAST: + { + for(int i = 0; i < stages; i++) + { + displays[i] = GLAllocation.generateDisplayLists(1); + GL11.glNewList(displays[i], 4864); + + toReturn.minX = 0.7 - offset; + toReturn.minY = 0.3 + offset; + toReturn.minZ = 0.3 + offset; + + toReturn.maxX = 1.0; + toReturn.maxY = 0.3 - offset + ((float)i / (float)100); + toReturn.maxZ = 0.7 - offset; + + ObjectRenderer.renderObject(toReturn, world, 0, 0, 0, false, true); + GL11.glEndList(); + } + + return displays; + } + } + + return null; } } diff --git a/src/minecraft/mekanism/client/RenderUniversalCable.java b/src/minecraft/mekanism/client/RenderUniversalCable.java index 89e0c0ba9..ad4a0e4cb 100644 --- a/src/minecraft/mekanism/client/RenderUniversalCable.java +++ b/src/minecraft/mekanism/client/RenderUniversalCable.java @@ -92,7 +92,7 @@ public class RenderUniversalCable extends TileEntitySpecialRenderer model.Center.render(0.0625F); GL11.glPopMatrix(); - if(tileEntity.liquidScale > 0) + if(tileEntity.energyScale > 0) { GL11.glPushMatrix(); GL11.glDisable(2896); @@ -104,12 +104,12 @@ public class RenderUniversalCable extends TileEntitySpecialRenderer if(connectable[i]) { int[] displayList = getListAndRender(ForgeDirection.getOrientation(i), tileEntity.worldObj); - GL11.glCallList(displayList[Math.max(3, (int)((float)tileEntity.liquidScale*(stages-1)))]); + GL11.glCallList(displayList[Math.max(3, (int)((float)tileEntity.energyScale*(stages-1)))]); } } int[] displayList = getListAndRender(ForgeDirection.UNKNOWN, tileEntity.worldObj); - GL11.glCallList(displayList[Math.max(3, (int)((float)tileEntity.liquidScale*(stages-1)))]); + GL11.glCallList(displayList[Math.max(3, (int)((float)tileEntity.energyScale*(stages-1)))]); GL11.glEnable(2896); GL11.glPopMatrix(); diff --git a/src/minecraft/mekanism/common/BlockTransmitter.java b/src/minecraft/mekanism/common/BlockTransmitter.java index 4ad89b23c..39ab649e9 100644 --- a/src/minecraft/mekanism/common/BlockTransmitter.java +++ b/src/minecraft/mekanism/common/BlockTransmitter.java @@ -66,7 +66,7 @@ public class BlockTransmitter extends Block } else if(tileEntity instanceof TileEntityUniversalCable) { - return (int)(((TileEntityUniversalCable)tileEntity).liquidScale*15F); + return (int)(((TileEntityUniversalCable)tileEntity).energyScale*15F); } return 0; diff --git a/src/minecraft/mekanism/common/EnergyTransferProtocol.java b/src/minecraft/mekanism/common/EnergyTransferProtocol.java index a29e0508d..2c82f0c88 100644 --- a/src/minecraft/mekanism/common/EnergyTransferProtocol.java +++ b/src/minecraft/mekanism/common/EnergyTransferProtocol.java @@ -162,7 +162,6 @@ public class EnergyTransferProtocol Collections.shuffle(availableAcceptors); - double prevNeeded = neededEnergy(); double prevSending = energyToSend; if(!availableAcceptors.isEmpty()) @@ -202,7 +201,7 @@ public class EnergyTransferProtocol } } - if(prevNeeded > 0 && prevSending > 0 && FMLCommonHandler.instance().getEffectiveSide().isServer()) + if(prevSending > energyToSend && FMLCommonHandler.instance().getEffectiveSide().isServer()) { PacketHandler.sendEnergyTransferUpdate(pointer); } diff --git a/src/minecraft/mekanism/common/EnumPacketType.java b/src/minecraft/mekanism/common/EnumPacketType.java index df5d081f4..d370f7351 100644 --- a/src/minecraft/mekanism/common/EnumPacketType.java +++ b/src/minecraft/mekanism/common/EnumPacketType.java @@ -60,8 +60,11 @@ public enum EnumPacketType /** Used to send an energy transfer update packet to all clients. */ ENERGY_TRANSFER_UPDATE(16), + /** Used to send a gas transfer update packet to all clients. */ + GAS_TRANSFER_UPDATE(17), + /** Used to send an electrolytic separator particle to all clients. */ - ELECTROLYTIC_SEPARATOR_PARTICLE(17), + ELECTROLYTIC_SEPARATOR_PARTICLE(18), /** A custom packet type. Handled in PacketHandler. */ CUSTOM(-1); diff --git a/src/minecraft/mekanism/common/LiquidTransferProtocol.java b/src/minecraft/mekanism/common/LiquidTransferProtocol.java index 525679d4a..90cdd90fe 100644 --- a/src/minecraft/mekanism/common/LiquidTransferProtocol.java +++ b/src/minecraft/mekanism/common/LiquidTransferProtocol.java @@ -126,7 +126,10 @@ public class LiquidTransferProtocol } } - iteratedPipes.add(tile); + if(!iteratedPipes.contains(tile)) + { + iteratedPipes.add(tile); + } TileEntity[] pipes = PipeUtils.getConnectedPipes(tile); @@ -146,7 +149,7 @@ public class LiquidTransferProtocol * Updates the client-side pipes for rendering. * @param transferred - the LiquidStack of server-side transferred liquid */ - public void clientUpdate(LiquidStack transferred) + public void clientUpdate() { loopThrough(pointer); @@ -154,7 +157,7 @@ public class LiquidTransferProtocol { if(tileEntity instanceof IMechanicalPipe) { - ((IMechanicalPipe)tileEntity).onTransfer(transferred); + ((IMechanicalPipe)tileEntity).onTransfer(liquidToSend); } } } diff --git a/src/minecraft/mekanism/common/Mekanism.java b/src/minecraft/mekanism/common/Mekanism.java index 3d6a4923d..4505d2f90 100644 --- a/src/minecraft/mekanism/common/Mekanism.java +++ b/src/minecraft/mekanism/common/Mekanism.java @@ -9,6 +9,7 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; +import mekanism.api.EnumGas; import mekanism.api.InfuseObject; import mekanism.api.InfusionInput; import mekanism.api.InfusionType; @@ -127,6 +128,8 @@ public class Mekanism public static Item TeleportationCore; public static Item Configurator; public static Item LiquidEnergy; + public static Item LiquidHydrogen; + public static Item LiquidOxygen; //Blocks public static Block BasicBlock; @@ -431,6 +434,8 @@ public class Mekanism LanguageRegistry.addName(TeleportationCore, "Teleportation Core"); LanguageRegistry.addName(Configurator, "Configurator"); LanguageRegistry.addName(LiquidEnergy, "Liquid Energy"); + LanguageRegistry.addName(LiquidHydrogen, "Liquid Hydrogen"); + LanguageRegistry.addName(LiquidOxygen, "Liquid Oxygen"); //Localization for BasicBlock LanguageRegistry.instance().addStringLocalization("tile.BasicBlock.OsmiumBlock.name", "Osmium Block"); @@ -545,6 +550,8 @@ public class Mekanism Clump = new ItemClump(configuration.getItem("Clump", 11219).getInt()-256); DirtyDust = new ItemDirtyDust(configuration.getItem("DirtyDust", 11220).getInt()-256); Configurator = new ItemConfigurator(configuration.getItem("Configurator", 11221).getInt()).setUnlocalizedName("Configurator"); + LiquidHydrogen = new ItemMekanism(configuration.getItem("LiquidHydrogen", 11222).getInt()).setUnlocalizedName("LiquidHydrogen").setCreativeTab(null); + LiquidOxygen = new ItemMekanism(configuration.getItem("LiquidOxygen", 11223).getInt()).setUnlocalizedName("LiquidOxygen").setCreativeTab(null); configuration.save(); //Registrations @@ -574,6 +581,8 @@ public class Mekanism GameRegistry.registerItem(Clump, "Clump"); GameRegistry.registerItem(DirtyDust, "DirtyDust"); GameRegistry.registerItem(Configurator, "Configurator"); + GameRegistry.registerItem(LiquidHydrogen, "LiquidHydrogen"); + GameRegistry.registerItem(LiquidOxygen, "LiquidOxygen"); } /** @@ -1001,6 +1010,18 @@ public class Mekanism hooks.hook(); addIntegratedItems(); + if(!EnumGas.HYDROGEN.hasTexture()) + { + EnumGas.HYDROGEN.gasItem = LiquidHydrogen; + EnumGas.HYDROGEN.texturePath = "/mods/mekanism/textures/items/LiquidHydrogen.png"; + } + + if(!EnumGas.OXYGEN.hasTexture()) + { + EnumGas.OXYGEN.gasItem = LiquidOxygen; + EnumGas.OXYGEN.texturePath = "/mods/mekanism/textures/items/LiquidOxygen.png"; + } + System.out.println("[Mekanism] Hooking complete."); proxy.loadSoundHandler(); diff --git a/src/minecraft/mekanism/common/PacketHandler.java b/src/minecraft/mekanism/common/PacketHandler.java index fa45bede5..3b78a1628 100644 --- a/src/minecraft/mekanism/common/PacketHandler.java +++ b/src/minecraft/mekanism/common/PacketHandler.java @@ -9,6 +9,8 @@ import java.util.Random; import universalelectricity.core.electricity.ElectricityPack; import universalelectricity.core.item.IItemElectric; +import mekanism.api.EnumGas; +import mekanism.api.GasTransferProtocol; import mekanism.generators.common.TileEntityElectrolyticSeparator; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -403,7 +405,7 @@ public class PacketHandler implements IPacketHandler if(tileEntity != null) { - new LiquidTransferProtocol(tileEntity, null, liquidStack).clientUpdate(liquidStack); + new LiquidTransferProtocol(tileEntity, null, liquidStack).clientUpdate(); } } catch(Exception e) { System.err.println("[Mekanism] Error while handling liquid transfer update packet."); @@ -428,6 +430,26 @@ public class PacketHandler implements IPacketHandler e.printStackTrace(); } } + else if(packetType == EnumPacketType.GAS_TRANSFER_UPDATE.id) + { + try { + int x = dataStream.readInt(); + int y = dataStream.readInt(); + int z = dataStream.readInt(); + + EnumGas type = EnumGas.getFromName(dataStream.readUTF()); + + TileEntity tileEntity = entityplayer.worldObj.getBlockTileEntity(x, y, z); + + if(tileEntity != null) + { + new GasTransferProtocol(tileEntity, null, type, 0).clientUpdate(); + } + } catch(Exception e) { + System.err.println("[Mekanism] Error while handling energy transfer update packet."); + e.printStackTrace(); + } + } else if(packetType == EnumPacketType.ELECTROLYTIC_SEPARATOR_PARTICLE.id) { try { @@ -916,7 +938,7 @@ public class PacketHandler implements IPacketHandler packet.length = packet.data.length; PacketDispatcher.sendPacketToAllPlayers(packet); } catch (IOException e) { - System.err.println("[Mekanism] Error while writing tile entity packet."); + System.err.println("[Mekanism] Error while writing liquid transfer update packet."); e.printStackTrace(); } } @@ -943,7 +965,36 @@ public class PacketHandler implements IPacketHandler packet.length = packet.data.length; PacketDispatcher.sendPacketToAllPlayers(packet); } catch (IOException e) { - System.err.println("[Mekanism] Error while writing tile entity packet."); + System.err.println("[Mekanism] Error while writing energy transfer update packet."); + e.printStackTrace(); + } + } + + /** + * Sends a packet to the client-side with a GasTransferProtocol's information. Used for render updates. + * @param head - head TileEntity of the calculation + */ + public static void sendGasTransferUpdate(TileEntity head, EnumGas type) + { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + DataOutputStream output = new DataOutputStream(bytes); + + try { + output.writeInt(EnumPacketType.GAS_TRANSFER_UPDATE.id); + + output.writeInt(head.xCoord); + output.writeInt(head.yCoord); + output.writeInt(head.zCoord); + + output.writeUTF(type.name); + + Packet250CustomPayload packet = new Packet250CustomPayload(); + packet.channel = "Mekanism"; + packet.data = bytes.toByteArray(); + packet.length = packet.data.length; + PacketDispatcher.sendPacketToAllPlayers(packet); + } catch (IOException e) { + System.err.println("[Mekanism] Error while writing gas transfer update packet."); e.printStackTrace(); } } diff --git a/src/minecraft/mekanism/common/TileEntityMechanicalPipe.java b/src/minecraft/mekanism/common/TileEntityMechanicalPipe.java index 1834fc0e2..8859a36bb 100644 --- a/src/minecraft/mekanism/common/TileEntityMechanicalPipe.java +++ b/src/minecraft/mekanism/common/TileEntityMechanicalPipe.java @@ -23,14 +23,19 @@ import cpw.mods.fml.relauncher.SideOnly; public class TileEntityMechanicalPipe extends TileEntity implements IMechanicalPipe, ITankContainer, ITileNetwork { + /** The fake tank used for liquid transfer calculations. */ public LiquidTank dummyTank = new LiquidTank(LiquidContainerRegistry.BUCKET_VOLUME); + /** The LiquidStack displayed on this pipe. */ public LiquidStack refLiquid = null; + /** This pipe's active state. */ public boolean isActive = false; + /** The scale (0F -> 1F) of this pipe's liquid level. */ public float liquidScale; + /** Previous scale for this pipe's liquid level. */ public float prevScale; @Override @@ -44,12 +49,12 @@ public class TileEntityMechanicalPipe extends TileEntity implements IMechanicalP { if(liquidStack.isLiquidEqual(refLiquid)) { - liquidScale = Math.min(1, liquidScale+((float)liquidStack.amount/(float)3000)); + liquidScale = Math.min(1, liquidScale+((float)liquidStack.amount/50F)); } else if(refLiquid == null) { refLiquid = liquidStack.copy(); - liquidScale += Math.min(1, (float)liquidStack.amount/(float)3000); + liquidScale += Math.min(1, ((float)liquidStack.amount/50F)); } } diff --git a/src/minecraft/mekanism/common/TileEntityPressurizedTube.java b/src/minecraft/mekanism/common/TileEntityPressurizedTube.java index 109d23cd4..d905a2ab4 100644 --- a/src/minecraft/mekanism/common/TileEntityPressurizedTube.java +++ b/src/minecraft/mekanism/common/TileEntityPressurizedTube.java @@ -2,6 +2,7 @@ package mekanism.common; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import mekanism.api.EnumGas; import mekanism.api.IPressurizedTube; import mekanism.api.ITubeConnection; import net.minecraft.tileentity.TileEntity; @@ -10,12 +11,47 @@ import net.minecraftforge.common.ForgeDirection; public class TileEntityPressurizedTube extends TileEntity implements IPressurizedTube, ITubeConnection { + /** The gas currently displayed in this tube. */ + public EnumGas refGas = null; + + /** The scale of the gas (0F -> 1F) currently inside this tube. */ + public float gasScale; + + @Override + public void updateEntity() + { + if(worldObj.isRemote) + { + if(gasScale > 0) + { + gasScale -= .01; + } + else { + refGas = null; + } + } + } + @Override public boolean canTransferGas(TileEntity fromTile) { return worldObj.getBlockPowerInput(xCoord, yCoord, zCoord) == 0; } + @Override + public void onTransfer(EnumGas type) + { + if(type == refGas) + { + gasScale = Math.min(1, gasScale+.02F); + } + else if(refGas == null) + { + refGas = type; + gasScale += Math.min(1, gasScale+.02F); + } + } + @Override public boolean canTubeConnect(ForgeDirection side) { @@ -25,7 +61,7 @@ public class TileEntityPressurizedTube extends TileEntity implements IPressurize @Override public boolean canUpdate() { - return false; + return true; } @Override diff --git a/src/minecraft/mekanism/common/TileEntityUniversalCable.java b/src/minecraft/mekanism/common/TileEntityUniversalCable.java index 8ae9ca925..9e5fb6a7f 100644 --- a/src/minecraft/mekanism/common/TileEntityUniversalCable.java +++ b/src/minecraft/mekanism/common/TileEntityUniversalCable.java @@ -17,10 +17,13 @@ import cpw.mods.fml.relauncher.SideOnly; public class TileEntityUniversalCable extends TileEntity implements IUniversalCable, IPowerReceptor { + /** A fake power provider used to initiate energy transfer calculations. */ public CablePowerProvider powerProvider; - public float liquidScale; + /** The scale of the energy (0F -> 1F) currently inside this cable. */ + public float energyScale; + /** This cable's previous energy scale state. */ public float prevScale; public TileEntityUniversalCable() @@ -37,16 +40,16 @@ public class TileEntityUniversalCable extends TileEntity implements IUniversalCa { if(worldObj.isRemote) { - if(liquidScale != prevScale) + if(energyScale != prevScale) { worldObj.updateAllLightTypes(xCoord, yCoord, zCoord); } - prevScale = liquidScale; + prevScale = energyScale; - if(liquidScale > 0) + if(energyScale > 0) { - liquidScale -= .01; + energyScale -= .01; } } } @@ -60,7 +63,7 @@ public class TileEntityUniversalCable extends TileEntity implements IUniversalCa @Override public void onTransfer() { - liquidScale = Math.min(1, liquidScale+.02F); + energyScale = Math.min(1, energyScale+.02F); } @Override diff --git a/src/minecraft/mekanism/nei/NEIMekanismConfig.java b/src/minecraft/mekanism/nei/NEIMekanismConfig.java index c4816428b..1aae614dc 100644 --- a/src/minecraft/mekanism/nei/NEIMekanismConfig.java +++ b/src/minecraft/mekanism/nei/NEIMekanismConfig.java @@ -39,6 +39,8 @@ public class NEIMekanismConfig implements IConfigureNEI API.hideItem(Mekanism.boundingBlockID); API.hideItem(Mekanism.LiquidEnergy.itemID); + API.hideItem(Mekanism.LiquidHydrogen.itemID); + API.hideItem(Mekanism.LiquidOxygen.itemID); } @Override