Fixed grinder rotation and packets

This commit is contained in:
Calclavia 2014-01-31 00:10:13 +08:00
parent 2cb30f501b
commit bffc3e4fd5
3 changed files with 50 additions and 5 deletions

View file

@ -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<IMechanicalNetwork, IMechanical>
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<IMechanicalNetwork, IMechanical>
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));
}
}
}

View file

@ -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

View file

@ -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;
}
}