diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java index fdb28f4b9c..e44b937892 100644 --- a/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java @@ -478,7 +478,7 @@ public class Chunk { while (iterator.hasNext()) { TileEntity tileentity = (TileEntity) iterator.next(); - tileentity.h(); + world.markForRemoval(tileentity); // Craftbukkit } for (int i = 0; i < this.entitySlices.length; ++i) { diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java index 63ea15884a..f317fd2282 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -89,6 +89,7 @@ public class World implements IBlockAccess { int lastXAccessed = Integer.MIN_VALUE; int lastZAccessed = Integer.MIN_VALUE; final Object chunkLock = new Object(); + private List tileEntitiesToUnload; private boolean canSpawn(int x, int z) { if (this.generator != null) { @@ -106,10 +107,15 @@ public class World implements IBlockAccess { return (CraftServer) Bukkit.getServer(); } + public void markForRemoval(TileEntity tileentity) { + tileEntitiesToUnload.add(tileentity); + } + // CraftBukkit - changed signature public World(IDataManager idatamanager, String s, long i, WorldProvider worldprovider, ChunkGenerator gen, org.bukkit.World.Environment env) { this.generator = gen; this.world = new CraftWorld((WorldServer) this, gen, env); + tileEntitiesToUnload = new ArrayList(); // CraftBukkit end this.Q = this.random.nextInt(12000); @@ -1137,6 +1143,14 @@ public class World implements IBlockAccess { } this.L = false; + + // Craftbukkit start + if (!tileEntitiesToUnload.isEmpty()) { + this.c.removeAll(tileEntitiesToUnload); + this.tileEntitiesToUnload.clear(); + } + // Craftbukkit end + if (!this.G.isEmpty()) { Iterator iterator1 = this.G.iterator();