package micdoodle8.mods.galacticraft.core.energy.tile;
import micdoodle8.mods.galacticraft.api.transmission.NetworkType;
import micdoodle8.mods.galacticraft.api.transmission.grid.IElectricityNetwork;
import micdoodle8.mods.galacticraft.api.transmission.grid.IGridNetwork;
import micdoodle8.mods.galacticraft.api.transmission.tile.IConductor;
import micdoodle8.mods.galacticraft.api.transmission.tile.IConnector;
import micdoodle8.mods.galacticraft.api.transmission.tile.INetworkProvider;
import micdoodle8.mods.galacticraft.api.vector.BlockVec3;
import micdoodle8.mods.galacticraft.core.energy.grid.EnergyNetwork;
import micdoodle8.mods.galacticraft.core.tick.TickHandlerServer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
/**
* This tile entity pre-fabricated for all conductors.
*
* @author Calclavia
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public abstract class TileBaseConductor extends TileEntity implements IConductor
{
protected IGridNetwork network;
public TileEntity[] adjacentConnections = null;
@Override
public void validate()
{
super.validate();
if (!this.worldObj.isRemote)
{
TickHandlerServer.energyTransmitterUpdates.add(this);
}
}
@Override
public void invalidate()
{
if (!this.worldObj.isRemote)
{
this.getNetwork().split(this);
}
super.invalidate();
}
@Override
public void onChunkUnload()
{
super.invalidate();
super.onChunkUnload();
}
@Override
public IElectricityNetwork getNetwork()
{
if (this.network == null)
{
EnergyNetwork network = new EnergyNetwork();
network.getTransmitters().add(this);
this.setNetwork(network);
}
return (IElectricityNetwork) this.network;
}
@Override
public void setNetwork(IGridNetwork network)
{
this.network = network;
}
@Override
public void refresh()
{
if (!this.worldObj.isRemote)
{
this.adjacentConnections = null;
this.getNetwork().refresh();
BlockVec3 thisVec = new BlockVec3(this);
for (EnumFacing side : EnumFacing.values())
{
TileEntity tileEntity = thisVec.getTileEntityOnSide(this.worldObj, side);
if (tileEntity instanceof TileBaseConductor && ((TileBaseConductor)tileEntity).canConnect(side.getOpposite(), NetworkType.POWER))
{
IGridNetwork otherNet = ((INetworkProvider) tileEntity).getNetwork();
if (!this.getNetwork().equals(otherNet))
{
if (!otherNet.getTransmitters().isEmpty())
{
otherNet.merge(this.getNetwork());
}
}
}
}
}
}
@Override
public TileEntity[] getAdjacentConnections()
{
/**
* Cache the adjacentConnections.
*/
if (this.adjacentConnections == null)
{
this.adjacentConnections = new TileEntity[6];
BlockVec3 thisVec = new BlockVec3(this);
for (int i = 0; i < 6; i++)
{
EnumFacing side = EnumFacing.getFront(i);
TileEntity tileEntity = thisVec.getTileEntityOnSide(this.worldObj, side);
if (tileEntity instanceof IConnector)
{
if (((IConnector) tileEntity).canConnect(side.getOpposite(), NetworkType.POWER))
{
this.adjacentConnections[i] = tileEntity;
}
}
}
}
return this.adjacentConnections;
}
@Override
public boolean hasNetwork()
{
return this.network != null;
}
@Override
public boolean canConnect(EnumFacing direction, NetworkType type)
{
return type == NetworkType.POWER;
}
@Override
@SideOnly(Side.CLIENT)
public AxisAlignedBB getRenderBoundingBox()
{
return AxisAlignedBB.fromBounds(this.getPos().getX(), this.getPos().getY(), this.getPos().getZ(), this.getPos().getX() + 1, this.getPos().getY() + 1, this.getPos().getZ() + 1);
}
@Override
public NetworkType getNetworkType()
{
return NetworkType.POWER;
}
@Override
public boolean canTransmit()
{
return true;
}
@Override
public boolean shouldRefresh(World world, BlockPos pos, IBlockState oldState, IBlockState newSate)
{
return oldState.getBlock() != newSate.getBlock();
}
}