Merge branch 'master' into pre/1.13

* master:
  Fix Dupe UUID logic triggering when the duplicate is pending unload
This commit is contained in:
Aikar 2018-07-28 01:59:20 -04:00
commit 1b53a468de
No known key found for this signature in database
GPG key ID: 401ADFC9891FAAFE
2 changed files with 27 additions and 28 deletions

View file

@ -1,4 +1,4 @@
From a034c787c361a89d9679e0936d3151ff3d84d06f Mon Sep 17 00:00:00 2001 From 3b96328cbca2cc941e8a10dfdc47f5970379ef8e Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co> From: Aikar <aikar@aikar.co>
Date: Sat, 21 Jul 2018 14:27:34 -0400 Date: Sat, 21 Jul 2018 14:27:34 -0400
Subject: [PATCH] Duplicate UUID Resolve Option Subject: [PATCH] Duplicate UUID Resolve Option
@ -33,7 +33,7 @@ But for those who are ok with leaving this inconsistent behavior, you may use WA
It is recommended you regenerate the entities, as these were legit entities, and deserve your love. It is recommended you regenerate the entities, as these were legit entities, and deserve your love.
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
index 7bd7aa0d94..ba6d5b7ff5 100644 index 7bd7aa0d94..5d9bed3f19 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -430,4 +430,40 @@ public class PaperWorldConfig { @@ -430,4 +430,40 @@ public class PaperWorldConfig {
@ -45,7 +45,7 @@ index 7bd7aa0d94..ba6d5b7ff5 100644
+ REGEN, DELETE, NOTHING, WARN + REGEN, DELETE, NOTHING, WARN
+ } + }
+ public DuplicateUUIDMode duplicateUUIDMode = DuplicateUUIDMode.REGEN; + public DuplicateUUIDMode duplicateUUIDMode = DuplicateUUIDMode.REGEN;
+ public void repairDuplicateUUID() { + private void repairDuplicateUUID() {
+ String desiredMode = getString("duplicate-uuid-resolver", "regenerate").toLowerCase().trim(); + String desiredMode = getString("duplicate-uuid-resolver", "regenerate").toLowerCase().trim();
+ switch (desiredMode.toLowerCase()) { + switch (desiredMode.toLowerCase()) {
+ case "regen": + case "regen":
@ -78,7 +78,7 @@ index 7bd7aa0d94..ba6d5b7ff5 100644
+ } + }
} }
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
index 3ac115ff65..4728ded917 100644 index 3ac115ff65..ba2aeb432d 100644
--- a/src/main/java/net/minecraft/server/Chunk.java --- a/src/main/java/net/minecraft/server/Chunk.java
+++ b/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java
@@ -1,5 +1,10 @@ @@ -1,5 +1,10 @@
@ -108,21 +108,22 @@ index 3ac115ff65..4728ded917 100644
} }
int k = MathHelper.floor(entity.locY / 16.0D); int k = MathHelper.floor(entity.locY / 16.0D);
@@ -865,6 +872,35 @@ public class Chunk implements IChunkAccess { @@ -865,6 +872,39 @@ public class Chunk implements IChunkAccess {
for (int j = 0; j < i; ++j) { for (int j = 0; j < i; ++j) {
List entityslice = aentityslice[j]; // Spigot List entityslice = aentityslice[j]; // Spigot
+ // Paper start + // Paper start
+ DuplicateUUIDMode mode = world.paperConfig.duplicateUUIDMode; + DuplicateUUIDMode mode = world.paperConfig.duplicateUUIDMode;
+ if (mode == DuplicateUUIDMode.DELETE || mode == DuplicateUUIDMode.REGEN) { + if (mode == DuplicateUUIDMode.WARN | mode == DuplicateUUIDMode.DELETE || mode == DuplicateUUIDMode.REGEN) {
+ Map<UUID, Entity> thisChunk = new HashMap<>(); + Map<UUID, Entity> thisChunk = new HashMap<>();
+ for (Iterator<Entity> iterator = ((List<Entity>) entityslice).iterator(); iterator.hasNext(); ) { + for (Iterator<Entity> iterator = ((List<Entity>) entityslice).iterator(); iterator.hasNext(); ) {
+ Entity entity = iterator.next(); + Entity entity = iterator.next();
+ if (entity.dead) continue;
+ Entity other = ((WorldServer) world).entitiesByUUID.get(entity.uniqueID); + 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); + other = thisChunk.get(entity.uniqueID);
+ } + }
+ if (other != null) { + if (other != null && !other.dead) {
+ switch (mode) { + switch (mode) {
+ case REGEN: { + case REGEN: {
+ entity.setUUID(UUID.randomUUID()); + entity.setUUID(UUID.randomUUID());
@ -135,6 +136,9 @@ index 3ac115ff65..4728ded917 100644
+ iterator.remove(); + iterator.remove();
+ break; + 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); + thisChunk.put(entity.uniqueID, entity);
@ -156,6 +160,19 @@ index 4ea52f9c59..2217ca9737 100644
public void a(UUID uuid) { public void a(UUID uuid) {
this.uniqueID = uuid; this.uniqueID = uuid;
this.au = this.uniqueID.toString(); this.au = this.uniqueID.toString();
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index 127dcedc97..5ee7cdc79c 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -72,7 +72,7 @@ public abstract class World implements GeneratorAccess, IIBlockAccess, AutoClose
}
};
// Spigot end
- protected final Set<Entity> g = Sets.newHashSet(); // Paper
+ protected final Set<Entity> g = Sets.newHashSet(); public Set<Entity> getEntityUnloadQueue() { return g; };// Paper - OBFHELPER
//public final List<TileEntity> tileEntityList = Lists.newArrayList(); // Paper - remove unused list
public final List<TileEntity> tileEntityListTick = Lists.newArrayList();
private final List<TileEntity> c = Lists.newArrayList();
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 747d99dbe6..7a9f28421b 100644 index 747d99dbe6..7a9f28421b 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java --- a/src/main/java/net/minecraft/server/WorldServer.java

View file

@ -1,4 +1,4 @@
From a03528da903b6a8261c06c40ad9fde7267b3434e Mon Sep 17 00:00:00 2001 From 95116432cfa374f39797e4e998f50223478d15c5 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co> From: Aikar <aikar@aikar.co>
Date: Thu, 26 Jul 2018 00:11:12 -0400 Date: Thu, 26 Jul 2018 00:11:12 -0400
Subject: [PATCH] Prevent Saving Bad entities to chunks Subject: [PATCH] Prevent Saving Bad entities to chunks
@ -17,24 +17,6 @@ an invalid entity.
This should reduce log occurrences of dupe uuid messages. This should reduce log occurrences of dupe uuid messages.
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
index 56a74c6062..fd1e53febb 100644
--- a/src/main/java/net/minecraft/server/Chunk.java
+++ b/src/main/java/net/minecraft/server/Chunk.java
@@ -911,11 +911,12 @@ public class Chunk implements IChunkAccess {
Map<UUID, Entity> thisChunk = new HashMap<>();
for (Iterator<Entity> iterator = ((List<Entity>) entityslice).iterator(); iterator.hasNext(); ) {
Entity entity = iterator.next();
+ if (entity.dead) continue;
Entity other = ((WorldServer) world).entitiesByUUID.get(entity.uniqueID);
if (other == null) {
other = thisChunk.get(entity.uniqueID);
}
- if (other != null) {
+ if (other != null && !other.dead) {
switch (mode) {
case REGEN: {
entity.setUUID(UUID.randomUUID());
diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
index a97e024ec4..bd52bf6561 100644 index a97e024ec4..bd52bf6561 100644
--- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java --- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java
@ -75,7 +57,7 @@ index a97e024ec4..bd52bf6561 100644
nbttagcompound.set("Entities", nbttaglist1); nbttagcompound.set("Entities", nbttaglist1);
NBTTagList nbttaglist2 = new NBTTagList(); NBTTagList nbttaglist2 = new NBTTagList();
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index 6d80e55c19..27398806d3 100644 index a66770e241..1f58042125 100644
--- a/src/main/java/net/minecraft/server/World.java --- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java
@@ -1053,7 +1053,7 @@ public abstract class World implements GeneratorAccess, IIBlockAccess, AutoClose @@ -1053,7 +1053,7 @@ public abstract class World implements GeneratorAccess, IIBlockAccess, AutoClose