Finished hard core large gear connection logic
This commit is contained in:
parent
4ac678aa00
commit
4fdc27cabe
9 changed files with 160 additions and 22 deletions
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -270,6 +270,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
|
|||
}
|
||||
|
||||
@Override
|
||||
@Deprecated
|
||||
public boolean canConnect(ForgeDirection direction)
|
||||
{
|
||||
return true;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue