From 883930a1bf9dabe696a3229483f93cc34c376792 Mon Sep 17 00:00:00 2001 From: Calclavia Date: Sat, 18 Jan 2014 12:36:31 +0800 Subject: [PATCH] Made mechanical network packets more efficient --- .../electrical/generator/BlockGenerator.java | 2 + .../electrical/generator/TileGenerator.java | 18 +- .../wire/framed/PartFramedWire.java | 12 +- .../mechanical/gear/PartGear.java | 170 ++++++++++++++---- .../network/IMechanicalConnector.java | 7 +- .../network/IMechanicalNetwork.java | 6 +- .../mechanical/network/MechanicalNetwork.java | 80 +++++---- 7 files changed, 215 insertions(+), 80 deletions(-) diff --git a/src/main/java/resonantinduction/electrical/generator/BlockGenerator.java b/src/main/java/resonantinduction/electrical/generator/BlockGenerator.java index 94ab79d7..bcf18e40 100644 --- a/src/main/java/resonantinduction/electrical/generator/BlockGenerator.java +++ b/src/main/java/resonantinduction/electrical/generator/BlockGenerator.java @@ -3,6 +3,7 @@ package resonantinduction.electrical.generator; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import resonantinduction.core.Reference; import resonantinduction.core.prefab.block.BlockRIRotatable; import resonantinduction.core.render.RIBlockRenderingHandler; import cpw.mods.fml.relauncher.Side; @@ -13,6 +14,7 @@ public class BlockGenerator extends BlockRIRotatable public BlockGenerator() { super("generator"); + setTextureName(Reference.PREFIX + "material_steel"); } @Override diff --git a/src/main/java/resonantinduction/electrical/generator/TileGenerator.java b/src/main/java/resonantinduction/electrical/generator/TileGenerator.java index 37f82262..275db150 100644 --- a/src/main/java/resonantinduction/electrical/generator/TileGenerator.java +++ b/src/main/java/resonantinduction/electrical/generator/TileGenerator.java @@ -2,6 +2,7 @@ package resonantinduction.electrical.generator; import java.util.EnumSet; +import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.ForgeDirection; import resonantinduction.mechanical.network.IMechanical; import universalelectricity.api.energy.EnergyStorageHandler; @@ -15,8 +16,6 @@ import calclavia.lib.prefab.tile.TileElectrical; */ public class TileGenerator extends TileElectrical implements IMechanical { - private long power; - /** Generator turns KE -> EE. Inverted one will turn EE -> KE. */ public boolean isInversed = false; @@ -33,7 +32,6 @@ public class TileGenerator extends TileElectrical implements IMechanical { if (!isInversed) { - this.power -= this.energy.receiveEnergy(power, true); this.produce(); } else @@ -88,4 +86,18 @@ public class TileGenerator extends TileElectrical implements IMechanical { energy.receiveEnergy((long) (torque * angularVelocity), true); } + + @Override + public void readFromNBT(NBTTagCompound nbt) + { + super.readFromNBT(nbt); + isInversed = nbt.getBoolean("isInversed"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) + { + super.writeToNBT(nbt); + nbt.setBoolean("isInversed", isInversed); + } } diff --git a/src/main/java/resonantinduction/electrical/wire/framed/PartFramedWire.java b/src/main/java/resonantinduction/electrical/wire/framed/PartFramedWire.java index 0817c23b..3897548a 100644 --- a/src/main/java/resonantinduction/electrical/wire/framed/PartFramedWire.java +++ b/src/main/java/resonantinduction/electrical/wire/framed/PartFramedWire.java @@ -256,12 +256,6 @@ public class PartFramedWire extends PartAdvancedWire implements TSlottedPart, JN IconHitEffects.addDestroyEffects(this, effectRenderer, false); } - @Override - public void onPartChanged(TMultiPart part) - { - refresh(); - } - public boolean isBlockedOnSide(ForgeDirection side) { TMultiPart blocker = tile().partMap(side.ordinal()); @@ -481,6 +475,12 @@ public class PartFramedWire extends PartAdvancedWire implements TSlottedPart, JN refresh(); } + @Override + public void onPartChanged(TMultiPart part) + { + refresh(); + } + /** * Packets */ diff --git a/src/main/java/resonantinduction/mechanical/gear/PartGear.java b/src/main/java/resonantinduction/mechanical/gear/PartGear.java index c6d3d2ff..8e62d086 100644 --- a/src/main/java/resonantinduction/mechanical/gear/PartGear.java +++ b/src/main/java/resonantinduction/mechanical/gear/PartGear.java @@ -81,39 +81,134 @@ public class PartGear extends JCuboidPart implements JNormalOcclusion, TFacePart @Override public void update() { - if (manualCrankTime > 0) + if (!this.world().isRemote) { - onReceiveEnergy(null, 20, 0.3f); - manualCrankTime--; - } - - if (!world().isRemote) - { - //TODO: Save packets. - if (markRotationUpdate || this.getNetwork().getPrevTorque() != this.getNetwork().getTorque() || this.getNetwork().getPrevAngularVelocity() != this.getNetwork().getAngularVelocity()) + if (manualCrankTime > 0) { - this.sendRotationUpdate(this.getNetwork().getTorque(), this.getNetwork().getAngularVelocity()); + onReceiveEnergy(null, 20, 0.3f); + manualCrankTime--; } } - - if (markRotationUpdate) + else { - refresh(); + if (markRotationUpdate) + { + updateRotations(); + } + + /** + * Update angle rotation. + */ + if (isClockwise) + angle += this.getNetwork().getAngularVelocity() / 20f; + else + angle -= this.getNetwork().getAngularVelocity() / 20f; } + } @Override - public void networkUpdate() + public void onNetworkChanged() { - /** - * Update angle rotation. - */ - if (isClockwise) - angle += this.getNetwork().getAngularVelocity() / 20; - else - angle -= this.getNetwork().getAngularVelocity() / 20; + if (world() != null) + { + if (markRotationUpdate) + { + updateRotations(); + } + } } + /** + * Updates rotations of all nearby gears. + */ + public void updateRotations() + { + /** Look for gears that are back-to-back with this gear. Equate torque. */ + universalelectricity.api.vector.Vector3 vec = new universalelectricity.api.vector.Vector3(tile()).modifyPositionFromSide(placementSide); + + TileEntity tile = vec.getTileEntity(world()); + + if (tile instanceof TileMultipart) + { + TMultiPart neighbor = ((TileMultipart) tile).partMap(this.placementSide.getOpposite().ordinal()); + + if (neighbor instanceof PartGear) + { + equateRotation((PartGear) neighbor, false); + } + } + + /** Look for gears outside this block space, the relative UP, DOWN, LEFT, RIGHT */ + for (int i = 0; i < 4; i++) + { + ForgeDirection checkDir = ForgeDirection.getOrientation(Rotation.rotateSide(this.placementSide.ordinal(), i)); + universalelectricity.api.vector.Vector3 checkVec = new universalelectricity.api.vector.Vector3(tile()).modifyPositionFromSide(checkDir); + + TileEntity checkTile = checkVec.getTileEntity(world()); + + if (checkTile instanceof TileMultipart) + { + TMultiPart neighbor = ((TileMultipart) checkTile).partMap(this.placementSide.ordinal()); + + if (neighbor != this && neighbor instanceof PartGear) + { + equateRotation((PartGear) neighbor, false); + } + } + } + + /** Look for gears that are internal and adjacent to this gear. (The 2 sides) */ + for (int i = 0; i < 4; i++) + { + ForgeDirection checkDir = ForgeDirection.getOrientation(i); + TMultiPart neighbor = tile().partMap(this.placementSide.getRotation(checkDir).ordinal()); + + if (neighbor != this && neighbor instanceof PartGear) + { + equateRotation((PartGear) neighbor, false); + } + } + + markRotationUpdate = false; + } + + @Override + public void onAdded() + { + super.onAdded(); + refresh(); + } + + @Override + public void onMoved() + { + this.refresh(); + } + + @Override + public void onChunkLoad() + { + super.onChunkLoad(); + refresh(); + } + + @Override + public void onNeighborChanged() + { + super.onNeighborChanged(); + refresh(); + } + + @Override + public void onPartChanged(TMultiPart part) + { + refresh(); + } + + /** + * Refresh should be called sparingly. + */ public void refresh() { /** Look for gears that are back-to-back with this gear. Equate torque. */ @@ -129,13 +224,11 @@ public class PartGear extends JCuboidPart implements JNormalOcclusion, TFacePart { connections[this.placementSide.getOpposite().ordinal()] = neighbor; getNetwork().merge(((PartGear) neighbor).getNetwork()); - equateRotation((PartGear) neighbor, false); } } else if (tile instanceof IMechanical) { connections[this.placementSide.getOpposite().ordinal()] = tile; - getNetwork().reconstruct(); } /** Look for gears outside this block space, the relative UP, DOWN, LEFT, RIGHT */ @@ -154,7 +247,6 @@ public class PartGear extends JCuboidPart implements JNormalOcclusion, TFacePart { connections[checkDir.ordinal()] = neighbor; getNetwork().merge(((PartGear) neighbor).getNetwork()); - equateRotation((PartGear) neighbor, false); } } } @@ -169,11 +261,10 @@ public class PartGear extends JCuboidPart implements JNormalOcclusion, TFacePart { connections[checkDir.ordinal()] = neighbor; getNetwork().merge(((PartGear) neighbor).getNetwork()); - equateRotation((PartGear) neighbor, false); } } - markRotationUpdate = false; + getNetwork().reconstruct(); } @Override @@ -213,17 +304,17 @@ public class PartGear extends JCuboidPart implements JNormalOcclusion, TFacePart public void onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity) { - getNetwork().applyEnergy(torque, angularVelocity); - markRotationUpdate = true; + if (!world().isRemote) + { + getNetwork().applyEnergy(torque, angularVelocity); + markRotationUpdate = true; + } } @Override public void preRemove() { - if (!world().isRemote) - { - this.getNetwork().split(this); - } + this.getNetwork().split(this); } /** Packet Code. */ @@ -245,19 +336,22 @@ public class PartGear extends JCuboidPart implements JNormalOcclusion, TFacePart read(packet, packet.readUByte()); } + @Override + public void sendNetworkPacket(long torque, float angularVelocity) + {System.out.println("SEND"); + tile().getWriteStream(this).writeByte(0).writeLong(torque).writeFloat(angularVelocity).writeBoolean(isClockwise); + } + public void read(MCDataInput packet, int packetID) { if (packetID == 0) { - onReceiveEnergy(null, packet.readLong(), packet.readFloat()); + getNetwork().setPower(packet.readLong(), packet.readFloat()); + isClockwise = packet.readBoolean(); + markRotationUpdate = true; } } - public void sendRotationUpdate(long torque, float angularVelocity) - { - tile().getWriteStream(this).writeByte(0).writeLong(torque).writeFloat(angularVelocity); - } - @Override public int getSlotMask() { diff --git a/src/main/java/resonantinduction/mechanical/network/IMechanicalConnector.java b/src/main/java/resonantinduction/mechanical/network/IMechanicalConnector.java index bccbae07..a465a958 100644 --- a/src/main/java/resonantinduction/mechanical/network/IMechanicalConnector.java +++ b/src/main/java/resonantinduction/mechanical/network/IMechanicalConnector.java @@ -13,5 +13,10 @@ public interface IMechanicalConnector extends IMechanical, IConnector implements IMechanicalNetwork { - public int prevTorque = 0; - public float prevAngularVelocity = 0; + private long prevTorque = 0; + private float prevAngularVelocity = 0; - public int torque = 0; - public float angularVelocity = 0; + private long torque = 0; + private float angularVelocity = 0; /** The direction in which a conductor is placed relative to a specific conductor. */ protected final HashMap> handlerDirectionMap = new LinkedHashMap>(); + /** + * An network update called only server side. + */ @Override public void update() { - prevTorque = torque; - prevAngularVelocity = angularVelocity; - - for (IMechanicalConnector connector : this.getConnectors()) + if (getPrevTorque() != getTorque() || getPrevAngularVelocity() != getAngularVelocity()) { - connector.networkUpdate(); + boolean isFirst = true; + + for (IMechanicalConnector connector : this.getConnectors()) + { + if (isFirst) + { + connector.sendNetworkPacket(torque, angularVelocity); + isFirst = false; + } + + connector.onNetworkChanged(); + } } for (IMechanical node : this.getNodes()) @@ -56,12 +67,16 @@ public class MechanicalNetwork extends Network 0) - { - NetworkTickHandler.addNetwork(this); - } } } @@ -269,15 +300,4 @@ public class MechanicalNetwork extends Network