While it wasn't really "broken" before, if plugins use NMS (which they really should't be) and mess with entity management themselves, and get it wrong, they could ultimately corrupt our state expectations. I've been unable to reproduce any issues locally, but these changes are the result of me analyzing the code pretty deeply and seeing about how to make it more durable to abnormal usage. Any servers seeing oddities, please run with -Ddebug.entities=true and send me any logs triggered.
57 lines
2.3 KiB
Diff
57 lines
2.3 KiB
Diff
From a16143b109a5099f59c969c98ed7299fbf4cf84c 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
|
|
|
|
use sets for faster removal
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
|
index a80acbb6a5..09cf98ccdd 100644
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
|
@@ -68,11 +68,11 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
|
|
}
|
|
};
|
|
// Spigot end
|
|
- protected final List<Entity> g = Lists.newArrayList();
|
|
+ protected final Set<Entity> g = com.google.common.collect.Sets.newHashSet(); // Paper
|
|
public final List<TileEntity> tileEntityList = Lists.newArrayList();
|
|
public final List<TileEntity> tileEntityListTick = Lists.newArrayList();
|
|
private final List<TileEntity> c = Lists.newArrayList();
|
|
- private final List<TileEntity> tileEntityListUnload = Lists.newArrayList();
|
|
+ private final Set<TileEntity> tileEntityListUnload = com.google.common.collect.Sets.newHashSet(); // Paper
|
|
public final List<EntityHuman> players = Lists.newArrayList();
|
|
public final List<Entity> k = Lists.newArrayList();
|
|
protected final IntHashMap<Entity> entitiesById = new IntHashMap<>();
|
|
@@ -1095,20 +1095,21 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
|
|
this.entityList.removeAll(this.g);
|
|
|
|
int j;
|
|
-
|
|
- for (i = 0; i < this.g.size(); ++i) {
|
|
- entity = (Entity) this.g.get(i);
|
|
+ // Paper start - Set based removal lists
|
|
+ for (Iterator<Entity> it = this.g.iterator(); it.hasNext() ; ) {
|
|
+ entity = it.next(); // Paper
|
|
int k = entity.chunkX;
|
|
|
|
j = entity.chunkZ;
|
|
if (entity.inChunk && this.isChunkLoaded(k, j, true)) {
|
|
this.getChunkAt(k, j).b(entity);
|
|
}
|
|
- }
|
|
+ //} // Paper - merge
|
|
|
|
- for (i = 0; i < this.g.size(); ++i) {
|
|
- this.c((Entity) this.g.get(i));
|
|
+ //for (Entity e : this.g) { // Paper - merge
|
|
+ this.c(entity); // Paper use entity
|
|
}
|
|
+ // Paper end
|
|
|
|
this.g.clear();
|
|
this.p_();
|
|
--
|
|
2.21.0
|
|
|