mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-09 06:50:32 +08:00
f51ad46686
* master: Add some debug for entity slices Mark chunk dirty on entity changes Reduce and improve dupe uuid resolve message Add more entity debug info Bring some 1.13 authors to master Fixed more stuff Remove unsed method Extend player profile API to support skin changes Extend player profile API to support skin changes
108 lines
5.6 KiB
Diff
108 lines
5.6 KiB
Diff
From 50bd6c799a35435682d288098ad5a3999f888f42 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/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
|
|
index ea8684747..5fd0c0cf5 100644
|
|
--- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java
|
|
+++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
|
|
@@ -566,6 +566,14 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver {
|
|
while (iterator.hasNext()) {
|
|
Entity entity = (Entity) iterator.next();
|
|
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
|
|
+ // Paper start
|
|
+ if (entity.getChunkX() != chunk.locX || entity.getChunkZ() != chunk.locZ) {
|
|
+ LogManager.getLogger().error(entity + " is not actually in this chunk! Report this to https://github.com/PaperMC/Paper/issues/1223", new Throwable());
|
|
+ }
|
|
+ if ((int)Math.floor(entity.locX) >> 4 != chunk.locX || (int)Math.floor(entity.locZ) >> 4 != chunk.locZ) {
|
|
+ LogManager.getLogger().error(entity + " will be leaving this chunk but saved to it. Report this to https://github.com/PaperMC/Paper/issues/1223", new Throwable());
|
|
+ }
|
|
+ // Paper end
|
|
|
|
if (entity.d(nbttagcompound1)) {
|
|
chunk.f(true);
|
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
|
index 47ce5cda7..b308f4416 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -71,6 +71,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 b048343b7..747d99dbe 100644
|
|
--- a/src/main/java/net/minecraft/server/WorldServer.java
|
|
+++ b/src/main/java/net/minecraft/server/WorldServer.java
|
|
@@ -53,6 +53,10 @@ public class WorldServer extends World implements IAsyncTaskHandler {
|
|
private boolean Q;
|
|
|
|
// CraftBukkit start
|
|
+ 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());
|
|
+ }
|
|
public final int dimension;
|
|
|
|
// Add env and gen to constructor
|
|
@@ -980,6 +984,7 @@ 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: " + entity); // CraftBukkit // Paper
|
|
+ if (DEBUG_ENTITIES) getAddToWorldStackTrace(entity).printStackTrace();
|
|
return false;
|
|
} else {
|
|
UUID uuid = entity.getUniqueID();
|
|
@@ -991,8 +996,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;
|
|
}
|
|
|
|
@@ -1009,7 +1020,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.18.0
|
|
|