Finished hard core large gear connection logic

This commit is contained in:
Calclavia 2014-01-26 19:51:06 +08:00
parent 4ac678aa00
commit 4fdc27cabe
9 changed files with 160 additions and 22 deletions

View file

@ -217,9 +217,9 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl
}
@Override
public boolean canConnect(ForgeDirection direction)
public boolean canConnect(ForgeDirection from, Object source)
{
return direction != getDirection() || direction != getDirection().getOpposite();
return from != getDirection() || from != getDirection().getOpposite();
}
public void refresh()

View file

@ -19,6 +19,8 @@ import calclavia.lib.prefab.block.BlockAdvanced;
import codechicken.lib.vec.Rotation;
import codechicken.lib.vec.Vector3;
import codechicken.multipart.ControlKeyModifer;
import codechicken.multipart.TMultiPart;
import codechicken.multipart.TileMultipart;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@ -40,15 +42,30 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
if (manualCrankTime > 0)
{
if (angularVelocity > 0)
{
torque += 1;
angularVelocity += 0.1f;
}
else
{
torque -= 1;
angularVelocity -= 0.1f;
}
manualCrankTime--;
}
if (getMultiBlock().isPrimary())
{
// Decelerate the gear.
torque *= 0.95f;
angularVelocity *= 0.95f;
}
else
{
torque = 0;
angularVelocity = 0;
}
}
getMultiBlock().update();
@ -58,6 +75,9 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
@Override
public boolean activate(EntityPlayer player, MovingObjectPosition hit, ItemStack item)
{
if (!world().isRemote)
System.out.println(getNetwork());
if (BlockAdvanced.isUsableWrench(player, player.getCurrentEquippedItem(), x(), y(), z()))
{
if (player.isSneaking())
@ -98,6 +118,9 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
{
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())
{
return;
@ -108,9 +131,9 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
if (tileBehind instanceof IMechanical)
{
IMechanical instance = (IMechanical) ((IMechanical) tileBehind).getInstance(placementSide.getOpposite());
IMechanical instance = ((IMechanical) tileBehind).getInstance(placementSide.getOpposite());
if (instance != null && instance.canConnect(placementSide))
if (instance != null && instance.canConnect(placementSide, this))
{
connections[placementSide.getOpposite().ordinal()] = instance;
getNetwork().merge(instance.getNetwork());
@ -126,7 +149,7 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
IMechanical instance = ((IMechanical) tile()).getInstance(checkDir);
if (connections[checkDir.ordinal()] == null && checkDir != placementSide && checkDir != placementSide.getOpposite() && instance != null && instance.canConnect(checkDir.getOpposite()))
if (connections[checkDir.ordinal()] == null && checkDir != placementSide && checkDir != placementSide.getOpposite() && instance != null && instance.canConnect(checkDir.getOpposite(), this))
{
connections[checkDir.ordinal()] = instance;
getNetwork().merge(instance.getNetwork());
@ -151,7 +174,7 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
{
IMechanical instance = (IMechanical) ((IMechanical) checkTile).getInstance(placementSide);
if (instance != null && instance.canConnect(placementSide.getOpposite()))
if (instance != null && instance.canConnect(checkDir.getOpposite(), this))
{
connections[checkDir.ordinal()] = instance;
getNetwork().merge(instance.getNetwork());
@ -162,6 +185,39 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
getNetwork().reconstruct();
}
/**
* Is this gear block the one in the center-edge of the multiblock that can interact with other
* gears?
*
* @return
*/
public boolean isCenterMultiBlock()
{
if (!getMultiBlock().isConstructed())
{
return false;
}
universalelectricity.api.vector.Vector3 primaryPos = getMultiBlock().getPrimary().getPosition();
if (primaryPos.intX() == x() && placementSide.offsetX == 0)
{
return true;
}
if (primaryPos.intY() == y() && placementSide.offsetY == 0)
{
return true;
}
if (primaryPos.intZ() == z() && placementSide.offsetZ == 0)
{
return true;
}
return false;
}
@Override
public Object[] getConnections()
{
@ -286,12 +342,52 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
@Override
public IMechanical getInstance(ForgeDirection from)
{
if (!getMultiBlock().isPrimary() && from == placementSide)
{
return null;
}
return getMultiBlock().get();
}
@Override
public boolean canConnect(ForgeDirection from, Object source)
{
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())
{
TileEntity sourceTile = getPosition().translate(from.getOpposite()).getTileEntity(world());
if (sourceTile instanceof IMechanical)
{
IMechanical sourceInstance = ((IMechanical) sourceTile).getInstance(from);
return sourceInstance == source;
}
}
else
{
TileEntity destinationTile = ((IMechanical) source).getPosition().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)
{
System.out.println("WORK" + ((PartGear) destinationPart).isCenterMultiBlock());
return ((PartGear) destinationPart).isCenterMultiBlock();
}
else
{
return true;
}
}
}
}
}
return false;
}
}

View file

@ -2,6 +2,7 @@ package resonantinduction.mechanical.network;
import net.minecraftforge.common.ForgeDirection;
import universalelectricity.api.net.IConnector;
import universalelectricity.api.vector.Vector3;
public interface IMechanical extends IConnector<IMechanicalNetwork>
{
@ -17,8 +18,19 @@ public interface IMechanical extends IConnector<IMechanicalNetwork>
public long getTorque();
public void setTorque(long torque);
public float getRatio(ForgeDirection dir);
public IMechanical getInstance(ForgeDirection dir);
/**
* Can this components connect with the other?
*
* @param from - The direction the connection is coming from relative to this block.
* @param source - The object trying to connect
* @return
*/
public boolean canConnect(ForgeDirection from, Object sourcen);
public Vector3 getPosition();
}

View file

@ -150,7 +150,7 @@ public class MechanicalNetwork extends Network<IMechanicalNetwork, IMechanical>
if (deltaTime > 1)
{
rotation = (float) (((velocity) * ((double)deltaTime / 1000d) + rotation) % (2 * Math.PI));
rotation = (float) (((velocity) * ((double) deltaTime / 1000d) + rotation) % (2 * Math.PI));
lastRotateTime = System.currentTimeMillis();
}

View file

@ -270,6 +270,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
}
@Override
@Deprecated
public boolean canConnect(ForgeDirection direction)
{
return true;

View file

@ -49,6 +49,13 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical
return 0.9f;
}
@Override
@Deprecated
public boolean canConnect(ForgeDirection direction)
{
return true;
}
@Override
public Object[] getConnections()
{
@ -60,9 +67,9 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical
if (tile instanceof IMechanical)
{
IMechanical mech = (IMechanical) ((IMechanical) tile).getInstance(dir.getOpposite());
IMechanical mech = ((IMechanical) tile).getInstance(dir.getOpposite());
if (mech != null && canConnect(dir) && mech.canConnect(dir.getOpposite()))
if (mech != null && canConnect(dir, this) && mech.canConnect(dir.getOpposite(), this))
{
connections[dir.ordinal()] = mech;
getNetwork().merge(mech.getNetwork());
@ -125,4 +132,10 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical
{
return this;
}
@Override
public Vector3 getPosition()
{
return new Vector3(this);
}
}

View file

@ -12,6 +12,7 @@ import resonantinduction.api.recipe.RecipeUtils.ItemStackResource;
import resonantinduction.api.recipe.RecipeUtils.Resource;
import resonantinduction.core.Reference;
import resonantinduction.core.ResonantInduction;
import resonantinduction.mechanical.network.IMechanical;
import resonantinduction.mechanical.network.IMechanicalNetwork;
import resonantinduction.mechanical.network.TileMechanical;
import universalelectricity.api.vector.Vector3;
@ -30,7 +31,7 @@ public class TileGrinderWheel extends TileMechanical implements IRotatable
public static final Timer<EntityItem> timer = new Timer<EntityItem>();
public EntityItem grindingItem = null;
private final long requiredTorque = 2000;
private long counter = 0;
@ -167,7 +168,7 @@ public class TileGrinderWheel extends TileMechanical implements IRotatable
}
@Override
public boolean canConnect(ForgeDirection from)
public boolean canConnect(ForgeDirection from, Object source)
{
return from != this.getDirection() && from != this.getDirection().getOpposite();
}

View file

@ -16,6 +16,7 @@ import resonantinduction.api.recipe.MachineRecipes.RecipeType;
import resonantinduction.core.Reference;
import resonantinduction.core.ResonantInduction;
import resonantinduction.core.resource.fluid.TileLiquidMixture;
import resonantinduction.mechanical.network.IMechanical;
import resonantinduction.mechanical.network.TileMechanical;
import universalelectricity.api.vector.Vector3;
@ -155,8 +156,8 @@ public class TileMixer extends TileMechanical
{
this.worldObj.playSoundEffect(this.xCoord + 0.5, this.yCoord + 0.5, this.zCoord + 0.5, Reference.PREFIX + "mixer", 0.5f, 1);
}
counter-=requiredTorque;
counter -= requiredTorque;
}
}
@ -180,8 +181,8 @@ public class TileMixer extends TileMechanical
}
@Override
public boolean canConnect(ForgeDirection direction)
public boolean canConnect(ForgeDirection from, Object source)
{
return direction == ForgeDirection.UP || direction == ForgeDirection.DOWN;
return from == ForgeDirection.UP || from == ForgeDirection.DOWN;
}
}

View file

@ -6,6 +6,7 @@ import java.util.Set;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.mechanical.network.IMechanical;
import resonantinduction.mechanical.network.IMechanicalNetwork;
import universalelectricity.api.vector.Vector3;
import codechicken.multipart.TMultiPart;
import codechicken.multipart.TileMultipart;
@ -90,7 +91,7 @@ public class TraitMechanical extends TileMultipart implements IMechanical
{
if (part instanceof IMechanical)
{
return (IMechanical) part;
return ((IMechanical) part).getInstance(from);
}
}
@ -133,4 +134,17 @@ public class TraitMechanical extends TileMultipart implements IMechanical
{
return 0;
}
@Override
public boolean canConnect(ForgeDirection from, Object source)
{
return false;
}
@Override
public Vector3 getPosition()
{
return null;
}
}