Finished initial mechanical network packet and rotation system

This commit is contained in:
Calclavia 2014-01-21 18:24:05 +08:00
parent 19ee8e95d0
commit 5bc0d45912
22 changed files with 294 additions and 166 deletions

View file

@ -11,6 +11,7 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Icon; import net.minecraft.util.Icon;
import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.MovingObjectPosition;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
import universalelectricity.api.energy.IEnergyNetwork;
import universalelectricity.api.net.IConnector; import universalelectricity.api.net.IConnector;
import universalelectricity.api.net.INodeNetwork; import universalelectricity.api.net.INodeNetwork;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
@ -198,7 +199,7 @@ public abstract class PartFramedConnection<M extends Enum, C extends IConnector<
@Override @Override
public void bind(TileMultipart t) public void bind(TileMultipart t)
{ {
if ( this.getNetwork() != null) if (this.getNetwork() != null)
{ {
getNetwork().getConnectors().remove(this); getNetwork().getConnectors().remove(this);
super.bind(t); super.bind(t);
@ -458,4 +459,10 @@ public abstract class PartFramedConnection<M extends Enum, C extends IConnector<
this.network = network; this.network = network;
} }
@Override
public IConnector<N> getInstance(ForgeDirection dir)
{
return this;
}
} }

View file

@ -8,6 +8,7 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
import resonantinduction.core.ResonantInduction; import resonantinduction.core.ResonantInduction;
import resonantinduction.mechanical.network.IMechanical;
import universalelectricity.api.UniversalElectricity; import universalelectricity.api.UniversalElectricity;
import universalelectricity.api.electricity.IVoltageInput; import universalelectricity.api.electricity.IVoltageInput;
import universalelectricity.api.electricity.IVoltageOutput; import universalelectricity.api.electricity.IVoltageOutput;
@ -194,4 +195,10 @@ public class TileBattery extends TileElectrical implements IConnector<BatteryNet
{ {
} }
@Override
public IConnector<BatteryNetwork> getInstance(ForgeDirection from)
{
return this;
}
} }

View file

@ -69,7 +69,7 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat
{ {
float angularVelocity = extract / torqueRatio; float angularVelocity = extract / torqueRatio;
long torque = (long) (extract / angularVelocity); 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; return this.network;
} }
@Override
public IMechanicalNetwork getNetwork(ForgeDirection from)
{
return getNetwork();
}
@Override @Override
public void setNetwork(IMechanicalNetwork network) public void setNetwork(IMechanicalNetwork network)
{ {
@ -166,9 +160,9 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat
} }
@Override @Override
public boolean sendNetworkPacket(long torque, float angularVelocity) public int[] getLocation()
{ {
return false; return new int[] { xCoord, yCoord, zCoord, 0 };
} }
@Override @Override

View file

@ -13,6 +13,7 @@ import universalelectricity.api.UniversalClass;
import universalelectricity.api.energy.EnergyNetworkLoader; import universalelectricity.api.energy.EnergyNetworkLoader;
import universalelectricity.api.energy.IConductor; import universalelectricity.api.energy.IConductor;
import universalelectricity.api.energy.IEnergyNetwork; import universalelectricity.api.energy.IEnergyNetwork;
import universalelectricity.api.net.IConnector;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import universalelectricity.api.vector.VectorHelper; import universalelectricity.api.vector.VectorHelper;
import codechicken.multipart.TMultiPart; import codechicken.multipart.TMultiPart;
@ -170,6 +171,12 @@ public abstract class PartConductor extends PartAdvanced implements IConductor
super.preRemove(); super.preRemove();
} }
@Override
public IConnector<IEnergyNetwork> getInstance(ForgeDirection dir)
{
return this;
}
@Override @Override
public void save(NBTTagCompound nbt) public void save(NBTTagCompound nbt)
{ {

View file

@ -18,6 +18,8 @@ import resonantinduction.electrical.wire.EnumWireMaterial;
import resonantinduction.electrical.wire.PartAdvancedWire; import resonantinduction.electrical.wire.PartAdvancedWire;
import universalelectricity.api.CompatibilityModule; import universalelectricity.api.CompatibilityModule;
import universalelectricity.api.energy.IConductor; import universalelectricity.api.energy.IConductor;
import universalelectricity.api.energy.IEnergyNetwork;
import universalelectricity.api.net.IConnector;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import universalelectricity.api.vector.VectorHelper; import universalelectricity.api.vector.VectorHelper;
import codechicken.lib.data.MCDataInput; 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)); this.getNetwork().setBufferFor(this, otherCable.getNetwork().getBufferOf(otherCable));
} }
} }

View file

@ -6,6 +6,7 @@ import java.util.Set;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
import universalelectricity.api.energy.IConductor; import universalelectricity.api.energy.IConductor;
import universalelectricity.api.energy.IEnergyNetwork; import universalelectricity.api.energy.IEnergyNetwork;
import universalelectricity.api.net.IConnector;
import codechicken.multipart.TMultiPart; import codechicken.multipart.TMultiPart;
import codechicken.multipart.TileMultipart; import codechicken.multipart.TileMultipart;
@ -67,11 +68,6 @@ public class TraitConductor extends TileMultipart implements IConductor
@Override @Override
public IEnergyNetwork getNetwork() public IEnergyNetwork getNetwork()
{ {
for (IConductor conductor : this.ueInterfaces)
{
return conductor.getNetwork();
}
return null; return null;
} }
@ -108,14 +104,11 @@ public class TraitConductor extends TileMultipart implements IConductor
{ {
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) 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)) if (this.ueInterfaces.contains(part))
{ {
return ((IConductor) part).onReceiveEnergy(from, receive, doReceive); return ((IConductor) part).onReceiveEnergy(from, receive, doReceive);
}
} }
} }
} }
@ -164,4 +157,26 @@ public class TraitConductor extends TileMultipart implements IConductor
return capacitance; return capacitance;
} }
@Override
public IConnector<IEnergyNetwork> 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;
}
} }

View file

@ -24,6 +24,8 @@ import resonantinduction.mechanical.logistic.BlockRejector;
import resonantinduction.mechanical.logistic.TileDetector; import resonantinduction.mechanical.logistic.TileDetector;
import resonantinduction.mechanical.logistic.TileManipulator; import resonantinduction.mechanical.logistic.TileManipulator;
import resonantinduction.mechanical.logistic.TileRejector; import resonantinduction.mechanical.logistic.TileRejector;
import resonantinduction.mechanical.network.IMechanical;
import resonantinduction.mechanical.network.PacketNetwork;
import calclavia.lib.content.ContentRegistry; import calclavia.lib.content.ContentRegistry;
import calclavia.lib.network.PacketHandler; import calclavia.lib.network.PacketHandler;
import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod;
@ -79,6 +81,8 @@ public class Mechanical
public static Item itemPipe; public static Item itemPipe;
public static Item itemPipeGuage; public static Item itemPipeGuage;
public static final PacketNetwork PACKET_NETWORK = new PacketNetwork(IMechanical.class, Reference.CHANNEL);
@EventHandler @EventHandler
public void preInit(FMLPreInitializationEvent evt) public void preInit(FMLPreInitializationEvent evt)
{ {

View file

@ -259,7 +259,7 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl
if (tile instanceof IBelt) if (tile instanceof IBelt)
{ {
connections[dir.ordinal()] = tile; connections[dir.ordinal()] = tile;
this.getNetwork().merge(((IBelt) tile).getNetwork()); getNetwork().merge(((IBelt) tile).getNetwork());
didRefresh = true; didRefresh = true;
} }
} }
@ -282,13 +282,13 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl
@Override @Override
public void invalidate() public void invalidate()
{ {
this.getNetwork().split(this); getNetwork().split(this);
super.invalidate(); super.invalidate();
} }
public float getMoveVelocity() public float getMoveVelocity()
{ {
return Math.max(this.getNetwork().getAngularVelocity(), this.getNetwork().getPrevAngularVelocity()); return Math.max(getNetwork().getAngularVelocity(), getNetwork().getPrevAngularVelocity());
} }
@Override @Override
@ -296,13 +296,4 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl
{ {
return 0.5f; return 0.5f;
} }
@Override
public IMechanicalNetwork getNetwork(ForgeDirection from)
{
if (from != this.getDirection() && from != this.getDirection().getOpposite())
return getNetwork();
return null;
}
} }

View file

@ -9,6 +9,7 @@ import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler; import net.minecraftforge.fluids.IFluidHandler;
import resonantinduction.api.fluid.IFluidConnector; import resonantinduction.api.fluid.IFluidConnector;
import resonantinduction.api.fluid.IFluidNetwork; import resonantinduction.api.fluid.IFluidNetwork;
import resonantinduction.api.fluid.IFluidPipe;
import universalelectricity.api.net.IUpdate; import universalelectricity.api.net.IUpdate;
import universalelectricity.core.net.NetworkTickHandler; import universalelectricity.core.net.NetworkTickHandler;
import universalelectricity.core.net.NodeNetwork; import universalelectricity.core.net.NodeNetwork;
@ -186,6 +187,12 @@ public abstract class FluidNetwork extends NodeNetwork<IFluidNetwork, IFluidConn
return this.tank; return this.tank;
} }
@Override
public Class getConnectorClass()
{
return IFluidConnector.class;
}
@Override @Override
public FluidTankInfo[] getTankInfo() public FluidTankInfo[] getTankInfo()
{ {

View file

@ -11,6 +11,7 @@ import net.minecraftforge.fluids.IFluidHandler;
import resonantinduction.api.fluid.IFluidConnector; import resonantinduction.api.fluid.IFluidConnector;
import resonantinduction.api.fluid.IFluidNetwork; import resonantinduction.api.fluid.IFluidNetwork;
import resonantinduction.api.fluid.IFluidPipe; import resonantinduction.api.fluid.IFluidPipe;
import universalelectricity.api.energy.IConductor;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import calclavia.lib.utility.FluidUtility; import calclavia.lib.utility.FluidUtility;
@ -122,6 +123,12 @@ public class PipeNetwork extends FluidNetwork
return null; return null;
} }
@Override
public Class getConnectorClass()
{
return IFluidPipe.class;
}
@Override @Override
public IFluidNetwork newInstance() public IFluidNetwork newInstance()
{ {

View file

@ -17,6 +17,7 @@ import resonantinduction.api.fluid.IFluidConnector;
import resonantinduction.api.fluid.IFluidNetwork; import resonantinduction.api.fluid.IFluidNetwork;
import resonantinduction.core.ResonantInduction; import resonantinduction.core.ResonantInduction;
import resonantinduction.mechanical.Mechanical; import resonantinduction.mechanical.Mechanical;
import resonantinduction.mechanical.network.IMechanical;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import calclavia.lib.network.IPacketReceiverWithID; import calclavia.lib.network.IPacketReceiverWithID;
import calclavia.lib.network.PacketHandler; import calclavia.lib.network.PacketHandler;
@ -315,4 +316,9 @@ public abstract class TileFluidNetwork extends TileAdvanced implements IFluidCon
return null; return null;
} }
@Override
public IFluidConnector getInstance(ForgeDirection from)
{
return this;
}
} }

View file

@ -43,7 +43,7 @@ public class TileTank extends TileFluidNetwork
{ {
if (tileEntity instanceof TileTank) if (tileEntity instanceof TileTank)
{ {
this.getNetwork().merge(((IFluidConnector) tileEntity).getNetwork()); getNetwork().merge(((IFluidConnector) tileEntity).getNetwork());
this.setRenderSide(side, true); this.setRenderSide(side, true);
connectedBlocks[side.ordinal()] = tileEntity; connectedBlocks[side.ordinal()] = tileEntity;
} }

View file

@ -1,5 +1,6 @@
package resonantinduction.mechanical.gear; package resonantinduction.mechanical.gear;
import calclavia.lib.prefab.block.BlockAdvanced;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.MovingObjectPosition;
@ -48,9 +49,21 @@ public class PartGear extends PartMechanical implements IMechanical
{ {
System.out.println(world().isRemote + ": " + getNetwork()); System.out.println(world().isRemote + ": " + getNetwork());
if (player.isSneaking()) if (BlockAdvanced.isUsableWrench(player, player.getCurrentEquippedItem(), tile().xCoord, tile().yCoord, tile().zCoord))
{ {
this.manualCrankTime = 20; if (player.isSneaking())
{
if (!world().isRemote)
{
setClockwise(!isClockwise());
player.addChatMessage("Flipped gear to rotate " + (isClockwise() ? "clockwise" : "anticlockwise") + ".");
}
}
else
{
this.manualCrankTime = 20;
}
} }
return false; return false;

View file

@ -5,13 +5,6 @@ import universalelectricity.api.net.IConnector;
public interface IMechanical extends IConnector<IMechanicalNetwork> public interface IMechanical extends IConnector<IMechanicalNetwork>
{ {
/**
* 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. * The percentage of resistance caused by this connector.
* *
@ -19,6 +12,12 @@ public interface IMechanical extends IConnector<IMechanicalNetwork>
*/ */
public float getResistance(); public float getResistance();
/**
*
* @return int[4]: x,y,z,direction
*/
public int[] getLocation();
/** /**
* @return Is the mechanical machine going clockwise currently? * @return Is the mechanical machine going clockwise currently?
*/ */
@ -30,13 +29,4 @@ public interface IMechanical extends IConnector<IMechanicalNetwork>
* @return Return true if the mechanical block should have its rotation set inveresed. * @return Return true if the mechanical block should have its rotation set inveresed.
*/ */
public boolean isRotationInversed(); public boolean isRotationInversed();
public IMechanicalNetwork getNetwork(ForgeDirection from);
/**
* Gets the instance of this mechanical through ForgeMultipart
*
* @return
*/
public IMechanical getInstance(ForgeDirection from);
} }

View file

@ -2,15 +2,22 @@ package resonantinduction.mechanical.network;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.Set; import java.util.Set;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
import resonantinduction.mechanical.Mechanical;
import universalelectricity.api.net.IUpdate; import universalelectricity.api.net.IUpdate;
import universalelectricity.core.net.Network; import universalelectricity.core.net.Network;
import universalelectricity.core.net.NetworkTickHandler; 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. * A mechanical network for translate speed and force using mechanical rotations.
@ -28,7 +35,7 @@ import universalelectricity.core.net.NetworkTickHandler;
* *
* @author Calclavia * @author Calclavia
*/ */
public class MechanicalNetwork extends Network<IMechanicalNetwork, IMechanical> implements IMechanicalNetwork, IUpdate public class MechanicalNetwork extends Network<IMechanicalNetwork, IMechanical> implements IMechanicalNetwork, IPacketReceiver, IUpdate
{ {
private long prevTorque = 0; private long prevTorque = 0;
private float prevAngularVelocity = 0; private float prevAngularVelocity = 0;
@ -72,9 +79,13 @@ public class MechanicalNetwork extends Network<IMechanicalNetwork, IMechanical>
for (IMechanical generatorNode : generators) for (IMechanical generatorNode : generators)
{ {
PathfinderRotationManager rotationPathfinder = new PathfinderRotationManager(generatorNode, closedSet); if (generatorNode != null)
rotationPathfinder.findNodes(generatorNode); {
closedSet.addAll(rotationPathfinder.closedSet); PathfinderUpdateRotation rotationPathfinder = new PathfinderUpdateRotation(generatorNode, this, closedSet);
rotationPathfinder.findNodes(generatorNode);
closedSet.addAll(rotationPathfinder.closedSet);
sendRotationUpdatePacket(generatorNode);
}
} }
generators.clear(); generators.clear();
@ -91,18 +102,10 @@ public class MechanicalNetwork extends Network<IMechanicalNetwork, IMechanical>
/** /**
* Update all connectors * Update all connectors
*/ */
if (markPacketUpdate || getPrevTorque() != getTorque() || getPrevAngularVelocity() != getAngularVelocity()) if (getPrevTorque() != getTorque() || getPrevAngularVelocity() != getAngularVelocity())
{ {
/** sendNetworkPacket();
* Send network update packet for connectors. markPacketUpdate = false;
*/
for (IMechanical connector : this.getConnectors())
{
if (connector.sendNetworkPacket(torque, angularVelocity))
{
break;
}
}
} }
prevTorque = torque; prevTorque = torque;
@ -123,6 +126,53 @@ public class MechanicalNetwork extends Network<IMechanicalNetwork, IMechanical>
return canUpdate(); 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. * Applies energy to the mechanical network this tick.
* Note: Server side only. * Note: Server side only.
@ -182,7 +232,7 @@ public class MechanicalNetwork extends Network<IMechanicalNetwork, IMechanical>
// Reset // Reset
prevTorque = torque = 0; prevTorque = torque = 0;
prevAngularVelocity = angularVelocity = 0; prevAngularVelocity = angularVelocity = 0;
load = 0; load = 1;
super.reconstruct(); super.reconstruct();
} }
@ -233,6 +283,12 @@ public class MechanicalNetwork extends Network<IMechanicalNetwork, IMechanical>
return new MechanicalNetwork(); return new MechanicalNetwork();
} }
@Override
public Class getConnectorClass()
{
return IMechanical.class;
}
@Override @Override
public String toString() public String toString()
{ {

View file

@ -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<C extends IConnector> 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);
}
}
}
}

View file

@ -20,7 +20,6 @@ import codechicken.multipart.JCuboidPart;
import codechicken.multipart.JNormalOcclusion; import codechicken.multipart.JNormalOcclusion;
import codechicken.multipart.TFacePart; import codechicken.multipart.TFacePart;
import codechicken.multipart.TMultiPart; import codechicken.multipart.TMultiPart;
import codechicken.multipart.TileMultipart;
/** /**
* We assume all the force acting on the gear is 90 degrees. * 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() public void refresh()
{ {
/** Look for gears that are back-to-back with this gear. Equate torque. */ /** 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 (tileBehind instanceof IMechanical)
if (tile 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()); connections[placementSide.getOpposite().ordinal()] = instance;
getNetwork().merge(networkToMerge); getNetwork().merge(instance.getNetwork());
} }
} }
@ -124,18 +121,16 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
ForgeDirection checkDir = ForgeDirection.getOrientation(Rotation.rotateSide(this.placementSide.ordinal(), 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 = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir).getTileEntity(world());
TileEntity checkTile = checkVec.getTileEntity(world());
if (checkTile instanceof IMechanical) 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); connections[checkDir.ordinal()] = instance;
getNetwork().merge(networkToMerge); getNetwork().merge(instance.getNetwork());
} }
} }
} }
@ -144,29 +139,22 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{ {
ForgeDirection checkDir = ForgeDirection.getOrientation(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); connections[checkDir.ordinal()] = instance;
getNetwork().merge(networkToMerge); getNetwork().merge(instance.getNetwork());
} }
} }
getNetwork().reconstruct(); getNetwork().reconstruct();
if (!world().isRemote) if (!world().isRemote)
{ {
sendRefreshPacket(); sendRotationPacket();
} }
} }
@Override
public IMechanicalNetwork getNetwork(ForgeDirection from)
{
return getNetwork();
}
@Override @Override
public Object[] getConnections() public Object[] getConnections()
{ {
@ -180,23 +168,11 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
} }
/** Packet Code. */ /** Packet Code. */
public void sendRotationPacket()
@Override
public boolean sendNetworkPacket(long torque, float angularVelocity)
{ {
if (world() != null && !world().isRemote && tile() != null) if (world() != null && !world().isRemote && tile() != null)
{ {
tile().getWriteStream(this).writeByte(0).writeLong(torque).writeFloat(angularVelocity).writeBoolean(isClockwise); tile().getWriteStream(this).writeByte(0).writeBoolean(isClockwise);
}
return true;
}
public void sendRefreshPacket()
{
if (world() != null && !world().isRemote && tile() != null)
{
tile().getWriteStream(this).writeByte(1);
} }
} }
@ -204,13 +180,9 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
{ {
if (packetID == 0) if (packetID == 0)
{ {
getNetwork().setPower(packet.readLong(), packet.readFloat()); refresh();
isClockwise = packet.readBoolean(); isClockwise = packet.readBoolean();
} }
else if (packetID == 1)
{
this.refresh();
}
} }
/** /**
@ -236,7 +208,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
@Override @Override
public boolean canConnect(ForgeDirection direction) 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 @Override
@ -343,4 +315,9 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
return getItem(); return getItem();
} }
@Override
public int[] getLocation()
{
return new int[] { x(), y(), z(), placementSide.ordinal() };
}
} }

View file

@ -19,35 +19,38 @@ import universalelectricity.core.net.ConnectionPathfinder;
* @author Calclavia * @author Calclavia
* *
*/ */
public class PathfinderRotationManager extends ConnectionPathfinder<IMechanical> public class PathfinderUpdateRotation extends ConnectionPathfinder<IMechanical>
{ {
private boolean currentIsClockwise = true; private boolean currentRotationFlag = true;
private Set<IMechanical> prevClosedSet; private Set<IMechanical> prevClosedSet;
private IMechanicalNetwork network;
public PathfinderRotationManager(IMechanical first, Set<IMechanical> prevClosedSet) public PathfinderUpdateRotation(IMechanical first, IMechanicalNetwork network, Set<IMechanical> prevClosedSet)
{ {
super(first); super(IMechanical.class, first);
this.currentIsClockwise = first.isClockwise(); this.currentRotationFlag = first.isClockwise();
this.prevClosedSet = prevClosedSet; this.prevClosedSet = prevClosedSet;
this.network = network;
} }
public boolean findNodes(IMechanical currentNode) public boolean findNodes(IMechanical currentNode)
{ {
this.closedSet.add(currentNode); this.closedSet.add(currentNode);
currentNode.setClockwise(currentIsClockwise); currentNode.setClockwise(currentRotationFlag);
for (IMechanical node : this.getConnectedNodes(currentNode)) for (IMechanical node : this.getConnectedNodes(currentNode))
{ {
if (!this.closedSet.contains(node)) 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. // We have conflicting rotations. Network is now stuck.
currentNode.getNetwork().setPower(0, 0); network.setPower(0, 0);
} }
currentIsClockwise = (node.isRotationInversed() && currentNode.isRotationInversed()) ? !currentNode.isClockwise() : currentNode.isClockwise();
findNodes(node); findNodes(node);
} }
} }

View file

@ -12,12 +12,6 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical
private boolean isClockwise = false; private boolean isClockwise = false;
@Override
public boolean canConnect(ForgeDirection direction)
{
return false;
}
@Override @Override
public Object[] getConnections() public Object[] getConnections()
{ {
@ -42,9 +36,9 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical
} }
@Override @Override
public boolean sendNetworkPacket(long torque, float angularVelocity) public int[] getLocation()
{ {
return false; return new int[] { xCoord, yCoord, zCoord, 0 };
} }
@Override @Override

View file

@ -35,11 +35,8 @@ public class RenderGrinderWheel extends TileEntitySpecialRenderer
glPushMatrix(); glPushMatrix();
glTranslatef((float) x + 0.5F, (float) y + 0.5f, (float) z + 0.5F); glTranslatef((float) x + 0.5F, (float) y + 0.5f, (float) z + 0.5F);
glScalef(0.51f, 0.51f, 0.51f); glScalef(0.51f, 0.51f, 0.51f);
RenderUtility.rotateBlockBasedOnDirection(tile.getDirection()); 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); FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE);
MODEL.renderAll(); MODEL.renderAll();
glPopMatrix(); glPopMatrix();

View file

@ -179,10 +179,8 @@ public class TileGrinderWheel extends TileMechanical implements IRotatable
} }
@Override @Override
public IMechanicalNetwork getNetwork(ForgeDirection from) public boolean canConnect(ForgeDirection from)
{ {
if (from != this.getDirection() && from != this.getDirection().getOpposite()) return from != this.getDirection() && from != this.getDirection().getOpposite();
return getNetwork();
return null;
} }
} }

View file

@ -88,18 +88,8 @@ public class TraitMechanical extends TileMultipart implements IMechanical
} }
@Override @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; return null;
} }
@ -117,12 +107,7 @@ public class TraitMechanical extends TileMultipart implements IMechanical
} }
return null; return null;
}
@Override
public IMechanicalNetwork getNetwork()
{
return null;
} }
@Override @Override
@ -131,12 +116,6 @@ public class TraitMechanical extends TileMultipart implements IMechanical
} }
@Override
public boolean sendNetworkPacket(long torque, float angularVelocity)
{
return false;
}
@Override @Override
public float getResistance() public float getResistance()
{ {
@ -148,4 +127,10 @@ public class TraitMechanical extends TileMultipart implements IMechanical
{ {
return false; return false;
} }
@Override
public int[] getLocation()
{
return null;
}
} }