9dc4d6448b
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.
83 Zeilen
3.5 KiB
Diff
83 Zeilen
3.5 KiB
Diff
From 28a9ac54731e4f544a428ad3e267f26d96370d4d Mon Sep 17 00:00:00 2001
|
|
From: willies952002 <admin@domnian.com>
|
|
Date: Mon, 30 Jul 2018 02:42:49 -0400
|
|
Subject: [PATCH] World EntityHuman Lookup Optimizations
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
|
index 5d60b36678..3acea908c2 100644
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
|
@@ -76,6 +76,7 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
|
|
private final List<TileEntity> c = Lists.newArrayList();
|
|
private final Set<TileEntity> tileEntityListUnload = com.google.common.collect.Sets.newHashSet(); // Paper
|
|
public final List<EntityHuman> players = Lists.newArrayList();
|
|
+ public final Map<String, EntityHuman> playersByName = Maps.newHashMap(); // Paper - World EntityHuman Lookup Optimizations
|
|
public final List<Entity> k = Lists.newArrayList();
|
|
protected final IntHashMap<Entity> entitiesById = new IntHashMap<>();
|
|
private final long F = 16777215L;
|
|
@@ -1030,6 +1031,8 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
|
|
EntityHuman entityhuman = (EntityHuman) entity;
|
|
|
|
this.players.add(entityhuman);
|
|
+ this.playersByName.put(entityhuman.getName(), entityhuman);
|
|
+ // Paper end
|
|
this.everyoneSleeping();
|
|
}
|
|
|
|
@@ -1072,6 +1075,7 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
|
|
entity.die();
|
|
if (entity instanceof EntityHuman) {
|
|
this.players.remove(entity);
|
|
+ this.playersByName.remove(entity.getName()); // Paper - World EntityHuman Lookup Optimizations
|
|
// Spigot start
|
|
for ( WorldPersistentData worldData : worldMaps.worldMap.values() )
|
|
{
|
|
@@ -1105,6 +1109,7 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
|
|
entity.die();
|
|
if (entity instanceof EntityHuman) {
|
|
this.players.remove(entity);
|
|
+ this.playersByName.remove(entity.getName()); // Paper - World EntityHuman Lookup Optimizations
|
|
this.everyoneSleeping();
|
|
}
|
|
|
|
@@ -2667,6 +2672,8 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
|
|
|
|
@Nullable
|
|
public EntityHuman a(String s) {
|
|
+ // Paper start - World EntityHuman Lookup Optimizations
|
|
+ /*
|
|
for (int i = 0; i < this.players.size(); ++i) {
|
|
EntityHuman entityhuman = (EntityHuman) this.players.get(i);
|
|
|
|
@@ -2676,10 +2683,15 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
|
|
}
|
|
|
|
return null;
|
|
+ */
|
|
+ return this.playersByName.get(s);
|
|
+ // Paper end
|
|
}
|
|
|
|
@Nullable
|
|
public EntityHuman b(UUID uuid) {
|
|
+ // Paper start - World EntityHuman Lookup Optimizations
|
|
+ /*
|
|
for (int i = 0; i < this.players.size(); ++i) {
|
|
EntityHuman entityhuman = (EntityHuman) this.players.get(i);
|
|
|
|
@@ -2689,6 +2701,10 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc
|
|
}
|
|
|
|
return null;
|
|
+ */
|
|
+ Entity entity = ((WorldServer)this).entitiesByUUID.get(uuid);
|
|
+ return entity instanceof EntityHuman ? (EntityHuman) entity : null;
|
|
+ // Paper end
|
|
}
|
|
|
|
public void checkSession() throws ExceptionWorldConflict {
|
|
--
|
|
2.21.0
|
|
|