geforkt von Mirrors/Paper
b62dfa0bf9
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 39ce5d3a SPIGOT-4399: ItemMeta.equals broken with AttributeModifiers CraftBukkit Changes:1cf8b5dc
SPIGOT-4400: Populators running on existing chunks116cb9a1
SPIGOT-4399: Add attribute modifier equality test5ee1c18a
SPIGOT-4398: Set ASM7_EXPERIMENTAL flag
90 Zeilen
4.0 KiB
Diff
90 Zeilen
4.0 KiB
Diff
From f73262650a77e5b3300a76bc932eb6c96b0b60b8 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Mon, 23 Jul 2018 22:44:23 -0400
|
|
Subject: [PATCH] Add some Debug to Chunk Entity slices
|
|
|
|
If we detect unexpected state, log and try to recover
|
|
|
|
This should hopefully avoid duplicate entities ever being created
|
|
if the entity was to end up in 2 different chunk slices
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
|
index 17f1e71d48..a75b058e2a 100644
|
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
|
@@ -710,8 +710,34 @@ public class Chunk implements IChunkAccess {
|
|
entity.ae = this.locX;
|
|
entity.af = k;
|
|
entity.ag = this.locZ;
|
|
- this.entitySlices[k].add(entity);
|
|
+
|
|
// Paper start
|
|
+ List<Entity> entitySlice = this.entitySlices[k];
|
|
+ boolean inThis = entitySlice.contains(entity);
|
|
+ List<Entity> currentSlice = entity.entitySlice;
|
|
+ if ((currentSlice != null && currentSlice.contains(entity)) || inThis) {
|
|
+ if (currentSlice == entitySlice || inThis) {
|
|
+ LogManager.getLogger().warn(entity + " was already in this chunk section! Report this to https://github.com/PaperMC/Paper/issues/1302");
|
|
+ new Throwable().printStackTrace();
|
|
+ return;
|
|
+ } else {
|
|
+ LogManager.getLogger().warn(entity + " is still in another ChunkSection! Report this to https://github.com/PaperMC/Paper/issues/1302");
|
|
+
|
|
+ Chunk chunk = entity.getCurrentChunk();
|
|
+ if (chunk != null) {
|
|
+ if (chunk != this) {
|
|
+ LogManager.getLogger().warn(entity + " was in another chunk at that! " + chunk.locX + "," + chunk.locZ);
|
|
+ }
|
|
+ chunk.removeEntity(entity);
|
|
+ } else {
|
|
+ removeEntity(entity);
|
|
+ }
|
|
+ new Throwable().printStackTrace();
|
|
+ }
|
|
+ }
|
|
+ entity.entitySlice = entitySlice;
|
|
+ entitySlice.add(entity);
|
|
+
|
|
this.markDirty();
|
|
if (entity instanceof EntityItem) {
|
|
itemCounts[k]++;
|
|
@@ -741,9 +767,13 @@ public class Chunk implements IChunkAccess {
|
|
i = this.entitySlices.length - 1;
|
|
}
|
|
// Paper start
|
|
- if (!this.entitySlices[i].remove(entity)) {
|
|
- return;
|
|
+ if (entity.entitySlice == null || !entity.entitySlice.contains(entity) || entitySlices[i] == entity.entitySlice) {
|
|
+ entity.entitySlice = null;
|
|
+ } else {
|
|
+ LogManager.getLogger().warn(entity + " was removed from a entitySlice we did not expect. Report this to https://github.com/PaperMC/Paper/issues/1302");
|
|
+ new Throwable().printStackTrace();
|
|
}
|
|
+ if (!this.entitySlices[i].remove(entity)) { return; }
|
|
this.markDirty();
|
|
if (entity instanceof EntityItem) {
|
|
itemCounts[i]--;
|
|
@@ -1017,6 +1047,7 @@ public class Chunk implements IChunkAccess {
|
|
}
|
|
// Spigot End
|
|
entity.setCurrentChunk(null); // Paper
|
|
+ entity.entitySlice = null; // Paper
|
|
|
|
// Do not pass along players, as doing so can get them stuck outside of time.
|
|
// (which for example disables inventory icon updates and prevents block breaking)
|
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
|
index 0381f8e658..965cd592f3 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -64,6 +64,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
}
|
|
}
|
|
};
|
|
+ List<Entity> entitySlice = null;
|
|
// Paper end
|
|
static boolean isLevelAtLeast(NBTTagCompound tag, int level) {
|
|
return tag.hasKey("Bukkit.updateLevel") && tag.getInt("Bukkit.updateLevel") >= level;
|
|
--
|
|
2.19.0
|
|
|