diff --git a/sources/src/main/java/net/minecraft/server/Chunk.java b/sources/src/main/java/net/minecraft/server/Chunk.java index cc6416146..23c8f3c1c 100644 --- a/sources/src/main/java/net/minecraft/server/Chunk.java +++ b/sources/src/main/java/net/minecraft/server/Chunk.java @@ -54,11 +54,11 @@ public class Chunk { TileEntity replaced = super.put(key, value); if (replaced != null) { replaced.setCurrentChunk(null); - tileEntityCounts.decrement(replaced.tileEntityKeyString); + tileEntityCounts.decrement(replaced.getMinecraftKeyString()); } if (value != null) { value.setCurrentChunk(Chunk.this); - tileEntityCounts.increment(value.tileEntityKeyString); + tileEntityCounts.increment(value.getMinecraftKeyString()); } return replaced; } @@ -68,7 +68,7 @@ public class Chunk { TileEntity removed = super.remove(key); if (removed != null) { removed.setCurrentChunk(null); - tileEntityCounts.decrement(removed.tileEntityKeyString); + tileEntityCounts.decrement(removed.getMinecraftKeyString()); } return removed; } @@ -712,7 +712,7 @@ public class Chunk { this.markDirty(); entity.setCurrentChunk(this); - entityCounts.increment(entity.entityKeyString); + entityCounts.increment(entity.getMinecraftKeyString()); if (entity instanceof EntityItem) { itemCounts[k]++; } else if (entity instanceof IInventory) { @@ -761,7 +761,7 @@ public class Chunk { } this.markDirty(); entity.setCurrentChunk(null); - entityCounts.decrement(entity.entityKeyString); + entityCounts.decrement(entity.getMinecraftKeyString()); if (entity instanceof EntityItem) { itemCounts[i]--; } else if (entity instanceof IInventory) { @@ -895,13 +895,13 @@ public class Chunk { List entityslice = aentityslice[j]; // Spigot // Paper start DuplicateUUIDMode mode = world.paperConfig.duplicateUUIDMode; - if (mode == DuplicateUUIDMode.DELETE || mode == DuplicateUUIDMode.REGEN) { + if (mode == DuplicateUUIDMode.WARN | mode == DuplicateUUIDMode.DELETE || mode == DuplicateUUIDMode.REGEN) { Map thisChunk = new HashMap<>(); for (Iterator iterator = ((List) entityslice).iterator(); iterator.hasNext(); ) { Entity entity = iterator.next(); if (entity.dead) continue; Entity other = ((WorldServer) world).entitiesByUUID.get(entity.uniqueID); - if (other == null) { + if (other == null || other.dead || world.getEntityUnloadQueue().contains(other)) { other = thisChunk.get(entity.uniqueID); } if (other != null && !other.dead) { @@ -917,6 +917,9 @@ public class Chunk { iterator.remove(); break; } + default: + logger.warn("[DUPE-UUID] Duplicate UUID found used by " + other + ", doing nothing to " + entity + ". See https://github.com/PaperMC/Paper/issues/1223 for discussion on what this is about."); + break; } } thisChunk.put(entity.uniqueID, entity); diff --git a/sources/src/main/java/net/minecraft/server/Entity.java b/sources/src/main/java/net/minecraft/server/Entity.java index f1cae87cf..5750f3862 100644 --- a/sources/src/main/java/net/minecraft/server/Entity.java +++ b/sources/src/main/java/net/minecraft/server/Entity.java @@ -1813,21 +1813,26 @@ public abstract class Entity implements ICommandListener, KeyedObject { // Paper public Chunk getChunkAtLocation() { return getCurrentChunkAt((int)Math.floor(locX) >> 4, (int)Math.floor(locZ) >> 4); } - public final MinecraftKey entityKey = EntityTypes.getKey(this); - public final String entityKeyString = entityKey != null ? entityKey.toString() : null; + private String entityKeyString = null; + private MinecraftKey entityKey = getMinecraftKey(); @Override public MinecraftKey getMinecraftKey() { + if (entityKey == null) { + entityKey = EntityTypes.getKey(this); + entityKeyString = entityKey != null ? entityKey.toString() : null; + } return entityKey; } @Override public String getMinecraftKeyString() { + getMinecraftKey(); // Try to load if it doesn't exists. see: https://github.com/PaperMC/Paper/issues/1280 return entityKeyString; } @Nullable public final String getSaveID() { - return entityKeyString; + return getMinecraftKeyString(); // Paper end } diff --git a/work/Paper b/work/Paper index 8b96ee7ea..72be84cd8 160000 --- a/work/Paper +++ b/work/Paper @@ -1 +1 @@ -Subproject commit 8b96ee7ea8d947a979896eb7a1353c7e8f1479f6 +Subproject commit 72be84cd89e025ecdf4040f25ce77537bd0f64b0