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.
70 lines
2.5 KiB
Diff
70 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
|
|
|