New gear rotation calculation algorithm
This commit is contained in:
parent
fea61d5241
commit
bc81e18874
16 changed files with 227 additions and 482 deletions
|
@ -3,14 +3,14 @@ package resonantinduction.api;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import resonantinduction.mechanical.network.IMechanicalConnector;
|
import resonantinduction.mechanical.network.IMechanical;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An interface applied to the tile entity of a conveyor belt
|
* An interface applied to the tile entity of a conveyor belt
|
||||||
*
|
*
|
||||||
* @Author DarkGuardsman
|
* @Author DarkGuardsman
|
||||||
*/
|
*/
|
||||||
public interface IBelt extends IMechanicalConnector
|
public interface IBelt extends IMechanical
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Used to get a list of entities the belt exerts an effect upon.
|
* Used to get a list of entities the belt exerts an effect upon.
|
||||||
|
|
|
@ -45,11 +45,11 @@ public class RenderBattery extends TileEntitySpecialRenderer
|
||||||
GL11.glRotatef(90 * i, 0, 1, 0);
|
GL11.glRotatef(90 * i, 0, 1, 0);
|
||||||
ForgeDirection dir = ForgeDirection.getOrientation(i);
|
ForgeDirection dir = ForgeDirection.getOrientation(i);
|
||||||
|
|
||||||
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_LEVELS);
|
|
||||||
MODEL.renderPart("Battery");
|
|
||||||
|
|
||||||
if (t.worldObj != null)
|
if (t.worldObj != null)
|
||||||
{
|
{
|
||||||
|
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_LEVELS);
|
||||||
|
MODEL.renderPart("Battery");
|
||||||
|
|
||||||
// Render top and bottom
|
// Render top and bottom
|
||||||
//if (!(new Vector3(t).translate(dir).getTileEntity(t.worldObj) instanceof TileBattery))
|
//if (!(new Vector3(t).translate(dir).getTileEntity(t.worldObj) instanceof TileBattery))
|
||||||
{
|
{
|
||||||
|
@ -81,6 +81,10 @@ public class RenderBattery extends TileEntitySpecialRenderer
|
||||||
|
|
||||||
if (new Vector3(t).translate(ForgeDirection.UP).getTileEntity(t.worldObj) instanceof TileBattery)
|
if (new Vector3(t).translate(ForgeDirection.UP).getTileEntity(t.worldObj) instanceof TileBattery)
|
||||||
MODEL.renderPart("VertConnector");
|
MODEL.renderPart("VertConnector");
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_CAP);
|
||||||
|
MODEL.renderAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
|
@ -6,6 +6,8 @@ import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraftforge.common.ForgeDirection;
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
import resonantinduction.mechanical.network.IMechanical;
|
import resonantinduction.mechanical.network.IMechanical;
|
||||||
|
import resonantinduction.mechanical.network.IMechanicalNetwork;
|
||||||
|
import resonantinduction.mechanical.network.MechanicalNetwork;
|
||||||
import universalelectricity.api.energy.EnergyStorageHandler;
|
import universalelectricity.api.energy.EnergyStorageHandler;
|
||||||
import universalelectricity.api.vector.Vector3;
|
import universalelectricity.api.vector.Vector3;
|
||||||
import calclavia.lib.prefab.tile.IRotatable;
|
import calclavia.lib.prefab.tile.IRotatable;
|
||||||
|
@ -18,6 +20,8 @@ import calclavia.lib.prefab.tile.TileElectrical;
|
||||||
*/
|
*/
|
||||||
public class TileGenerator extends TileElectrical implements IMechanical, IRotatable
|
public class TileGenerator extends TileElectrical implements IMechanical, IRotatable
|
||||||
{
|
{
|
||||||
|
private IMechanicalNetwork network;
|
||||||
|
|
||||||
/** Generator turns KE -> EE. Inverted one will turn EE -> KE. */
|
/** Generator turns KE -> EE. Inverted one will turn EE -> KE. */
|
||||||
public boolean isInversed = false;
|
public boolean isInversed = false;
|
||||||
|
|
||||||
|
@ -41,6 +45,7 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat
|
||||||
{
|
{
|
||||||
if (!isInversed)
|
if (!isInversed)
|
||||||
{
|
{
|
||||||
|
energy.receiveEnergy(getNetwork().getPower(), true);
|
||||||
produce();
|
produce();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -53,7 +58,7 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat
|
||||||
|
|
||||||
public void produceMechanical(ForgeDirection outputDir)
|
public void produceMechanical(ForgeDirection outputDir)
|
||||||
{
|
{
|
||||||
Vector3 outputVector = new Vector3(this).modifyPositionFromSide(outputDir);
|
Vector3 outputVector = new Vector3(this).translate(outputDir);
|
||||||
TileEntity mechanical = outputVector.getTileEntity(worldObj);
|
TileEntity mechanical = outputVector.getTileEntity(worldObj);
|
||||||
|
|
||||||
if (mechanical instanceof IMechanical)
|
if (mechanical instanceof IMechanical)
|
||||||
|
@ -64,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).onReceiveEnergy(outputDir.getOpposite(), torque, angularVelocity, true), true);
|
energy.extractEnergy(((IMechanical) mechanical).getNetwork().onReceiveEnergy(((IMechanical) mechanical), torque, angularVelocity), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -94,7 +99,6 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat
|
||||||
public void setDirection(ForgeDirection dir)
|
public void setDirection(ForgeDirection dir)
|
||||||
{
|
{
|
||||||
this.worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, dir.ordinal(), 3);
|
this.worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, dir.ordinal(), 3);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isFunctioning()
|
private boolean isFunctioning()
|
||||||
|
@ -102,16 +106,6 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public long onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity, boolean doReceive)
|
|
||||||
{
|
|
||||||
if (!this.isInversed)
|
|
||||||
{
|
|
||||||
return energy.receiveEnergy((long) (torque * angularVelocity), doReceive);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void readFromNBT(NBTTagCompound nbt)
|
public void readFromNBT(NBTTagCompound nbt)
|
||||||
{
|
{
|
||||||
|
@ -140,4 +134,47 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object[] getConnections()
|
||||||
|
{
|
||||||
|
Object[] connections = new Object[6];
|
||||||
|
connections[getDirection().ordinal()] = new Vector3(this).translate(getDirection()).getTileEntity(worldObj);
|
||||||
|
return connections;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IMechanicalNetwork getNetwork()
|
||||||
|
{
|
||||||
|
if (this.network == null)
|
||||||
|
{
|
||||||
|
this.network = new MechanicalNetwork();
|
||||||
|
this.network.addConnector(this);
|
||||||
|
}
|
||||||
|
return this.network;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNetwork(IMechanicalNetwork network)
|
||||||
|
{
|
||||||
|
this.network = network;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean sendNetworkPacket(long torque, float angularVelocity)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getResistance()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isRotationInversed()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,6 @@ public class MultipartMechanical implements IPartFactory
|
||||||
MultiPartRegistry.registerParts(this, PART_TYPES);
|
MultiPartRegistry.registerParts(this, PART_TYPES);
|
||||||
MultipartGenerator.registerPassThroughInterface("resonantinduction.api.fluid.IFluidPipe");
|
MultipartGenerator.registerPassThroughInterface("resonantinduction.api.fluid.IFluidPipe");
|
||||||
MultipartGenerator.registerTrait("resonantinduction.mechanical.network.IMechanical", "resonantinduction.mechanical.trait.TraitMechanical");
|
MultipartGenerator.registerTrait("resonantinduction.mechanical.network.IMechanical", "resonantinduction.mechanical.trait.TraitMechanical");
|
||||||
MultipartGenerator.registerTrait("resonantinduction.mechanical.network.IMechanicalConnector", "resonantinduction.mechanical.trait.TraitMechanicalConnector");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -15,7 +15,6 @@ import resonantinduction.api.IBelt;
|
||||||
import resonantinduction.core.ResonantInduction;
|
import resonantinduction.core.ResonantInduction;
|
||||||
import resonantinduction.mechanical.Mechanical;
|
import resonantinduction.mechanical.Mechanical;
|
||||||
import resonantinduction.mechanical.network.IMechanical;
|
import resonantinduction.mechanical.network.IMechanical;
|
||||||
import resonantinduction.mechanical.network.IMechanicalConnector;
|
|
||||||
import resonantinduction.mechanical.network.TileMechanical;
|
import resonantinduction.mechanical.network.TileMechanical;
|
||||||
import universalelectricity.api.vector.Vector3;
|
import universalelectricity.api.vector.Vector3;
|
||||||
import calclavia.lib.network.IPacketReceiverWithID;
|
import calclavia.lib.network.IPacketReceiverWithID;
|
||||||
|
@ -30,7 +29,7 @@ import cpw.mods.fml.common.network.PacketDispatcher;
|
||||||
*
|
*
|
||||||
* @author DarkGuardsman
|
* @author DarkGuardsman
|
||||||
*/
|
*/
|
||||||
public class TileConveyorBelt extends TileMechanical implements IMechanicalConnector, IBelt, IRotatable, IPacketReceiverWithID
|
public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatable, IPacketReceiverWithID
|
||||||
{
|
{
|
||||||
public enum SlantType
|
public enum SlantType
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,7 +4,7 @@ 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;
|
||||||
import resonantinduction.mechanical.Mechanical;
|
import resonantinduction.mechanical.Mechanical;
|
||||||
import resonantinduction.mechanical.network.IMechanicalConnector;
|
import resonantinduction.mechanical.network.IMechanical;
|
||||||
import resonantinduction.mechanical.network.PartMechanical;
|
import resonantinduction.mechanical.network.PartMechanical;
|
||||||
import codechicken.lib.vec.Vector3;
|
import codechicken.lib.vec.Vector3;
|
||||||
import cpw.mods.fml.relauncher.Side;
|
import cpw.mods.fml.relauncher.Side;
|
||||||
|
@ -16,7 +16,7 @@ import cpw.mods.fml.relauncher.SideOnly;
|
||||||
* @author Calclavia
|
* @author Calclavia
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class PartGear extends PartMechanical implements IMechanicalConnector
|
public class PartGear extends PartMechanical implements IMechanical
|
||||||
{
|
{
|
||||||
private int manualCrankTime = 0;
|
private int manualCrankTime = 0;
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ public class PartGear extends PartMechanical implements IMechanicalConnector
|
||||||
{
|
{
|
||||||
if (manualCrankTime > 0)
|
if (manualCrankTime > 0)
|
||||||
{
|
{
|
||||||
onReceiveEnergy(null, 20, 0.2f, true);
|
|
||||||
manualCrankTime--;
|
manualCrankTime--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,15 +38,16 @@ public class PartGear extends PartMechanical implements IMechanicalConnector
|
||||||
@Override
|
@Override
|
||||||
public float getResistance()
|
public float getResistance()
|
||||||
{
|
{
|
||||||
return 0.1f;
|
return 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean activate(EntityPlayer player, MovingObjectPosition hit, ItemStack item)
|
public boolean activate(EntityPlayer player, MovingObjectPosition hit, ItemStack item)
|
||||||
{
|
{
|
||||||
// System.out.println(world().isRemote + ": " + getNetwork());
|
System.out.println(world().isRemote + ": " + getNetwork());
|
||||||
if (player.isSneaking())
|
if (player.isSneaking())
|
||||||
{
|
{
|
||||||
|
getNetwork().onReceiveEnergy(this, 20, 0.3f);
|
||||||
this.manualCrankTime = 20;
|
this.manualCrankTime = 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,10 +66,16 @@ public class PartGear extends PartMechanical implements IMechanicalConnector
|
||||||
{
|
{
|
||||||
if (pass == 0)
|
if (pass == 0)
|
||||||
{
|
{
|
||||||
RenderGear.INSTANCE.renderDynamic(this, pos.x, pos.y, pos.z);
|
RenderGear.INSTANCE.renderDynamic(this, pos.x, pos.y, pos.z, frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isRotationInversed()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getType()
|
public String getType()
|
||||||
{
|
{
|
||||||
|
|
|
@ -29,7 +29,7 @@ public class RenderGear
|
||||||
GL11.glPopMatrix();
|
GL11.glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void renderDynamic(PartGear part, double x, double y, double z)
|
public void renderDynamic(PartGear part, double x, double y, double z, float frame)
|
||||||
{
|
{
|
||||||
GL11.glPushMatrix();
|
GL11.glPushMatrix();
|
||||||
// Center the model first.
|
// Center the model first.
|
||||||
|
@ -63,7 +63,7 @@ public class RenderGear
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
GL11.glRotatef((float) Math.toDegrees(part.angle), 0, 1, 0);
|
GL11.glRotatef((float) Math.toDegrees(part.isClockwise() ? part.getNetwork().getRotation() : -part.getNetwork().getRotation()), 0, 1, 0);
|
||||||
|
|
||||||
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE);
|
FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE);
|
||||||
MODEL.renderAll();
|
MODEL.renderAll();
|
||||||
|
|
|
@ -1,20 +1,23 @@
|
||||||
package resonantinduction.mechanical.network;
|
package resonantinduction.mechanical.network;
|
||||||
|
|
||||||
import net.minecraftforge.common.ForgeDirection;
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
import universalelectricity.api.net.IConnectable;
|
import universalelectricity.api.net.IConnector;
|
||||||
|
|
||||||
public interface IMechanical extends IConnectable
|
public interface IMechanical extends IConnector<IMechanicalNetwork>
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Adds energy to a block. Returns the quantity of energy that was accepted. This should always
|
* Uses this connector to send a packet to the client for the network.
|
||||||
* return 0 if the block cannot be externally charged.
|
|
||||||
*
|
*
|
||||||
* @param from Orientation the energy is sent in from.
|
* @return True if the packet was successfully sent.
|
||||||
* @param receive Maximum amount of energy (joules) to be sent into the block.
|
|
||||||
* @param doReceive If false, the charge will only be simulated.
|
|
||||||
* @return Amount of energy that was accepted by the block.
|
|
||||||
*/
|
*/
|
||||||
public long onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity, boolean doReceive);
|
public boolean sendNetworkPacket(long torque, float angularVelocity);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The percentage of resistance caused by this connector.
|
||||||
|
*
|
||||||
|
* @return A small value, most likely less than one.
|
||||||
|
*/
|
||||||
|
public float getResistance();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Is the mechanical machine going clockwise currently?
|
* @return Is the mechanical machine going clockwise currently?
|
||||||
|
@ -22,4 +25,11 @@ public interface IMechanical extends IConnectable
|
||||||
public boolean isClockwise();
|
public boolean isClockwise();
|
||||||
|
|
||||||
public void setClockwise(boolean isClockwise);
|
public void setClockwise(boolean isClockwise);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* *
|
||||||
|
*
|
||||||
|
* @return Return true if the mechanical block should have its rotation set inveresed.
|
||||||
|
*/
|
||||||
|
public boolean isRotationInversed();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
package resonantinduction.mechanical.network;
|
|
||||||
|
|
||||||
import universalelectricity.api.net.IConnector;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applied to connectors in a mechanical network
|
|
||||||
*
|
|
||||||
* @author Calclavia
|
|
||||||
*/
|
|
||||||
public interface IMechanicalConnector extends IMechanical, 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.
|
|
||||||
*
|
|
||||||
* @return A small value, most likely less than one.
|
|
||||||
*/
|
|
||||||
public float getResistance();
|
|
||||||
}
|
|
|
@ -1,13 +1,13 @@
|
||||||
package resonantinduction.mechanical.network;
|
package resonantinduction.mechanical.network;
|
||||||
|
|
||||||
import universalelectricity.api.net.INodeNetwork;
|
import universalelectricity.api.net.INetwork;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mechanical network in interface form for interaction or extension
|
* Mechanical network in interface form for interaction or extension
|
||||||
*
|
*
|
||||||
* @author DarkGuardsman
|
* @author DarkGuardsman
|
||||||
*/
|
*/
|
||||||
public interface IMechanicalNetwork extends INodeNetwork<IMechanicalNetwork, IMechanicalConnector, IMechanical>
|
public interface IMechanicalNetwork extends INetwork<IMechanicalNetwork, IMechanical>
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Gets the power of the network.
|
* Gets the power of the network.
|
||||||
|
@ -32,11 +32,7 @@ public interface IMechanicalNetwork extends INodeNetwork<IMechanicalNetwork, IMe
|
||||||
|
|
||||||
public float getPrevAngularVelocity();
|
public float getPrevAngularVelocity();
|
||||||
|
|
||||||
/** Called to rebuild the network */
|
public long onReceiveEnergy(IMechanical source, long torque, float angularVelocity);
|
||||||
@Override
|
|
||||||
public void reconstruct();
|
|
||||||
|
|
||||||
public long onReceiveEnergy(long torque, float angularVelocity);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The current rotation value of the network.
|
* @return The current rotation value of the network.
|
||||||
|
|
|
@ -4,11 +4,13 @@ import java.util.EnumSet;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import net.minecraftforge.common.ForgeDirection;
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
import universalelectricity.api.net.IUpdate;
|
import universalelectricity.api.net.IUpdate;
|
||||||
|
import universalelectricity.core.net.Network;
|
||||||
import universalelectricity.core.net.NetworkTickHandler;
|
import universalelectricity.core.net.NetworkTickHandler;
|
||||||
import universalelectricity.core.net.NodeNetwork;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A mechanical network for translate speed and force using mechanical rotations.
|
* A mechanical network for translate speed and force using mechanical rotations.
|
||||||
|
@ -26,7 +28,7 @@ import universalelectricity.core.net.NodeNetwork;
|
||||||
*
|
*
|
||||||
* @author Calclavia
|
* @author Calclavia
|
||||||
*/
|
*/
|
||||||
public class MechanicalNetwork extends NodeNetwork<IMechanicalNetwork, IMechanicalConnector, IMechanical> implements IMechanicalNetwork, IUpdate
|
public class MechanicalNetwork extends Network<IMechanicalNetwork, IMechanical> implements IMechanicalNetwork, IUpdate
|
||||||
{
|
{
|
||||||
private long prevTorque = 0;
|
private long prevTorque = 0;
|
||||||
private float prevAngularVelocity = 0;
|
private float prevAngularVelocity = 0;
|
||||||
|
@ -35,7 +37,7 @@ public class MechanicalNetwork extends NodeNetwork<IMechanicalNetwork, IMechanic
|
||||||
private float angularVelocity = 0;
|
private float angularVelocity = 0;
|
||||||
|
|
||||||
/** The cached resistance caused by all connectors */
|
/** The cached resistance caused by all connectors */
|
||||||
private float connectorResistance = 0;
|
private float load = 0;
|
||||||
|
|
||||||
/** The current rotation of the network */
|
/** The current rotation of the network */
|
||||||
private float rotation = 0;
|
private float rotation = 0;
|
||||||
|
@ -45,8 +47,11 @@ public class MechanicalNetwork extends NodeNetwork<IMechanicalNetwork, IMechanic
|
||||||
/** The direction in which a conductor is placed relative to a specific conductor. */
|
/** The direction in which a conductor is placed relative to a specific conductor. */
|
||||||
protected final HashMap<Object, EnumSet<ForgeDirection>> handlerDirectionMap = new LinkedHashMap<Object, EnumSet<ForgeDirection>>();
|
protected final HashMap<Object, EnumSet<ForgeDirection>> handlerDirectionMap = new LinkedHashMap<Object, EnumSet<ForgeDirection>>();
|
||||||
|
|
||||||
|
private Set<IMechanical> prevGenerators = new LinkedHashSet<IMechanical>();
|
||||||
|
private Set<IMechanical> generators = new LinkedHashSet<IMechanical>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addConnector(IMechanicalConnector connector)
|
public void addConnector(IMechanical connector)
|
||||||
{
|
{
|
||||||
this.markPacketUpdate = true;
|
this.markPacketUpdate = true;
|
||||||
super.addConnector(connector);
|
super.addConnector(connector);
|
||||||
|
@ -58,26 +63,29 @@ public class MechanicalNetwork extends NodeNetwork<IMechanicalNetwork, IMechanic
|
||||||
@Override
|
@Override
|
||||||
public void update()
|
public void update()
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Calculation rotations of all generators.
|
||||||
|
*/
|
||||||
|
prevGenerators = generators;
|
||||||
|
|
||||||
|
Set<IMechanical> closedSet = new LinkedHashSet<IMechanical>();
|
||||||
|
|
||||||
|
for (IMechanical generatorNode : generators)
|
||||||
|
{
|
||||||
|
PathfinderRotationManager rotationPathfinder = new PathfinderRotationManager(generatorNode, closedSet);
|
||||||
|
rotationPathfinder.findNodes(generatorNode);
|
||||||
|
closedSet.addAll(rotationPathfinder.closedSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
generators.clear();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate load
|
* Calculate load
|
||||||
*/
|
*/
|
||||||
if (getPower() > 0)
|
if (load > 0)
|
||||||
{
|
{
|
||||||
float division = connectorResistance;
|
torque /= load / 2;
|
||||||
|
angularVelocity /= load / 2;
|
||||||
for (IMechanical node : this.getNodes())
|
|
||||||
{
|
|
||||||
for (ForgeDirection dir : handlerDirectionMap.get(node))
|
|
||||||
{
|
|
||||||
division += node.onReceiveEnergy(dir, torque, angularVelocity, false) / torque;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (division > 0)
|
|
||||||
{
|
|
||||||
torque /= division / 2;
|
|
||||||
angularVelocity /= division / 2;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -88,7 +96,7 @@ public class MechanicalNetwork extends NodeNetwork<IMechanicalNetwork, IMechanic
|
||||||
/**
|
/**
|
||||||
* Send network update packet for connectors.
|
* Send network update packet for connectors.
|
||||||
*/
|
*/
|
||||||
for (IMechanicalConnector connector : this.getConnectors())
|
for (IMechanical connector : this.getConnectors())
|
||||||
{
|
{
|
||||||
if (connector.sendNetworkPacket(torque, angularVelocity))
|
if (connector.sendNetworkPacket(torque, angularVelocity))
|
||||||
{
|
{
|
||||||
|
@ -97,24 +105,22 @@ public class MechanicalNetwork extends NodeNetwork<IMechanicalNetwork, IMechanic
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Distribute energy to handlers
|
|
||||||
*/
|
|
||||||
if (getPower() > 0)
|
|
||||||
{
|
|
||||||
for (IMechanical node : this.getNodes())
|
|
||||||
{
|
|
||||||
for (ForgeDirection dir : handlerDirectionMap.get(node))
|
|
||||||
{
|
|
||||||
node.onReceiveEnergy(dir, torque, angularVelocity, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
prevTorque = torque;
|
prevTorque = torque;
|
||||||
prevAngularVelocity = angularVelocity;
|
prevAngularVelocity = angularVelocity;
|
||||||
torque = 0;
|
torque *= 0.5;
|
||||||
angularVelocity = 0;
|
angularVelocity *= 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canUpdate()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean continueUpdate()
|
||||||
|
{
|
||||||
|
return canUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -122,10 +128,11 @@ public class MechanicalNetwork extends NodeNetwork<IMechanicalNetwork, IMechanic
|
||||||
* Note: Server side only.
|
* Note: Server side only.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public long onReceiveEnergy(long torque, float angularVelocity)
|
public long onReceiveEnergy(IMechanical source, long torque, float angularVelocity)
|
||||||
{
|
{
|
||||||
this.torque += torque;
|
this.torque += torque;
|
||||||
this.angularVelocity += angularVelocity;
|
this.angularVelocity += angularVelocity;
|
||||||
|
this.generators.add(source);
|
||||||
NetworkTickHandler.addNetwork(this);
|
NetworkTickHandler.addNetwork(this);
|
||||||
return (long) (torque * angularVelocity);
|
return (long) (torque * angularVelocity);
|
||||||
}
|
}
|
||||||
|
@ -169,67 +176,28 @@ public class MechanicalNetwork extends NodeNetwork<IMechanicalNetwork, IMechanic
|
||||||
this.angularVelocity = angularVelocity;
|
this.angularVelocity = angularVelocity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canUpdate()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean continueUpdate()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reconstruct()
|
public void reconstruct()
|
||||||
{
|
{
|
||||||
// Reset
|
// Reset
|
||||||
prevTorque = torque = 0;
|
prevTorque = torque = 0;
|
||||||
prevAngularVelocity = angularVelocity = 0;
|
prevAngularVelocity = angularVelocity = 0;
|
||||||
connectorResistance = 0;
|
load = 0;
|
||||||
|
|
||||||
if (this.getConnectors().size() > 0)
|
super.reconstruct();
|
||||||
{
|
|
||||||
// Reset all values related to wires
|
|
||||||
this.getNodes().clear();
|
|
||||||
|
|
||||||
// Iterate threw list of wires
|
|
||||||
Iterator<IMechanicalConnector> it = this.getConnectors().iterator();
|
|
||||||
|
|
||||||
while (it.hasNext())
|
|
||||||
{
|
|
||||||
IMechanicalConnector connector = it.next();
|
|
||||||
|
|
||||||
if (connector != null)
|
|
||||||
{
|
|
||||||
reconstructConnector(connector);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
it.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Segmented out call so overriding can be done when conductors are reconstructed. */
|
@Override
|
||||||
protected void reconstructConnector(IMechanicalConnector connector)
|
protected void reconstructConnector(IMechanical connector)
|
||||||
{
|
{
|
||||||
connector.setNetwork(this);
|
connector.setNetwork(this);
|
||||||
|
load += connector.getResistance();
|
||||||
for (int i = 0; i < connector.getConnections().length; i++)
|
|
||||||
{
|
|
||||||
reconstructHandler(connector.getConnections()[i], ForgeDirection.getOrientation(i).getOpposite());
|
|
||||||
}
|
|
||||||
|
|
||||||
connectorResistance += connector.getResistance();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Segmented out call so overriding can be done when machines are reconstructed. */
|
/** Segmented out call so overriding can be done when machines are reconstructed. */
|
||||||
protected void reconstructHandler(Object obj, ForgeDirection side)
|
protected void reconstructHandler(Object obj, ForgeDirection side)
|
||||||
{
|
{
|
||||||
if (obj != null && !(obj instanceof IMechanicalConnector))
|
if (obj != null && !(obj instanceof IMechanical))
|
||||||
{
|
{
|
||||||
if (obj instanceof IMechanical)
|
if (obj instanceof IMechanical)
|
||||||
{
|
{
|
||||||
|
@ -238,7 +206,7 @@ public class MechanicalNetwork extends NodeNetwork<IMechanicalNetwork, IMechanic
|
||||||
{
|
{
|
||||||
set = EnumSet.noneOf(ForgeDirection.class);
|
set = EnumSet.noneOf(ForgeDirection.class);
|
||||||
}
|
}
|
||||||
this.getNodes().add((IMechanical) obj);
|
this.getConnectors().add((IMechanical) obj);
|
||||||
set.add(side);
|
set.add(side);
|
||||||
this.handlerDirectionMap.put(obj, set);
|
this.handlerDirectionMap.put(obj, set);
|
||||||
}
|
}
|
||||||
|
@ -252,7 +220,7 @@ public class MechanicalNetwork extends NodeNetwork<IMechanicalNetwork, IMechanic
|
||||||
|
|
||||||
if (deltaTime > 1)
|
if (deltaTime > 1)
|
||||||
{
|
{
|
||||||
rotation = (float) (((angularVelocity) * (deltaTime / 1000f) + rotation) % Math.PI);
|
rotation = (float) (((angularVelocity) * (deltaTime / 1000f) + rotation) % (2 * Math.PI));
|
||||||
lastRotateTime = System.currentTimeMillis();
|
lastRotateTime = System.currentTimeMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,6 +236,6 @@ public class MechanicalNetwork extends NodeNetwork<IMechanicalNetwork, IMechanic
|
||||||
@Override
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
return this.getClass().getSimpleName() + "[" + this.hashCode() + ", Handlers: " + getNodes().size() + ", Connectors: " + getConnectors().size() + ", Power:" + getPower() + "]";
|
return this.getClass().getSimpleName() + "[" + this.hashCode() + ", Handlers: " + getConnectors().size() + ", Connectors: " + getConnectors().size() + ", Power:" + getPower() + "]";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ import codechicken.multipart.TileMultipart;
|
||||||
* @author Calclavia
|
* @author Calclavia
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public abstract class PartMechanical extends JCuboidPart implements JNormalOcclusion, TFacePart, IMechanicalConnector
|
public abstract class PartMechanical extends JCuboidPart implements JNormalOcclusion, TFacePart, IMechanical
|
||||||
{
|
{
|
||||||
public static Cuboid6[][] oBoxes = new Cuboid6[6][2];
|
public static Cuboid6[][] oBoxes = new Cuboid6[6][2];
|
||||||
|
|
||||||
|
@ -60,22 +60,15 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
|
||||||
/** The current angle the gear is on. In radians per second. */
|
/** The current angle the gear is on. In radians per second. */
|
||||||
public float angle = 0;
|
public float angle = 0;
|
||||||
|
|
||||||
/** When true, it will start marking nearby gears for update */
|
|
||||||
public boolean markRotationUpdate = true;
|
|
||||||
|
|
||||||
public void preparePlacement(int side, int itemDamage)
|
public void preparePlacement(int side, int itemDamage)
|
||||||
{
|
{
|
||||||
this.placementSide = ForgeDirection.getOrientation((byte) (side ^ 1));
|
this.placementSide = ForgeDirection.getOrientation((byte) (side ^ 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: We don't need to tick.
|
||||||
@Override
|
@Override
|
||||||
public void update()
|
public void update()
|
||||||
{
|
{
|
||||||
if (markRotationUpdate)
|
|
||||||
{
|
|
||||||
updateRotations();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.world().isRemote)
|
if (this.world().isRemote)
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -89,61 +82,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
|
||||||
angle -= getNetwork().getAngularVelocity() / 20f;
|
angle -= getNetwork().getAngularVelocity() / 20f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates rotations of all nearby gears.
|
|
||||||
*/
|
|
||||||
public void updateRotations()
|
|
||||||
{
|
|
||||||
/** Look for gears that are back-to-back with this gear. Equate torque. */
|
|
||||||
universalelectricity.api.vector.Vector3 vec = new universalelectricity.api.vector.Vector3(tile()).modifyPositionFromSide(placementSide);
|
|
||||||
|
|
||||||
TileEntity tile = vec.getTileEntity(world());
|
|
||||||
|
|
||||||
if (tile instanceof TileMultipart)
|
|
||||||
{
|
|
||||||
TMultiPart neighbor = ((TileMultipart) tile).partMap(this.placementSide.getOpposite().ordinal());
|
|
||||||
|
|
||||||
if (neighbor instanceof PartMechanical)
|
|
||||||
{
|
|
||||||
equateRotation((PartMechanical) neighbor, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Look for gears outside this block space, the relative UP, DOWN, LEFT, RIGHT */
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
ForgeDirection checkDir = ForgeDirection.getOrientation(Rotation.rotateSide(this.placementSide.ordinal(), i));
|
|
||||||
universalelectricity.api.vector.Vector3 checkVec = new universalelectricity.api.vector.Vector3(tile()).modifyPositionFromSide(checkDir);
|
|
||||||
|
|
||||||
TileEntity checkTile = checkVec.getTileEntity(world());
|
|
||||||
|
|
||||||
if (checkTile instanceof TileMultipart)
|
|
||||||
{
|
|
||||||
TMultiPart neighbor = ((TileMultipart) checkTile).partMap(this.placementSide.ordinal());
|
|
||||||
|
|
||||||
if (neighbor != this && neighbor instanceof PartMechanical)
|
|
||||||
{
|
|
||||||
equateRotation((PartMechanical) neighbor, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Look for gears that are internal and adjacent to this gear. (The 2 sides) */
|
|
||||||
for (int i = 0; i < 6; i++)
|
|
||||||
{
|
|
||||||
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
|
|
||||||
TMultiPart neighbor = tile().partMap(this.placementSide.getRotation(checkDir).ordinal());
|
|
||||||
|
|
||||||
if (neighbor != this && neighbor instanceof PartMechanical)
|
|
||||||
{
|
|
||||||
equateRotation((PartMechanical) neighbor, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
markRotationUpdate = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -185,7 +123,7 @@ 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()).modifyPositionFromSide(placementSide);
|
universalelectricity.api.vector.Vector3 vec = new universalelectricity.api.vector.Vector3(tile()).translate(placementSide);
|
||||||
|
|
||||||
TileEntity tile = vec.getTileEntity(world());
|
TileEntity tile = vec.getTileEntity(world());
|
||||||
|
|
||||||
|
@ -193,18 +131,18 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
|
||||||
{
|
{
|
||||||
TMultiPart neighbor = ((TileMultipart) tile).partMap(this.placementSide.getOpposite().ordinal());
|
TMultiPart neighbor = ((TileMultipart) tile).partMap(this.placementSide.getOpposite().ordinal());
|
||||||
|
|
||||||
if (neighbor instanceof IMechanicalConnector)
|
if (neighbor instanceof IMechanical)
|
||||||
{
|
{
|
||||||
connections[this.placementSide.getOpposite().ordinal()] = neighbor;
|
connections[this.placementSide.getOpposite().ordinal()] = neighbor;
|
||||||
getNetwork().merge(((IMechanicalConnector) neighbor).getNetwork());
|
getNetwork().merge(((IMechanical) neighbor).getNetwork());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (tile instanceof IMechanical)
|
else if (tile instanceof IMechanical)
|
||||||
{
|
{
|
||||||
connections[this.placementSide.getOpposite().ordinal()] = tile;
|
connections[this.placementSide.getOpposite().ordinal()] = tile;
|
||||||
if (tile instanceof IMechanicalConnector)
|
if (tile instanceof IMechanical)
|
||||||
{
|
{
|
||||||
getNetwork().merge(((IMechanicalConnector) tile).getNetwork());
|
getNetwork().merge(((IMechanical) tile).getNetwork());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,18 +150,17 @@ 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()).modifyPositionFromSide(checkDir);
|
universalelectricity.api.vector.Vector3 checkVec = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir);
|
||||||
|
|
||||||
TileEntity checkTile = checkVec.getTileEntity(world());
|
TileEntity checkTile = checkVec.getTileEntity(world());
|
||||||
|
|
||||||
if (checkTile instanceof TileMultipart)
|
if (checkTile instanceof TileMultipart)
|
||||||
{
|
{
|
||||||
TMultiPart neighbor = ((TileMultipart) checkTile).partMap(this.placementSide.ordinal());
|
TMultiPart neighbor = ((TileMultipart) checkTile).partMap(this.placementSide.ordinal());
|
||||||
|
|
||||||
if (neighbor != this && neighbor instanceof PartMechanical)
|
if (neighbor != this && neighbor instanceof IMechanical)
|
||||||
{
|
{
|
||||||
connections[checkDir.ordinal()] = neighbor;
|
connections[checkDir.ordinal()] = neighbor;
|
||||||
getNetwork().merge(((PartMechanical) neighbor).getNetwork());
|
getNetwork().merge(((IMechanical) neighbor).getNetwork());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -234,10 +171,10 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
|
||||||
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
|
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
|
||||||
TMultiPart neighbor = tile().partMap(this.placementSide.getRotation(checkDir).ordinal());
|
TMultiPart neighbor = tile().partMap(this.placementSide.getRotation(checkDir).ordinal());
|
||||||
|
|
||||||
if (neighbor != this && neighbor instanceof PartMechanical)
|
if (neighbor != this && neighbor instanceof IMechanical)
|
||||||
{
|
{
|
||||||
connections[checkDir.ordinal()] = neighbor;
|
connections[checkDir.ordinal()] = neighbor;
|
||||||
getNetwork().merge(((PartMechanical) neighbor).getNetwork());
|
getNetwork().merge(((IMechanical) neighbor).getNetwork());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,35 +192,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
|
||||||
return connections;
|
return connections;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void equateRotation(PartMechanical neighbor, boolean isPositive)
|
|
||||||
{
|
|
||||||
if (!neighbor.markRotationUpdate)
|
|
||||||
{
|
|
||||||
if (isPositive)
|
|
||||||
{
|
|
||||||
neighbor.setClockwise(isClockwise);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
neighbor.setClockwise(!isClockwise);
|
|
||||||
}
|
|
||||||
|
|
||||||
neighbor.markRotationUpdate = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity, boolean doReceive)
|
|
||||||
{
|
|
||||||
if (!world().isRemote && doReceive)
|
|
||||||
{
|
|
||||||
getNetwork().onReceiveEnergy(torque, angularVelocity);
|
|
||||||
markRotationUpdate = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (long) (torque * angularVelocity);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void preRemove()
|
public void preRemove()
|
||||||
{
|
{
|
||||||
|
@ -295,7 +203,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
|
||||||
@Override
|
@Override
|
||||||
public boolean sendNetworkPacket(long torque, float angularVelocity)
|
public boolean sendNetworkPacket(long torque, float angularVelocity)
|
||||||
{
|
{
|
||||||
if (tile() != null)
|
if (!world().isRemote && tile() != null)
|
||||||
{
|
{
|
||||||
tile().getWriteStream(this).writeByte(0).writeLong(torque).writeFloat(angularVelocity).writeBoolean(isClockwise);
|
tile().getWriteStream(this).writeByte(0).writeLong(torque).writeFloat(angularVelocity).writeBoolean(isClockwise);
|
||||||
}
|
}
|
||||||
|
@ -317,7 +225,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
|
||||||
{
|
{
|
||||||
getNetwork().setPower(packet.readLong(), packet.readFloat());
|
getNetwork().setPower(packet.readLong(), packet.readFloat());
|
||||||
isClockwise = packet.readBoolean();
|
isClockwise = packet.readBoolean();
|
||||||
markRotationUpdate = true;
|
|
||||||
}
|
}
|
||||||
else if (packetID == 1)
|
else if (packetID == 1)
|
||||||
{
|
{
|
||||||
|
@ -348,7 +255,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 IMechanicalConnector;
|
return new universalelectricity.api.vector.Vector3(this.x() + direction.offsetX, this.y() + direction.offsetY, this.z() + direction.offsetZ).getTileEntity(this.world()) instanceof IMechanical;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -8,6 +8,7 @@ import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import universalelectricity.api.net.IConnector;
|
import universalelectricity.api.net.IConnector;
|
||||||
|
import universalelectricity.core.net.ConnectionPathfinder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets proper rotations on all connected units in the mechanical network.
|
* Sets proper rotations on all connected units in the mechanical network.
|
||||||
|
@ -18,92 +19,40 @@ import universalelectricity.api.net.IConnector;
|
||||||
* @author Calclavia
|
* @author Calclavia
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class PathfinderRotationManager
|
public class PathfinderRotationManager extends ConnectionPathfinder<IMechanical>
|
||||||
{
|
{
|
||||||
/** A list of nodes that the pathfinder already went through. */
|
private boolean currentIsClockwise = true;
|
||||||
public final Set<IConnector> closedSet = new LinkedHashSet<IConnector>();
|
private Set<IMechanical> prevClosedSet;
|
||||||
|
|
||||||
/** The resulted path found by the pathfinder. Could be null if no path was found. */
|
public PathfinderRotationManager(IMechanical first, Set<IMechanical> prevClosedSet)
|
||||||
public final Set<IConnector> results = new LinkedHashSet<IConnector>();
|
|
||||||
|
|
||||||
private final IConnector targetConnector;
|
|
||||||
private final List<IConnector> ignoreConnector;
|
|
||||||
|
|
||||||
public PathfinderRotationManager(IConnector targetConnector, IConnector... ignoreConnector)
|
|
||||||
{
|
{
|
||||||
this.targetConnector = targetConnector;
|
super(first);
|
||||||
if (ignoreConnector != null)
|
this.currentIsClockwise = first.isClockwise();
|
||||||
{
|
this.prevClosedSet = prevClosedSet;
|
||||||
this.ignoreConnector = Arrays.asList(ignoreConnector);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this.ignoreConnector = new ArrayList<IConnector>();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public boolean findNodes(IMechanical currentNode)
|
||||||
* A recursive function to find all connectors.
|
|
||||||
*
|
|
||||||
* @return True on success finding, false on failure.
|
|
||||||
*/
|
|
||||||
public boolean findNodes(IConnector currentNode)
|
|
||||||
{
|
{
|
||||||
this.closedSet.add(currentNode);
|
this.closedSet.add(currentNode);
|
||||||
|
|
||||||
if (this.onSearch(currentNode))
|
currentNode.setClockwise(currentIsClockwise);
|
||||||
{
|
currentIsClockwise = !currentNode.isClockwise();
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (IConnector node : this.getConnectedNodes(currentNode))
|
for (IMechanical node : this.getConnectedNodes(currentNode))
|
||||||
{
|
{
|
||||||
if (!this.closedSet.contains(node))
|
if (!this.closedSet.contains(node))
|
||||||
{
|
{
|
||||||
if (this.findNodes(node))
|
if (prevClosedSet.contains(node) && node.isClockwise() != currentNode.isClockwise())
|
||||||
{
|
{
|
||||||
return true;
|
// We have conflicting gears. Network is now equal.
|
||||||
|
currentNode.getNetwork().setPower(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
findNodes(node);
|
||||||
|
currentIsClockwise = node.isRotationInversed() ? !currentNode.isClockwise() : currentNode.isClockwise();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<IConnector> getConnectedNodes(IConnector currentNode)
|
|
||||||
{
|
|
||||||
Set<IConnector> connectedNodes = new HashSet<IConnector>();
|
|
||||||
|
|
||||||
if (currentNode != null)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < currentNode.getConnections().length; i++)
|
|
||||||
{
|
|
||||||
Object obj = currentNode.getConnections()[i];
|
|
||||||
|
|
||||||
if (obj instanceof IConnector && !this.ignoreConnector.contains(obj))
|
|
||||||
{
|
|
||||||
connectedNodes.add((IConnector) obj);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return connectedNodes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean onSearch(IConnector node)
|
|
||||||
{
|
|
||||||
if (node == this.targetConnector)
|
|
||||||
{
|
|
||||||
this.results.add(node);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void reset()
|
|
||||||
{
|
|
||||||
this.results.clear();
|
|
||||||
this.closedSet.clear();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ package resonantinduction.mechanical.network;
|
||||||
import net.minecraftforge.common.ForgeDirection;
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
import calclavia.lib.prefab.tile.TileAdvanced;
|
import calclavia.lib.prefab.tile.TileAdvanced;
|
||||||
|
|
||||||
public class TileMechanical extends TileAdvanced implements IMechanicalConnector
|
public class TileMechanical extends TileAdvanced implements IMechanical
|
||||||
{
|
{
|
||||||
/** The mechanical connections this connector has made */
|
/** The mechanical connections this connector has made */
|
||||||
protected Object[] connections = new Object[6];
|
protected Object[] connections = new Object[6];
|
||||||
|
@ -12,12 +12,6 @@ public class TileMechanical extends TileAdvanced implements IMechanicalConnector
|
||||||
|
|
||||||
private boolean isClockwise = false;
|
private boolean isClockwise = false;
|
||||||
|
|
||||||
@Override
|
|
||||||
public long onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity, boolean doReceive)
|
|
||||||
{
|
|
||||||
return this.getNetwork().onReceiveEnergy(torque, angularVelocity);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canConnect(ForgeDirection direction)
|
public boolean canConnect(ForgeDirection direction)
|
||||||
{
|
{
|
||||||
|
@ -70,4 +64,10 @@ public class TileMechanical extends TileAdvanced implements IMechanicalConnector
|
||||||
{
|
{
|
||||||
this.isClockwise = isClockwise;
|
this.isClockwise = isClockwise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isRotationInversed()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import java.util.Set;
|
||||||
|
|
||||||
import net.minecraftforge.common.ForgeDirection;
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
import resonantinduction.mechanical.network.IMechanical;
|
import resonantinduction.mechanical.network.IMechanical;
|
||||||
|
import resonantinduction.mechanical.network.IMechanicalNetwork;
|
||||||
import codechicken.multipart.TMultiPart;
|
import codechicken.multipart.TMultiPart;
|
||||||
import codechicken.multipart.TileMultipart;
|
import codechicken.multipart.TileMultipart;
|
||||||
|
|
||||||
|
@ -66,22 +67,6 @@ public class TraitMechanical extends TileMultipart implements IMechanical
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public long onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity, boolean doReceive)
|
|
||||||
{
|
|
||||||
TMultiPart part = this.partMap(from.ordinal());
|
|
||||||
|
|
||||||
if (part != null)
|
|
||||||
{
|
|
||||||
if (this.mechanicalInterfaces.contains(part))
|
|
||||||
{
|
|
||||||
return ((IMechanical) part).onReceiveEnergy(from, torque, angularVelocity, doReceive);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isClockwise()
|
public boolean isClockwise()
|
||||||
{
|
{
|
||||||
|
@ -93,4 +78,40 @@ public class TraitMechanical extends TileMultipart implements IMechanical
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object[] getConnections()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IMechanicalNetwork getNetwork()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNetwork(IMechanicalNetwork network)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean sendNetworkPacket(long torque, float angularVelocity)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getResistance()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isRotationInversed()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,127 +0,0 @@
|
||||||
package resonantinduction.mechanical.trait;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import net.minecraftforge.common.ForgeDirection;
|
|
||||||
import resonantinduction.mechanical.network.IMechanicalConnector;
|
|
||||||
import resonantinduction.mechanical.network.IMechanicalNetwork;
|
|
||||||
import codechicken.multipart.TMultiPart;
|
|
||||||
import codechicken.multipart.TileMultipart;
|
|
||||||
|
|
||||||
public class TraitMechanicalConnector extends TileMultipart implements IMechanicalConnector
|
|
||||||
{
|
|
||||||
public Set<IMechanicalConnector> mechanicalConnectorInterfaces = new HashSet<IMechanicalConnector>();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void copyFrom(TileMultipart that)
|
|
||||||
{
|
|
||||||
super.copyFrom(that);
|
|
||||||
|
|
||||||
if (that instanceof TraitMechanicalConnector)
|
|
||||||
{
|
|
||||||
this.mechanicalConnectorInterfaces = ((TraitMechanicalConnector) that).mechanicalConnectorInterfaces;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void bindPart(TMultiPart part)
|
|
||||||
{
|
|
||||||
super.bindPart(part);
|
|
||||||
|
|
||||||
if (part instanceof IMechanicalConnector)
|
|
||||||
{
|
|
||||||
this.mechanicalConnectorInterfaces.add((IMechanicalConnector) part);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void partRemoved(TMultiPart part, int p)
|
|
||||||
{
|
|
||||||
super.partRemoved(part, p);
|
|
||||||
|
|
||||||
if (part instanceof IMechanicalConnector)
|
|
||||||
{
|
|
||||||
this.mechanicalConnectorInterfaces.remove(part);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void clearParts()
|
|
||||||
{
|
|
||||||
super.clearParts();
|
|
||||||
this.mechanicalConnectorInterfaces.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canConnect(ForgeDirection direction)
|
|
||||||
{
|
|
||||||
for (IMechanicalConnector connector : this.mechanicalConnectorInterfaces)
|
|
||||||
{
|
|
||||||
if (connector.canConnect(direction.getOpposite()))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity, boolean doReceive)
|
|
||||||
{
|
|
||||||
TMultiPart part = this.partMap(from.ordinal());
|
|
||||||
|
|
||||||
if (part != null)
|
|
||||||
{
|
|
||||||
if (this.mechanicalConnectorInterfaces.contains(part))
|
|
||||||
{
|
|
||||||
return ((IMechanicalConnector) part).onReceiveEnergy(from, torque, angularVelocity, doReceive);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object[] getConnections()
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IMechanicalNetwork getNetwork()
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setNetwork(IMechanicalNetwork network)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean sendNetworkPacket(long torque, float angularVelocity)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public float getResistance()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isClockwise()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setClockwise(boolean isClockwise)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue