Gears now back to semi-working

This commit is contained in:
Calclavia 2014-01-20 23:22:10 +08:00
parent bc81e18874
commit f64b157544
10 changed files with 124 additions and 70 deletions

View file

@ -69,7 +69,7 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat
{ {
float angularVelocity = extract / torqueRatio; float angularVelocity = extract / torqueRatio;
long torque = (long) (extract / angularVelocity); long torque = (long) (extract / angularVelocity);
energy.extractEnergy(((IMechanical) mechanical).getNetwork().onReceiveEnergy(((IMechanical) mechanical), torque, angularVelocity), true); energy.extractEnergy(((IMechanical) mechanical).getNetwork(outputDir.getOpposite()).onReceiveEnergy(((IMechanical) mechanical), torque, angularVelocity), true);
} }
} }
} }
@ -153,6 +153,12 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat
return this.network; return this.network;
} }
@Override
public IMechanicalNetwork getNetwork(ForgeDirection from)
{
return getNetwork();
}
@Override @Override
public void setNetwork(IMechanicalNetwork network) public void setNetwork(IMechanicalNetwork network)
{ {
@ -177,4 +183,9 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat
return false; return false;
} }
@Override
public IMechanical getInstance(ForgeDirection from)
{
return this;
}
} }

View file

@ -15,6 +15,7 @@ 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.IMechanicalNetwork;
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;
@ -296,4 +297,12 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl
return 0.5f; return 0.5f;
} }
@Override
public IMechanicalNetwork getNetwork(ForgeDirection from)
{
if (from != this.getDirection() && from != this.getDirection().getOpposite())
return getNetwork();
return null;
}
} }

View file

@ -3,8 +3,10 @@ package resonantinduction.mechanical.gear;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.MovingObjectPosition;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.mechanical.Mechanical; import resonantinduction.mechanical.Mechanical;
import resonantinduction.mechanical.network.IMechanical; import resonantinduction.mechanical.network.IMechanical;
import resonantinduction.mechanical.network.IMechanicalNetwork;
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;
@ -27,7 +29,7 @@ public class PartGear extends PartMechanical implements IMechanical
{ {
if (manualCrankTime > 0) if (manualCrankTime > 0)
{ {
getNetwork().onReceiveEnergy(this, 20, 0.2f);
manualCrankTime--; manualCrankTime--;
} }
} }
@ -38,16 +40,16 @@ public class PartGear extends PartMechanical implements IMechanical
@Override @Override
public float getResistance() public float getResistance()
{ {
return 0.5f; return 0.1f;
} }
@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;
} }
@ -81,4 +83,11 @@ public class PartGear extends PartMechanical implements IMechanical
{ {
return "resonant_induction_gear"; return "resonant_induction_gear";
} }
@Override
public IMechanical getInstance(ForgeDirection from)
{
return this;
}
} }

View file

@ -27,9 +27,16 @@ public interface IMechanical extends IConnector<IMechanicalNetwork>
public void setClockwise(boolean isClockwise); public void setClockwise(boolean isClockwise);
/** /**
* *
*
* @return Return true if the mechanical block should have its rotation set inveresed. * @return Return true if the mechanical block should have its rotation set inveresed.
*/ */
public boolean isRotationInversed(); public boolean isRotationInversed();
public IMechanicalNetwork getNetwork(ForgeDirection from);
/**
* Gets the instance of this mechanical through ForgeMultipart
*
* @return
*/
public IMechanical getInstance(ForgeDirection from);
} }

View file

@ -107,8 +107,8 @@ public class MechanicalNetwork extends Network<IMechanicalNetwork, IMechanical>
prevTorque = torque; prevTorque = torque;
prevAngularVelocity = angularVelocity; prevAngularVelocity = angularVelocity;
torque *= 0.5; torque = 0;
angularVelocity *= 0.5; angularVelocity = 0;
} }
@Override @Override

View file

@ -65,25 +65,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
this.placementSide = ForgeDirection.getOrientation((byte) (side ^ 1)); this.placementSide = ForgeDirection.getOrientation((byte) (side ^ 1));
} }
// TODO: We don't need to tick.
@Override
public void update()
{
if (this.world().isRemote)
{
/**
* Update angle rotation.
*/
if (getNetwork().getPower() > 0)
{
if (isClockwise)
angle += getNetwork().getAngularVelocity() / 20f;
else
angle -= getNetwork().getAngularVelocity() / 20f;
}
}
}
@Override @Override
public void onAdded() public void onAdded()
{ {
@ -127,23 +108,16 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
TileEntity tile = vec.getTileEntity(world()); TileEntity tile = vec.getTileEntity(world());
if (tile instanceof TileMultipart) if (tile instanceof IMechanical)
{ {
TMultiPart neighbor = ((TileMultipart) tile).partMap(this.placementSide.getOpposite().ordinal()); IMechanicalNetwork networkToMerge = ((IMechanical) tile).getNetwork(this.placementSide.getOpposite());
if (neighbor instanceof IMechanical) if (networkToMerge != null)
{ {
connections[this.placementSide.getOpposite().ordinal()] = neighbor; connections[this.placementSide.getOpposite().ordinal()] = ((IMechanical) tile).getInstance(this.placementSide.getOpposite());
getNetwork().merge(((IMechanical) neighbor).getNetwork()); getNetwork().merge(networkToMerge);
}
}
else if (tile instanceof IMechanical)
{
connections[this.placementSide.getOpposite().ordinal()] = tile;
if (tile instanceof IMechanical)
{
getNetwork().merge(((IMechanical) tile).getNetwork());
} }
} }
/** Look for gears outside this block space, the relative UP, DOWN, LEFT, RIGHT */ /** Look for gears outside this block space, the relative UP, DOWN, LEFT, RIGHT */
@ -153,14 +127,15 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
universalelectricity.api.vector.Vector3 checkVec = new universalelectricity.api.vector.Vector3(tile()).translate(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)
{
TMultiPart neighbor = ((TileMultipart) checkTile).partMap(this.placementSide.ordinal());
if (neighbor != this && neighbor instanceof IMechanical) if (checkTile instanceof IMechanical)
{
IMechanicalNetwork networkToMerge = ((IMechanical) checkTile).getNetwork(this.placementSide);
if (networkToMerge != null)
{ {
connections[checkDir.ordinal()] = neighbor; connections[checkDir.ordinal()] = ((IMechanical) checkTile).getInstance(this.placementSide);
getNetwork().merge(((IMechanical) neighbor).getNetwork()); getNetwork().merge(networkToMerge);
} }
} }
} }
@ -169,12 +144,12 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{ {
ForgeDirection checkDir = ForgeDirection.getOrientation(i); ForgeDirection checkDir = ForgeDirection.getOrientation(i);
TMultiPart neighbor = tile().partMap(this.placementSide.getRotation(checkDir).ordinal()); IMechanicalNetwork networkToMerge = ((IMechanical) tile()).getNetwork(checkDir);
if (neighbor != this && neighbor instanceof IMechanical) if (networkToMerge != null)
{ {
connections[checkDir.ordinal()] = neighbor; connections[checkDir.ordinal()] = ((IMechanical) tile()).getInstance(checkDir);
getNetwork().merge(((IMechanical) neighbor).getNetwork()); getNetwork().merge(networkToMerge);
} }
} }
@ -186,6 +161,12 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
} }
} }
@Override
public IMechanicalNetwork getNetwork(ForgeDirection from)
{
return getNetwork();
}
@Override @Override
public Object[] getConnections() public Object[] getConnections()
{ {
@ -203,7 +184,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 (!world().isRemote && tile() != null) if (world() != null && !world().isRemote && tile() != null)
{ {
tile().getWriteStream(this).writeByte(0).writeLong(torque).writeFloat(angularVelocity).writeBoolean(isClockwise); tile().getWriteStream(this).writeByte(0).writeLong(torque).writeFloat(angularVelocity).writeBoolean(isClockwise);
} }
@ -213,7 +194,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
public void sendRefreshPacket() public void sendRefreshPacket()
{ {
if (tile() != null) if (world() != null && !world().isRemote && tile() != null)
{ {
tile().getWriteStream(this).writeByte(1); tile().getWriteStream(this).writeByte(1);
} }

View file

@ -36,7 +36,6 @@ public class PathfinderRotationManager extends ConnectionPathfinder<IMechanical>
this.closedSet.add(currentNode); this.closedSet.add(currentNode);
currentNode.setClockwise(currentIsClockwise); currentNode.setClockwise(currentIsClockwise);
currentIsClockwise = !currentNode.isClockwise();
for (IMechanical node : this.getConnectedNodes(currentNode)) for (IMechanical node : this.getConnectedNodes(currentNode))
{ {
@ -48,8 +47,8 @@ public class PathfinderRotationManager extends ConnectionPathfinder<IMechanical>
currentNode.getNetwork().setPower(0, 0); currentNode.getNetwork().setPower(0, 0);
} }
currentIsClockwise = (node.isRotationInversed()) ? !currentNode.isClockwise() : currentNode.isClockwise();
findNodes(node); findNodes(node);
currentIsClockwise = node.isRotationInversed() ? !currentNode.isClockwise() : currentNode.isClockwise();
} }
} }

View file

@ -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 IMechanical public abstract 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];
@ -70,4 +70,10 @@ public class TileMechanical extends TileAdvanced implements IMechanical
{ {
return false; return false;
} }
@Override
public IMechanical getInstance(ForgeDirection from)
{
return this;
}
} }

View file

@ -12,6 +12,7 @@ import resonantinduction.api.recipe.RecipeUtils.ItemStackResource;
import resonantinduction.api.recipe.RecipeUtils.Resource; import resonantinduction.api.recipe.RecipeUtils.Resource;
import resonantinduction.core.Reference; import resonantinduction.core.Reference;
import resonantinduction.core.ResonantInduction; import resonantinduction.core.ResonantInduction;
import resonantinduction.mechanical.network.IMechanicalNetwork;
import resonantinduction.mechanical.network.TileMechanical; import resonantinduction.mechanical.network.TileMechanical;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import calclavia.lib.prefab.tile.IRotatable; import calclavia.lib.prefab.tile.IRotatable;
@ -160,17 +161,6 @@ public class TileGrinderWheel extends TileMechanical implements IRotatable
return clientTimer; return clientTimer;
} }
@Override
public boolean isClockwise()
{
if (worldObj != null)
{
return !(getBlockMetadata() % 2 == 0);
}
return false;
}
@Override @Override
public ForgeDirection getDirection() public ForgeDirection getDirection()
{ {
@ -187,4 +177,12 @@ public class TileGrinderWheel extends TileMechanical implements IRotatable
{ {
worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, direction.ordinal(), 3); worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, direction.ordinal(), 3);
} }
@Override
public IMechanicalNetwork getNetwork(ForgeDirection from)
{
if (from != this.getDirection() && from != this.getDirection().getOpposite())
return getNetwork();
return null;
}
} }

View file

@ -54,13 +54,15 @@ public class TraitMechanical extends TileMultipart implements IMechanical
} }
@Override @Override
public boolean canConnect(ForgeDirection direction) public boolean canConnect(ForgeDirection from)
{ {
for (IMechanical connector : this.mechanicalInterfaces) TMultiPart part = this.partMap(from.ordinal());
if (part != null)
{ {
if (connector.canConnect(direction.getOpposite())) if (this.mechanicalInterfaces.contains(part))
{ {
return true; return ((IMechanical) part).canConnect(from);
} }
} }
@ -85,6 +87,38 @@ public class TraitMechanical extends TileMultipart implements IMechanical
return null; return null;
} }
@Override
public IMechanicalNetwork getNetwork(ForgeDirection from)
{
TMultiPart part = this.partMap(from.ordinal());
if (part != null)
{
if (part instanceof IMechanical)
{
return ((IMechanical) part).getNetwork();
}
}
return null;
}
@Override
public IMechanical getInstance(ForgeDirection from)
{
TMultiPart part = this.partMap(from.ordinal());
if (part != null)
{
if (part instanceof IMechanical)
{
return (IMechanical) part;
}
}
return null;
}
@Override @Override
public IMechanicalNetwork getNetwork() public IMechanicalNetwork getNetwork()
{ {