package advancedsystemsmanager.tileentities;
import advancedsystemsmanager.api.tileentities.IRedstoneReceiver;
import advancedsystemsmanager.api.tileentities.ISystemListener;
import advancedsystemsmanager.api.tileentities.ITriggerNode;
import advancedsystemsmanager.api.tileentities.IBUDListener;
import advancedsystemsmanager.tileentities.manager.TileEntityManager;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.ArrayList;
import java.util.List;
public class TileEntityReceiver extends TileEntityElementBase implements IRedstoneReceiver, ISystemListener, ITriggerNode, IBUDListener
{
private static final String NBT_SIDES = "Sides";
private List<TileEntityManager> managerList = new ArrayList<TileEntityManager>();
private int[] oldPowered = new int[ForgeDirection.VALID_DIRECTIONS.length];
private int[] isPowered = 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 triggerRedstone()
{
isPowered = new int[isPowered.length];
boolean change = false;
for (int i = 0; i < isPowered.length; i++)
{
ForgeDirection direction = ForgeDirection.VALID_DIRECTIONS[i];
isPowered[i] = worldObj.getIndirectPowerLevelTo(direction.offsetX + this.xCoord, direction.offsetY + this.yCoord, direction.offsetZ + this.zCoord, direction.ordinal());
if (isPowered[i] == oldPowered[i]) change = true;
}
if (change)
{
for (int i = managerList.size() - 1; i >= 0; i--)
{
managerList.get(i).triggerRedstone(this);
}
oldPowered = isPowered;
}
}
@Override
public int[] getPower()
{
return isPowered;
}
@Override
public void writeToTileNBT(NBTTagCompound tag)
{
super.writeToTileNBT(tag);
byte[] sides = new byte[isPowered.length];
for (int i = 0; i < sides.length; i++)
{
sides[i] = (byte)isPowered[i];
}
tag.setByteArray(NBT_SIDES, sides);
}
@Override
public void readFromTileNBT(NBTTagCompound nbtTagCompound)
{
byte[] sides = nbtTagCompound.getByteArray(NBT_SIDES);
int[] powered = new int[ForgeDirection.VALID_DIRECTIONS.length];
for (int i = 0; i < sides.length; i++)
{
powered[i] = sides[i];
}
oldPowered = isPowered = powered;
}
@Override
public int[] getData()
{
return isPowered;
}
@Override
public int[] getOldData()
{
return oldPowered;
}
@Override
public void onNeighborBlockChange()
{
triggerRedstone();
}
}