package mekanism.common.tile;
import java.util.HashSet;
import java.util.Set;
import mekanism.api.Coord4D;
import mekanism.common.multiblock.IMultiblock;
import mekanism.common.multiblock.IStructuralMultiblock;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
public class TileEntityStructuralGlass extends TileEntity implements IStructuralMultiblock
{
public Coord4D master;
@Override
public boolean onActivate(EntityPlayer player, EnumHand hand, ItemStack stack)
{
if(master != null)
{
TileEntity masterTile = master.getTileEntity(worldObj);
if(masterTile instanceof IMultiblock)
{
return ((IMultiblock)masterTile).onActivate(player, hand, stack);
}
else {
master = null;
}
}
return false;
}
@Override
public void doUpdate()
{
if(master != null)
{
TileEntity masterTile = master.getTileEntity(worldObj);
if(masterTile instanceof IMultiblock)
{
((IMultiblock)masterTile).doUpdate();
}
else {
master = null;
}
}
else {
IMultiblock multiblock = new ControllerFinder().find();
if(multiblock != null)
{
multiblock.doUpdate();
}
}
}
@Override
public boolean canInterface(TileEntity controller)
{
return true;
}
@Override
public void setController(Coord4D coord)
{
master = coord;
}
public class ControllerFinder
{
public IMultiblock found;
public Set<Coord4D> iterated = new HashSet<Coord4D>();
public void loop(Coord4D pos)
{
if(iterated.size() > 2048 || found != null)
{
return;
}
iterated.add(pos);
for(EnumFacing side : EnumFacing.VALUES)
{
Coord4D coord = pos.offset(side);
TileEntity tile = coord.getTileEntity(worldObj);
if(!iterated.contains(coord))
{
if(tile instanceof IMultiblock)
{
found = (IMultiblock)tile;
return;
}
else if(tile instanceof IStructuralMultiblock)
{
loop(coord);
}
}
}
}
public IMultiblock find()
{
loop(Coord4D.get(TileEntityStructuralGlass.this));
return found;
}
}
}