diff --git a/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java b/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java index 9aa33d13..93003cfe 100644 --- a/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java +++ b/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java @@ -6,6 +6,7 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import resonantinduction.mechanical.process.TileGrinderWheel; import net.minecraftforge.common.ForgeDirection; import universalelectricity.api.net.IUpdate; import universalelectricity.core.net.Network; @@ -80,7 +81,7 @@ public class MechanicalNetwork extends Network float ratio = adjacentMech.getRatio(dir) / mechanical.getRatio(dir.getOpposite()); long torque = mechanical.getTorque(); - boolean inverseRotation = mechanical.inverseRotation(dir, adjacentMech) || adjacentMech.inverseRotation(dir.getOpposite(), mechanical); + boolean inverseRotation = mechanical.inverseRotation(dir, adjacentMech) && adjacentMech.inverseRotation(dir.getOpposite(), mechanical); int inversion = inverseRotation ? -1 : 1; @@ -93,7 +94,7 @@ public class MechanicalNetwork extends Network if (Math.abs(velocity + inversion * (adjacentMech.getAngularVelocity() * ratio * ACCELERATION)) < Math.abs(adjacentMech.getAngularVelocity() * ratio)) { - mechanical.setAngularVelocity(velocity + inversion * ((adjacentMech.getAngularVelocity() * ratio * ACCELERATION))); + mechanical.setAngularVelocity(velocity + (inversion * adjacentMech.getAngularVelocity() * ratio * ACCELERATION)); } } } diff --git a/src/main/java/resonantinduction/mechanical/network/TileMechanical.java b/src/main/java/resonantinduction/mechanical/network/TileMechanical.java index 17c6f34f..f5a8d2c5 100644 --- a/src/main/java/resonantinduction/mechanical/network/TileMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/TileMechanical.java @@ -1,13 +1,19 @@ package resonantinduction.mechanical.network; -import resonantinduction.mechanical.gear.PartGearShaft; +import com.google.common.io.ByteArrayDataInput; + +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; +import resonantinduction.core.ResonantInduction; +import resonantinduction.mechanical.gear.PartGearShaft; import universalelectricity.api.vector.Vector3; +import calclavia.lib.network.IPacketReceiver; +import calclavia.lib.network.PacketHandler; import calclavia.lib.prefab.tile.TileAdvanced; -public abstract class TileMechanical extends TileAdvanced implements IMechanical +public abstract class TileMechanical extends TileAdvanced implements IMechanical, IPacketReceiver { /** The mechanical connections this connector has made */ protected Object[] connections = new Object[6]; @@ -16,6 +22,12 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical protected long torque; public float angle = 0; + /** + * For sending client update packets + */ + private float prevAngularVelocity; + private boolean markPacketUpdate; + @Override public void initiate() { @@ -29,6 +41,29 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical angle += angularVelocity / 20; torque *= getLoad(); angularVelocity *= getLoad(); + + if (Math.abs(prevAngularVelocity - angularVelocity) > 0.05f) + { + prevAngularVelocity = angularVelocity; + markPacketUpdate = true; + } + + if (markPacketUpdate && ticks % 10 == 0) + { + sendRotationPacket(); + markPacketUpdate = false; + } + } + + private void sendRotationPacket() + { + PacketHandler.sendPacketToClients(ResonantInduction.PACKET_TILE.getPacket(this, angularVelocity), worldObj, new Vector3(this), 20); + } + + @Override + public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra) + { + angularVelocity = data.readFloat(); } @Override diff --git a/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java b/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java index 46e8638c..8d39fd03 100644 --- a/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java +++ b/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java @@ -2,7 +2,10 @@ package resonantinduction.mechanical.process; import org.apache.commons.lang3.ArrayUtils; +import com.google.common.io.ByteArrayDataInput; + import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraftforge.common.ForgeDirection; @@ -167,6 +170,12 @@ public class TileGrinderWheel extends TileMechanical implements IRotatable @Override public boolean canConnect(ForgeDirection from, Object source) { - return from != this.getDirection() && from != this.getDirection().getOpposite(); + if (getDirection().ordinal() < 2) + { + return from.offsetY != 0; + } + + return getDirection().getRotation(ForgeDirection.UP) == from || getDirection().getRotation(ForgeDirection.DOWN) == from; } + }