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.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<M extends Enum, C extends IConnector<
@Override
public void bind(TileMultipart t)
{
if ( this.getNetwork() != null)
if (this.getNetwork() != null)
{
getNetwork().getConnectors().remove(this);
super.bind(t);
@ -458,4 +459,10 @@ public abstract class PartFramedConnection<M extends Enum, C extends IConnector<
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.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<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;
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

View file

@ -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<IEnergyNetwork> getInstance(ForgeDirection dir)
{
return this;
}
@Override
public void save(NBTTagCompound nbt)
{

View file

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

View file

@ -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<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.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)
{

View file

@ -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;
}
}

View file

@ -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<IFluidNetwork, IFluidConn
return this.tank;
}
@Override
public Class getConnectorClass()
{
return IFluidConnector.class;
}
@Override
public FluidTankInfo[] getTankInfo()
{

View file

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

View file

@ -17,6 +17,7 @@ import resonantinduction.api.fluid.IFluidConnector;
import resonantinduction.api.fluid.IFluidNetwork;
import resonantinduction.core.ResonantInduction;
import resonantinduction.mechanical.Mechanical;
import resonantinduction.mechanical.network.IMechanical;
import universalelectricity.api.vector.Vector3;
import calclavia.lib.network.IPacketReceiverWithID;
import calclavia.lib.network.PacketHandler;
@ -315,4 +316,9 @@ public abstract class TileFluidNetwork extends TileAdvanced implements IFluidCon
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)
{
this.getNetwork().merge(((IFluidConnector) tileEntity).getNetwork());
getNetwork().merge(((IFluidConnector) tileEntity).getNetwork());
this.setRenderSide(side, true);
connectedBlocks[side.ordinal()] = tileEntity;
}

View file

@ -1,5 +1,6 @@
package resonantinduction.mechanical.gear;
import calclavia.lib.prefab.block.BlockAdvanced;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MovingObjectPosition;
@ -48,9 +49,21 @@ public class PartGear extends PartMechanical implements IMechanical
{
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;

View file

@ -5,13 +5,6 @@ import universalelectricity.api.net.IConnector;
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.
*
@ -19,6 +12,12 @@ public interface IMechanical extends IConnector<IMechanicalNetwork>
*/
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<IMechanicalNetwork>
* @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);
}

View file

@ -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<IMechanicalNetwork, IMechanical> implements IMechanicalNetwork, IUpdate
public class MechanicalNetwork extends Network<IMechanicalNetwork, IMechanical> implements IMechanicalNetwork, IPacketReceiver, IUpdate
{
private long prevTorque = 0;
private float prevAngularVelocity = 0;
@ -72,9 +79,13 @@ public class MechanicalNetwork extends Network<IMechanicalNetwork, IMechanical>
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<IMechanicalNetwork, IMechanical>
/**
* 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<IMechanicalNetwork, IMechanical>
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<IMechanicalNetwork, IMechanical>
// Reset
prevTorque = torque = 0;
prevAngularVelocity = angularVelocity = 0;
load = 0;
load = 1;
super.reconstruct();
}
@ -233,6 +283,12 @@ public class MechanicalNetwork extends Network<IMechanicalNetwork, IMechanical>
return new MechanicalNetwork();
}
@Override
public Class getConnectorClass()
{
return IMechanical.class;
}
@Override
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.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() };
}
}

View file

@ -19,35 +19,38 @@ import universalelectricity.core.net.ConnectionPathfinder;
* @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 IMechanicalNetwork network;
public PathfinderRotationManager(IMechanical first, Set<IMechanical> prevClosedSet)
public PathfinderUpdateRotation(IMechanical first, IMechanicalNetwork network, Set<IMechanical> 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);
}
}

View file

@ -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

View file

@ -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();

View file

@ -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();
}
}

View file

@ -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;
}
}