papermc/Spigot-Server-Patches/0059-Change-implementation-of-tile-entity-removal-list.patch
Aikar e674d3a00f
If Entity is added to chunk, look up the chunk if current isnt set
Hopefully will (f)ix #1280...

I'm suspicious that Citizens isn't calling things in the same order and causes the current
chunk to not be set, which then bugs removals. Though this doesn't make any sense to me,
so this likely won't fix it...

But if the isAddedToChunk is true, we really should be returning a chunk anyways if its loaded.
2018-07-29 12:06:20 -04:00

69 lines
2.5 KiB
Diff

From abef5d63377c635fd7072ddf5e166aff23a86ead 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 e85ed2e33..89197281e 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();
@@ -1397,20 +1402,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.18.0