package micdoodle8.mods.galacticraft.core.energy.grid;
import micdoodle8.mods.galacticraft.api.transmission.tile.IConductor;
import micdoodle8.mods.galacticraft.api.vector.BlockVec3;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
public class NetworkFinder
{
public World worldObj;
public BlockVec3 start;
private int theDim;
private BlockVec3 toIgnore;
private Set<BlockVec3> iterated = new HashSet<BlockVec3>();
public List<IConductor> found = new LinkedList<IConductor>();
public NetworkFinder(World world, BlockVec3 location, BlockVec3 ignore)
{
worldObj = world;
start = location;
toIgnore = ignore;
}
private void loopAll(int x, int y, int z, int dirIn)
{
BlockVec3 obj = null;
for (int dir = 0; dir < 6; dir++)
{
if (dir == dirIn)
{
continue;
}
switch (dir)
{
case 0:
obj = new BlockVec3(x, y - 1, z);
break;
case 1:
obj = new BlockVec3(x, y + 1, z);
break;
case 2:
obj = new BlockVec3(x, y, z - 1);
break;
case 3:
obj = new BlockVec3(x, y, z + 1);
break;
case 4:
obj = new BlockVec3(x - 1, y, z);
break;
case 5:
obj = new BlockVec3(x + 1, y, z);
break;
}
if (!iterated.contains(obj))
{
iterated.add(obj);
TileEntity tileEntity = worldObj.getTileEntity(new BlockPos(obj.x, obj.y, obj.z));
if (tileEntity instanceof IConductor)
{
found.add((IConductor) tileEntity);
loopAll(obj.x, obj.y, obj.z, dir ^ 1);
}
}
}
}
public List<IConductor> exploreNetwork()
{
if (start.getTileEntity(worldObj) instanceof IConductor)
{
iterated.add(start);
iterated.add(toIgnore);
found.add((IConductor) start.getTileEntity(worldObj));
loopAll(start.x, start.y, start.z, 6);
}
return found;
}
}