From a360255f6398ab6f9d2439ad36d589120926a7ed Mon Sep 17 00:00:00 2001 From: Aidan Brady Date: Mon, 25 Nov 2013 00:00:26 -0500 Subject: [PATCH] Greatly improve performance of transmitter networks, improved logistics of Mechanical Pipe --- .../api/transmitters/DynamicNetwork.java | 43 +++++++++++ .../TransmitterNetworkRegistry.java | 19 ++--- .../mekanism/client/EnergyClientUpdate.java | 41 ---------- common/mekanism/client/FluidClientUpdate.java | 28 ++----- .../tileentity/RenderMechanicalPipe.java | 21 +++--- .../tileentity/RenderUniversalCable.java | 4 +- common/mekanism/common/EnergyNetwork.java | 58 +++++---------- common/mekanism/common/FluidNetwork.java | 63 +++++++++++++++- common/mekanism/common/Mekanism.java | 21 +++--- common/mekanism/common/PacketHandler.java | 9 +++ .../common/block/BlockTransmitter.java | 6 ++ ...date.java => PacketTransmitterUpdate.java} | 56 +++++++++----- .../tileentity/TileEntityMechanicalPipe.java | 74 ++++++------------- .../tileentity/TileEntityPressurizedTube.java | 40 +++++----- .../tileentity/TileEntityTransmitter.java | 44 +++++++++-- .../tileentity/TileEntityUniversalCable.java | 51 +++++++------ 16 files changed, 317 insertions(+), 261 deletions(-) delete mode 100644 common/mekanism/client/EnergyClientUpdate.java rename common/mekanism/common/network/{PacketTransmitterTransferUpdate.java => PacketTransmitterUpdate.java} (58%) diff --git a/common/mekanism/api/transmitters/DynamicNetwork.java b/common/mekanism/api/transmitters/DynamicNetwork.java index 533ac11fa..24aceb192 100644 --- a/common/mekanism/api/transmitters/DynamicNetwork.java +++ b/common/mekanism/api/transmitters/DynamicNetwork.java @@ -6,12 +6,15 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; +import cpw.mods.fml.common.FMLCommonHandler; import mekanism.api.Object3D; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; @@ -23,10 +26,14 @@ public abstract class DynamicNetwork implements ITransmitterNetwork public HashSet possibleAcceptors = new HashSet(); public HashMap acceptorDirections = new HashMap(); + private List updateQueue = new ArrayList(); + protected int ticksSinceCreate = 0; protected boolean fixed = false; + protected boolean needsUpdate = false; + protected abstract ITransmitterNetwork create(ITransmitter... varTransmitters); protected abstract ITransmitterNetwork create(Collection> collection); @@ -94,6 +101,25 @@ public abstract class DynamicNetwork implements ITransmitterNetwork fixMessedUpNetwork(transmitters.iterator().next()); } } + + if(FMLCommonHandler.instance().getEffectiveSide().isServer()) + { + Iterator i = updateQueue.iterator(); + + while(i.hasNext()) + { + DelayQueue q = i.next(); + + if(q.delay > 0) + { + q.delay--; + } + else { + needsUpdate = true; + i.remove(); + } + } + } } @Override @@ -195,6 +221,11 @@ public abstract class DynamicNetwork implements ITransmitterNetwork fixed = value; } + public void addUpdate(EntityPlayer player) + { + updateQueue.add(new DelayQueue(player)); + } + public static class NetworkFinder { public TransmissionType transmissionType; @@ -254,4 +285,16 @@ public abstract class DynamicNetwork implements ITransmitterNetwork return iterated; } } + + public static class DelayQueue + { + public EntityPlayer player; + public int delay; + + public DelayQueue(EntityPlayer p) + { + player = p; + delay = 5; + } + } } diff --git a/common/mekanism/api/transmitters/TransmitterNetworkRegistry.java b/common/mekanism/api/transmitters/TransmitterNetworkRegistry.java index 342c4714f..91c11392b 100644 --- a/common/mekanism/api/transmitters/TransmitterNetworkRegistry.java +++ b/common/mekanism/api/transmitters/TransmitterNetworkRegistry.java @@ -1,10 +1,8 @@ package mekanism.api.transmitters; import java.util.EnumSet; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.Map; import java.util.Set; import net.minecraft.tileentity.TileEntity; @@ -138,19 +136,14 @@ public class TransmitterNetworkRegistry implements ITickHandler try { if(c != null) { - Map copy = (Map)((HashMap)c.chunkTileEntityMap).clone(); - - for(Object obj : copy.values()) + for(Iterator iter = c.chunkTileEntityMap.values().iterator(); iter.hasNext();) { - if(obj instanceof TileEntity) + Object obj = iter.next(); + + if(obj instanceof ITransmitter && !((TileEntity)obj).worldObj.isRemote) { - TileEntity tileEntity = (TileEntity)obj; - - if(tileEntity instanceof ITransmitter) - { - ((ITransmitter)tileEntity).refreshTransmitterNetwork(); - ((ITransmitter)tileEntity).chunkLoad(); - } + ((ITransmitter)obj).refreshTransmitterNetwork(); + ((ITransmitter)obj).chunkLoad(); } } } diff --git a/common/mekanism/client/EnergyClientUpdate.java b/common/mekanism/client/EnergyClientUpdate.java deleted file mode 100644 index 600e02309..000000000 --- a/common/mekanism/client/EnergyClientUpdate.java +++ /dev/null @@ -1,41 +0,0 @@ -package mekanism.client; - -import java.util.List; - -import mekanism.api.transmitters.TransmissionType; -import mekanism.api.transmitters.DynamicNetwork.NetworkFinder; -import mekanism.api.Object3D; -import mekanism.common.tileentity.TileEntityUniversalCable; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public class EnergyClientUpdate -{ - public NetworkFinder finder; - - public World worldObj; - - public double energyScale; - - public EnergyClientUpdate(TileEntity head, double power) - { - worldObj = head.worldObj; - energyScale = power; - finder = new NetworkFinder(head.worldObj, TransmissionType.ENERGY, Object3D.get(head)); - } - - public void clientUpdate() - { - List found = finder.exploreNetwork(); - - for(Object3D object : found) - { - TileEntity tileEntity = object.getTileEntity(worldObj); - - if(tileEntity instanceof TileEntityUniversalCable) - { - ((TileEntityUniversalCable)tileEntity).setCachedEnergy(energyScale); - } - } - } -} diff --git a/common/mekanism/client/FluidClientUpdate.java b/common/mekanism/client/FluidClientUpdate.java index 63b765293..e7145e7e6 100644 --- a/common/mekanism/client/FluidClientUpdate.java +++ b/common/mekanism/client/FluidClientUpdate.java @@ -1,10 +1,7 @@ package mekanism.client; -import java.util.List; - -import mekanism.api.transmitters.TransmissionType; -import mekanism.api.transmitters.DynamicNetwork.NetworkFinder; -import mekanism.api.Object3D; +import mekanism.api.transmitters.ITransmitter; +import mekanism.common.FluidNetwork; import mekanism.common.tileentity.TileEntityMechanicalPipe; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -12,31 +9,16 @@ import net.minecraftforge.fluids.FluidStack; public class FluidClientUpdate { - public NetworkFinder finder; - public World worldObj; public FluidStack fluidStack; + + public TileEntity tileEntity; public FluidClientUpdate(TileEntity head, FluidStack fluid) { worldObj = head.worldObj; + tileEntity = head; fluidStack = fluid; - finder = new NetworkFinder(head.worldObj, TransmissionType.FLUID, Object3D.get(head)); - } - - public void clientUpdate() - { - List found = finder.exploreNetwork(); - - for(Object3D object : found) - { - TileEntity tileEntity = object.getTileEntity(worldObj); - - if(tileEntity instanceof TileEntityMechanicalPipe) - { - ((TileEntityMechanicalPipe)tileEntity).onTransfer(fluidStack); - } - } } } diff --git a/common/mekanism/client/render/tileentity/RenderMechanicalPipe.java b/common/mekanism/client/render/tileentity/RenderMechanicalPipe.java index 1717a9710..5cf195f8e 100644 --- a/common/mekanism/client/render/tileentity/RenderMechanicalPipe.java +++ b/common/mekanism/client/render/tileentity/RenderMechanicalPipe.java @@ -60,47 +60,50 @@ public class RenderMechanicalPipe extends TileEntitySpecialRenderer GL11.glEnable(GL11.GL_CULL_FACE); GL11.glPopMatrix(); - if(tileEntity.fluidScale > 0 && tileEntity.refFluid != null) + Fluid fluid = tileEntity.getTransmitterNetwork().refFluid; + float scale = tileEntity.getTransmitterNetwork().fluidScale; + + if(scale > 0 && fluid != null) { push(); - MekanismRenderer.glowOn(tileEntity.refFluid.getFluid().getLuminosity()); + MekanismRenderer.glowOn(fluid.getLuminosity()); bindTexture(MekanismRenderer.getBlocksTexture()); GL11.glTranslatef((float)x, (float)y, (float)z); - boolean gas = tileEntity.refFluid.getFluid().isGaseous(); + boolean gas = fluid.isGaseous(); for(int i = 0; i < 6; i++) { if(connectable[i]) { - DisplayInteger[] displayLists = getListAndRender(ForgeDirection.getOrientation(i), tileEntity.refFluid.getFluid()); + DisplayInteger[] displayLists = getListAndRender(ForgeDirection.getOrientation(i), fluid); if(displayLists != null) { if(!gas) { - displayLists[Math.max(0, (int)((float)tileEntity.fluidScale*(stages-1)))].render(); + displayLists[Math.max(0, (int)((float)scale*(stages-1)))].render(); } else { - GL11.glColor4f(1F, 1F, 1F, tileEntity.fluidScale); + GL11.glColor4f(1F, 1F, 1F, scale); displayLists[stages-1].render(); } } } } - DisplayInteger[] displayLists = getListAndRender(ForgeDirection.UNKNOWN, tileEntity.refFluid.getFluid()); + DisplayInteger[] displayLists = getListAndRender(ForgeDirection.UNKNOWN, fluid); if(displayLists != null) { if(!gas) { - displayLists[Math.max(3, (int)((float)tileEntity.fluidScale*(stages-1)))].render(); + displayLists[Math.max(3, (int)((float)scale*(stages-1)))].render(); } else { - GL11.glColor4f(1F, 1F, 1F, tileEntity.fluidScale); + GL11.glColor4f(1F, 1F, 1F, scale); displayLists[stages-1].render(); } } diff --git a/common/mekanism/client/render/tileentity/RenderUniversalCable.java b/common/mekanism/client/render/tileentity/RenderUniversalCable.java index 04e47eb73..4e60bd144 100644 --- a/common/mekanism/client/render/tileentity/RenderUniversalCable.java +++ b/common/mekanism/client/render/tileentity/RenderUniversalCable.java @@ -64,7 +64,7 @@ public class RenderUniversalCable extends TileEntitySpecialRenderer GL11.glEnable(GL11.GL_CULL_FACE); GL11.glPopMatrix(); - if(tileEntity.getEnergyScale() <= 0 || !MekanismClient.fancyUniversalCableRender) + if(tileEntity.getTransmitterNetwork().clientEnergyScale <= 0 || !MekanismClient.fancyUniversalCableRender) { return; } @@ -72,7 +72,7 @@ public class RenderUniversalCable extends TileEntitySpecialRenderer push(); MekanismRenderer.glowOn(); - GL11.glColor4f(1F, 1F, 1F, tileEntity.getEnergyScale()); + GL11.glColor4f(1F, 1F, 1F, (float)tileEntity.getTransmitterNetwork().clientEnergyScale); bindTexture(MekanismRenderer.getBlocksTexture()); GL11.glTranslatef((float)x, (float)y, (float)z); diff --git a/common/mekanism/common/EnergyNetwork.java b/common/mekanism/common/EnergyNetwork.java index a422acdcb..1e7fcfee4 100644 --- a/common/mekanism/common/EnergyNetwork.java +++ b/common/mekanism/common/EnergyNetwork.java @@ -39,9 +39,7 @@ public class EnergyNetwork extends DynamicNetwork private double joulesTransmitted = 0; private double joulesLastTick = 0; - private List updateQueue = new ArrayList(); - - private boolean needsUpdate = false; + public double clientEnergyScale = 0; public EnergyNetwork(ITransmitter... varCables) { @@ -72,6 +70,11 @@ public class EnergyNetwork extends DynamicNetwork public synchronized double getEnergyNeeded(List ignored) { + if(FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return 0; + } + double totalNeeded = 0; for(TileEntity acceptor : getAcceptors()) @@ -109,6 +112,11 @@ public class EnergyNetwork extends DynamicNetwork public synchronized double emit(double energyToSend, ArrayList ignored) { + if(FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return energyToSend; + } + double prevEnergy = energyToSend; double sent; @@ -207,6 +215,11 @@ public class EnergyNetwork extends DynamicNetwork { Set toReturn = new HashSet(); + if(FMLCommonHandler.instance().getEffectiveSide().isClient()) + { + return toReturn; + } + Set copy = (Set)possibleAcceptors.clone(); for(TileEntity acceptor : copy) @@ -355,31 +368,15 @@ public class EnergyNetwork extends DynamicNetwork @Override public void tick() - { - clearJoulesTransmitted(); - + { super.tick(); + clearJoulesTransmitted(); + double currentPowerScale = getPowerScale(); if(FMLCommonHandler.instance().getEffectiveSide().isServer()) { - Iterator i = updateQueue.iterator(); - - while(i.hasNext()) - { - DelayQueue q = i.next(); - - if(q.delay > 0) - { - q.delay--; - } - else { - needsUpdate = true; - i.remove(); - } - } - if(currentPowerScale != lastPowerScale) { needsUpdate = true; @@ -411,11 +408,6 @@ public class EnergyNetwork extends DynamicNetwork return joulesLastTick * 20; } - public void addUpdate(EntityPlayer player) - { - updateQueue.add(new DelayQueue(player)); - } - @Override protected EnergyNetwork create(ITransmitter... varTransmitters) { @@ -451,16 +443,4 @@ public class EnergyNetwork extends DynamicNetwork { return ElectricityDisplay.getDisplay((float)(getPower()*Mekanism.TO_UE), ElectricityDisplay.ElectricUnit.JOULES); } - - public static class DelayQueue - { - public EntityPlayer player; - public int delay; - - public DelayQueue(EntityPlayer p) - { - player = p; - delay = 5; - } - } } diff --git a/common/mekanism/common/FluidNetwork.java b/common/mekanism/common/FluidNetwork.java index 964172e98..9039353a4 100644 --- a/common/mekanism/common/FluidNetwork.java +++ b/common/mekanism/common/FluidNetwork.java @@ -25,6 +25,13 @@ import cpw.mods.fml.common.FMLCommonHandler; public class FluidNetwork extends DynamicNetwork { + public int transferDelay = 0; + + public float fluidScale; + public float prevFluidScale; + + public Fluid refFluid = null; + public FluidNetwork(ITransmitter... varPipes) { transmitters.addAll(Arrays.asList(varPipes)); @@ -74,6 +81,11 @@ public class FluidNetwork extends DynamicNetwork public synchronized int emit(FluidStack fluidToSend, boolean doTransfer, TileEntity emitter) { + if(refFluid != null && refFluid != fluidToSend.getFluid()) + { + return 0; + } + List availableAcceptors = Arrays.asList(getAcceptors(fluidToSend).toArray()); Collections.shuffle(availableAcceptors); @@ -108,12 +120,53 @@ public class FluidNetwork extends DynamicNetwork { FluidStack sendStack = fluidToSend.copy(); sendStack.amount = fluidSent; - MinecraftForge.EVENT_BUS.post(new FluidTransferEvent(this, sendStack)); + + if(sendStack.getFluid() == refFluid) + { + fluidScale = Math.min(1, fluidScale+((float)sendStack.amount/1000F)); + } + else if(refFluid == null) + { + refFluid = sendStack.getFluid(); + fluidScale += Math.min(1, ((float)sendStack.amount/1000F)); + } + + transferDelay = 2; } return fluidSent; } + @Override + public void tick() + { + super.tick(); + + if(FMLCommonHandler.instance().getEffectiveSide().isServer()) + { + if(transferDelay == 0) + { + if(fluidScale > 0) + { + fluidScale -= .02; + } + else { + refFluid = null; + } + } + else { + transferDelay--; + } + + if(fluidScale != prevFluidScale) + { + MinecraftForge.EVENT_BUS.post(new FluidTransferEvent(this, refFluid != null ? refFluid.getID() : -1, fluidScale)); + } + + prevFluidScale = fluidScale; + } + } + @Override public synchronized Set getAcceptors(Object... data) { @@ -188,12 +241,14 @@ public class FluidNetwork extends DynamicNetwork { public final FluidNetwork fluidNetwork; - public final FluidStack fluidSent; + public final int fluidType; + public final float fluidScale; - public FluidTransferEvent(FluidNetwork network, FluidStack fluid) + public FluidTransferEvent(FluidNetwork network, int type, float scale) { fluidNetwork = network; - fluidSent = fluid; + fluidType = type; + fluidScale = scale; } } diff --git a/common/mekanism/common/Mekanism.java b/common/mekanism/common/Mekanism.java index 6fa2fd353..00260d900 100644 --- a/common/mekanism/common/Mekanism.java +++ b/common/mekanism/common/Mekanism.java @@ -7,6 +7,7 @@ import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -18,6 +19,7 @@ import mekanism.api.infuse.InfuseObject; import mekanism.api.infuse.InfuseRegistry; import mekanism.api.infuse.InfuseType; import mekanism.api.infuse.InfusionInput; +import mekanism.api.transmitters.ITransmitter; import mekanism.api.transmitters.TransmitterNetworkRegistry; import mekanism.common.EnergyNetwork.EnergyTransferEvent; import mekanism.common.FluidNetwork.FluidTransferEvent; @@ -72,8 +74,8 @@ import mekanism.common.network.PacketRobit; import mekanism.common.network.PacketSimpleGui; import mekanism.common.network.PacketStatusUpdate; import mekanism.common.network.PacketTileEntity; -import mekanism.common.network.PacketTransmitterTransferUpdate; -import mekanism.common.network.PacketTransmitterTransferUpdate.TransmitterTransferType; +import mekanism.common.network.PacketTransmitterUpdate; +import mekanism.common.network.PacketTransmitterUpdate.PacketType; import mekanism.common.network.PacketWalkieTalkieState; import mekanism.common.tileentity.TileEntityAdvancedBoundingBlock; import mekanism.common.tileentity.TileEntityBoundingBlock; @@ -97,6 +99,7 @@ import net.minecraftforge.oredict.ShapelessOreRecipe; import rebelkeithy.mods.metallurgy.api.IOreInfo; import rebelkeithy.mods.metallurgy.api.MetallurgyAPI; import thermalexpansion.api.crafting.CraftingManagers; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.Mod.Instance; @@ -1120,7 +1123,7 @@ public class Mekanism //Packet registrations PacketHandler.registerPacket(PacketRobit.class); - PacketHandler.registerPacket(PacketTransmitterTransferUpdate.class); + PacketHandler.registerPacket(PacketTransmitterUpdate.class); PacketHandler.registerPacket(PacketElectricChest.class); PacketHandler.registerPacket(PacketElectricBowState.class); PacketHandler.registerPacket(PacketConfiguratorState.class); @@ -1160,7 +1163,7 @@ public class Mekanism public void onEnergyTransferred(EnergyTransferEvent event) { try { - PacketHandler.sendPacket(Transmission.ALL_CLIENTS, new PacketTransmitterTransferUpdate().setParams(TransmitterTransferType.ENERGY, event.energyNetwork.transmitters.iterator().next(), event.power)); + PacketHandler.sendPacket(Transmission.ALL_CLIENTS, new PacketTransmitterUpdate().setParams(PacketType.ENERGY, event.energyNetwork.transmitters.iterator().next(), event.power)); } catch(Exception e) {} } @@ -1168,7 +1171,7 @@ public class Mekanism public void onGasTransferred(GasTransferEvent event) { try { - PacketHandler.sendPacket(Transmission.ALL_CLIENTS, new PacketTransmitterTransferUpdate().setParams(TransmitterTransferType.GAS, event.gasNetwork.transmitters.iterator().next(), event.transferType)); + PacketHandler.sendPacket(Transmission.ALL_CLIENTS, new PacketTransmitterUpdate().setParams(PacketType.GAS, event.gasNetwork.transmitters.iterator().next(), event.transferType)); } catch(Exception e) {} } @@ -1176,7 +1179,7 @@ public class Mekanism public void onLiquidTransferred(FluidTransferEvent event) { try { - PacketHandler.sendPacket(Transmission.ALL_CLIENTS, new PacketTransmitterTransferUpdate().setParams(TransmitterTransferType.FLUID, event.fluidNetwork.transmitters.iterator().next(), event.fluidSent)); + PacketHandler.sendPacket(Transmission.ALL_CLIENTS, new PacketTransmitterUpdate().setParams(PacketType.FLUID, event.fluidNetwork.transmitters.iterator().next(), event.fluidType, event.fluidScale)); } catch(Exception e) {} } @@ -1185,10 +1188,10 @@ public class Mekanism { if(event.getChunk() != null) { - Map copy = (Map)((HashMap)event.getChunk().chunkTileEntityMap).clone(); - - for(Object obj : copy.values()) + for(Iterator iter = event.getChunk().chunkTileEntityMap.values().iterator(); iter.hasNext();) { + Object obj = iter.next(); + if(obj instanceof TileEntity) { TileEntity tileEntity = (TileEntity)obj; diff --git a/common/mekanism/common/PacketHandler.java b/common/mekanism/common/PacketHandler.java index 4b934cba4..487ef34b7 100644 --- a/common/mekanism/common/PacketHandler.java +++ b/common/mekanism/common/PacketHandler.java @@ -187,6 +187,9 @@ public class PacketHandler implements IPacketHandler Object3D obj = (Object3D)transParams[0]; PacketDispatcher.sendPacketToAllAround(obj.xCoord, obj.yCoord, obj.zCoord, (Double)transParams[1], obj.dimensionId, packet); break; + case CLIENTS_DIM: + PacketDispatcher.sendPacketToAllInDimension(packet, (Integer)transParams[0]); + break; case SINGLE_CLIENT: ((EntityPlayerMP)transParams[0]).playerNetServerHandler.sendPacketToPlayer(packet); break; @@ -216,6 +219,9 @@ public class PacketHandler implements IPacketHandler case CLIENTS_RANGE: System.out.println("[Mekanism] Sent '" + packetType.getName() + "' packet to clients in a " + (Double)transParams[1] + " block range."); break; + case CLIENTS_DIM: + System.out.println("[Mekanism] Sent '" + packetType.getName() + "' packet to clients in dimension ID " + (Integer)transParams[0] + "."); + break; case SINGLE_CLIENT: System.out.println("[Mekanism] Sent '" + packetType.getName() + "' packet to " + ((EntityPlayer)transParams[0]).username); break; @@ -234,6 +240,9 @@ public class PacketHandler implements IPacketHandler /** 2 parameters - Object3D representing the location of the transmission, and a double of the distance this packet can be sent in. */ CLIENTS_RANGE(2), + /** 1 parameter - int representing the dimension ID to send this packet to. */ + CLIENTS_DIM(1), + /** 1 parameter - EntityPlayer to send this packet to. */ SINGLE_CLIENT(1); diff --git a/common/mekanism/common/block/BlockTransmitter.java b/common/mekanism/common/block/BlockTransmitter.java index 55e34c724..fa7c598be 100644 --- a/common/mekanism/common/block/BlockTransmitter.java +++ b/common/mekanism/common/block/BlockTransmitter.java @@ -8,7 +8,11 @@ import mekanism.api.gas.ITubeConnection; import mekanism.api.transmitters.ITransmitter; import mekanism.client.ClientProxy; import mekanism.common.Mekanism; +import mekanism.common.PacketHandler; +import mekanism.common.PacketHandler.Transmission; import mekanism.common.PipeUtils; +import mekanism.common.network.PacketTransmitterUpdate; +import mekanism.common.network.PacketTransmitterUpdate.PacketType; import mekanism.common.tileentity.TileEntityDiversionTransporter; import mekanism.common.tileentity.TileEntityLogisticalTransporter; import mekanism.common.tileentity.TileEntityMechanicalPipe; @@ -311,6 +315,7 @@ public class BlockTransmitter extends Block if(tileEntity instanceof ITransmitter) { ((ITransmitter)tileEntity).refreshTransmitterNetwork(); + PacketHandler.sendPacket(Transmission.CLIENTS_DIM, new PacketTransmitterUpdate().setParams(PacketType.UPDATE, tileEntity), world.provider.dimensionId); } } } @@ -325,6 +330,7 @@ public class BlockTransmitter extends Block if(tileEntity instanceof ITransmitter) { ((ITransmitter)tileEntity).refreshTransmitterNetwork(); + PacketHandler.sendPacket(Transmission.CLIENTS_DIM, new PacketTransmitterUpdate().setParams(PacketType.UPDATE, tileEntity), world.provider.dimensionId); if(tileEntity instanceof TileEntityUniversalCable) { diff --git a/common/mekanism/common/network/PacketTransmitterTransferUpdate.java b/common/mekanism/common/network/PacketTransmitterUpdate.java similarity index 58% rename from common/mekanism/common/network/PacketTransmitterTransferUpdate.java rename to common/mekanism/common/network/PacketTransmitterUpdate.java index a6bbf2064..83d32cf6f 100644 --- a/common/mekanism/common/network/PacketTransmitterTransferUpdate.java +++ b/common/mekanism/common/network/PacketTransmitterUpdate.java @@ -3,19 +3,21 @@ package mekanism.common.network; import java.io.DataOutputStream; import mekanism.api.gas.EnumGas; -import mekanism.client.EnergyClientUpdate; -import mekanism.client.FluidClientUpdate; +import mekanism.api.transmitters.ITransmitter; import mekanism.client.GasClientUpdate; +import mekanism.common.tileentity.TileEntityMechanicalPipe; +import mekanism.common.tileentity.TileEntityUniversalCable; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; import com.google.common.io.ByteArrayDataInput; -public class PacketTransmitterTransferUpdate implements IMekanismPacket +public class PacketTransmitterUpdate implements IMekanismPacket { - public TransmitterTransferType activeType; + public PacketType packetType; public TileEntity tileEntity; @@ -23,7 +25,8 @@ public class PacketTransmitterTransferUpdate implements IMekanismPacket public String gasName; - public FluidStack fluidStack; + public int fluidType; + public float fluidScale; @Override public String getName() @@ -34,10 +37,10 @@ public class PacketTransmitterTransferUpdate implements IMekanismPacket @Override public IMekanismPacket setParams(Object... data) { - activeType = (TransmitterTransferType)data[0]; + packetType = (PacketType)data[0]; tileEntity = (TileEntity)data[1]; - switch(activeType) + switch(packetType) { case ENERGY: power = (Double)data[2]; @@ -46,7 +49,8 @@ public class PacketTransmitterTransferUpdate implements IMekanismPacket gasName = ((EnumGas)data[2]).name; break; case FLUID: - fluidStack = (FluidStack)data[2]; + fluidType = (Integer)data[2]; + fluidScale = (Float)data[3]; break; } @@ -63,6 +67,15 @@ public class PacketTransmitterTransferUpdate implements IMekanismPacket int z = dataStream.readInt(); if(transmitterType == 0) + { + ITransmitter transmitter = (ITransmitter)world.getBlockTileEntity(x, y, z); + + if(transmitter != null) + { + transmitter.refreshTransmitterNetwork(); + } + } + if(transmitterType == 1) { double powerLevel = dataStream.readDouble(); @@ -70,10 +83,10 @@ public class PacketTransmitterTransferUpdate implements IMekanismPacket if(tileEntity != null) { - new EnergyClientUpdate(tileEntity, powerLevel).clientUpdate(); + ((TileEntityUniversalCable)tileEntity).getTransmitterNetwork().clientEnergyScale = powerLevel; } } - else if(transmitterType == 1) + else if(transmitterType == 2) { EnumGas type = EnumGas.getFromName(dataStream.readUTF()); @@ -84,14 +97,18 @@ public class PacketTransmitterTransferUpdate implements IMekanismPacket new GasClientUpdate(tileEntity, type).clientUpdate(); } } - else if(transmitterType == 2) + else if(transmitterType == 3) { TileEntity tileEntity = world.getBlockTileEntity(x, y, z); - FluidStack fluidStack = new FluidStack(dataStream.readInt(), dataStream.readInt()); + + int type = dataStream.readInt(); + Fluid fluidType = type != -1 ? FluidRegistry.getFluid(type) : null; + float fluidScale = dataStream.readFloat(); if(tileEntity != null) { - new FluidClientUpdate(tileEntity, fluidStack).clientUpdate(); + ((TileEntityMechanicalPipe)tileEntity).getTransmitterNetwork().refFluid = fluidType; + ((TileEntityMechanicalPipe)tileEntity).getTransmitterNetwork().fluidScale = fluidScale; } } } @@ -99,13 +116,13 @@ public class PacketTransmitterTransferUpdate implements IMekanismPacket @Override public void write(DataOutputStream dataStream) throws Exception { - dataStream.writeInt(activeType.ordinal()); + dataStream.writeInt(packetType.ordinal()); dataStream.writeInt(tileEntity.xCoord); dataStream.writeInt(tileEntity.yCoord); dataStream.writeInt(tileEntity.zCoord); - switch(activeType) + switch(packetType) { case ENERGY: dataStream.writeDouble(power); @@ -114,14 +131,15 @@ public class PacketTransmitterTransferUpdate implements IMekanismPacket dataStream.writeUTF(gasName); break; case FLUID: - dataStream.writeInt(fluidStack.fluidID); - dataStream.writeInt(fluidStack.amount); + dataStream.writeInt(fluidType); + dataStream.writeFloat(fluidScale); break; } } - public static enum TransmitterTransferType + public static enum PacketType { + UPDATE, ENERGY, GAS, FLUID diff --git a/common/mekanism/common/tileentity/TileEntityMechanicalPipe.java b/common/mekanism/common/tileentity/TileEntityMechanicalPipe.java index 4280ace31..7b8d5a8ca 100644 --- a/common/mekanism/common/tileentity/TileEntityMechanicalPipe.java +++ b/common/mekanism/common/tileentity/TileEntityMechanicalPipe.java @@ -7,6 +7,7 @@ import java.util.HashSet; import mekanism.api.Object3D; import mekanism.api.transmitters.ITransmitter; import mekanism.api.transmitters.TransmissionType; +import mekanism.api.transmitters.TransmitterNetworkRegistry; import mekanism.common.FluidNetwork; import mekanism.common.ITileNetwork; import mekanism.common.PacketHandler; @@ -34,32 +35,9 @@ public class TileEntityMechanicalPipe extends TileEntityTransmitter 1F) of this pipe's fluid level. */ - public float fluidScale; - - public void onTransfer(FluidStack fluidStack) - { - if(fluidStack.isFluidEqual(refFluid)) - { - fluidScale = Math.min(1, fluidScale+((float)fluidStack.amount/1000F)); - } - else if(refFluid == null) - { - refFluid = fluidStack.copy(); - fluidScale += Math.min(1, ((float)fluidStack.amount/1000F)); - } - - transferDelay = 2; - } - @Override public TransmissionType getTransmissionType() { @@ -82,7 +60,7 @@ public class TileEntityMechanicalPipe extends TileEntityTransmitter)tileEntity).getTransmitterNetwork()); - } - } + TileEntity tileEntity = Object3D.get(this).getFromSide(side).getTileEntity(worldObj); - getTransmitterNetwork().refresh(); + if(TransmissionType.checkTransmissionType(tileEntity, getTransmissionType())) + { + getTransmitterNetwork().merge(((ITransmitter)tileEntity).getTransmitterNetwork()); + } } + + getTransmitterNetwork().refresh(); } @Override public void updateEntity() { - if(worldObj.isRemote) + if(!worldObj.isRemote) { - if(transferDelay == 0) - { - if(fluidScale > 0) - { - fluidScale -= .01; - } - else { - refFluid = null; - } - } - else { - transferDelay--; - } - } - else { if(isActive) { IFluidHandler[] connectedAcceptors = PipeUtils.getConnectedAcceptors(this); diff --git a/common/mekanism/common/tileentity/TileEntityPressurizedTube.java b/common/mekanism/common/tileentity/TileEntityPressurizedTube.java index 23333edba..02bb7fa9b 100644 --- a/common/mekanism/common/tileentity/TileEntityPressurizedTube.java +++ b/common/mekanism/common/tileentity/TileEntityPressurizedTube.java @@ -10,6 +10,7 @@ import mekanism.api.gas.IGasTransmitter; import mekanism.api.gas.ITubeConnection; import mekanism.api.transmitters.ITransmitter; import mekanism.api.transmitters.TransmissionType; +import mekanism.api.transmitters.TransmitterNetworkRegistry; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; @@ -43,7 +44,7 @@ public class TileEntityPressurizedTube extends TileEntityTransmitter } } - if(connectedNets.size() == 0 || worldObj.isRemote) + if(connectedNets.size() == 0) { theNetwork = new GasNetwork(this); } @@ -67,12 +68,22 @@ public class TileEntityPressurizedTube extends TileEntityTransmitter getTransmitterNetwork().fixMessedUpNetwork(this); } + @Override + public void onChunkUnload() + { + super.onChunkUnload(); + + getTransmitterNetwork().split(this); + } + @Override public void invalidate() { + getTransmitterNetwork().split(this); + if(!worldObj.isRemote) { - getTransmitterNetwork().split(this); + TransmitterNetworkRegistry.getInstance().pruneEmptyNetworks(); } super.invalidate(); @@ -90,20 +101,17 @@ public class TileEntityPressurizedTube extends TileEntityTransmitter @Override public void refreshTransmitterNetwork() { - if(!worldObj.isRemote) + for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) - { - TileEntity tileEntity = Object3D.get(this).getFromSide(side).getTileEntity(worldObj); - - if(TransmissionType.checkTransmissionType(tileEntity, TransmissionType.GAS, this)) - { - getTransmitterNetwork().merge(((ITransmitter)tileEntity).getTransmitterNetwork()); - } - } + TileEntity tileEntity = Object3D.get(this).getFromSide(side).getTileEntity(worldObj); - getTransmitterNetwork().refresh(); + if(TransmissionType.checkTransmissionType(tileEntity, TransmissionType.GAS, this)) + { + getTransmitterNetwork().merge(((ITransmitter)tileEntity).getTransmitterNetwork()); + } } + + getTransmitterNetwork().refresh(); } public void onTransfer(EnumGas type) @@ -125,12 +133,6 @@ public class TileEntityPressurizedTube extends TileEntityTransmitter return true; } - @Override - public boolean canUpdate() - { - return false; - } - @Override public int getTransmitterNetworkSize() { diff --git a/common/mekanism/common/tileentity/TileEntityTransmitter.java b/common/mekanism/common/tileentity/TileEntityTransmitter.java index bd1c86fa9..f09c2b002 100644 --- a/common/mekanism/common/tileentity/TileEntityTransmitter.java +++ b/common/mekanism/common/tileentity/TileEntityTransmitter.java @@ -1,20 +1,19 @@ package mekanism.common.tileentity; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import mekanism.api.Object3D; import mekanism.api.transmitters.ITransmitter; import mekanism.api.transmitters.TransmitterNetworkRegistry; -import mekanism.common.PacketHandler; -import mekanism.common.PacketHandler.Transmission; -import mekanism.common.network.PacketDataRequest; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; public abstract class TileEntityTransmitter extends TileEntity implements ITransmitter { public N theNetwork; + public int delayTicks = 0; + @Override @SideOnly(Side.CLIENT) public AxisAlignedBB getRenderBoundingBox() @@ -22,11 +21,40 @@ public abstract class TileEntityTransmitter extends TileEntity implements ITr return INFINITE_EXTENT_AABB; } + @Override + public boolean canUpdate() + { + return FMLCommonHandler.instance().getEffectiveSide().isClient(); + } + + @Override + public void updateEntity() + { + super.updateEntity(); + + if(worldObj.isRemote) + { + if(delayTicks == 3) + { + delayTicks++; + refreshTransmitterNetwork(); + } + else if(delayTicks < 3) + { + delayTicks++; + } + } + } + @Override public void onChunkUnload() { - invalidate(); - TransmitterNetworkRegistry.getInstance().pruneEmptyNetworks(); + super.onChunkUnload(); + + if(!worldObj.isRemote) + { + TransmitterNetworkRegistry.getInstance().pruneEmptyNetworks(); + } } @Override diff --git a/common/mekanism/common/tileentity/TileEntityUniversalCable.java b/common/mekanism/common/tileentity/TileEntityUniversalCable.java index 3a1a42a61..049950e5e 100644 --- a/common/mekanism/common/tileentity/TileEntityUniversalCable.java +++ b/common/mekanism/common/tileentity/TileEntityUniversalCable.java @@ -12,6 +12,7 @@ import java.util.Set; import mekanism.api.Object3D; import mekanism.api.transmitters.ITransmitter; import mekanism.api.transmitters.TransmissionType; +import mekanism.api.transmitters.TransmitterNetworkRegistry; import mekanism.common.EnergyNetwork; import mekanism.common.ITileNetwork; import mekanism.common.Mekanism; @@ -59,12 +60,6 @@ public class TileEntityUniversalCable extends TileEntityTransmitter)tileEntity).getTransmitterNetwork()); - } - } + TileEntity tileEntity = Object3D.get(this).getFromSide(side).getTileEntity(worldObj); - getTransmitterNetwork().refresh(); - reconfigure(); + if(TransmissionType.checkTransmissionType(tileEntity, TransmissionType.ENERGY)) + { + getTransmitterNetwork().merge(((ITransmitter)tileEntity).getTransmitterNetwork()); + } } + + getTransmitterNetwork().refresh(); + reconfigure(); } @Override