Block breatheableAirID = GCBlocks.breatheableAir;
for (BlockVec3 checkedVec : this.airToReplace)
{
//No block update for performance reasons; deal with unlit torches separately
changeList.add(new ScheduledBlockChange(checkedVec.clone(), breatheableAirID, 0));
}
for (BlockVec3 checkedVec : this.airToReplaceBright)
{
changeList.add(new ScheduledBlockChange(checkedVec.clone(), GCBlocks.brightBreatheableAir, 0));
}
TickHandlerServer.scheduleNewBlockChange(this.world.provider.dimensionId, changeList);
}
if (!this.torchesToUpdate.isEmpty())
{
TickHandlerServer.scheduleNewTorchUpdate(this.world.provider.dimensionId, this.torchesToUpdate);
}
}
else
{
HashSet checkedSave = this.checked;
this.checked = new HashSet<BlockVec3>();
this.breatheableToReplace = new LinkedList<BlockVec3>();
this.breatheableToReplaceBright = new LinkedList<BlockVec3>();
this.otherSealers = new LinkedList<TileEntityOxygenSealer>();
// loopThroughD will mark breatheableAir blocks for change as it
// finds them, also searches for unchecked sealers
this.currentLayer.clear();
this.currentLayer.add(this.head);
this.torchesToUpdate.clear();
if (this.head.x < -29990000 || this.head.z < -29990000 || this.head.x >= 29990000 || this.head.z >= 29990000)
{
this.loopThroughDNearMapEdge();
}
else
{
this.loopThroughD();
}
if (!this.otherSealers.isEmpty())
{
// OtherSealers will have members if the space to be made
// unbreathable actually still has an unchecked sealer in it
List<TileEntityOxygenSealer> sealersSave = this.sealers;
List<BlockVec3> torchesSave = this.torchesToUpdate;
List<TileEntityOxygenSealer> sealersDone = new ArrayList();
sealersDone.addAll(this.sealers);
for (TileEntityOxygenSealer otherSealer : this.otherSealers)
{
// If it hasn't already been counted, need to check the
// other sealer immediately in case it can keep the space
// sealed
if (!sealersDone.contains(otherSealer) && otherSealer.getFindSealChecks() > 0)
{
BlockVec3 newhead = new BlockVec3(otherSealer).translate(0, 1, 0);
this.sealed = true;
this.checkCount = otherSealer.getFindSealChecks();
this.sealers = new LinkedList<TileEntityOxygenSealer>();
this.sealers.add(otherSealer);
this.checked = new HashSet<BlockVec3>();
this.checked.add(newhead);
this.currentLayer.clear();
this.airToReplace.clear();
this.airToReplaceBright.clear();
this.torchesToUpdate = new LinkedList<BlockVec3>();
this.currentLayer.add(newhead.clone());
if (newhead.x < -29990000 || newhead.z < -29990000 || newhead.x >= 29990000 || newhead.z >= 29990000)
{
this.doLayerNearMapEdge();
}
else
{
this.doLayer();
}
// If found a sealer which can still seal the space, it
// should take over as head
if (this.sealed)
{
if (ConfigManagerCore.enableDebug)
{
FMLLog.info("Oxygen Sealer replacing head at x" + this.head.x + " y" + (this.head.y - 1) + " z" + this.head.z);
}
if (!sealersSave.isEmpty())
{
TileEntityOxygenSealer oldHead = sealersSave.get(0);
if (!this.sealers.contains(oldHead))
{
this.sealers.add(oldHead);
}
}
this.head = newhead.clone();
otherSealer.threadSeal = this;
otherSealer.stopSealThreadCooldown = 75 + TileEntityOxygenSealer.countEntities;
checkedSave.addAll(this.checked);
break;
}
else
{
sealersDone.addAll(this.sealers);
}
checkedSave.addAll(this.checked);
}
}
// Restore sealers to what it was, if this search did not
// result in a seal
if (!this.sealed)
{
this.sealers = sealersSave;
this.torchesToUpdate = torchesSave;
}
else
{
//If the second search sealed the area, there may also be air or torches to update
if (!this.airToReplace.isEmpty() || !this.airToReplaceBright.isEmpty())
{
List<ScheduledBlockChange> changeList = new LinkedList<ScheduledBlockChange>();
Block breatheableAirID = GCBlocks.breatheableAir;
for (BlockVec3 airVec : this.airToReplace)
{
changeList.add(new ScheduledBlockChange(airVec.clone(), breatheableAirID, 0));
}
for (BlockVec3 airVec : this.airToReplaceBright)
{
changeList.add(new ScheduledBlockChange(airVec.clone(), GCBlocks.brightBreatheableAir, 0));
}
TickHandlerServer.scheduleNewBlockChange(this.world.provider.dimensionId, changeList);
}
if (!this.torchesToUpdate.isEmpty())
{
TickHandlerServer.scheduleNewTorchUpdate(this.world.provider.dimensionId, this.torchesToUpdate);
}
}
}
this.checked = checkedSave;
if (!this.sealed)
{
if (this.head.getBlockID(this.world) == GCBlocks.breatheableAir)
{
this.breatheableToReplace.add(this.head);
}
if (this.head.getBlockID(this.world) == GCBlocks.brightBreatheableAir)
{
this.breatheableToReplaceBright.add(this.head);
}
if (!this.breatheableToReplace.isEmpty() || !this.breatheableToReplaceBright.isEmpty())
{
List<ScheduledBlockChange> changeList = new LinkedList<ScheduledBlockChange>();
for (BlockVec3 checkedVec : this.breatheableToReplace)
{
changeList.add(new ScheduledBlockChange(checkedVec.clone(), Blocks.air, 0));
}
for (BlockVec3 checkedVec : this.breatheableToReplaceBright)
{
changeList.add(new ScheduledBlockChange(checkedVec.clone(), GCBlocks.brightAir, 0));
}
TickHandlerServer.scheduleNewBlockChange(this.world.provider.dimensionId, changeList);
}
if (!this.torchesToUpdate.isEmpty())
{