From 0f81bc31ff04eed997c92431e1c42a28a230b4cc Mon Sep 17 00:00:00 2001 From: bea4dev <34712108+bea4dev@users.noreply.github.com> Date: Thu, 13 Jun 2024 21:28:36 -0400 Subject: [PATCH] fix full light data is not sent (#2191) * fix full light data is not sent * remove fullLightCache --- .../server/instance/DynamicChunk.java | 6 +-- .../server/instance/LightingChunk.java | 43 +++++++++++++------ 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/minestom/server/instance/DynamicChunk.java b/src/main/java/net/minestom/server/instance/DynamicChunk.java index 8a368b5eb..51ca29be4 100644 --- a/src/main/java/net/minestom/server/instance/DynamicChunk.java +++ b/src/main/java/net/minestom/server/instance/DynamicChunk.java @@ -264,15 +264,15 @@ public class DynamicChunk extends Chunk { return new ChunkDataPacket(chunkX, chunkZ, new ChunkData(heightmapsNBT, data, entries), - createLightData() + createLightData(true) ); } @NotNull UpdateLightPacket createLightPacket() { - return new UpdateLightPacket(chunkX, chunkZ, createLightData()); + return new UpdateLightPacket(chunkX, chunkZ, createLightData(false)); } - protected LightData createLightData() { + protected LightData createLightData(boolean requiredFullChunk) { BitSet skyMask = new BitSet(); BitSet blockMask = new BitSet(); BitSet emptySkyMask = new BitSet(); diff --git a/src/main/java/net/minestom/server/instance/LightingChunk.java b/src/main/java/net/minestom/server/instance/LightingChunk.java index 2affbde5a..c95dfc761 100644 --- a/src/main/java/net/minestom/server/instance/LightingChunk.java +++ b/src/main/java/net/minestom/server/instance/LightingChunk.java @@ -37,8 +37,9 @@ public class LightingChunk extends DynamicChunk { private static final ExecutorService pool = Executors.newWorkStealingPool(); private int[] occlusionMap; - final CachedPacket lightCache = new CachedPacket(this::createLightPacket); - private LightData lightData; + final CachedPacket partialLightCache = new CachedPacket(this::createLightPacket); + private LightData partialLightData; + private LightData fullLightData; private int highestBlock; private boolean freezeInvalidation = false; @@ -86,9 +87,10 @@ public class LightingChunk extends DynamicChunk { ); public void invalidate() { - this.lightCache.invalidate(); + this.partialLightCache.invalidate(); this.chunkCache.invalidate(); - this.lightData = null; + this.partialLightData = null; + this.fullLightData = null; } public LightingChunk(@NotNull Instance instance, int chunkX, int chunkZ) { @@ -160,13 +162,13 @@ public class LightingChunk extends DynamicChunk { if (doneInit && !freezeInvalidation) { invalidateNeighborsSection(coordinate); invalidateResendDelay(); - this.lightCache.invalidate(); + this.partialLightCache.invalidate(); } } public void sendLighting() { if (!isLoaded()) return; - sendPacketToViewers(lightCache); + sendPacketToViewers(partialLightCache); } @Override @@ -235,11 +237,18 @@ public class LightingChunk extends DynamicChunk { } @Override - protected LightData createLightData() { + protected LightData createLightData(boolean requiredFullChunk) { packetGenerationLock.lock(); - if (lightData != null) { - packetGenerationLock.unlock(); - return lightData; + if (requiredFullChunk) { + if (fullLightData != null) { + packetGenerationLock.unlock(); + return fullLightData; + } + } else { + if (partialLightData != null) { + packetGenerationLock.unlock(); + return partialLightData; + } } BitSet skyMask = new BitSet(); @@ -271,14 +280,14 @@ public class LightingChunk extends DynamicChunk { if (section.blockLight().requiresUpdate()) { relightSection(instance, this.chunkX, index + minSection, chunkZ, LightType.BLOCK); wasUpdatedBlock = true; - } else if (section.blockLight().requiresSend()) { + } else if (requiredFullChunk || section.blockLight().requiresSend()) { wasUpdatedBlock = true; } if (section.skyLight().requiresUpdate()) { relightSection(instance, this.chunkX, index + minSection, chunkZ, LightType.SKY); wasUpdatedSky = true; - } else if (section.skyLight().requiresSend()) { + } else if (requiredFullChunk || section.skyLight().requiresSend()) { wasUpdatedSky = true; } @@ -308,13 +317,19 @@ public class LightingChunk extends DynamicChunk { } } - this.lightData = new LightData(skyMask, blockMask, + LightData lightData = new LightData(skyMask, blockMask, emptySkyMask, emptyBlockMask, skyLights, blockLights); + if (requiredFullChunk) { + this.fullLightData = lightData; + } else { + this.partialLightData = lightData; + } + packetGenerationLock.unlock(); - return this.lightData; + return lightData; } @Override