int duplicateTiles = 0;
int invalidTiles = 0;
int unloadedEntities = 0;
int unloadedTiles = 0;
ChunkProviderServer chunkProviderServer = world.theChunkProviderServer;
{
Set<Entity> contained = new HashSet<Entity>();
Set<Entity> toRemove = new ContainedRemoveSet<Entity>();
List<Entity> unloaded = new ArrayList<Entity>();
synchronized (entityLock) {
for (Entity e : entityList) {
if (add(e, false)) {
missingEntities++;
fixed++;
} else if (!contained.add(e)) {
toRemove.add(e);
duplicateEntities++;
fixed++;
} else if (e instanceof IProjectile || e instanceof EntityCreature || e instanceof EntityMob) {
synchronized (e) {
Chunk chunk = world.getChunkIfExists(e.chunkCoordX, e.chunkCoordZ);
if (chunk == null || !chunk.entityLists[e.chunkCoordY].contains(e)) {
unloaded.add(e);
unloadedEntities++;
}
}
}
}
for (Entity e : unloaded) {
remove(e);
}
entityList.removeAll(toRemove);
}
}
{
Set<TileEntity> contained = new HashSet<TileEntity>();
Set<TileEntity> toRemove = new ContainedRemoveSet<TileEntity>();
List<TileEntity> copy = new ArrayList<TileEntity>(tileEntityList.size());
synchronized (tileEntityLock) {
for (TileEntity te : tileEntityList) {
copy.add(te);
if (add(te, false)) {
missingTiles++;
fixed++;
}
if (!contained.add(te)) {
toRemove.add(te);
duplicateTiles++;
fixed++;
}
}
tileEntityList.removeAll(toRemove);
}
for (TileEntity te : copy) {
Chunk chunk;
boolean invalid = te.isInvalid();
if (te.yCoord < 0 || te.yCoord > 255) {
sb.append("TileEntity ").append(Log.toString(te)).append(" has an invalid y coordinate.\n");
invalid = true;
}
if (invalid || (chunk = chunkProviderServer.getChunkIfExists(te.xCoord >> 4, te.zCoord >> 4)) == null || chunk.getChunkBlockTileEntity(te.xCoord & 15, te.yCoord, te.zCoord & 15) != te) {
if (invalid) {
invalidTiles++;
sb.append("Removed ").append(Log.toString(te)).append(" as it is invalid.\n");
} else {
unloadedTiles++;