From 4fdc27cabe0d7e6bb6604667e554f35725e39b2a Mon Sep 17 00:00:00 2001 From: Calclavia Date: Sun, 26 Jan 2014 19:51:06 +0800 Subject: [PATCH] Finished hard core large gear connection logic --- .../mechanical/belt/TileConveyorBelt.java | 4 +- .../mechanical/gear/PartGear.java | 114 ++++++++++++++++-- .../mechanical/network/IMechanical.java | 14 ++- .../mechanical/network/MechanicalNetwork.java | 2 +- .../mechanical/network/PartMechanical.java | 1 + .../mechanical/network/TileMechanical.java | 17 ++- .../mechanical/process/TileGrinderWheel.java | 5 +- .../mechanical/process/TileMixer.java | 9 +- .../mechanical/trait/TraitMechanical.java | 16 ++- 9 files changed, 160 insertions(+), 22 deletions(-) diff --git a/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java b/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java index 080d5c0c..ac9d9e0c 100644 --- a/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java +++ b/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java @@ -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() diff --git a/src/main/java/resonantinduction/mechanical/gear/PartGear.java b/src/main/java/resonantinduction/mechanical/gear/PartGear.java index fba18427..e2e0c56e 100644 --- a/src/main/java/resonantinduction/mechanical/gear/PartGear.java +++ b/src/main/java/resonantinduction/mechanical/gear/PartGear.java @@ -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; + } } \ No newline at end of file diff --git a/src/main/java/resonantinduction/mechanical/network/IMechanical.java b/src/main/java/resonantinduction/mechanical/network/IMechanical.java index 2b57eb17..ccbc4378 100644 --- a/src/main/java/resonantinduction/mechanical/network/IMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/IMechanical.java @@ -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 { @@ -17,8 +18,19 @@ public interface IMechanical extends IConnector 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(); } diff --git a/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java b/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java index 71fb8445..d9f947aa 100644 --- a/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java +++ b/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java @@ -150,7 +150,7 @@ public class MechanicalNetwork extends Network 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(); } diff --git a/src/main/java/resonantinduction/mechanical/network/PartMechanical.java b/src/main/java/resonantinduction/mechanical/network/PartMechanical.java index c4bb0089..6fb737c0 100644 --- a/src/main/java/resonantinduction/mechanical/network/PartMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/PartMechanical.java @@ -270,6 +270,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu } @Override + @Deprecated public boolean canConnect(ForgeDirection direction) { return true; diff --git a/src/main/java/resonantinduction/mechanical/network/TileMechanical.java b/src/main/java/resonantinduction/mechanical/network/TileMechanical.java index 32efe38b..0618c94f 100644 --- a/src/main/java/resonantinduction/mechanical/network/TileMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/TileMechanical.java @@ -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); + } } diff --git a/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java b/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java index 71c3d4ad..c77e2eb1 100644 --- a/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java +++ b/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java @@ -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 timer = new Timer(); 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(); } diff --git a/src/main/java/resonantinduction/mechanical/process/TileMixer.java b/src/main/java/resonantinduction/mechanical/process/TileMixer.java index d677cbf3..1f0c24c3 100644 --- a/src/main/java/resonantinduction/mechanical/process/TileMixer.java +++ b/src/main/java/resonantinduction/mechanical/process/TileMixer.java @@ -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; } } diff --git a/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java b/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java index 25e91cb1..91d8c79c 100644 --- a/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java +++ b/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java @@ -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; + } + }