diff --git a/common/mekanism/client/EnergyClientUpdate.java b/common/mekanism/client/EnergyClientUpdate.java new file mode 100644 index 000000000..6c8fdc314 --- /dev/null +++ b/common/mekanism/client/EnergyClientUpdate.java @@ -0,0 +1,41 @@ +package mekanism.client; + +import java.util.ArrayList; +import java.util.List; + +import mekanism.api.Object3D; +import mekanism.common.EnergyNetwork.NetworkFinder; +import mekanism.common.IUniversalCable; +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, Object3D.get(head)); + System.out.println(power); + } + + public void clientUpdate() + { + List found = finder.exploreNetwork(); + + for(Object3D object : found) + { + TileEntity tileEntity = object.getTileEntity(worldObj); + if(tileEntity instanceof IUniversalCable) + { + ((IUniversalCable)tileEntity).setEnergyScale(energyScale); + } + } + } +} diff --git a/common/mekanism/common/EnergyNetwork.java b/common/mekanism/common/EnergyNetwork.java index 86ea884d3..f91dd14d3 100644 --- a/common/mekanism/common/EnergyNetwork.java +++ b/common/mekanism/common/EnergyNetwork.java @@ -12,6 +12,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import cpw.mods.fml.common.FMLCommonHandler; + import mekanism.api.IStrictEnergyAcceptor; import mekanism.api.ITransmitterNetwork; import mekanism.api.Object3D; @@ -19,6 +21,8 @@ import mekanism.api.TransmitterNetworkRegistry; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.Event; import net.minecraftforge.event.ForgeSubscribe; import net.minecraftforge.event.world.ChunkEvent; import buildcraft.api.power.IPowerReceptor; @@ -32,9 +36,11 @@ public class EnergyNetwork implements ITransmitterNetwork public Set possibleAcceptors = new HashSet(); public Map acceptorDirections = new HashMap(); + private double lastPowerScale = 0; private double joulesTransmitted = 0; private double joulesLastTick = 0; private int ticksSinceCreate = 0; + private int ticksSinceSecond = 0; private boolean fixed = false; public EnergyNetwork(IUniversalCable... varCables) @@ -210,6 +216,14 @@ public class EnergyNetwork implements ITransmitterNetwork } } } + + double currentPowerScale = getPowerScale(); + if(FMLCommonHandler.instance().getEffectiveSide().isServer()) + { + lastPowerScale = currentPowerScale; + + MinecraftForge.EVENT_BUS.post(new EnergyTransferEvent(this, currentPowerScale)); + } } public void merge(EnergyNetwork network) @@ -393,6 +407,19 @@ public class EnergyNetwork implements ITransmitterNetwork } } + public static class EnergyTransferEvent extends Event + { + public final EnergyNetwork energyNetwork; + + public final double power; + + public EnergyTransferEvent(EnergyNetwork network, double currentPower) + { + energyNetwork = network; + power = currentPower; + } + } + public static class NetworkLoader { @ForgeSubscribe @@ -436,6 +463,19 @@ public class EnergyNetwork implements ITransmitterNetwork fixMessedUpNetwork(cables.iterator().next()); } } + + double currentPowerScale = getPowerScale(); + if(currentPowerScale != lastPowerScale && FMLCommonHandler.instance().getEffectiveSide().isServer()) + { + lastPowerScale = currentPowerScale; + + MinecraftForge.EVENT_BUS.post(new EnergyTransferEvent(this, currentPowerScale)); + } + } + + public double getPowerScale() + { + return joulesLastTick == 0 ? 0 : Math.min(Math.ceil(Math.log10(getPower())*2)/10, 1); } public void clearJoulesTransmitted() diff --git a/common/mekanism/common/IUniversalCable.java b/common/mekanism/common/IUniversalCable.java index 9315abcea..0ce05a9bb 100644 --- a/common/mekanism/common/IUniversalCable.java +++ b/common/mekanism/common/IUniversalCable.java @@ -45,4 +45,6 @@ public interface IUniversalCable */ public void fixNetwork(); + public void setEnergyScale(double energyScale); + } diff --git a/common/mekanism/common/Mekanism.java b/common/mekanism/common/Mekanism.java index 4440aa28b..4b1b18792 100644 --- a/common/mekanism/common/Mekanism.java +++ b/common/mekanism/common/Mekanism.java @@ -17,6 +17,7 @@ import mekanism.api.InfuseType; import mekanism.api.InfusionInput; import mekanism.api.Object3D; import mekanism.client.SoundHandler; +import mekanism.common.EnergyNetwork.EnergyTransferEvent; import mekanism.common.FluidNetwork.FluidTransferEvent; import mekanism.common.IFactory.RecipeType; import mekanism.common.MekanismUtils.ResourceType; @@ -1214,6 +1215,14 @@ public class Mekanism logger.info("[Mekanism] Mod loaded."); } + @ForgeSubscribe + public void onEnergyTransferred(EnergyTransferEvent event) + { + try { + PacketHandler.sendPacket(Transmission.ALL_CLIENTS, new PacketTransmitterTransferUpdate().setParams(TransmitterTransferType.ENERGY, event.energyNetwork.cables.iterator().next(), event.power)); + } catch(Exception e) {} + } + @ForgeSubscribe public void onGasTransferred(GasTransferEvent event) { diff --git a/common/mekanism/common/TileEntityUniversalCable.java b/common/mekanism/common/TileEntityUniversalCable.java index 3144213a0..e678219ef 100644 --- a/common/mekanism/common/TileEntityUniversalCable.java +++ b/common/mekanism/common/TileEntityUniversalCable.java @@ -4,6 +4,10 @@ import java.util.HashSet; import mekanism.api.Object3D; import mekanism.api.TransmitterNetworkRegistry; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.INetworkManager; +import net.minecraft.network.packet.Packet; +import net.minecraft.network.packet.Packet132TileEntityData; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; @@ -22,6 +26,8 @@ public class TileEntityUniversalCable extends TileEntity implements IUniversalCa /** The energy network currently in use by this cable segment. */ public EnergyNetwork energyNetwork; + public double energyScale; + public TileEntityUniversalCable() { powerHandler = new PowerHandler(this, PowerHandler.Type.STORAGE); @@ -40,12 +46,6 @@ public class TileEntityUniversalCable extends TileEntity implements IUniversalCa return getNetwork(true); } - public float getEnergyScale() - { - //TODO: Let the client know how much power's being transferred - return 1.F; - } - @Override public EnergyNetwork getNetwork(boolean createIfNull) { @@ -161,4 +161,29 @@ public class TileEntityUniversalCable extends TileEntity implements IUniversalCa invalidate(); TransmitterNetworkRegistry.getInstance().pruneEmptyNetworks(); } + + @Override + public void setEnergyScale(double scale) + { + energyScale = scale; + } + + @Override + public Packet getDescriptionPacket() + { + energyScale = getNetwork().getPowerScale(); + NBTTagCompound nbtTag = new NBTTagCompound(); + nbtTag.setDouble("energyScale", energyScale); + return new Packet132TileEntityData(this.xCoord, this.yCoord, this.zCoord, 1, nbtTag); + } + + public void onDataPacket(INetworkManager net, Packet132TileEntityData packet) + { + setEnergyScale(packet.customParam1.getDouble("energyScale")); + } + + public float getEnergyScale() + { + return (float)energyScale; + } } \ No newline at end of file diff --git a/common/mekanism/common/network/PacketTransmitterTransferUpdate.java b/common/mekanism/common/network/PacketTransmitterTransferUpdate.java index 6f94f7746..560cf8228 100644 --- a/common/mekanism/common/network/PacketTransmitterTransferUpdate.java +++ b/common/mekanism/common/network/PacketTransmitterTransferUpdate.java @@ -3,6 +3,7 @@ package mekanism.common.network; import java.io.DataOutputStream; import mekanism.api.EnumGas; +import mekanism.client.EnergyClientUpdate; import mekanism.client.GasClientUpdate; import mekanism.client.FluidClientUpdate; import net.minecraft.entity.player.EntityPlayer; @@ -18,6 +19,8 @@ public class PacketTransmitterTransferUpdate implements IMekanismPacket public TileEntity tileEntity; + public double power; + public String gasName; public FluidStack fluidStack; @@ -36,6 +39,9 @@ public class PacketTransmitterTransferUpdate implements IMekanismPacket switch(activeType) { + case ENERGY: + power = (double)data[2]; + break; case GAS: gasName = ((EnumGas)data[2]).name; break; @@ -56,7 +62,18 @@ public class PacketTransmitterTransferUpdate implements IMekanismPacket int y = dataStream.readInt(); int z = dataStream.readInt(); - if(transmitterType == 0) + if(transmitterType == 0) + { + double powerLevel = dataStream.readDouble(); + + TileEntity tileEntity = world.getBlockTileEntity(x, y, z); + + if(tileEntity != null) + { + new EnergyClientUpdate(tileEntity, powerLevel).clientUpdate(); + } + } + else if(transmitterType == 1) { EnumGas type = EnumGas.getFromName(dataStream.readUTF()); @@ -67,7 +84,7 @@ public class PacketTransmitterTransferUpdate implements IMekanismPacket new GasClientUpdate(tileEntity, type).clientUpdate(); } } - else if(transmitterType == 1) + else if(transmitterType == 2) { TileEntity tileEntity = world.getBlockTileEntity(x, y, z); FluidStack fluidStack = new FluidStack(dataStream.readInt(), dataStream.readInt()); @@ -90,6 +107,9 @@ public class PacketTransmitterTransferUpdate implements IMekanismPacket switch(activeType) { + case ENERGY: + dataStream.writeDouble(power); + break; case GAS: dataStream.writeUTF(gasName); break; @@ -102,6 +122,7 @@ public class PacketTransmitterTransferUpdate implements IMekanismPacket public static enum TransmitterTransferType { + ENERGY, GAS, FLUID }