-
-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add getChunkSnapshot includeLightData parameter
- Loading branch information
1 parent
581fb30
commit b69be85
Showing
2 changed files
with
106 additions
and
0 deletions.
There are no files selected for viewing
34 changes: 34 additions & 0 deletions
34
patches/api/0462-Add-getChunkSnapshot-includeLightData-parameter.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: Warrior <50800980+Warriorrrr@users.noreply.github.com> | ||
Date: Sat, 10 Feb 2024 10:05:59 +0100 | ||
Subject: [PATCH] Add getChunkSnapshot includeLightData parameter | ||
|
||
|
||
diff --git a/src/main/java/org/bukkit/Chunk.java b/src/main/java/org/bukkit/Chunk.java | ||
index eca55d8d3464f0e13a3b7984f74559ccda87edba..65c38a34a4428d08e927cca8d68b7eaefd09ee56 100644 | ||
--- a/src/main/java/org/bukkit/Chunk.java | ||
+++ b/src/main/java/org/bukkit/Chunk.java | ||
@@ -100,6 +100,23 @@ public interface Chunk extends PersistentDataHolder { | ||
@NotNull | ||
ChunkSnapshot getChunkSnapshot(boolean includeMaxblocky, boolean includeBiome, boolean includeBiomeTempRain); | ||
|
||
+ // Paper start - Add getChunkSnapshot includeLightData parameter | ||
+ /** | ||
+ * Capture thread-safe read-only snapshot of chunk data | ||
+ * | ||
+ * @param includeMaxblocky if true, snapshot includes per-coordinate | ||
+ * maximum Y values | ||
+ * @param includeBiome if true, snapshot includes per-coordinate biome | ||
+ * type | ||
+ * @param includeBiomeTempRain if true, snapshot includes per-coordinate | ||
+ * raw biome temperature and rainfall | ||
+ * @param includeLightData Whether to include per-coordinate light emitted by blocks and sky light data | ||
+ * @return ChunkSnapshot | ||
+ */ | ||
+ @NotNull | ||
+ ChunkSnapshot getChunkSnapshot(boolean includeMaxblocky, boolean includeBiome, boolean includeBiomeTempRain, boolean includeLightData); | ||
+ // Paper end | ||
+ | ||
/** | ||
* Checks if entities in this chunk are loaded. | ||
* |
72 changes: 72 additions & 0 deletions
72
patches/server/1049-Add-getChunkSnapshot-includeLightData-parameter.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
From 0000000000000000000000000000000000000000 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 | ||
|
||
|
||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java | ||
index fd702027e62eb38d51fb7c46ef268e9bb94e1e92..4300baf86da31cb8a70c6ab521dbffbf6ffa1e0f 100644 | ||
--- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java | ||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java | ||
@@ -279,14 +279,23 @@ public class CraftChunk implements Chunk { | ||
return this.getChunkSnapshot(true, false, false); | ||
} | ||
|
||
+ // Paper start - Add getChunkSnapshot includeLightData parameter | ||
@Override | ||
public ChunkSnapshot getChunkSnapshot(boolean includeMaxBlockY, boolean includeBiome, boolean includeBiomeTempRain) { | ||
+ return getChunkSnapshot(includeMaxBlockY, includeBiome, includeBiomeTempRain, true); | ||
+ } | ||
+ | ||
+ @Override | ||
+ public ChunkSnapshot getChunkSnapshot(boolean includeMaxBlockY, boolean includeBiome, boolean includeBiomeTempRain, boolean includeLightData) { | ||
+ // Paper end | ||
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 | ||
boolean[] sectionEmpty = new boolean[cs.length]; | ||
PalettedContainerRO<Holder<net.minecraft.world.level.biome.Biome>>[] biome = (includeBiome || includeBiomeTempRain) ? new PalettedContainer[cs.length] : null; | ||
|
||
@@ -303,6 +312,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) { | ||
@@ -318,6 +328,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<Holder<net.minecraft.world.level.biome.Biome>>) cs[i].getBiomes()).copy(); // Paper - Perf: use copy instead of round tripping with codecs | ||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java b/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java | ||
index 85029f1acfdbb411d9ebdf95838d6db3898f4e58..0756b5adb3039997feadeb94afb10b596abd9424 100644 | ||
--- a/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java | ||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java | ||
@@ -118,6 +118,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); | ||
@@ -126,6 +127,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); |