From 54471c66951769a76f2e247c3361d273646c0986 Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Wed, 15 Dec 2021 20:40:06 -0600 Subject: [PATCH] Workaround bizarre 1.17->1.18 chunk lifecycle (Spigot, Fabric, Forge) --- .../common/chunk/GenericMapChunkCache.java | 7 +++- .../bukkit/helper/v118/MapChunkCache118.java | 2 +- .../fabric_1_18/FabricMapChunkCache.java | 40 +++++++------------ .../dynmap/forge_1_18/ForgeMapChunkCache.java | 2 +- 4 files changed, 22 insertions(+), 29 deletions(-) diff --git a/DynmapCore/src/main/java/org/dynmap/common/chunk/GenericMapChunkCache.java b/DynmapCore/src/main/java/org/dynmap/common/chunk/GenericMapChunkCache.java index 1426d9ea..36c45e64 100644 --- a/DynmapCore/src/main/java/org/dynmap/common/chunk/GenericMapChunkCache.java +++ b/DynmapCore/src/main/java/org/dynmap/common/chunk/GenericMapChunkCache.java @@ -901,6 +901,8 @@ public abstract class GenericMapChunkCache extends MapChunkCache { nbt = nbt.getCompound("Level"); } if (nbt == null) return null; + boolean hasLight = false; + boolean isEmpty = nbt.getString("Status").equals("empty"); // Incomplete migration // Start generic chunk builder GenericChunk.Builder bld = new GenericChunk.Builder(dw.minY, dw.worldheight); int x = nbt.getInt("xPos"); @@ -1047,9 +1049,11 @@ public abstract class GenericMapChunkCache extends MapChunkCache { } if (sec.contains("BlockLight")) { sbld.emittedLight(sec.getByteArray("BlockLight")); + hasLight = true; } if (sec.contains("SkyLight")) { sbld.skyLight(sec.getByteArray("SkyLight")); + hasLight = true; } // If section biome palette if (sec.contains("biomes")) { @@ -1083,7 +1087,8 @@ public abstract class GenericMapChunkCache extends MapChunkCache { bld.addSection(secnum, sbld.build()); sbld.reset(); } - return bld.build(); + // If isEmpty and has no light, drop it + return (isEmpty && (!hasLight)) ? null : bld.build(); } } diff --git a/bukkit-helper-118/src/main/java/org/dynmap/bukkit/helper/v118/MapChunkCache118.java b/bukkit-helper-118/src/main/java/org/dynmap/bukkit/helper/v118/MapChunkCache118.java index 15be0eb3..62d62b36 100644 --- a/bukkit-helper-118/src/main/java/org/dynmap/bukkit/helper/v118/MapChunkCache118.java +++ b/bukkit-helper-118/src/main/java/org/dynmap/bukkit/helper/v118/MapChunkCache118.java @@ -57,7 +57,7 @@ public class MapChunkCache118 extends GenericMapChunkCache { if (nbt != null) { String stat = nbt.l("Status"); ChunkStatus cs = ChunkStatus.a(stat); - if ((stat != null) && cs.b(ChunkStatus.l)) { // ChunkStatus.LIGHT + if ((stat != null) && (cs.b(ChunkStatus.l) || (cs == ChunkStatus.c))) { // ChunkStatus.LIGHT OR ChunkStatus.EMPTY (migrated use this for some reason) return true; } } diff --git a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricMapChunkCache.java b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricMapChunkCache.java index 1962484d..45f71c11 100644 --- a/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricMapChunkCache.java +++ b/fabric-1.18/src/main/java/org/dynmap/fabric_1_18/FabricMapChunkCache.java @@ -60,30 +60,6 @@ public class FabricMapChunkCache extends GenericMapChunkCache { super.setChunks(dw, chunks); } - private NbtCompound readChunk(int x, int z) { - try { - ThreadedAnvilChunkStorage acl = cps.threadedAnvilChunkStorage; - - ChunkPos coord = new ChunkPos(x, z); - NbtCompound rslt = acl.getNbt(coord); - if (rslt != null) { - // Don't load uncooked chunks - String stat = rslt.getString("Status"); - ChunkStatus cs = ChunkStatus.byId(stat); - if ((stat == null) || - // Needs to be at least lighted - (!cs.isAtLeast(ChunkStatus.LIGHT))) { - rslt = null; - } - } - //Log.info(String.format("loadChunk(%d,%d)=%s", x, z, (rslt != null) ? rslt.toString() : "null")); - return rslt; - } catch (Exception exc) { - Log.severe(String.format("Error reading chunk: %s,%d,%d", dw.getName(), x, z), exc); - return null; - } - } - private boolean isLitChunk(NbtCompound nbt) { if ((nbt != null) && nbt.contains("Level")) { nbt = nbt.getCompound("Level"); @@ -91,7 +67,7 @@ public class FabricMapChunkCache extends GenericMapChunkCache { if (nbt != null) { String stat = nbt.getString("Status"); ChunkStatus cs = ChunkStatus.byId(stat); - if ((stat != null) && cs.isAtLeast(ChunkStatus.LIGHT)) { // ChunkStatus.LIGHT + if ((stat != null) && (cs.isAtLeast(ChunkStatus.LIGHT) || (cs == ChunkStatus.EMPTY))) { // ChunkStatus.LIGHT OR migrated EMPTY return true; } } @@ -115,7 +91,19 @@ public class FabricMapChunkCache extends GenericMapChunkCache { } return gc; } - + + private NbtCompound readChunk(int x, int z) { + try { + ThreadedAnvilChunkStorage acl = cps.threadedAnvilChunkStorage; + + ChunkPos coord = new ChunkPos(x, z); + return acl.getNbt(coord); + } catch (Exception exc) { + Log.severe(String.format("Error reading chunk: %s,%d,%d", dw.getName(), x, z), exc); + return null; + } + } + // Load generic chunk from unloaded chunk protected GenericChunk loadChunk(DynmapChunk chunk) { GenericChunk gc = null; diff --git a/forge-1.18/src/main/java/org/dynmap/forge_1_18/ForgeMapChunkCache.java b/forge-1.18/src/main/java/org/dynmap/forge_1_18/ForgeMapChunkCache.java index dcef0bd1..2ddd8e24 100644 --- a/forge-1.18/src/main/java/org/dynmap/forge_1_18/ForgeMapChunkCache.java +++ b/forge-1.18/src/main/java/org/dynmap/forge_1_18/ForgeMapChunkCache.java @@ -38,7 +38,7 @@ public class ForgeMapChunkCache extends GenericMapChunkCache { if (nbt != null) { String stat = nbt.getString("Status"); ChunkStatus cs = ChunkStatus.byName(stat); - if ((stat != null) && cs.isOrAfter(ChunkStatus.LIGHT)) { // ChunkStatus.LIGHT + if ((stat != null) && (cs.isOrAfter(ChunkStatus.LIGHT) || (cs == ChunkStatus.EMPTY))) { // ChunkStatus.LIGHT or migrated EMPTY return true; } }