PaperMC/Spigot-Server-Patches/0052-Change-implementation-of-tile-entity-removal-list.patch
Aikar 9dc4d6448b
Numerous fixes to entity related changes
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.
2019-04-05 23:08:45 -04:00

56 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