package advancedsystemsmanager.tileentities;
import advancedsystemsmanager.AdvancedSystemsManager;
import advancedsystemsmanager.api.tileentities.ICluster;
import advancedsystemsmanager.api.tileentities.ITileFactory;
import advancedsystemsmanager.api.network.IPacketBlock;
import advancedsystemsmanager.api.tileentities.ITileInterfaceProvider;
import advancedsystemsmanager.api.tileentities.ITileElement;
import advancedsystemsmanager.blocks.BlockTileElement;
import advancedsystemsmanager.network.ASMPacket;
import advancedsystemsmanager.network.PacketHandler;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.Packet;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
public abstract class TileEntityElementBase extends TileEntity implements ITileElement, IPacketBlock
{
public static final int CLIENT_SYNC = 1;
public static final int TILE_DATA = 2;
public static final String NBT_SUBTYPE = "s";
protected int subtype;
protected boolean isPartOfCluster;
private int message;
@Override
public void updateEntity()
{
super.updateEntity();
sendPacketToClient();
}
@Override
public IIcon getIcon(int side)
{
return getTileFactory().getIcon(side, subtype);
}
@Override
public boolean isPartOfCluster()
{
return isPartOfCluster;
}
@Override
public void setPartOfCluster(boolean partOfCluster)
{
this.isPartOfCluster = partOfCluster;
}
@Override
public void onAddedToCluster(ICluster cluster)
{
}
@Override
public int getSubtype()
{
return subtype;
}
@Override
public void setSubtype(int subtype)
{
if (subtype != this.subtype)
{
this.subtype = subtype;
setMessageType(CLIENT_SYNC);
}
}
@Override
public final void readFromNBT(NBTTagCompound tag)
{
if (tag != null)
{
super.readFromNBT(tag);
readFromTileNBT(tag);
readItemNBT(tag);
}
}
@Override
public final void writeToNBT(NBTTagCompound tag)
{
if (tag != null)
{
super.writeToNBT(tag);
writeToTileNBT(tag);
writeItemNBT(tag);
}
}
public void readFromTileNBT(NBTTagCompound tag)
{
setSubtype(tag.getByte(NBT_SUBTYPE));
}
public void writeToTileNBT(NBTTagCompound tag)
{
if (subtype != 0)
{
tag.setByte(NBT_SUBTYPE, (byte) subtype);
}
}
@Override
public void readItemNBT(NBTTagCompound tag)
{
}
@Override
public void writeItemNBT(NBTTagCompound tag)
{
}
public boolean onBlockActivated(EntityPlayer player, int side, float xSide, float ySide, float zSide)
{
if (this instanceof ITileInterfaceProvider && !worldObj.isRemote)
{
FMLNetworkHandler.openGui(player, AdvancedSystemsManager.INSTANCE, 1, worldObj, xCoord, yCoord, zCoord);
}
return true;
}
@Override
public Packet getDescriptionPacket()
{
sendPacketToClient(CLIENT_SYNC);
return null;
}
@Override
public final void readData(ASMPacket packet, int id)
{
if ((id & CLIENT_SYNC) > 0)
readClientSyncData(packet);
if ((id & TILE_DATA) > 0)
readTileData(packet);
}
@Override
public final void writeData(ASMPacket packet, int id)
{
if ((id & CLIENT_SYNC) > 0)
writeClientSyncData(packet);
if ((id & TILE_DATA) > 0)
writeTileData(packet);
}
public void writeClientSyncData(ASMPacket packet)
{
packet.writeByte(subtype);
}
public void writeTileData(ASMPacket packet)
{
}
public void readClientSyncData(ASMPacket packet)
{
setSubtype(packet.readByte());
markForRenderUpdate();
}
public void readTileData(ASMPacket packet)
{
}
public void setMessageType(int type)
{
message |= type;
}
public void sendPacketToClient()
{
sendPacketToClient(message);
message = 0;
}
public void sendPacketToClient(int message)
{
if (message > 0 && !worldObj.isRemote)
{
if ((message < TILE_DATA && !this.isPartOfCluster))
{
PacketHandler.sendBlockPacket(this, null, message);
}
}
}
public void markForRenderUpdate()
{
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
}
public ITileFactory getTileFactory()
{
return ((BlockTileElement)worldObj.getBlock(xCoord, yCoord, zCoord)).getTileFactory(worldObj.getBlockMetadata(xCoord, yCoord, zCoord));
}
}