From 5bc0d45912c303171c596a0ef2f44f296ce1c915 Mon Sep 17 00:00:00 2001 From: Calclavia Date: Tue, 21 Jan 2014 18:24:05 +0800 Subject: [PATCH] Finished initial mechanical network packet and rotation system --- .../prefab/part/PartFramedConnection.java | 9 +- .../electrical/battery/TileBattery.java | 7 ++ .../electrical/generator/TileGenerator.java | 12 +-- .../electrical/wire/PartConductor.java | 7 ++ .../wire/framed/PartFramedWire.java | 3 + .../electrical/wire/trait/TraitConductor.java | 39 +++++--- .../mechanical/Mechanical.java | 4 + .../mechanical/belt/TileConveyorBelt.java | 15 +--- .../fluid/network/FluidNetwork.java | 7 ++ .../mechanical/fluid/network/PipeNetwork.java | 7 ++ .../fluid/prefab/TileFluidNetwork.java | 6 ++ .../mechanical/fluid/tank/TileTank.java | 2 +- .../mechanical/gear/PartGear.java | 17 +++- .../mechanical/network/IMechanical.java | 22 ++--- .../mechanical/network/MechanicalNetwork.java | 90 +++++++++++++++---- .../mechanical/network/PacketNetwork.java | 67 ++++++++++++++ .../mechanical/network/PartMechanical.java | 73 ++++++--------- ...ger.java => PathfinderUpdateRotation.java} | 23 ++--- .../mechanical/network/TileMechanical.java | 10 +-- .../process/RenderGrinderWheel.java | 5 +- .../mechanical/process/TileGrinderWheel.java | 6 +- .../mechanical/trait/TraitMechanical.java | 29 ++---- 22 files changed, 294 insertions(+), 166 deletions(-) create mode 100644 src/main/java/resonantinduction/mechanical/network/PacketNetwork.java rename src/main/java/resonantinduction/mechanical/network/{PathfinderRotationManager.java => PathfinderUpdateRotation.java} (53%) diff --git a/src/main/java/resonantinduction/core/prefab/part/PartFramedConnection.java b/src/main/java/resonantinduction/core/prefab/part/PartFramedConnection.java index 705dd7aa..2cc39097 100644 --- a/src/main/java/resonantinduction/core/prefab/part/PartFramedConnection.java +++ b/src/main/java/resonantinduction/core/prefab/part/PartFramedConnection.java @@ -11,6 +11,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraft.util.MovingObjectPosition; import net.minecraftforge.common.ForgeDirection; +import universalelectricity.api.energy.IEnergyNetwork; import universalelectricity.api.net.IConnector; import universalelectricity.api.net.INodeNetwork; import universalelectricity.api.vector.Vector3; @@ -198,7 +199,7 @@ public abstract class PartFramedConnection getInstance(ForgeDirection dir) + { + return this; + } + } \ No newline at end of file diff --git a/src/main/java/resonantinduction/electrical/battery/TileBattery.java b/src/main/java/resonantinduction/electrical/battery/TileBattery.java index 902fda8d..adf96695 100644 --- a/src/main/java/resonantinduction/electrical/battery/TileBattery.java +++ b/src/main/java/resonantinduction/electrical/battery/TileBattery.java @@ -8,6 +8,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; import resonantinduction.core.ResonantInduction; +import resonantinduction.mechanical.network.IMechanical; import universalelectricity.api.UniversalElectricity; import universalelectricity.api.electricity.IVoltageInput; import universalelectricity.api.electricity.IVoltageOutput; @@ -194,4 +195,10 @@ public class TileBattery extends TileElectrical implements IConnector getInstance(ForgeDirection from) + { + return this; + } } diff --git a/src/main/java/resonantinduction/electrical/generator/TileGenerator.java b/src/main/java/resonantinduction/electrical/generator/TileGenerator.java index 60731402..1f931713 100644 --- a/src/main/java/resonantinduction/electrical/generator/TileGenerator.java +++ b/src/main/java/resonantinduction/electrical/generator/TileGenerator.java @@ -69,7 +69,7 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat { float angularVelocity = extract / torqueRatio; long torque = (long) (extract / angularVelocity); - energy.extractEnergy(((IMechanical) mechanical).getNetwork(outputDir.getOpposite()).onReceiveEnergy(((IMechanical) mechanical), torque, angularVelocity), true); + energy.extractEnergy(((IMechanical) mechanical).getInstance(outputDir.getOpposite()).getNetwork().onReceiveEnergy(((IMechanical) mechanical), torque, angularVelocity), true); } } } @@ -153,12 +153,6 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat return this.network; } - @Override - public IMechanicalNetwork getNetwork(ForgeDirection from) - { - return getNetwork(); - } - @Override public void setNetwork(IMechanicalNetwork network) { @@ -166,9 +160,9 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat } @Override - public boolean sendNetworkPacket(long torque, float angularVelocity) + public int[] getLocation() { - return false; + return new int[] { xCoord, yCoord, zCoord, 0 }; } @Override diff --git a/src/main/java/resonantinduction/electrical/wire/PartConductor.java b/src/main/java/resonantinduction/electrical/wire/PartConductor.java index 678ca311..2a5a0c14 100644 --- a/src/main/java/resonantinduction/electrical/wire/PartConductor.java +++ b/src/main/java/resonantinduction/electrical/wire/PartConductor.java @@ -13,6 +13,7 @@ import universalelectricity.api.UniversalClass; import universalelectricity.api.energy.EnergyNetworkLoader; import universalelectricity.api.energy.IConductor; import universalelectricity.api.energy.IEnergyNetwork; +import universalelectricity.api.net.IConnector; import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.VectorHelper; import codechicken.multipart.TMultiPart; @@ -170,6 +171,12 @@ public abstract class PartConductor extends PartAdvanced implements IConductor super.preRemove(); } + @Override + public IConnector getInstance(ForgeDirection dir) + { + return this; + } + @Override public void save(NBTTagCompound nbt) { diff --git a/src/main/java/resonantinduction/electrical/wire/framed/PartFramedWire.java b/src/main/java/resonantinduction/electrical/wire/framed/PartFramedWire.java index c7dc4736..9be3e313 100644 --- a/src/main/java/resonantinduction/electrical/wire/framed/PartFramedWire.java +++ b/src/main/java/resonantinduction/electrical/wire/framed/PartFramedWire.java @@ -18,6 +18,8 @@ import resonantinduction.electrical.wire.EnumWireMaterial; import resonantinduction.electrical.wire.PartAdvancedWire; import universalelectricity.api.CompatibilityModule; import universalelectricity.api.energy.IConductor; +import universalelectricity.api.energy.IEnergyNetwork; +import universalelectricity.api.net.IConnector; import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.VectorHelper; import codechicken.lib.data.MCDataInput; @@ -538,4 +540,5 @@ public class PartFramedWire extends PartAdvancedWire implements TSlottedPart, JN this.getNetwork().setBufferFor(this, otherCable.getNetwork().getBufferOf(otherCable)); } + } \ No newline at end of file diff --git a/src/main/java/resonantinduction/electrical/wire/trait/TraitConductor.java b/src/main/java/resonantinduction/electrical/wire/trait/TraitConductor.java index d2309529..df337fb8 100644 --- a/src/main/java/resonantinduction/electrical/wire/trait/TraitConductor.java +++ b/src/main/java/resonantinduction/electrical/wire/trait/TraitConductor.java @@ -6,6 +6,7 @@ import java.util.Set; import net.minecraftforge.common.ForgeDirection; import universalelectricity.api.energy.IConductor; import universalelectricity.api.energy.IEnergyNetwork; +import universalelectricity.api.net.IConnector; import codechicken.multipart.TMultiPart; import codechicken.multipart.TileMultipart; @@ -67,11 +68,6 @@ public class TraitConductor extends TileMultipart implements IConductor @Override public IEnergyNetwork getNetwork() { - for (IConductor conductor : this.ueInterfaces) - { - return conductor.getNetwork(); - } - return null; } @@ -108,14 +104,11 @@ public class TraitConductor extends TileMultipart implements IConductor { for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - // if (dir != from.getOpposite()) - { - TMultiPart part = this.partMap(dir.ordinal()); + TMultiPart part = this.partMap(dir.ordinal()); - if (this.ueInterfaces.contains(part)) - { - return ((IConductor) part).onReceiveEnergy(from, receive, doReceive); - } + if (this.ueInterfaces.contains(part)) + { + return ((IConductor) part).onReceiveEnergy(from, receive, doReceive); } } } @@ -164,4 +157,26 @@ public class TraitConductor extends TileMultipart implements IConductor return capacitance; } + + @Override + public IConnector getInstance(ForgeDirection from) + { + /** + * Try out different sides to try to inject energy into. + */ + if (this.partMap(from.ordinal()) == null) + { + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + { + TMultiPart part = this.partMap(dir.ordinal()); + + if (this.ueInterfaces.contains(part)) + { + return ((IConductor) part).getInstance(from); + } + } + } + + return null; + } } diff --git a/src/main/java/resonantinduction/mechanical/Mechanical.java b/src/main/java/resonantinduction/mechanical/Mechanical.java index c68c0714..3c84f4f8 100644 --- a/src/main/java/resonantinduction/mechanical/Mechanical.java +++ b/src/main/java/resonantinduction/mechanical/Mechanical.java @@ -24,6 +24,8 @@ import resonantinduction.mechanical.logistic.BlockRejector; import resonantinduction.mechanical.logistic.TileDetector; import resonantinduction.mechanical.logistic.TileManipulator; import resonantinduction.mechanical.logistic.TileRejector; +import resonantinduction.mechanical.network.IMechanical; +import resonantinduction.mechanical.network.PacketNetwork; import calclavia.lib.content.ContentRegistry; import calclavia.lib.network.PacketHandler; import cpw.mods.fml.common.Mod; @@ -79,6 +81,8 @@ public class Mechanical public static Item itemPipe; public static Item itemPipeGuage; + public static final PacketNetwork PACKET_NETWORK = new PacketNetwork(IMechanical.class, Reference.CHANNEL); + @EventHandler public void preInit(FMLPreInitializationEvent evt) { diff --git a/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java b/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java index 60b982ce..cfd386a4 100644 --- a/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java +++ b/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java @@ -259,7 +259,7 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl if (tile instanceof IBelt) { connections[dir.ordinal()] = tile; - this.getNetwork().merge(((IBelt) tile).getNetwork()); + getNetwork().merge(((IBelt) tile).getNetwork()); didRefresh = true; } } @@ -282,13 +282,13 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl @Override public void invalidate() { - this.getNetwork().split(this); + getNetwork().split(this); super.invalidate(); } public float getMoveVelocity() { - return Math.max(this.getNetwork().getAngularVelocity(), this.getNetwork().getPrevAngularVelocity()); + return Math.max(getNetwork().getAngularVelocity(), getNetwork().getPrevAngularVelocity()); } @Override @@ -296,13 +296,4 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl { return 0.5f; } - - @Override - public IMechanicalNetwork getNetwork(ForgeDirection from) - { - if (from != this.getDirection() && from != this.getDirection().getOpposite()) - return getNetwork(); - return null; - } - } diff --git a/src/main/java/resonantinduction/mechanical/fluid/network/FluidNetwork.java b/src/main/java/resonantinduction/mechanical/fluid/network/FluidNetwork.java index bd56b069..d7d711df 100644 --- a/src/main/java/resonantinduction/mechanical/fluid/network/FluidNetwork.java +++ b/src/main/java/resonantinduction/mechanical/fluid/network/FluidNetwork.java @@ -9,6 +9,7 @@ import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; import resonantinduction.api.fluid.IFluidConnector; import resonantinduction.api.fluid.IFluidNetwork; +import resonantinduction.api.fluid.IFluidPipe; import universalelectricity.api.net.IUpdate; import universalelectricity.core.net.NetworkTickHandler; import universalelectricity.core.net.NodeNetwork; @@ -186,6 +187,12 @@ public abstract class FluidNetwork extends NodeNetwork { - /** - * Uses this connector to send a packet to the client for the network. - * - * @return True if the packet was successfully sent. - */ - public boolean sendNetworkPacket(long torque, float angularVelocity); - /** * The percentage of resistance caused by this connector. * @@ -19,6 +12,12 @@ public interface IMechanical extends IConnector */ public float getResistance(); + /** + * + * @return int[4]: x,y,z,direction + */ + public int[] getLocation(); + /** * @return Is the mechanical machine going clockwise currently? */ @@ -30,13 +29,4 @@ public interface IMechanical extends IConnector * @return Return true if the mechanical block should have its rotation set inveresed. */ public boolean isRotationInversed(); - - public IMechanicalNetwork getNetwork(ForgeDirection from); - - /** - * Gets the instance of this mechanical through ForgeMultipart - * - * @return - */ - public IMechanical getInstance(ForgeDirection from); } diff --git a/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java b/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java index 9772b52d..8fc00877 100644 --- a/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java +++ b/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java @@ -2,15 +2,22 @@ package resonantinduction.mechanical.network; import java.util.EnumSet; import java.util.HashMap; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Set; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; +import resonantinduction.mechanical.Mechanical; import universalelectricity.api.net.IUpdate; import universalelectricity.core.net.Network; import universalelectricity.core.net.NetworkTickHandler; +import calclavia.lib.network.IPacketReceiver; + +import com.google.common.io.ByteArrayDataInput; + +import cpw.mods.fml.common.network.PacketDispatcher; /** * A mechanical network for translate speed and force using mechanical rotations. @@ -28,7 +35,7 @@ import universalelectricity.core.net.NetworkTickHandler; * * @author Calclavia */ -public class MechanicalNetwork extends Network implements IMechanicalNetwork, IUpdate +public class MechanicalNetwork extends Network implements IMechanicalNetwork, IPacketReceiver, IUpdate { private long prevTorque = 0; private float prevAngularVelocity = 0; @@ -72,9 +79,13 @@ public class MechanicalNetwork extends Network for (IMechanical generatorNode : generators) { - PathfinderRotationManager rotationPathfinder = new PathfinderRotationManager(generatorNode, closedSet); - rotationPathfinder.findNodes(generatorNode); - closedSet.addAll(rotationPathfinder.closedSet); + if (generatorNode != null) + { + PathfinderUpdateRotation rotationPathfinder = new PathfinderUpdateRotation(generatorNode, this, closedSet); + rotationPathfinder.findNodes(generatorNode); + closedSet.addAll(rotationPathfinder.closedSet); + sendRotationUpdatePacket(generatorNode); + } } generators.clear(); @@ -91,18 +102,10 @@ public class MechanicalNetwork extends Network /** * Update all connectors */ - if (markPacketUpdate || getPrevTorque() != getTorque() || getPrevAngularVelocity() != getAngularVelocity()) + if (getPrevTorque() != getTorque() || getPrevAngularVelocity() != getAngularVelocity()) { - /** - * Send network update packet for connectors. - */ - for (IMechanical connector : this.getConnectors()) - { - if (connector.sendNetworkPacket(torque, angularVelocity)) - { - break; - } - } + sendNetworkPacket(); + markPacketUpdate = false; } prevTorque = torque; @@ -123,6 +126,53 @@ public class MechanicalNetwork extends Network return canUpdate(); } + /** + * Send network update packet for connectors. + */ + public void sendNetworkPacket() + { + for (IMechanical connector : this.getConnectors()) + { + if (connector instanceof TileEntity) + { + int[] location = connector.getLocation(); + PacketDispatcher.sendPacketToAllPlayers(Mechanical.PACKET_NETWORK.getPacket(location[0], location[1], location[2], location[3], (byte) 0, torque, angularVelocity)); + break; + } + } + } + + public void sendRotationUpdatePacket(IMechanical connector) + { + int[] location = connector.getLocation(); + PacketDispatcher.sendPacketToAllPlayers(Mechanical.PACKET_NETWORK.getPacket(location[0], location[1], location[2], location[3], (byte) 1, connector.isClockwise())); + } + + @Override + public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra) + { + try + { + switch (data.readByte()) + { + case 0: + setPower(data.readLong(), data.readFloat()); + break; + case 1: + IMechanical updateNode = (IMechanical) extra[0]; + updateNode.setClockwise(data.readBoolean()); + PathfinderUpdateRotation rotationPathfinder = new PathfinderUpdateRotation(updateNode, this, null); + rotationPathfinder.findNodes(updateNode); + System.out.println("UPDATE"); + break; + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + /** * Applies energy to the mechanical network this tick. * Note: Server side only. @@ -182,7 +232,7 @@ public class MechanicalNetwork extends Network // Reset prevTorque = torque = 0; prevAngularVelocity = angularVelocity = 0; - load = 0; + load = 1; super.reconstruct(); } @@ -233,6 +283,12 @@ public class MechanicalNetwork extends Network return new MechanicalNetwork(); } + @Override + public Class getConnectorClass() + { + return IMechanical.class; + } + @Override public String toString() { diff --git a/src/main/java/resonantinduction/mechanical/network/PacketNetwork.java b/src/main/java/resonantinduction/mechanical/network/PacketNetwork.java new file mode 100644 index 00000000..0dc6fa51 --- /dev/null +++ b/src/main/java/resonantinduction/mechanical/network/PacketNetwork.java @@ -0,0 +1,67 @@ +package resonantinduction.mechanical.network; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.network.packet.Packet; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.ForgeDirection; +import universalelectricity.api.net.IConnector; +import calclavia.lib.network.IPacketReceiver; +import calclavia.lib.network.PacketType; + +import com.google.common.io.ByteArrayDataInput; + +/** + * Packet handler for a grid network. + * + * @author Calclavia + */ +public class PacketNetwork extends PacketType +{ + private Class connectorClass; + + public PacketNetwork(Class networkClass, String channel) + { + super(channel); + this.connectorClass = networkClass; + } + + public Packet getPacket(int x, int y, int z, int dir, Object... args) + { + List newArgs = new ArrayList(); + + newArgs.add(x); + newArgs.add(y); + newArgs.add(z); + newArgs.add(dir); + + for (Object obj : args) + { + newArgs.add(obj); + } + + return super.getPacket(newArgs.toArray()); + } + + @Override + public void receivePacket(ByteArrayDataInput data, EntityPlayer player) + { + int x = data.readInt(); + int y = data.readInt(); + int z = data.readInt(); + TileEntity tileEntity = player.worldObj.getBlockTileEntity(x, y, z); + + if (tileEntity != null && connectorClass.isAssignableFrom(tileEntity.getClass())) + { + C instance = (C) ((C) tileEntity).getInstance(ForgeDirection.getOrientation(data.readInt())); + Object network = instance.getNetwork(); + + if (network instanceof IPacketReceiver) + { + ((IPacketReceiver) network).onReceivePacket(data, player, instance); + } + } + } +} diff --git a/src/main/java/resonantinduction/mechanical/network/PartMechanical.java b/src/main/java/resonantinduction/mechanical/network/PartMechanical.java index 9288695d..60a7dd24 100644 --- a/src/main/java/resonantinduction/mechanical/network/PartMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/PartMechanical.java @@ -20,7 +20,6 @@ import codechicken.multipart.JCuboidPart; import codechicken.multipart.JNormalOcclusion; import codechicken.multipart.TFacePart; import codechicken.multipart.TMultiPart; -import codechicken.multipart.TileMultipart; /** * We assume all the force acting on the gear is 90 degrees. @@ -104,18 +103,16 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu public void refresh() { /** Look for gears that are back-to-back with this gear. Equate torque. */ - universalelectricity.api.vector.Vector3 vec = new universalelectricity.api.vector.Vector3(tile()).translate(placementSide); + TileEntity tileBehind = new universalelectricity.api.vector.Vector3(tile()).translate(placementSide).getTileEntity(world()); - TileEntity tile = vec.getTileEntity(world()); - - if (tile instanceof IMechanical) + if (tileBehind instanceof IMechanical) { - IMechanicalNetwork networkToMerge = ((IMechanical) tile).getNetwork(this.placementSide.getOpposite()); + IMechanical instance = (IMechanical) ((IMechanical) tileBehind).getInstance(placementSide.getOpposite()); - if (networkToMerge != null) + if (instance != null && instance.canConnect(placementSide)) { - connections[this.placementSide.getOpposite().ordinal()] = ((IMechanical) tile).getInstance(this.placementSide.getOpposite()); - getNetwork().merge(networkToMerge); + connections[placementSide.getOpposite().ordinal()] = instance; + getNetwork().merge(instance.getNetwork()); } } @@ -124,18 +121,16 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu 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()).translate(checkDir); - - TileEntity checkTile = checkVec.getTileEntity(world()); + TileEntity checkTile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir).getTileEntity(world()); if (checkTile instanceof IMechanical) { - IMechanicalNetwork networkToMerge = ((IMechanical) checkTile).getNetwork(this.placementSide); + IMechanical instance = (IMechanical) ((IMechanical) checkTile).getInstance(placementSide); - if (networkToMerge != null) + if (instance != null && instance.canConnect(placementSide.getOpposite())) { - connections[checkDir.ordinal()] = ((IMechanical) checkTile).getInstance(this.placementSide); - getNetwork().merge(networkToMerge); + connections[checkDir.ordinal()] = instance; + getNetwork().merge(instance.getNetwork()); } } } @@ -144,29 +139,22 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu for (int i = 0; i < 6; i++) { ForgeDirection checkDir = ForgeDirection.getOrientation(i); - IMechanicalNetwork networkToMerge = ((IMechanical) tile()).getNetwork(checkDir); + IMechanical instance = (IMechanical) ((IMechanical) tile()).getInstance(checkDir); - if (networkToMerge != null) + if (instance != null && instance.canConnect(checkDir.getOpposite())) { - connections[checkDir.ordinal()] = ((IMechanical) tile()).getInstance(checkDir); - getNetwork().merge(networkToMerge); + connections[checkDir.ordinal()] = instance; + getNetwork().merge(instance.getNetwork()); } } - getNetwork().reconstruct(); if (!world().isRemote) { - sendRefreshPacket(); + sendRotationPacket(); } } - @Override - public IMechanicalNetwork getNetwork(ForgeDirection from) - { - return getNetwork(); - } - @Override public Object[] getConnections() { @@ -180,23 +168,11 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu } /** Packet Code. */ - - @Override - public boolean sendNetworkPacket(long torque, float angularVelocity) + public void sendRotationPacket() { if (world() != null && !world().isRemote && tile() != null) { - tile().getWriteStream(this).writeByte(0).writeLong(torque).writeFloat(angularVelocity).writeBoolean(isClockwise); - } - - return true; - } - - public void sendRefreshPacket() - { - if (world() != null && !world().isRemote && tile() != null) - { - tile().getWriteStream(this).writeByte(1); + tile().getWriteStream(this).writeByte(0).writeBoolean(isClockwise); } } @@ -204,13 +180,9 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu { if (packetID == 0) { - getNetwork().setPower(packet.readLong(), packet.readFloat()); + refresh(); isClockwise = packet.readBoolean(); } - else if (packetID == 1) - { - this.refresh(); - } } /** @@ -236,7 +208,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu @Override public boolean canConnect(ForgeDirection direction) { - return new universalelectricity.api.vector.Vector3(this.x() + direction.offsetX, this.y() + direction.offsetY, this.z() + direction.offsetZ).getTileEntity(this.world()) instanceof IMechanical; + return true; } @Override @@ -343,4 +315,9 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu return getItem(); } + @Override + public int[] getLocation() + { + return new int[] { x(), y(), z(), placementSide.ordinal() }; + } } \ No newline at end of file diff --git a/src/main/java/resonantinduction/mechanical/network/PathfinderRotationManager.java b/src/main/java/resonantinduction/mechanical/network/PathfinderUpdateRotation.java similarity index 53% rename from src/main/java/resonantinduction/mechanical/network/PathfinderRotationManager.java rename to src/main/java/resonantinduction/mechanical/network/PathfinderUpdateRotation.java index 45493f47..4c86767d 100644 --- a/src/main/java/resonantinduction/mechanical/network/PathfinderRotationManager.java +++ b/src/main/java/resonantinduction/mechanical/network/PathfinderUpdateRotation.java @@ -19,35 +19,38 @@ import universalelectricity.core.net.ConnectionPathfinder; * @author Calclavia * */ -public class PathfinderRotationManager extends ConnectionPathfinder +public class PathfinderUpdateRotation extends ConnectionPathfinder { - private boolean currentIsClockwise = true; + private boolean currentRotationFlag = true; private Set prevClosedSet; + private IMechanicalNetwork network; - public PathfinderRotationManager(IMechanical first, Set prevClosedSet) + public PathfinderUpdateRotation(IMechanical first, IMechanicalNetwork network, Set prevClosedSet) { - super(first); - this.currentIsClockwise = first.isClockwise(); + super(IMechanical.class, first); + this.currentRotationFlag = first.isClockwise(); this.prevClosedSet = prevClosedSet; + this.network = network; } public boolean findNodes(IMechanical currentNode) { this.closedSet.add(currentNode); - currentNode.setClockwise(currentIsClockwise); + currentNode.setClockwise(currentRotationFlag); for (IMechanical node : this.getConnectedNodes(currentNode)) { if (!this.closedSet.contains(node)) { - if (prevClosedSet.contains(node) && node.isClockwise() != currentNode.isClockwise()) + currentRotationFlag = (node.isRotationInversed() && currentNode.isRotationInversed()) ? !currentNode.isClockwise() : currentNode.isClockwise(); + + if ((prevClosedSet != null && prevClosedSet.contains(node)) && (node.isClockwise() != currentRotationFlag)) { - // We have conflicting gears. Network is now equal. - currentNode.getNetwork().setPower(0, 0); + // We have conflicting rotations. Network is now stuck. + network.setPower(0, 0); } - currentIsClockwise = (node.isRotationInversed() && currentNode.isRotationInversed()) ? !currentNode.isClockwise() : currentNode.isClockwise(); findNodes(node); } } diff --git a/src/main/java/resonantinduction/mechanical/network/TileMechanical.java b/src/main/java/resonantinduction/mechanical/network/TileMechanical.java index 00b12d57..7eb161ce 100644 --- a/src/main/java/resonantinduction/mechanical/network/TileMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/TileMechanical.java @@ -12,12 +12,6 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical private boolean isClockwise = false; - @Override - public boolean canConnect(ForgeDirection direction) - { - return false; - } - @Override public Object[] getConnections() { @@ -42,9 +36,9 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical } @Override - public boolean sendNetworkPacket(long torque, float angularVelocity) + public int[] getLocation() { - return false; + return new int[] { xCoord, yCoord, zCoord, 0 }; } @Override diff --git a/src/main/java/resonantinduction/mechanical/process/RenderGrinderWheel.java b/src/main/java/resonantinduction/mechanical/process/RenderGrinderWheel.java index d0efe5d1..60ea5542 100644 --- a/src/main/java/resonantinduction/mechanical/process/RenderGrinderWheel.java +++ b/src/main/java/resonantinduction/mechanical/process/RenderGrinderWheel.java @@ -35,11 +35,8 @@ public class RenderGrinderWheel extends TileEntitySpecialRenderer glPushMatrix(); glTranslatef((float) x + 0.5F, (float) y + 0.5f, (float) z + 0.5F); glScalef(0.51f, 0.51f, 0.51f); - RenderUtility.rotateBlockBasedOnDirection(tile.getDirection()); - - glRotatef((float) Math.toDegrees(tile.getNetwork().getRotation()) * (tile.isClockwise() ? 1 : -1), 0, 0, 1); - + glRotatef((float) Math.toDegrees(tile.getNetwork().getRotation() * (tile.isClockwise() ? 1 : -1)), 0, 0, 1); FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE); MODEL.renderAll(); glPopMatrix(); diff --git a/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java b/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java index 876a4094..8a74b848 100644 --- a/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java +++ b/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java @@ -179,10 +179,8 @@ public class TileGrinderWheel extends TileMechanical implements IRotatable } @Override - public IMechanicalNetwork getNetwork(ForgeDirection from) + public boolean canConnect(ForgeDirection from) { - if (from != this.getDirection() && from != this.getDirection().getOpposite()) - return getNetwork(); - return null; + return from != this.getDirection() && from != this.getDirection().getOpposite(); } } diff --git a/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java b/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java index 96d0569b..158901a2 100644 --- a/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java +++ b/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java @@ -88,18 +88,8 @@ public class TraitMechanical extends TileMultipart implements IMechanical } @Override - public IMechanicalNetwork getNetwork(ForgeDirection from) + public IMechanicalNetwork getNetwork() { - TMultiPart part = this.partMap(from.ordinal()); - - if (part != null) - { - if (part instanceof IMechanical) - { - return ((IMechanical) part).getNetwork(); - } - } - return null; } @@ -117,12 +107,7 @@ public class TraitMechanical extends TileMultipart implements IMechanical } return null; - } - @Override - public IMechanicalNetwork getNetwork() - { - return null; } @Override @@ -131,12 +116,6 @@ public class TraitMechanical extends TileMultipart implements IMechanical } - @Override - public boolean sendNetworkPacket(long torque, float angularVelocity) - { - return false; - } - @Override public float getResistance() { @@ -148,4 +127,10 @@ public class TraitMechanical extends TileMultipart implements IMechanical { return false; } + + @Override + public int[] getLocation() + { + return null; + } }