459987d69f
improved the water code so that immunity wont trigger if the entity has the water pathfinder system active, so this improves support for all entities that know how to behave in water. Merged 2 EAR patches together, and removed an MCUtil method that doesnt have a purpose anymore
95 Zeilen
4.8 KiB
Diff
95 Zeilen
4.8 KiB
Diff
From 06f6a8d9e4e27632a3122849abe57ff0e5966e7c Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Sat, 21 Jul 2018 08:25:40 -0400
|
|
Subject: [PATCH] Add Debug Entities option to debug dupe uuid issues
|
|
|
|
Add -Ddebug.entities=true to your JVM flags to gain more information
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
|
index 42c1c47c58..3606c78843 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -73,6 +73,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
protected CraftEntity bukkitEntity;
|
|
|
|
EntityTrackerEntry tracker; // Paper
|
|
+ Throwable addedToWorldStack; // Paper - entity debug
|
|
public CraftEntity getBukkitEntity() {
|
|
if (bukkitEntity == null) {
|
|
bukkitEntity = CraftEntity.getEntity(world.getServer(), this);
|
|
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
|
|
index 27278078e4..f6becaae43 100644
|
|
--- a/src/main/java/net/minecraft/server/WorldServer.java
|
|
+++ b/src/main/java/net/minecraft/server/WorldServer.java
|
|
@@ -55,6 +55,10 @@ public class WorldServer extends World implements IAsyncTaskHandler {
|
|
|
|
// CraftBukkit start
|
|
public final DimensionManager dimension;
|
|
+ private static final boolean DEBUG_ENTITIES = Boolean.getBoolean("debug.entities"); // Paper
|
|
+ private static Throwable getAddToWorldStackTrace(Entity entity) {
|
|
+ return new Throwable(entity + " Added to world at " + new java.util.Date());
|
|
+ }
|
|
|
|
// Add env and gen to constructor
|
|
public WorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, PersistentCollection persistentcollection, WorldData worlddata, DimensionManager dimensionmanager, MethodProfiler methodprofiler, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) {
|
|
@@ -974,7 +978,12 @@ public class WorldServer extends World implements IAsyncTaskHandler {
|
|
|
|
private boolean j(Entity entity) {
|
|
if (entity.dead) {
|
|
- // WorldServer.a.warn("Tried to add entity {} but it was marked as removed already", EntityTypes.getName(entity.P())); // CraftBukkit
|
|
+ // Paper start
|
|
+ if (DEBUG_ENTITIES) {
|
|
+ new Throwable("Tried to add entity " + entity + " but it was marked as removed already").printStackTrace(); // CraftBukkit
|
|
+ getAddToWorldStackTrace(entity).printStackTrace();
|
|
+ }
|
|
+ // Paper end
|
|
return false;
|
|
} else {
|
|
UUID uuid = entity.getUniqueID();
|
|
@@ -986,8 +995,14 @@ public class WorldServer extends World implements IAsyncTaskHandler {
|
|
this.g.remove(entity1);
|
|
} else {
|
|
if (!(entity instanceof EntityHuman)) {
|
|
- WorldServer.a.error("Keeping entity {} that already exists with UUID {} - " + entity1, EntityTypes.getName(entity1.P()), uuid.toString()); // CraftBukkit // Paper
|
|
+ WorldServer.a.error("Keeping entity {} that already exists with UUID {}", entity1, uuid.toString()); // CraftBukkit // Paper
|
|
WorldServer.a.error("Deleting duplicate entity {}", entity); // Paper
|
|
+ if (DEBUG_ENTITIES) {
|
|
+ if (entity1.addedToWorldStack != null) {
|
|
+ entity1.addedToWorldStack.printStackTrace();
|
|
+ }
|
|
+ getAddToWorldStackTrace(entity).printStackTrace();
|
|
+ }
|
|
return false;
|
|
}
|
|
|
|
@@ -1004,7 +1019,25 @@ public class WorldServer extends World implements IAsyncTaskHandler {
|
|
protected void b(Entity entity) {
|
|
super.b(entity);
|
|
this.entitiesById.a(entity.getId(), entity);
|
|
- this.entitiesByUUID.put(entity.getUniqueID(), entity);
|
|
+ // Paper start
|
|
+ if (DEBUG_ENTITIES) {
|
|
+ entity.addedToWorldStack = getAddToWorldStackTrace(entity);
|
|
+ }
|
|
+
|
|
+ Entity old = this.entitiesByUUID.put(entity.getUniqueID(), entity);
|
|
+ if (old != null && old.getId() != entity.getId() && old.valid) {
|
|
+ Logger logger = LogManager.getLogger();
|
|
+ logger.error("Overwrote an existing entity " + old + " with " + entity);
|
|
+ if (DEBUG_ENTITIES) {
|
|
+ if (old.addedToWorldStack != null) {
|
|
+ old.addedToWorldStack.printStackTrace();
|
|
+ } else {
|
|
+ logger.error("Oddly, the old entity was not added to the world in the normal way. Plugins?");
|
|
+ }
|
|
+ entity.addedToWorldStack.printStackTrace();
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
Entity[] aentity = entity.bi();
|
|
|
|
if (aentity != null) {
|
|
--
|
|
2.19.0
|
|
|