aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0067-Change-implementation-of-tile-entity-removal-list.patch
blob: fb334279a565d0b8b5174d5d23cc42404938df37 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
From 582cdbf4397d60d944fb6c56443b5eb1c49c10fb 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/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index 751e07d..c6fe888 100644
--- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java
@@ -119,9 +119,9 @@ public abstract class Entity implements ICommandListener {
     private static final DataWatcherObject<Boolean> aB = DataWatcher.a(Entity.class, DataWatcherRegistry.h);
     private static final DataWatcherObject<Boolean> aC = DataWatcher.a(Entity.class, DataWatcherRegistry.h);
     public boolean aa;
-    public int ab;
-    public int ac;
-    public int ad;
+    public int ab;public int getChunkX() { return ab; } // Paper
+    public int ac;public int getChunkY() { return ac; } // Paper
+    public int ad;public int getChunkZ() { return ad; } // Paper
     public boolean ah;
     public boolean impulse;
     public int portalCooldown;
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index 5adc297..e56f705 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -31,6 +31,11 @@ import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
 import org.bukkit.generator.ChunkGenerator;
 // CraftBukkit end
 
+// Paper start
+import java.util.Set;
+import com.google.common.collect.Sets;
+// Paper end
+
 public abstract class World implements IBlockAccess {
 
     private int a = 63;
@@ -61,11 +66,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();
     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();
@@ -1400,19 +1405,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.8.2