{
super.updateEntity();
if (this.anchor == null)
{
this.anchor = new Vector3();
}
if (this.getMode() != null && Settings.ENABLE_MANIPULATOR)
{
/**
* Manipulator activated and passed all checks. Actually moving the blocks now.
*/
if (!this.worldObj.isRemote)
{
if (this.manipulationVectors != null && this.manipulationVectors.size() > 0 && !this.isCalculatingManipulation)
{
/**
* This section is called when blocks set events are set and animation packets
* are to be sent.
*/
NBTTagCompound nbt = new NBTTagCompound();
NBTTagList nbtList = new NBTTagList();
// Number of blocks we're actually moving.
int i = 0;
for (Vector3 position : this.manipulationVectors)
{
if (this.moveBlock(position) && this.isBlockVisibleByPlayer(position) && i < Settings.MAX_FORCE_FIELDS_PER_TICK)
{
nbtList.appendTag(position.writeToNBT(new NBTTagCompound()));
i++;
}
}
if (i > 0)
{
queueEvent(new DelayedEvent(this, getMoveTime())
{
@Override protected void onEvent()
{
moveEntities();
PacketHandler.sendPacketToClients(ModularForceFieldSystem.PACKET_TILE.getPacket(TileForceManipulator.this, TilePacketType.FIELD.ordinal()));
}
});
nbt.setByte("type", (byte) 2);
nbt.setTag("list", nbtList);
if (!this.isTeleport())
{
PacketHandler.sendPacketToClients(ModularForceFieldSystem.PACKET_TILE.getPacket(this, TilePacketType.FXS.ordinal(), (byte) 1, nbt), worldObj, new Vector3(this), PACKET_DISTANCE);
if (this.getModuleCount(ModularForceFieldSystem.itemModuleSilence) <= 0)
{
this.worldObj.playSoundEffect(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D, ModularForceFieldSystem.PREFIX + "fieldmove", 0.6f, (1 - this.worldObj.rand.nextFloat() * 0.1f));
}
if (this.doAnchor)
{
this.anchor = this.anchor.translate(this.getDirection());
}
}
else
{
PacketHandler.sendPacketToClients(ModularForceFieldSystem.PACKET_TILE.getPacket(this, TilePacketType.FXS.ordinal(), (byte) 2, this.getMoveTime(), this.getAbsoluteAnchor().translate(0.5), this.getTargetPosition().translate(0.5).writeToNBT(new NBTTagCompound()), false, nbt), worldObj, new Vector3(this), PACKET_DISTANCE);
this.moveTime = this.getMoveTime();
}
}
else
{
this.markFailMove = true;
}
this.manipulationVectors = null;
this.onInventoryChanged();
}
}
/**
* While the field is being TELEPORTED ONLY.
*/
if (this.moveTime > 0)
{
if (this.isTeleport() && this.requestFortron(this.getFortronCost(), true) >= this.getFortronCost())
{
if (this.getModuleCount(ModularForceFieldSystem.itemModuleSilence) <= 0 && this.ticks % 10 == 0)
{
int moveTime = this.getMoveTime();
this.worldObj.playSoundEffect(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D, ModularForceFieldSystem.PREFIX + "fieldmove", 1.5f, 0.5f + 0.8f * (moveTime - this.moveTime) / moveTime);
}
if (--this.moveTime == 0)
{
this.worldObj.playSoundEffect(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D, ModularForceFieldSystem.PREFIX + "teleport", 0.6f, (1 - this.worldObj.rand.nextFloat() * 0.1f));
}
}
else
{
this.markFailMove = true;
}
}
/**
* Force Manipulator activated, try start moving...
*/
if (isActive())
{
markActive = true;
}
if (ticks % 20 == 0 && markActive)
{
if (moveTime <= 0 && requestFortron(this.getFortronCost(), false) > 0)
{
if (!worldObj.isRemote)
{
requestFortron(getFortronCost(), true);
// Start multi-threading calculations
(new ManipulatorCalculationThread(this)).start();
}
moveTime = 0;
}
if (!worldObj.isRemote)
{
setActive(false);
}
markActive = false;
}
/**
* Render preview
*/
if (!this.worldObj.isRemote)
{
if (!this.isCalculated)
{
this.calculateForceField();
}
// Manipulation area preview
if (this.ticks % 120 == 0 && !this.isCalculating && Settings.HIGH_GRAPHICS && this.delayedEvents.size() <= 0 && this.displayMode > 0)
{
NBTTagCompound nbt = new NBTTagCompound();
NBTTagList nbtList = new NBTTagList();
int i = 0;
for (Vector3 position : this.getInteriorPoints())
{
if (this.isBlockVisibleByPlayer(position) && (this.displayMode == 2 || !this.worldObj.isAirBlock(position.intX(), position.intY(), position.intZ()) && i < Settings.MAX_FORCE_FIELDS_PER_TICK))
{
i++;
nbtList.appendTag(new Vector3(position).writeToNBT(new NBTTagCompound()));
}
}
nbt.setByte("type", (byte) 1);
nbt.setTag("list", nbtList);
if (this.isTeleport())
{
Vector3 targetPosition;
if (getTargetPosition().world == null)
{
targetPosition = new Vector3(getTargetPosition());
}
else
{
targetPosition = getTargetPosition();
}
PacketHandler.sendPacketToClients(ModularForceFieldSystem.PACKET_TILE.getPacket(this, TilePacketType.FXS.ordinal(), (byte) 2, 60, getAbsoluteAnchor().translate(0.5), targetPosition.translate(0.5).writeToNBT(new NBTTagCompound()), true, nbt), worldObj, new Vector3(this), PACKET_DISTANCE);
}
else
{
PacketHandler.sendPacketToClients(ModularForceFieldSystem.PACKET_TILE.getPacket(this, TilePacketType.FXS.ordinal(), (byte) 1, nbt), worldObj, new Vector3(this), PACKET_DISTANCE);
}
}
}
if (this.markFailMove)
{
this.moveTime = 0;
delayedEvents.clear();
this.worldObj.playSoundEffect(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D, ModularForceFieldSystem.PREFIX + "powerdown", 0.6f, (1 - this.worldObj.rand.nextFloat() * 0.1f));
PacketHandler.sendPacketToClients(ModularForceFieldSystem.PACKET_TILE.getPacket(this, TilePacketType.RENDER.ordinal()), this.worldObj, new Vector3(this), PACKET_DISTANCE);
this.markFailMove = false;
/**
* Send failed positions to client to inform them WHICH blocks are causing the field
* to fail.
*/
NBTTagCompound nbt = new NBTTagCompound();
NBTTagList nbtList = new NBTTagList();
for (Vector3 position : this.failedPositions)
{
nbtList.appendTag(position.writeToNBT(new NBTTagCompound()));
}
nbt.setByte("type", (byte) 1);
nbt.setTag("list", nbtList);
this.failedPositions.clear();
PacketHandler.sendPacketToClients(ModularForceFieldSystem.PACKET_TILE.getPacket(this, TilePacketType.FXS.ordinal(), (byte) 3, nbt), this.worldObj, new Vector3(this), PACKET_DISTANCE);
}
}
else if (!worldObj.isRemote && isActive())
{
setActive(false);