Finished initial mechanical network packet and rotation system
This commit is contained in:
parent
19ee8e95d0
commit
5bc0d45912
22 changed files with 294 additions and 166 deletions
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -107,8 +103,6 @@ public class TraitConductor extends TileMultipart implements IConductor
|
|||
if (this.partMap(from.ordinal()) == null)
|
||||
{
|
||||
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
|
||||
{
|
||||
// if (dir != from.getOpposite())
|
||||
{
|
||||
TMultiPart part = this.partMap(dir.ordinal());
|
||||
|
||||
|
@ -118,7 +112,6 @@ public class TraitConductor extends TileMultipart implements IConductor
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,10 +49,22 @@ public class PartGear extends PartMechanical implements IMechanical
|
|||
{
|
||||
System.out.println(world().isRemote + ": " + getNetwork());
|
||||
|
||||
if (BlockAdvanced.isUsableWrench(player, player.getCurrentEquippedItem(), tile().xCoord, tile().yCoord, tile().zCoord))
|
||||
{
|
||||
if (player.isSneaking())
|
||||
{
|
||||
if (!world().isRemote)
|
||||
{
|
||||
setClockwise(!isClockwise());
|
||||
player.addChatMessage("Flipped gear to rotate " + (isClockwise() ? "clockwise" : "anticlockwise") + ".");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
this.manualCrankTime = 20;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
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()
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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() };
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue