From 84b6a774a12374f05c0d1d02f2ca5e07f0fe40f3 Mon Sep 17 00:00:00 2001
From: Joseph Hirschfeld <joe@ibj.io>
Date: Thu, 3 Mar 2016 02:39:54 -0600
Subject: [PATCH] Change implementation of (tile)entity removal list


diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index 21b0986..2919415 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -33,6 +33,8 @@ import org.bukkit.generator.ChunkGenerator;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.HashMap;
+import java.util.Set;
+import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
 // Paper end
 
@@ -66,11 +68,11 @@ public abstract class World implements IBlockAccess {
         }
     };
     // Spigot end
-    protected final List<Entity> f = Lists.newArrayList();
+    protected final Set<Entity> f = Sets.newHashSet(); // Paper
     //public final List<TileEntity> tileEntityList = Lists.newArrayList(); // Paper - Remove unused list
     public final List<TileEntity> tileEntityListTick = Lists.newArrayList();
     private final List<TileEntity> b = Lists.newArrayList();
-    private final List<TileEntity> tileEntityListUnload = Lists.newArrayList();
+    private final Set<TileEntity> tileEntityListUnload = Sets.newHashSet(); // Paper
     public final List<EntityHuman> players = Lists.newArrayList();
     public final List<Entity> j = Lists.newArrayList();
     protected final IntHashMap<Entity> entitiesById = new IntHashMap();
@@ -1384,19 +1386,20 @@ public abstract class World implements IBlockAccess {
 
         int j;
 
-        for (i = 0; i < this.f.size(); ++i) {
-            entity = (Entity) this.f.get(i);
-            int k = entity.ab;
+        // Paper start - Set based removal lists
+        for (Entity e : this.f) {
+            j = e.getChunkX();
+            int k = e.getChunkZ();
 
-            j = entity.ad;
-            if (entity.aa && this.isChunkLoaded(k, j, true)) {
-                this.getChunkAt(k, j).b(entity);
+            if (e.aa && this.isChunkLoaded(k, j, true)) {
+                this.getChunkAt(k, j).b(e);
             }
         }
 
-        for (i = 0; i < this.f.size(); ++i) {
-            this.c((Entity) this.f.get(i));
+        for (Entity e : this.f) {
+            this.c(e);
         }
+        // Paper end
 
         this.f.clear();
         this.l();
-- 
2.7.2