From 49fc056c8ca0c23d0429c9d7234a4b542c740131 Mon Sep 17 00:00:00 2001 From: Ben Spiers Date: Sun, 4 Aug 2013 01:48:13 +0100 Subject: [PATCH] My approach to Universal Cables rendering power. They render with transparency proportional to the base 10 log of power, to compensate for the wide range of power that can be transmitted, and minimise client update packets. --- .../mekanism/client/EnergyClientUpdate.java | 41 +++++++++++++++++++ common/mekanism/common/EnergyNetwork.java | 40 ++++++++++++++++++ common/mekanism/common/IUniversalCable.java | 2 + common/mekanism/common/Mekanism.java | 9 ++++ .../common/TileEntityUniversalCable.java | 37 ++++++++++++++--- .../PacketTransmitterTransferUpdate.java | 25 ++++++++++- 6 files changed, 146 insertions(+), 8 deletions(-) create mode 100644 common/mekanism/client/EnergyClientUpdate.java 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 }