From b5cda1d98f07d2b3663b086e2a9785b32613228e Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Sat, 10 Feb 2024 10:03:48 +0100 Subject: [PATCH] Add getChunkSnapshot includeLightData parameter --- .../java/org/bukkit/craftbukkit/CraftChunk.java | 15 +++++++++++++-- .../bukkit/craftbukkit/CraftChunkSnapshot.java | 2 ++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java index 08956b81b9..bfc8b87941 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java @@ -328,12 +328,21 @@ public class CraftChunk implements Chunk { @Override public ChunkSnapshot getChunkSnapshot(boolean includeMaxBlockY, boolean includeBiome, boolean includeBiomeTempRain) { + // Paper start - Add getChunkSnapshot includeLightData parameter + return getChunkSnapshot(includeMaxBlockY, includeBiome, includeBiomeTempRain, true); + } + + @Override + public ChunkSnapshot getChunkSnapshot(boolean includeMaxBlockY, boolean includeBiome, boolean includeBiomeTempRain, boolean includeLightData) { + // Paper end - Add getChunkSnapshot includeLightData parameter ChunkAccess chunk = this.getHandle(ChunkStatus.FULL); LevelChunkSection[] cs = chunk.getSections(); PalettedContainer[] sectionBlockIDs = new PalettedContainer[cs.length]; - byte[][] sectionSkyLights = new byte[cs.length][]; - byte[][] sectionEmitLights = new byte[cs.length][]; + // Paper start - Add getChunkSnapshot includeLightData parameter + byte[][] sectionSkyLights = includeLightData ? new byte[cs.length][] : null; + byte[][] sectionEmitLights = includeLightData ? new byte[cs.length][] : null; + // Paper end - Add getChunkSnapshot includeLightData parameter boolean[] sectionEmpty = new boolean[cs.length]; PalettedContainerRO>[] biome = (includeBiome || includeBiomeTempRain) ? new PalettedContainer[cs.length] : null; @@ -350,6 +359,7 @@ public class CraftChunk implements Chunk { } // Paper end - Fix ChunkSnapshot#isSectionEmpty(int) + if (includeLightData) { // Paper - Add getChunkSnapshot includeLightData parameter LevelLightEngine lightengine = this.worldServer.getLightEngine(); DataLayer skyLightArray = lightengine.getLayerListener(LightLayer.SKY).getDataLayerData(SectionPos.of(this.x, chunk.getSectionYFromSectionIndex(i), this.z)); // SPIGOT-7498: Convert section index if (skyLightArray == null) { @@ -365,6 +375,7 @@ public class CraftChunk implements Chunk { sectionEmitLights[i] = new byte[2048]; System.arraycopy(emitLightArray.getData(), 0, sectionEmitLights[i], 0, 2048); } + } // Paper - Add getChunkSnapshot includeLightData parameter if (biome != null) { biome[i] = ((PalettedContainer>) cs[i].getBiomes()).copy(); // Paper - Perf: use copy instead of round tripping with codecs diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java index c88e4ba701..ddcbdbcbfe 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java @@ -119,6 +119,7 @@ public class CraftChunkSnapshot implements ChunkSnapshot { @Override public final int getBlockSkyLight(int x, int y, int z) { + Preconditions.checkState(this.skylight != null, "ChunkSnapshot created without light data. Please call getSnapshot with includeLightData=true"); // Paper - Add getChunkSnapshot includeLightData parameter this.validateChunkCoordinates(x, y, z); int off = ((y & 0xF) << 7) | (z << 3) | (x >> 1); @@ -127,6 +128,7 @@ public class CraftChunkSnapshot implements ChunkSnapshot { @Override public final int getBlockEmittedLight(int x, int y, int z) { + Preconditions.checkState(this.emitlight != null, "ChunkSnapshot created without light data. Please call getSnapshot with includeLightData=true"); // Paper - Add getChunkSnapshot includeLightData parameter this.validateChunkCoordinates(x, y, z); int off = ((y & 0xF) << 7) | (z << 3) | (x >> 1);