Add getChunkSnapshot includeLightData parameter

This commit is contained in:
Warrior 2024-02-10 10:03:48 +01:00
parent a2bbaf6744
commit b5cda1d98f
2 changed files with 15 additions and 2 deletions

View file

@ -328,12 +328,21 @@ public class CraftChunk implements Chunk {
@Override @Override
public ChunkSnapshot getChunkSnapshot(boolean includeMaxBlockY, boolean includeBiome, boolean includeBiomeTempRain) { 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); ChunkAccess chunk = this.getHandle(ChunkStatus.FULL);
LevelChunkSection[] cs = chunk.getSections(); LevelChunkSection[] cs = chunk.getSections();
PalettedContainer[] sectionBlockIDs = new PalettedContainer[cs.length]; PalettedContainer[] sectionBlockIDs = new PalettedContainer[cs.length];
byte[][] sectionSkyLights = new byte[cs.length][]; // Paper start - Add getChunkSnapshot includeLightData parameter
byte[][] sectionEmitLights = new byte[cs.length][]; 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]; boolean[] sectionEmpty = new boolean[cs.length];
PalettedContainerRO<Holder<net.minecraft.world.level.biome.Biome>>[] biome = (includeBiome || includeBiomeTempRain) ? new PalettedContainer[cs.length] : null; 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) // Paper end - Fix ChunkSnapshot#isSectionEmpty(int)
if (includeLightData) { // Paper - Add getChunkSnapshot includeLightData parameter
LevelLightEngine lightengine = this.worldServer.getLightEngine(); 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 DataLayer skyLightArray = lightengine.getLayerListener(LightLayer.SKY).getDataLayerData(SectionPos.of(this.x, chunk.getSectionYFromSectionIndex(i), this.z)); // SPIGOT-7498: Convert section index
if (skyLightArray == null) { if (skyLightArray == null) {
@ -365,6 +375,7 @@ public class CraftChunk implements Chunk {
sectionEmitLights[i] = new byte[2048]; sectionEmitLights[i] = new byte[2048];
System.arraycopy(emitLightArray.getData(), 0, sectionEmitLights[i], 0, 2048); System.arraycopy(emitLightArray.getData(), 0, sectionEmitLights[i], 0, 2048);
} }
} // Paper - Add getChunkSnapshot includeLightData parameter
if (biome != null) { 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 biome[i] = ((PalettedContainer<Holder<net.minecraft.world.level.biome.Biome>>) cs[i].getBiomes()).copy(); // Paper - Perf: use copy instead of round tripping with codecs

View file

@ -119,6 +119,7 @@ public class CraftChunkSnapshot implements ChunkSnapshot {
@Override @Override
public final int getBlockSkyLight(int x, int y, int z) { 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); this.validateChunkCoordinates(x, y, z);
int off = ((y & 0xF) << 7) | (z << 3) | (x >> 1); int off = ((y & 0xF) << 7) | (z << 3) | (x >> 1);
@ -127,6 +128,7 @@ public class CraftChunkSnapshot implements ChunkSnapshot {
@Override @Override
public final int getBlockEmittedLight(int x, int y, int z) { 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); this.validateChunkCoordinates(x, y, z);
int off = ((y & 0xF) << 7) | (z << 3) | (x >> 1); int off = ((y & 0xF) << 7) | (z << 3) | (x >> 1);