geforkt von Mirrors/Paper
71 Zeilen
4.4 KiB
Diff
71 Zeilen
4.4 KiB
Diff
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 d6eab2a0fdbafc35efa7ed5b404357391565f4f3..69c7fe5bf5b914276a9f7a0e57ce668e569d91f9 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
|
|
+++ b/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<Holder<net.minecraft.world.level.biome.Biome>>[] 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<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);
|