aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0059-Change-implementation-of-tile-entity-removal-list.patch
blob: fcb279f621bf1db4684b840286afb33c119f1aad (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
86
87
88
From 7c794303b52022aca46e88ccf0dd466abd2700ab 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 7feed2995..5b5e0e73c 100644
--- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java
@@ -121,10 +121,10 @@ 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);
     private static final DataWatcherObject<Boolean> aD = DataWatcher.a(Entity.class, DataWatcherRegistry.h);
-    public boolean aa;
-    public int ab;
-    public int ac;
-    public int ad;
+    public boolean aa; public boolean isAddedToChunk() { return aa; } // Paper - OBFHELPER
+    public int ab; public int getChunkX() { return ab; } // Paper - OBFHELPER
+    public int ac; public int getChunkY() { return ac; } // Paper - OBFHELPER
+    public int ad; public int getChunkZ() { return ad; } // Paper - OBFHELPER
     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 a1cdcd71b..354a7309b 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -30,6 +30,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;
@@ -60,11 +65,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();
@@ -1394,20 +1399,20 @@ public abstract class World implements IBlockAccess {
         this.entityList.removeAll(this.f);
 
         int j;
+        // Paper start - Set based removal lists
+        for (Entity e : this.f) {
+            j = e.getChunkZ();
+            int k = e.getChunkX();
 
-        for (i = 0; i < this.f.size(); ++i) {
-            entity = (Entity) this.f.get(i);
-            int k = entity.ab;
-
-            j = entity.ad;
-            if (entity.aa && this.isChunkLoaded(k, j, true)) {
-                this.getChunkAt(k, j).b(entity);
+            if (e.isAddedToChunk() && 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.12.0.windows.1