A lot more work on new grid design

This commit is contained in:
Calclavia 2014-03-04 22:26:01 +08:00
parent 503c3a9904
commit dacf725587
16 changed files with 630 additions and 681 deletions

View file

@ -5,8 +5,8 @@ import java.util.EnumSet;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.api.mechanical.IMechanical;
import resonantinduction.api.mechanical.IMechanicalNetwork;
import resonantinduction.mechanical.energy.network.IMechanicalNodeProvider;
import resonantinduction.mechanical.energy.network.MechanicalNode;
import universalelectricity.api.energy.EnergyStorageHandler;
import universalelectricity.api.vector.Vector3;
import calclavia.lib.prefab.tile.IRotatable;
@ -17,9 +17,9 @@ import calclavia.lib.prefab.tile.TileElectrical;
*
* @author Calclavia
*/
public class TileGenerator extends TileElectrical implements IRotatable
public class TileGenerator extends TileElectrical implements IRotatable, IMechanicalNodeProvider
{
private IMechanicalNetwork network;
protected MechanicalNode node = new MechanicalNode(this).setLoad(0.5f);;
/** Generator turns KE -> EE. Inverted one will turn EE -> KE. */
public boolean isInversed = true;
@ -161,4 +161,10 @@ public class TileGenerator extends TileElectrical implements IRotatable
nbt.setBoolean("isInversed", isInversed);
nbt.setByte("gear", gearRatio);
}
@Override
public MechanicalNode getNode(ForgeDirection from)
{
return node;
}
}

View file

@ -0,0 +1,88 @@
package resonantinduction.electrical.multimeter;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
public class GraphD extends Graph<Double>
{
public GraphD(String name, int maxPoints)
{
super(name, maxPoints);
}
@Override
public void queue(Double value)
{
queue += value;
}
@Override
public void doneQueue()
{
super.doneQueue();
queue = 0d;
}
@Override
public Double getDefault()
{
return 0d;
}
@Override
public void load(NBTTagCompound nbt)
{
super.load(nbt);
NBTTagList nbtList = nbt.getTagList("DataPoints");
for (int i = 0; i < nbtList.tagCount(); ++i)
{
NBTTagCompound nbtPoint = (NBTTagCompound) nbtList.tagAt(i);
points.add(nbtPoint.getDouble("data"));
}
}
@Override
public NBTTagCompound save()
{
NBTTagCompound nbt = new NBTTagCompound();
NBTTagList data = new NBTTagList();
for (Double value : points)
{
NBTTagCompound nbtPoint = new NBTTagCompound();
nbtPoint.setDouble("data", value);
data.appendTag(nbtPoint);
}
nbt.setTag("DataPoints", data);
return nbt;
}
@Override
public double getDouble()
{
return get();
}
@Override
public Double getAverage()
{
if (points.size() > 0)
{
double average = 0;
for (double point : points)
{
average += point;
}
average /= points.size();
return average;
}
return 0d;
}
}

View file

@ -32,8 +32,8 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
public final GraphL powerGraph = new GraphL("Power", maxData);
public final GraphL energyCapacityGraph = new GraphL("Capacity", 1);
public final GraphL voltageGraph = new GraphL("Voltage", maxData);
public final GraphL torqueGraph = new GraphL("Torque", maxData);
public final GraphF angularVelocityGraph = new GraphF("Speed", maxData);
public final GraphD torqueGraph = new GraphD("Torque", maxData);
public final GraphD angularVelocityGraph = new GraphD("Speed", maxData);
public final GraphI fluidGraph = new GraphI("Fluid", maxData);
public final GraphF thermalGraph = new GraphF("Temperature", maxData);
public final GraphI pressureGraph = new GraphI("Pressure", maxData);

View file

@ -11,11 +11,12 @@ import net.minecraft.util.MovingObjectPosition;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
import resonantinduction.api.mechanical.IMechanical;
import resonantinduction.api.mechanical.fluid.IPressure;
import resonantinduction.core.ResonantInduction;
import resonantinduction.core.prefab.part.PartFace;
import resonantinduction.electrical.Electrical;
import resonantinduction.mechanical.energy.network.IMechanicalNodeProvider;
import resonantinduction.mechanical.energy.network.MechanicalNode;
import universalelectricity.api.CompatibilityModule;
import universalelectricity.api.electricity.IElectricalNetwork;
import universalelectricity.api.energy.IConductor;
@ -267,9 +268,9 @@ public class PartMultimeter extends PartFace implements IConnector<MultimeterNet
}
}
if (tileEntity instanceof IMechanical)
if (tileEntity instanceof IMechanicalNodeProvider)
{
IMechanical instance = ((IMechanical) tileEntity).getInstance(receivingSide);
MechanicalNode instance = ((IMechanicalNodeProvider) tileEntity).getNode(receivingSide);
for (ForgeDirection dir : ForgeDirection.values())
{
@ -278,14 +279,14 @@ public class PartMultimeter extends PartFace implements IConnector<MultimeterNet
break;
}
instance = ((IMechanical) tileEntity).getInstance(dir);
instance = ((IMechanicalNodeProvider) tileEntity).getNode(dir);
}
if (instance != null)
{
getNetwork().torqueGraph.queue(instance.getTorque());
getNetwork().angularVelocityGraph.queue(instance.getAngularVelocity());
getNetwork().energyGraph.queue((long) (instance.getTorque() * instance.getAngularVelocity()));
getNetwork().energyGraph.queue((long) (instance.getEnergy()));
getNetwork().powerGraph.queue(getNetwork().energyGraph.getAverage() * 20);
}
}

View file

@ -612,7 +612,7 @@ public class TileTesla extends TileElectrical implements IMultiBlockStructure<Ti
if (t instanceof TileTesla)
{
vectors.add(checkPosition.clone().subtract(getPosition()));
vectors.add(checkPosition.clone().subtract(position()));
}
else
{
@ -656,7 +656,7 @@ public class TileTesla extends TileElectrical implements IMultiBlockStructure<Ti
}
@Override
public Vector3 getPosition()
public Vector3 position()
{
return new Vector3(this);
}

View file

@ -19,7 +19,7 @@ public class MultipartMechanical implements IPartFactory
MultiPartRegistry.registerParts(this, PART_TYPES);
MultipartGenerator.registerPassThroughInterface("resonantinduction.core.fluid.IPressurizedNode");
MultipartGenerator.registerPassThroughInterface("resonantinduction.api.mechanical.fluid.IPressure");
MultipartGenerator.registerTrait("resonantinduction.api.mechanical.IMechanical", "resonantinduction.mechanical.trait.TraitMechanical");
MultipartGenerator.registerTrait("resonantinduction.api.mechanical.IMechanicalNodeProvider", "resonantinduction.mechanical.trait.TraitMechanical");
}
@Override

View file

@ -11,10 +11,11 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.api.mechanical.IMechanical;
import resonantinduction.core.Reference;
import resonantinduction.core.resource.ItemHandCrank;
import resonantinduction.mechanical.Mechanical;
import resonantinduction.mechanical.energy.network.IMechanicalNodeProvider;
import resonantinduction.mechanical.energy.network.MechanicalNode;
import resonantinduction.mechanical.energy.network.PartMechanical;
import calclavia.lib.multiblock.reference.IMultiBlockStructure;
import calclavia.lib.multiblock.reference.MultiBlockHandler;
@ -35,7 +36,7 @@ import cpw.mods.fml.relauncher.SideOnly;
*
* @author Calclavia
*/
public class PartGear extends PartMechanical implements IMechanical, IMultiBlockStructure<PartGear>
public class PartGear extends PartMechanical implements IMultiBlockStructure<PartGear>
{
public static Cuboid6[][] oBoxes = new Cuboid6[6][2];
@ -55,6 +56,287 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
private int manualCrankTime = 0;
private int multiBlockRadius = 1;
public PartGear()
{
super();
node = new MechanicalNode(this)
{
@Override
public void onUpdate()
{
if (!getMultiBlock().isPrimary())
{
torque = 0;
angularVelocity = 0;
}
}
@Override
public double getTorqueLoad()
{
// Decelerate the gear based on tier.
switch (tier)
{
default:
return 0.4;
case 1:
return 0.3;
case 2:
return 0.2;
}
}
@Override
public double getAngularVelocityLoad()
{
// Decelerate the gear based on tier.
switch (tier)
{
default:
return 0.3;
case 1:
return 0.4;
case 2:
return 0.2;
}
}
@Override
public void recache()
{
synchronized (connections)
{
connections.clear();
/**
* Only call refresh if this is the main block of a multiblock gear or a single
* gear
* block.
*/
if (!getMultiBlock().isPrimary() || world() == null)
{
return;
}
/** Look for gears that are back-to-back with this gear. Equate torque. */
TileEntity tileBehind = new universalelectricity.api.vector.Vector3(tile()).translate(placementSide).getTileEntity(world());
if (tileBehind instanceof IMechanicalNodeProvider)
{
MechanicalNode instance = ((IMechanicalNodeProvider) tileBehind).getNode(placementSide.getOpposite());
if (instance != null && instance != this && !(instance.parent instanceof PartGearShaft) && instance.canConnect(placementSide.getOpposite(), this))
{
connections.put(instance, placementSide);
}
}
/**
* Look for gears that are internal and adjacent to this gear. (The 4 sides +
* the
* internal
* center)
*/
for (int i = 0; i < 6; i++)
{
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
TileEntity tile = tile();
if (getMultiBlock().isConstructed() && checkDir != placementSide && checkDir != placementSide.getOpposite())
{
tile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir).getTileEntity(world());
}
if (tile instanceof IMechanicalNodeProvider)
{
/**
* If we're checking for the block that is opposite to the gear's
* placement
* side
* (the center), then we try to look for a gear shaft in the center.
*/
MechanicalNode instance = ((IMechanicalNodeProvider) tile).getNode(checkDir == placementSide.getOpposite() ? ForgeDirection.UNKNOWN : checkDir);
if (!connections.containsValue(checkDir) && instance != this && checkDir != placementSide && instance != null && instance.canConnect(checkDir.getOpposite(), this))
{
connections.put(instance, checkDir);
}
}
}
int displaceCheck = 1;
if (getMultiBlock().isPrimary() && getMultiBlock().isConstructed())
{
displaceCheck = 2;
}
/** 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(PartGear.this.placementSide.ordinal(), i));
TileEntity checkTile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir, displaceCheck).getTileEntity(world());
if (!connections.containsValue(checkDir) && checkTile instanceof IMechanicalNodeProvider)
{
MechanicalNode instance = ((IMechanicalNodeProvider) checkTile).getNode(placementSide);
if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this) && !(instance.parent instanceof PartGearShaft))
{
connections.put(instance, checkDir);
}
}
}
}
}
/**
* Can this gear be connected BY the source?
*
* @param from - Direction source is coming from.
* @param source - The source of the connection.
* @return True is so.
*/
@Override
public boolean canConnect(ForgeDirection from, Object with)
{
if (!getMultiBlock().isPrimary())
{
return false;
}
if (with instanceof MechanicalNode)
{
IMechanicalNodeProvider source = ((MechanicalNode) with).parent;
/**
* Check for flat connections (gear face on gear face) to make sure it's
* actually on
* this gear block.
*/
if (from == placementSide.getOpposite())
{
if (source instanceof PartGear || source instanceof PartGearShaft)
{
if (source instanceof PartGearShaft)
{
PartGearShaft shaft = (PartGearShaft) source;
return shaft.tile().partMap(from.getOpposite().ordinal()) == PartGear.this && Math.abs(shaft.placementSide.offsetX) == Math.abs(placementSide.offsetX) && Math.abs(shaft.placementSide.offsetY) == Math.abs(placementSide.offsetY) && Math.abs(shaft.placementSide.offsetZ) == Math.abs(placementSide.offsetZ);
}
else if (source instanceof PartGear)
{
if (((PartGear) source).tile() == tile() && !getMultiBlock().isConstructed())
{
return true;
}
if (((PartGear) source).placementSide != placementSide)
{
TMultiPart part = tile().partMap(((PartGear) source).placementSide.ordinal());
if (part instanceof PartGear)
{
/**
* Case when we connect gears via edges internally. Large
* gear
* attempt to connect to small gear.
*/
PartGear sourceGear = (PartGear) part;
if (sourceGear.isCenterMultiBlock() && !sourceGear.getMultiBlock().isPrimary())
{
// For large gear to small gear on edge connection.
return true;
}
}
else
{
/** Small gear attempting to connect to large gear. */
if (getMultiBlock().isConstructed())
{
TMultiPart checkPart = ((PartGear) source).tile().partMap(placementSide.ordinal());
if (checkPart instanceof PartGear)
{
ForgeDirection requiredDirection = ((PartGear) checkPart).position().subtract(position()).toForgeDirection();
return ((PartGear) checkPart).isCenterMultiBlock() && ((PartGear) source).placementSide == requiredDirection;
}
}
}
}
}
}
/** Face to face stick connection. */
TileEntity sourceTile = position().translate(from.getOpposite()).getTileEntity(world());
if (sourceTile instanceof IMechanicalNodeProvider)
{
MechanicalNode sourceInstance = ((IMechanicalNodeProvider) sourceTile).getNode(from);
return sourceInstance == source;
}
}
else if (from == placementSide)
{
/** Face to face stick connection. */
TileEntity sourceTile = position().translate(from).getTileEntity(world());
if (sourceTile instanceof IMechanicalNodeProvider)
{
MechanicalNode sourceInstance = ((IMechanicalNodeProvider) sourceTile).getNode(from.getOpposite());
return sourceInstance == source;
}
}
else
{
TileEntity destinationTile = ((MechanicalNode) with).position().translate(from.getOpposite()).getTileEntity(world());
if (destinationTile instanceof IMechanicalNodeProvider && destinationTile instanceof TileMultipart)
{
TMultiPart destinationPart = ((TileMultipart) destinationTile).partMap(placementSide.ordinal());
if (destinationPart instanceof PartGear)
{
if (PartGear.this != destinationPart)
{
return ((PartGear) destinationPart).isCenterMultiBlock();
}
else
{
return true;
}
}
else
{
return true;
}
}
}
}
return false;
}
@Override
public float getRatio(ForgeDirection dir, MechanicalNode with)
{
universalelectricity.api.vector.Vector3 deltaPos = with.position().subtract(position());
boolean caseX = placementSide.offsetX != 0 && deltaPos.y == 0 && deltaPos.z == 0;
boolean caseY = placementSide.offsetY != 0 && deltaPos.x == 0 && deltaPos.z == 0;
boolean caseZ = placementSide.offsetZ != 0 && deltaPos.x == 0 && deltaPos.y == 0;
if (caseX || caseY || caseZ)
{
return super.getRatio(dir, with);
}
return getMultiBlock().isConstructed() ? 1.5f : super.getRatio(dir, with);
}
};
}
@Override
public void update()
{
@ -64,36 +346,10 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
{
if (manualCrankTime > 0)
{
torque += isClockwiseCrank ? 4 : -4;
angularVelocity += isClockwiseCrank ? 0.03f : -0.03f;
node.apply(isClockwiseCrank ? 4 : -4, isClockwiseCrank ? 0.03f : -0.03f);
manualCrankTime--;
}
if (getMultiBlock().isPrimary())
{
// Decelerate the gear based on tier.
switch (tier)
{
default:
torque *= 0.96f;
angularVelocity *= 0.97f;
break;
case 1:
torque *= 0.97f;
angularVelocity *= 0.96f;
break;
case 2:
torque *= 0.98f;
angularVelocity *= 0.98f;
break;
}
}
else
{
torque = 0;
angularVelocity = 0;
}
}
getMultiBlock().update();
@ -113,8 +369,8 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
{
if (!world().isRemote && ControlKeyModifer.isControlDown(player))
{
getMultiBlock().get().torque = -getMultiBlock().get().torque;
getMultiBlock().get().angularVelocity = -getMultiBlock().get().angularVelocity;
getMultiBlock().get().node.torque = -getMultiBlock().get().node.torque;
getMultiBlock().get().node.angularVelocity = -getMultiBlock().get().node.angularVelocity;
return true;
}
@ -141,88 +397,6 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
getMultiBlock().deconstruct();
}
/** Refresh should be called sparingly. */
@Override
public Object[] getConnections()
{
Object[] connections = new Object[6];
/** Only call refresh if this is the main block of a multiblock gear or a single gear block. */
if (!getMultiBlock().isPrimary() || world() == null)
{
return connections;
}
/** Look for gears that are back-to-back with this gear. Equate torque. */
TileEntity tileBehind = new universalelectricity.api.vector.Vector3(tile()).translate(placementSide).getTileEntity(world());
if (tileBehind instanceof IMechanical)
{
IMechanical instance = ((IMechanical) tileBehind).getInstance(placementSide.getOpposite());
if (instance != null && instance != this && !(instance instanceof PartGearShaft) && instance.canConnect(placementSide.getOpposite(), this))
{
connections[placementSide.ordinal()] = instance;
}
}
/**
* Look for gears that are internal and adjacent to this gear. (The 4 sides + the internal
* center)
*/
for (int i = 0; i < 6; i++)
{
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
TileEntity tile = tile();
if (getMultiBlock().isConstructed() && checkDir != placementSide && checkDir != placementSide.getOpposite())
{
tile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir).getTileEntity(world());
}
if (tile instanceof IMechanical)
{
/**
* If we're checking for the block that is opposite to the gear's placement side
* (the center), then we try to look for a gear shaft in the center.
*/
IMechanical instance = ((IMechanical) tile).getInstance(checkDir == placementSide.getOpposite() ? ForgeDirection.UNKNOWN : checkDir);
if (connections[checkDir.ordinal()] == null && instance != this && checkDir != placementSide && instance != null && instance.canConnect(checkDir.getOpposite(), this))
{
connections[checkDir.ordinal()] = instance;
}
}
}
int displaceCheck = 1;
if (getMultiBlock().isPrimary() && getMultiBlock().isConstructed())
{
displaceCheck = 2;
}
/** 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));
TileEntity checkTile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir, displaceCheck).getTileEntity(world());
if (connections[checkDir.ordinal()] == null && checkTile instanceof IMechanical)
{
IMechanical instance = ((IMechanical) checkTile).getInstance(placementSide);
if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this) && !(instance instanceof PartGearShaft))
{
connections[checkDir.ordinal()] = instance;
}
}
}
return connections;
}
/**
* Is this gear block the one in the center-edge of the multiblock that can interact with other
* gears?
@ -356,152 +530,9 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
}
@Override
public float getRatio(ForgeDirection dir, Object source)
public MechanicalNode getNode(ForgeDirection from)
{
if (source instanceof IMechanical)
{
universalelectricity.api.vector.Vector3 deltaPos = ((IMechanical) source).position().subtract(position());
boolean caseX = placementSide.offsetX != 0 && deltaPos.y == 0 && deltaPos.z == 0;
boolean caseY = placementSide.offsetY != 0 && deltaPos.x == 0 && deltaPos.z == 0;
boolean caseZ = placementSide.offsetZ != 0 && deltaPos.x == 0 && deltaPos.y == 0;
if (caseX || caseY || caseZ)
{
return super.getRatio(dir, source);
}
}
return getMultiBlock().isConstructed() ? 1.5f : super.getRatio(dir, source);
}
@Override
public IMechanical getInstance(ForgeDirection from)
{
return getMultiBlock().get();
}
/**
* Can this gear be connected BY the source?
*
* @param from - Direction source is coming from.
* @param source - The source of the connection.
* @return True is so.
*/
@Override
public boolean canConnect(ForgeDirection from, Object source)
{
if (!getMultiBlock().isPrimary())
{
return false;
}
if (source instanceof IMechanical)
{
/**
* Check for flat connections (gear face on gear face) to make sure it's actually on
* this gear block.
*/
if (from == placementSide.getOpposite())
{
if (source instanceof PartGear || source instanceof PartGearShaft)
{
if (source instanceof PartGearShaft)
{
PartGearShaft shaft = (PartGearShaft) source;
return shaft.tile().partMap(from.getOpposite().ordinal()) == this && Math.abs(shaft.placementSide.offsetX) == Math.abs(placementSide.offsetX) && Math.abs(shaft.placementSide.offsetY) == Math.abs(placementSide.offsetY) && Math.abs(shaft.placementSide.offsetZ) == Math.abs(placementSide.offsetZ);
}
else if (source instanceof PartGear)
{
if (((PartGear) source).tile() == tile() && !getMultiBlock().isConstructed())
{
return true;
}
if (((PartGear) source).placementSide != placementSide)
{
TMultiPart part = tile().partMap(((PartGear) source).placementSide.ordinal());
if (part instanceof PartGear)
{
/**
* Case when we connect gears via edges internally. Large gear
* attempt to connect to small gear.
*/
PartGear sourceGear = (PartGear) part;
if (sourceGear.isCenterMultiBlock() && !sourceGear.getMultiBlock().isPrimary())
{
// For large gear to small gear on edge connection.
return true;
}
}
else
{
/** Small gear attempting to connect to large gear. */
if (getMultiBlock().isConstructed())
{
TMultiPart checkPart = ((PartGear) source).tile().partMap(placementSide.ordinal());
if (checkPart instanceof PartGear)
{
ForgeDirection requiredDirection = ((PartGear) checkPart).position().subtract(position()).toForgeDirection();
return ((PartGear) checkPart).isCenterMultiBlock() && ((PartGear) source).placementSide == requiredDirection;
}
}
}
}
}
}
/** Face to face stick connection. */
TileEntity sourceTile = position().translate(from.getOpposite()).getTileEntity(world());
if (sourceTile instanceof IMechanical)
{
IMechanical sourceInstance = ((IMechanical) sourceTile).getInstance(from);
return sourceInstance == source;
}
}
else if (from == placementSide)
{
/** Face to face stick connection. */
TileEntity sourceTile = position().translate(from).getTileEntity(world());
if (sourceTile instanceof IMechanical)
{
IMechanical sourceInstance = ((IMechanical) sourceTile).getInstance(from.getOpposite());
return sourceInstance == source;
}
}
else
{
TileEntity destinationTile = ((IMechanical) source).position().translate(from.getOpposite()).getTileEntity(world());
if (destinationTile instanceof IMechanical && destinationTile instanceof TileMultipart)
{
TMultiPart destinationPart = ((TileMultipart) destinationTile).partMap(placementSide.ordinal());
if (destinationPart instanceof PartGear)
{
if (this != destinationPart)
{
return ((PartGear) destinationPart).isCenterMultiBlock();
}
else
{
return true;
}
}
else
{
return true;
}
}
}
}
return false;
return getMultiBlock().get().node;
}
/** Multipart Bounds */
@ -523,12 +554,6 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
return FaceMicroClass.aBounds()[0x10 | this.placementSide.ordinal()];
}
@Override
public boolean inverseRotation(ForgeDirection dir, IMechanical with)
{
return true;
}
@Override
@SideOnly(Side.CLIENT)
public Cuboid6 getRenderBounds()

View file

@ -7,8 +7,9 @@ import java.util.Set;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.api.mechanical.IMechanical;
import resonantinduction.mechanical.Mechanical;
import resonantinduction.mechanical.energy.network.IMechanicalNodeProvider;
import resonantinduction.mechanical.energy.network.MechanicalNode;
import resonantinduction.mechanical.energy.network.PartMechanical;
import codechicken.lib.raytracer.IndexedCuboid6;
import codechicken.lib.vec.Cuboid6;
@ -47,79 +48,114 @@ public class PartGearShaft extends PartMechanical
tier = itemDamage;
}
@Override
public void update()
public PartGearShaft()
{
super.update();
super();
if (!this.world().isRemote)
node = new MechanicalNode(this)
{
// Decelerate the shaft.
switch (tier)
@Override
public double getTorqueLoad()
{
default:
torque *= 0.997f;
angularVelocity *= 0.998f;
break;
case 1:
torque *= 0.998f;
angularVelocity *= 0.997f;
break;
case 2:
torque *= 0.99f;
angularVelocity *= 0.999f;
break;
}
}
}
/**
* Refresh should be called sparingly.
*/
@Override
public Object[] getConnections()
{
Object[] connections = new Object[6];
/** Check for internal connections, the FRONT and BACK. */
for (int i = 0; i < 6; i++)
{
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
if (checkDir == placementSide || checkDir == placementSide.getOpposite())
{
IMechanical instance = ((IMechanical) tile()).getInstance(checkDir);
if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this))
// Decelerate the gear based on tier.
switch (tier)
{
connections[checkDir.ordinal()] = instance;
default:
return 0.04;
case 1:
return 0.03;
case 2:
return 0.02;
}
}
}
/** Look for connections outside this block space, the relative FRONT and BACK */
for (int i = 0; i < 6; i++)
{
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
if (connections[checkDir.ordinal()] == null && (checkDir == placementSide || checkDir == placementSide.getOpposite()))
@Override
public double getAngularVelocityLoad()
{
TileEntity checkTile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir).getTileEntity(world());
if (checkTile instanceof IMechanical)
// Decelerate the gear based on tier.
switch (tier)
{
IMechanical instance = ((IMechanical) checkTile).getInstance(checkDir.getOpposite());
default:
return 0.03;
case 1:
return 0.04;
case 2:
return 0.02;
}
}
// Only connect to shafts outside of this block space.
if (instance != null && instance != this && instance instanceof PartGearShaft && instance.canConnect(checkDir.getOpposite(), this))
@Override
public void recache()
{
synchronized (connections)
{
connections.clear();
/** Check for internal connections, the FRONT and BACK. */
for (int i = 0; i < 6; i++)
{
connections[checkDir.ordinal()] = instance;
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
if (checkDir == placementSide || checkDir == placementSide.getOpposite())
{
MechanicalNode instance = ((IMechanicalNodeProvider) tile()).getNode(checkDir);
if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this))
{
connections.put(instance, checkDir);
}
}
}
/** Look for connections outside this block space, the relative FRONT and BACK */
for (int i = 0; i < 6; i++)
{
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
if (!connections.containsValue(checkDir) && (checkDir == placementSide || checkDir == placementSide.getOpposite()))
{
TileEntity checkTile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir).getTileEntity(world());
if (checkTile instanceof IMechanicalNodeProvider)
{
MechanicalNode instance = ((IMechanicalNodeProvider) checkTile).getNode(checkDir.getOpposite());
// Only connect to shafts outside of this block space.
if (instance != null && instance != this && instance.parent instanceof PartGearShaft && instance.canConnect(checkDir.getOpposite(), this))
{
connections.put(instance, checkDir);
}
}
}
}
}
}
}
return connections;
@Override
public boolean canConnect(ForgeDirection from, Object source)
{
if (source instanceof PartGear)
{
PartGear gear = (PartGear) source;
if (!(Math.abs(gear.placementSide.offsetX) == Math.abs(placementSide.offsetX) && Math.abs(gear.placementSide.offsetY) == Math.abs(placementSide.offsetY) && Math.abs(gear.placementSide.offsetZ) == Math.abs(placementSide.offsetZ)))
return false;
}
return from == placementSide || from == placementSide.getOpposite();
}
@Override
public boolean inverseRotation(ForgeDirection dir, MechanicalNode with)
{
if (placementSide.offsetY != 0 || placementSide.offsetZ != 0)
{
return dir == placementSide.getOpposite();
}
return dir == placementSide;
}
};
}
@Override
@ -144,20 +180,6 @@ public class PartGearShaft extends PartMechanical
return "resonant_induction_gear_shaft";
}
@Override
public boolean canConnect(ForgeDirection from, Object source)
{
if (source instanceof PartGear)
{
PartGear gear = (PartGear) source;
if (!(Math.abs(gear.placementSide.offsetX) == Math.abs(placementSide.offsetX) && Math.abs(gear.placementSide.offsetY) == Math.abs(placementSide.offsetY) && Math.abs(gear.placementSide.offsetZ) == Math.abs(placementSide.offsetZ)))
return false;
}
return from == placementSide || from == placementSide.getOpposite();
}
/**
* Multipart Bounds
*/
@ -207,15 +229,4 @@ public class PartGearShaft extends PartMechanical
return new Cuboid6(0.375, 0.375, 0.375, 0.625, 0.625, 0.625);
}
@Override
public boolean inverseRotation(ForgeDirection dir, IMechanical with)
{
if (placementSide.offsetY != 0 || placementSide.offsetZ != 0)
{
return dir == placementSide.getOpposite();
}
return dir == placementSide;
}
}

View file

@ -5,11 +5,11 @@ import java.util.Iterator;
import java.util.Map.Entry;
import java.util.WeakHashMap;
import resonantinduction.core.grid.IGrid;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.core.grid.IGrid;
import universalelectricity.api.vector.Vector3;
import codechicken.multipart.TMultiPart;
@ -17,7 +17,7 @@ public class MechanicalNode extends EnergyNode
{
protected final AbstractMap<MechanicalNode, ForgeDirection> connections = new WeakHashMap<MechanicalNode, ForgeDirection>();
protected final IMechanicalNodeProvider parent;
public final IMechanicalNodeProvider parent;
public double torque = 0;
public double prevAngularVelocity, angularVelocity = 0;
@ -29,6 +29,7 @@ public class MechanicalNode extends EnergyNode
public double angle = 0;
protected double load = 1;
protected byte connectionMap = Byte.parseByte("111111", 2);
public MechanicalNode(IMechanicalNodeProvider parent)
{
@ -41,22 +42,21 @@ public class MechanicalNode extends EnergyNode
return this;
}
public MechanicalNode setConnection(byte connectionMap)
{
this.connectionMap = connectionMap;
return this;
}
@Override
public void update(float deltaTime)
{
float acceleration = this.acceleration * deltaTime;
double load = getLoad() * deltaTime;
prevAngularVelocity = angularVelocity;
onUpdate();
/**
* Loss energy
*/
torque -= torque * torque * load;
angularVelocity -= angularVelocity * angularVelocity * load;
angle += angularVelocity / 20;
if (angle % (Math.PI * 2) != angle)
@ -65,35 +65,44 @@ public class MechanicalNode extends EnergyNode
angle = angle % (Math.PI * 2);
}
synchronized (connections)
if (!world().isRemote)
{
Iterator<Entry<MechanicalNode, ForgeDirection>> it = connections.entrySet().iterator();
/**
* Loss energy
*/
torque -= torque * torque * getTorqueLoad() * deltaTime;
angularVelocity -= angularVelocity * angularVelocity * getAngularVelocityLoad() * deltaTime;
while (it.hasNext())
synchronized (connections)
{
Entry<MechanicalNode, ForgeDirection> entry = it.next();
Iterator<Entry<MechanicalNode, ForgeDirection>> it = connections.entrySet().iterator();
ForgeDirection dir = entry.getValue();
MechanicalNode adjacentMech = entry.getKey();
while (it.hasNext())
{
Entry<MechanicalNode, ForgeDirection> entry = it.next();
/**
* Calculate angular velocity and torque.
*/
float ratio = adjacentMech.getRatio(dir.getOpposite(), this) / getRatio(dir, adjacentMech);
boolean inverseRotation = inverseRotation(dir, adjacentMech) && adjacentMech.inverseRotation(dir.getOpposite(), this);
ForgeDirection dir = entry.getValue();
MechanicalNode adjacentMech = entry.getKey();
int inversion = inverseRotation ? -1 : 1;
/**
* Calculate angular velocity and torque.
*/
float ratio = adjacentMech.getRatio(dir.getOpposite(), this) / getRatio(dir, adjacentMech);
boolean inverseRotation = inverseRotation(dir, adjacentMech) && adjacentMech.inverseRotation(dir.getOpposite(), this);
if (Math.abs(torque + inversion * (adjacentMech.getTorque() / ratio * acceleration)) < Math.abs(adjacentMech.getTorque() / ratio))
torque = torque + inversion * (adjacentMech.getTorque() / ratio * acceleration);
int inversion = inverseRotation ? -1 : 1;
if (Math.abs(angularVelocity + inversion * (adjacentMech.getAngularVelocity() * ratio * acceleration)) < Math.abs(adjacentMech.getAngularVelocity() * ratio))
angularVelocity = angularVelocity + (inversion * adjacentMech.getAngularVelocity() * ratio * acceleration);
if (Math.abs(torque + inversion * (adjacentMech.getTorque() / ratio * acceleration)) < Math.abs(adjacentMech.getTorque() / ratio))
torque = torque + inversion * (adjacentMech.getTorque() / ratio * acceleration);
/**
* Set all current rotations
*/
adjacentMech.angle = Math.abs(angle) * (adjacentMech.angle >= 0 ? 1 : -1);
if (Math.abs(angularVelocity + inversion * (adjacentMech.getAngularVelocity() * ratio * acceleration)) < Math.abs(adjacentMech.getAngularVelocity() * ratio))
angularVelocity = angularVelocity + (inversion * adjacentMech.getAngularVelocity() * ratio * acceleration);
/**
* Set all current rotations
*/
adjacentMech.angle = Math.abs(angle) * (adjacentMech.angle >= 0 ? 1 : -1);
}
}
}
}
@ -119,12 +128,12 @@ public class MechanicalNode extends EnergyNode
public double getTorque()
{
return torque;
return angularVelocity != 0 ? torque : 0;
}
public double getAngularVelocity()
{
return angularVelocity;
return torque != 0 ? angularVelocity : 0;
}
public float getRatio(ForgeDirection dir, MechanicalNode with)
@ -140,7 +149,12 @@ public class MechanicalNode extends EnergyNode
/**
* The energy percentage loss due to resistance in seconds.
*/
public double getLoad()
public double getTorqueLoad()
{
return load;
}
public double getAngularVelocityLoad()
{
return load;
}
@ -189,7 +203,7 @@ public class MechanicalNode extends EnergyNode
public boolean canConnect(ForgeDirection from, Object source)
{
return true;
return (source instanceof MechanicalNode) && (connectionMap & (1 << from.ordinal())) != 0;
}
@Override
@ -219,4 +233,5 @@ public class MechanicalNode extends EnergyNode
nbt.setDouble("torque", torque);
nbt.setDouble("angularVelocity", angularVelocity);
}
}

View file

@ -7,8 +7,6 @@ import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.MovingObjectPosition;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.api.mechanical.IMechanical;
import resonantinduction.api.mechanical.IMechanicalNetwork;
import codechicken.lib.data.MCDataInput;
import codechicken.lib.data.MCDataOutput;
import codechicken.multipart.JCuboidPart;
@ -22,12 +20,11 @@ import codechicken.multipart.TMultiPart;
* @author Calclavia
*
*/
public abstract class PartMechanical extends JCuboidPart implements JNormalOcclusion, TFacePart, IMechanical
public abstract class PartMechanical extends JCuboidPart implements JNormalOcclusion, TFacePart, IMechanicalNodeProvider
{
private IMechanicalNetwork network;
protected MechanicalNode node;
protected float prevAngularVelocity, angularVelocity;
protected long torque;
protected double prevAngularVelocity;
/**
* Packets
@ -38,9 +35,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
/** Side of the block this is placed on */
public ForgeDirection placementSide = ForgeDirection.UNKNOWN;
/** The current angle the gear is on. In radians. */
public float angle = 0;
public int tier;
public void preparePlacement(int side, int itemDamage)
@ -53,7 +47,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
public void update()
{
ticks++;
angle += angularVelocity / 20;
if (!world().isRemote)
checkClientUpdate();
@ -63,9 +56,9 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
public void checkClientUpdate()
{
if (Math.abs(prevAngularVelocity - angularVelocity) > 0.05f || (prevAngularVelocity != angularVelocity && (prevAngularVelocity == 0 || angularVelocity == 0)))
if (Math.abs(prevAngularVelocity - node.angularVelocity) > 0.05f || (prevAngularVelocity != node.angularVelocity && (prevAngularVelocity == 0 || node.angularVelocity == 0)))
{
prevAngularVelocity = angularVelocity;
prevAngularVelocity = node.angularVelocity;
markPacketUpdate = true;
}
@ -76,28 +69,33 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
}
}
public MechanicalNode getNode(ForgeDirection dir)
{
return node;
}
@Override
public void onWorldJoin()
{
getNetwork().reconstruct();
node.reconstruct();
}
@Override
public void onNeighborChanged()
{
getNetwork().reconstruct();
node.reconstruct();
}
@Override
public void onPartChanged(TMultiPart part)
{
getNetwork().reconstruct();
node.reconstruct();
}
@Override
public void onWorldSeparate()
{
getNetwork().split(this);
node.split();
}
/** Packet Code. */
@ -119,7 +117,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
readDesc(packet);
break;
case 1:
angularVelocity = packet.readFloat();
node.angularVelocity = packet.readFloat();
break;
}
}
@ -163,16 +161,16 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
public void load(NBTTagCompound nbt)
{
placementSide = ForgeDirection.getOrientation(nbt.getByte("side"));
angularVelocity = nbt.getFloat("angularVelocity");
tier = nbt.getByte("tier");
node.load(nbt);
}
@Override
public void save(NBTTagCompound nbt)
{
nbt.setByte("side", (byte) placementSide.ordinal());
nbt.setFloat("angularVelocity", angularVelocity);
nbt.setByte("tier", (byte) tier);
node.save(nbt);
}
protected abstract ItemStack getItem();
@ -191,66 +189,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
return getItem();
}
/**
* Mechanical implementations
*/
@Override
public IMechanicalNetwork getNetwork()
{
if (network == null)
{
network = new MechanicalNetwork();
network.addConnector(this);
}
return network;
}
@Override
public void setNetwork(IMechanicalNetwork network)
{
this.network = network;
}
@Override
public float getAngularVelocity()
{
return torque != 0 ? angularVelocity : 0;
}
@Override
public void setAngularVelocity(float velocity)
{
if (world() != null && !world().isRemote)
this.angularVelocity = velocity;
}
@Override
public long getTorque()
{
return angularVelocity != 0 ? torque : 0;
}
@Override
public void setTorque(long torque)
{
if (world() != null && !world().isRemote)
this.torque = torque;
}
@Override
public float getRatio(ForgeDirection dir, Object source)
{
return 0.5f;
}
@Override
public IMechanical getInstance(ForgeDirection from)
{
return this;
}
@Override
public universalelectricity.api.vector.Vector3 position()
{
return new universalelectricity.api.vector.Vector3(x(), y(), z());

View file

@ -3,101 +3,62 @@ package resonantinduction.mechanical.energy.turbine;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.api.mechanical.IMechanical;
import resonantinduction.api.mechanical.IMechanicalNetwork;
import resonantinduction.mechanical.energy.network.MechanicalNetwork;
import resonantinduction.mechanical.energy.network.IMechanicalNodeProvider;
import resonantinduction.mechanical.energy.network.MechanicalNode;
import universalelectricity.api.energy.EnergyStorageHandler;
import calclavia.lib.network.Synced.SyncedInput;
import calclavia.lib.network.Synced.SyncedOutput;
import calclavia.lib.prefab.turbine.TileTurbine;
public class TileMechanicalTurbine extends TileTurbine implements IMechanical
public class TileMechanicalTurbine extends TileTurbine implements IMechanicalNodeProvider
{
protected MechanicalNode node;
public TileMechanicalTurbine()
{
super();
energy = new EnergyStorageHandler(0);
}
private IMechanicalNetwork network;
@Override
public IMechanicalNetwork getNetwork()
{
if (this.network == null)
node = new MechanicalNode(this)
{
this.network = new MechanicalNetwork();
this.network.addConnector(this);
}
return this.network;
}
@Override
public void setNetwork(IMechanicalNetwork network)
{
this.network = network;
}
@Override
public float getRatio(ForgeDirection dir, Object source)
{
return 0.5f;
}
@Override
public float getAngularVelocity()
{
return angularVelocity;
}
@Override
public void setAngularVelocity(float velocity)
{
this.angularVelocity = velocity;
}
@Override
public void setTorque(long torque)
{
this.torque = torque;
}
@Override
public boolean inverseRotation(ForgeDirection dir, IMechanical with)
{
return true;
}
@Override
public IMechanical getInstance(ForgeDirection dir)
{
return (IMechanical) getMultiBlock().get();
}
@Override
public boolean canConnect(ForgeDirection from, Object source)
{
if (source instanceof IMechanical && !(source instanceof TileMechanicalTurbine))
{
/**
* Face to face stick connection.
*/
TileEntity sourceTile = position().translate(from).getTileEntity(getWorld());
if (sourceTile instanceof IMechanical)
@Override
public boolean canConnect(ForgeDirection from, Object source)
{
IMechanical sourceInstance = ((IMechanical) sourceTile).getInstance(from.getOpposite());
return sourceInstance == source && from == getDirection().getOpposite();
if (source instanceof MechanicalNode && !(source instanceof TileMechanicalTurbine))
{
/**
* Face to face stick connection.
*/
TileEntity sourceTile = position().translate(from).getTileEntity(getWorld());
if (sourceTile instanceof IMechanicalNodeProvider)
{
MechanicalNode sourceInstance = ((IMechanicalNodeProvider) sourceTile).getNode(from.getOpposite());
return sourceInstance == source && from == getDirection().getOpposite();
}
}
return false;
}
}
return false;
@Override
public boolean inverseRotation(ForgeDirection dir, MechanicalNode with)
{
return false;
}
};
}
@Override
public Object[] getConnections()
public MechanicalNode getNode(ForgeDirection dir)
{
return null;
return ((TileMechanicalTurbine) getMultiBlock().get()).node;
}
@Override
public void invalidate()
{
node.split();
super.invalidate();
}
@Override
@ -106,6 +67,7 @@ public class TileMechanicalTurbine extends TileTurbine implements IMechanical
{
super.readFromNBT(nbt);
tier = nbt.getInteger("tier");
node.load(nbt);
}
/**
@ -117,5 +79,6 @@ public class TileMechanicalTurbine extends TileTurbine implements IMechanical
{
super.writeToNBT(nbt);
nbt.setInteger("tier", tier);
node.save(nbt);
}
}

View file

@ -4,11 +4,9 @@ import java.lang.reflect.Method;
import net.minecraft.block.Block;
import net.minecraft.block.BlockFluid;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Vec3;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.api.mechanical.IMechanical;
import universalelectricity.api.vector.Vector3;
import cpw.mods.fml.relauncher.ReflectionHelper;
@ -29,13 +27,6 @@ public class TileWaterTurbine extends TileMechanicalTurbine
torque = defaultTorque;
}
@Override
public void invalidate()
{
getNetwork().split(this);
super.invalidate();
}
@Override
public void updateEntity()
{
@ -107,33 +98,4 @@ public class TileWaterTurbine extends TileMechanicalTurbine
{
return maxPower / (2 - tier + 1);
}
@Override
public boolean canConnect(ForgeDirection from, Object source)
{
if (getDirection().offsetY == 0)
{
if (source instanceof IMechanical)
{
/**
* Face to face stick connection.
*/
TileEntity sourceTile = position().translate(from).getTileEntity(getWorld());
if (sourceTile instanceof IMechanical)
{
IMechanical sourceInstance = ((IMechanical) sourceTile).getInstance(from.getOpposite());
return sourceInstance == source && from == getDirection();
}
}
}
return super.canConnect(from, source);
}
@Override
public boolean inverseRotation(ForgeDirection dir, IMechanical with)
{
return false;
}
}

View file

@ -12,13 +12,13 @@ import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.api.mechanical.IMechanical;
import resonantinduction.api.recipe.MachineRecipes;
import resonantinduction.api.recipe.MachineRecipes.RecipeType;
import resonantinduction.archaic.filter.Timer;
import resonantinduction.core.Reference;
import resonantinduction.core.resource.ResourceGenerator;
import resonantinduction.core.resource.fluid.BlockFluidMixture;
import resonantinduction.mechanical.energy.network.MechanicalNode;
import resonantinduction.mechanical.energy.network.TileMechanical;
import universalelectricity.api.vector.Vector3;
import calclavia.lib.utility.inventory.InventoryUtility;
@ -33,6 +33,19 @@ public class TileMixer extends TileMechanical implements IInventory
public static final int PROCESS_TIME = 12 * 20;
public static final Timer<EntityItem> timer = new Timer<EntityItem>();
public TileMixer()
{
mechanicalNode = new PacketMechanicalNode(this)
{
@Override
public boolean inverseRotation(ForgeDirection dir, MechanicalNode with)
{
return dir == ForgeDirection.DOWN;
}
}.setConnection(Byte.parseByte("000011", 2));
}
@Override
public void updateEntity()
{
@ -51,7 +64,7 @@ public class TileMixer extends TileMechanical implements IInventory
*/
public boolean canWork()
{
return angularVelocity != 0;
return mechanicalNode.getAngularVelocity() != 0;
}
public void doWork()
@ -70,7 +83,7 @@ public class TileMixer extends TileMechanical implements IInventory
*/
Vector3 originalPosition = new Vector3(entity);
Vector3 relativePosition = originalPosition.clone().subtract(new Vector3(this).add(0.5));
relativePosition.rotate(-angularVelocity, 0, 0);
relativePosition.rotate(-mechanicalNode.getAngularVelocity(), 0, 0);
Vector3 newPosition = new Vector3(this).add(0.5).add(relativePosition);
Vector3 difference = newPosition.difference(originalPosition).scale(0.5);
@ -162,18 +175,6 @@ public class TileMixer extends TileMechanical implements IInventory
return false;
}
@Override
public boolean canConnect(ForgeDirection from, Object source)
{
return from == ForgeDirection.UP || from == ForgeDirection.DOWN;
}
@Override
public boolean inverseRotation(ForgeDirection dir, IMechanical with)
{
return dir == ForgeDirection.DOWN;
}
@Override
public int getSizeInventory()
{

View file

@ -4,16 +4,15 @@ import java.util.HashSet;
import java.util.Set;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.api.mechanical.IMechanical;
import resonantinduction.api.mechanical.IMechanicalNetwork;
import universalelectricity.api.vector.Vector3;
import resonantinduction.mechanical.energy.network.IMechanicalNodeProvider;
import resonantinduction.mechanical.energy.network.MechanicalNode;
import codechicken.multipart.PartMap;
import codechicken.multipart.TMultiPart;
import codechicken.multipart.TileMultipart;
public class TraitMechanical extends TileMultipart implements IMechanical
public class TraitMechanical extends TileMultipart implements IMechanicalNodeProvider
{
public Set<IMechanical> mechanicalInterfaces = new HashSet<IMechanical>();
public Set<IMechanicalNodeProvider> mechanicalInterfaces = new HashSet<IMechanicalNodeProvider>();
@Override
public void copyFrom(TileMultipart that)
@ -31,9 +30,9 @@ public class TraitMechanical extends TileMultipart implements IMechanical
{
super.bindPart(part);
if (part instanceof IMechanical)
if (part instanceof IMechanicalNodeProvider)
{
this.mechanicalInterfaces.add((IMechanical) part);
this.mechanicalInterfaces.add((IMechanicalNodeProvider) part);
}
}
@ -42,7 +41,7 @@ public class TraitMechanical extends TileMultipart implements IMechanical
{
super.partRemoved(part, p);
if (part instanceof IMechanical)
if (part instanceof IMechanicalNodeProvider)
{
this.mechanicalInterfaces.remove(part);
}
@ -56,19 +55,7 @@ public class TraitMechanical extends TileMultipart implements IMechanical
}
@Override
public Object[] getConnections()
{
return null;
}
@Override
public IMechanicalNetwork getNetwork()
{
return null;
}
@Override
public IMechanical getInstance(ForgeDirection from)
public MechanicalNode getNode(ForgeDirection from)
{
TMultiPart part = this.partMap(from.ordinal());
@ -79,67 +66,13 @@ public class TraitMechanical extends TileMultipart implements IMechanical
if (part != null)
{
if (part instanceof IMechanical)
if (part instanceof IMechanicalNodeProvider)
{
return ((IMechanical) part).getInstance(from);
return ((IMechanicalNodeProvider) part).getNode(from);
}
}
return null;
}
@Override
public void setNetwork(IMechanicalNetwork network)
{
}
@Override
public float getAngularVelocity()
{
return 0;
}
@Override
public void setAngularVelocity(float velocity)
{
}
@Override
public long getTorque()
{
return 0;
}
@Override
public void setTorque(long torque)
{
}
@Override
public float getRatio(ForgeDirection dir, Object source)
{
return 0;
}
@Override
public boolean canConnect(ForgeDirection from, Object source)
{
return false;
}
@Override
public Vector3 getPosition()
{
return null;
}
@Override
public boolean inverseRotation(ForgeDirection dir, IMechanical with)
{
return false;
}
}

View file

@ -4,5 +4,5 @@ import net.minecraftforge.common.ForgeDirection;
public interface INodeProvider<N extends INode>
{
public N getNode(ForgeDirection dir);
public N getNode(ForgeDirection from);
}

View file

@ -1,5 +1,6 @@
package resonantinduction.core.grid;
import resonantinduction.mechanical.energy.network.PartMechanical;
import net.minecraft.nbt.NBTTagCompound;
public abstract class Node<G extends IGrid> implements INode<G>
@ -35,6 +36,11 @@ public abstract class Node<G extends IGrid> implements INode<G>
}
public void split()
{
}
public void load(NBTTagCompound nbt)
{