package mekanism.generators.common.tile.reactor;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.Set;
import mekanism.api.Coord4D;
import mekanism.api.reactor.IFusionReactor;
import mekanism.api.reactor.IReactorBlock;
import mekanism.common.tile.TileEntityElectricBlock;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection;
public abstract class TileEntityReactorBlock extends TileEntityElectricBlock implements IReactorBlock
{
public IFusionReactor fusionReactor;
public boolean attempted;
public boolean changed;
public TileEntityReactorBlock()
{
super("ReactorBlock", 0);
inventory = new ItemStack[0];
}
public TileEntityReactorBlock(String name, double maxEnergy)
{
super(name, maxEnergy);
}
@Override
public void setReactor(IFusionReactor reactor)
{
if(reactor != fusionReactor)
{
changed = true;
}
fusionReactor = reactor;
}
@Override
public IFusionReactor getReactor()
{
return fusionReactor;
}
@Override
public void invalidate()
{
super.invalidate();
if(getReactor() != null)
{
getReactor().formMultiblock();
}
}
@Override
public void onUpdate()
{
super.onUpdate();
if(changed)
{
changed = false;
}
if(!worldObj.isRemote && ticker == 5 && !attempted && (getReactor() == null || !getReactor().isFormed()))
{
updateController();
}
attempted = false;
}
@Override
public EnumSet<ForgeDirection> getOutputtingSides()
{
return EnumSet.noneOf(ForgeDirection.class);
}
@Override
public EnumSet<ForgeDirection> getConsumingSides()
{
return EnumSet.noneOf(ForgeDirection.class);
}
@Override
public void onChunkUnload()
{
super.onChunkUnload();
if(!(this instanceof TileEntityReactorController) && getReactor() != null)
{
getReactor().formMultiblock();
}
}
@Override
public void onAdded()
{
super.onAdded();
if(!worldObj.isRemote)
{
if(getReactor() != null)
{
getReactor().formMultiblock();
}
else {
updateController();
}
}
}
public void updateController()
{
if(!(this instanceof TileEntityReactorController))
{
TileEntityReactorController found = new ControllerFinder().find();
if(found != null && (found.getReactor() == null || !found.getReactor().isFormed()))
{
found.formMultiblock();
}
}
}
public class ControllerFinder
{
public TileEntityReactorController found;
public Set<Coord4D> iterated = new HashSet<Coord4D>();
public void loop(Coord4D pos)
{
if(iterated.size() > 512 || found != null)
{
return;
}
iterated.add(pos);
for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
{
Coord4D coord = pos.getFromSide(side);
if(!iterated.contains(coord) && coord.getTileEntity(worldObj) instanceof TileEntityReactorBlock)
{
((TileEntityReactorBlock)coord.getTileEntity(worldObj)).attempted = true;
if(coord.getTileEntity(worldObj) instanceof TileEntityReactorController)
{
found = (TileEntityReactorController)coord.getTileEntity(worldObj);
return;
}
loop(coord);
}
}
}
public TileEntityReactorController find()
{
loop(Coord4D.get(TileEntityReactorBlock.this));
return found;
}
}
}