diff --git a/src/main/java/net/minecraft/world/World.java b/src/main/java/net/minecraft/world/World.java index 7ca858a..073633b 100644 --- a/src/main/java/net/minecraft/world/World.java +++ b/src/main/java/net/minecraft/world/World.java @@ -1928,7 +1928,7 @@ eventProxy.popState(); this.theProfiler.endStartSection("remove"); - if(unloadedEntityList.size() != 0) + if(!unloadedEntityList.isEmpty()) this.loadedEntityList.removeAll(new HashSet(unloadedEntityList)); int j; int l; @@ -4273,15 +4273,42 @@ } @SuppressWarnings("unchecked") - public void forceUnloadTileEntities() + public void processTileEntityUnload() { - if (!this.field_147483_b.isEmpty()) + if (this.field_147483_b.isEmpty()) + return; + + for (Object tile : field_147483_b) + ((TileEntity)tile).onChunkUnload(); + this.loadedTileEntityList.removeAll(this.field_147483_b); + this.field_147483_b.clear(); + } + + public void processEntityUnload() + { + if(unloadedEntityList.isEmpty()) + return; + //noinspection unchecked + this.loadedEntityList.removeAll(new HashSet(unloadedEntityList)); + + for (int i = 0; i < this.unloadedEntityList.size(); i++) { - for (Object tile : field_147483_b) - ((TileEntity)tile).onChunkUnload(); - this.loadedTileEntityList.removeAll(this.field_147483_b); - this.field_147483_b.clear(); + Entity entity = (Entity)this.unloadedEntityList.get(i); + int x = entity.chunkCoordX; + int z = entity.chunkCoordZ; + + if (entity.addedToChunk && this.chunkExists(x, z)) + { + this.getChunkFromChunkCoords(x, z).removeEntity(entity); + } } + + for (int i = 0; i < this.unloadedEntityList.size(); i++) + { + this.onEntityRemoved((Entity)this.unloadedEntityList.get(i)); + } + + this.unloadedEntityList.clear(); } public WorldEventProxy getEventProxy() diff --git a/src/main/java/net/minecraft/world/WorldServer.java b/src/main/java/net/minecraft/world/WorldServer.java index 5502f06..a51090e 100644 --- a/src/main/java/net/minecraft/world/WorldServer.java +++ b/src/main/java/net/minecraft/world/WorldServer.java @@ -1,7 +1,5 @@ package net.minecraft.world; -import com.google.common.collect.Lists; - import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -503,6 +501,8 @@ { if (this.updateEntityTick++ >= 1200) { + processEntityUnload(); + processTileEntityUnload(); return; } } diff --git a/src/main/java/net/minecraftforge/common/DimensionManager.java b/src/main/java/net/minecraftforge/common/DimensionManager.java index c40978e..7d71ad4 100644 --- a/src/main/java/net/minecraftforge/common/DimensionManager.java +++ b/src/main/java/net/minecraftforge/common/DimensionManager.java @@ -21,7 +21,6 @@ import cpw.mods.fml.common.FMLLog; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.server.MinecraftServer; -import net.minecraft.world.MinecraftException; import net.minecraft.world.World; import net.minecraft.world.WorldManager; import net.minecraft.world.WorldProvider; @@ -327,7 +326,7 @@ { w.theChunkProviderServer.unloadAll(true); w.theChunkProviderServer.setWorldUnloaded(); - w.forceUnloadTileEntities(); + w.processTileEntityUnload(); w.saveOtherData(); } else diff --git a/src/main/java/org/ultramine/server/world/WorldDescriptor.java b/src/main/java/org/ultramine/server/world/WorldDescriptor.java index ba099c4..a4c40e4 100644 --- a/src/main/java/org/ultramine/server/world/WorldDescriptor.java +++ b/src/main/java/org/ultramine/server/world/WorldDescriptor.java @@ -312,7 +312,7 @@ world.theChunkProviderServer.setWorldUnloaded(); world.theChunkProviderServer.unloadAll(save); - world.forceUnloadTileEntities(); + world.processTileEntityUnload(); if(save) world.saveOtherData();