package advancedsystemsmanager.tileentities;
import advancedsystemsmanager.api.tileentities.ISystemListener;
import advancedsystemsmanager.api.tileentities.ITriggerNode;
import advancedsystemsmanager.api.tileentities.IBUDListener;
import advancedsystemsmanager.tileentities.manager.TileEntityManager;
import net.minecraft.block.Block;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.ArrayList;
import java.util.List;
public class TileEntityBUD extends TileEntityElementBase implements ISystemListener, ITriggerNode, IBUDListener
{
private static final String NBT_SIDES = "Sides";
private static final String NBT_DATA = "Data";
private List<TileEntityManager> managerList = new ArrayList<TileEntityManager>();
private int[] oldData = new int[ForgeDirection.VALID_DIRECTIONS.length];
private int[] data = new int[ForgeDirection.VALID_DIRECTIONS.length];
@Override
public void added(TileEntityManager owner)
{
if (!managerList.contains(owner))
{
managerList.add(owner);
}
}
@Override
public void removed(TileEntityManager owner)
{
managerList.remove(owner);
}
public void onTrigger()
{
updateData();
for (int i = managerList.size() - 1; i >= 0; i--)
{
managerList.get(i).triggerBUD(this);
}
makeOld();
}
public void updateData()
{
if (worldObj != null)
{
data = new int[data.length];
for (int i = 0; i < data.length; i++)
{
ForgeDirection direction = ForgeDirection.VALID_DIRECTIONS[i];
int x = direction.offsetX + this.xCoord;
int y = direction.offsetY + this.yCoord;
int z = direction.offsetZ + this.zCoord;
data[i] = (Block.getIdFromBlock(worldObj.getBlock(x, y, z)) << 4) | (worldObj.getBlockMetadata(x, y, z) & 15);
}
}
}
public void makeOld()
{
oldData = data;
}
@Override
public int[] getData()
{
return data;
}
@Override
public int[] getOldData()
{
return oldData;
}
@Override
public void writeToTileNBT(NBTTagCompound nbtTagCompound)
{
NBTTagList sidesTag = new NBTTagList();
for (int aData : data)
{
NBTTagCompound sideTag = new NBTTagCompound();
sideTag.setShort(NBT_DATA, (short)aData);
sidesTag.appendTag(sideTag);
}
nbtTagCompound.setTag(NBT_SIDES, sidesTag);
}
@Override
public void readFromTileNBT(NBTTagCompound nbtTagCompound)
{
NBTTagList sidesTag = nbtTagCompound.getTagList(NBT_SIDES, 10);
for (int i = 0; i < sidesTag.tagCount(); i++)
{
NBTTagCompound sideTag = sidesTag.getCompoundTagAt(i);
oldData[i] = data[i] = sideTag.getShort(NBT_DATA);
}
}
@Override
public void onNeighborBlockChange()
{
updateData();
}
}