From 058346d2478af34a475bb89bb657feedc7d64da5 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sun, 28 Jun 2020 17:28:22 +0200 Subject: [PATCH] Workaround a bug in MC where light is not updated (fixes #209) MC stores server light data and only applies it during the next frame. Therefore, if there is no frame between receiving the chunk and block changes in it (like when jumping in replays), then the light update from the block change gets lost. --- .../replaymod/replay/FullReplaySender.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/java/com/replaymod/replay/FullReplaySender.java b/src/main/java/com/replaymod/replay/FullReplaySender.java index ed492577..04af72f9 100644 --- a/src/main/java/com/replaymod/replay/FullReplaySender.java +++ b/src/main/java/com/replaymod/replay/FullReplaySender.java @@ -66,11 +66,14 @@ import de.johni0702.minecraft.gui.versions.callbacks.PreTickCallback; //#endif //#if MC>=11400 +import com.replaymod.core.versions.MCVer; +import net.minecraft.network.packet.s2c.play.ChunkDataS2CPacket; import net.minecraft.network.packet.s2c.play.PlayerActionResponseS2CPacket; import net.minecraft.network.packet.s2c.play.OpenContainerS2CPacket; import net.minecraft.network.packet.s2c.play.OpenWrittenBookS2CPacket; import net.minecraft.entity.EntityType; import net.minecraft.text.TranslatableText; +import net.minecraft.world.chunk.light.LightingProvider; //#else //$$ import net.minecraft.client.resources.I18n; //$$ import net.minecraft.entity.Entity; @@ -453,6 +456,24 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend //#endif } } + + //#if MC>=11400 + if (p instanceof ChunkDataS2CPacket) { + Runnable doLightUpdates = () -> { + if (mc.world != null) { + LightingProvider provider = mc.world.getChunkManager().getLightingProvider(); + while (provider.hasUpdates()) { + provider.doLightUpdates(Integer.MAX_VALUE, true, true); + } + } + }; + if (MCVer.isOnMainThread()) { + doLightUpdates.run(); + } else { + MCVer.scheduleOnMainThread(doLightUpdates); + } + } + //#endif } } catch (Exception e) { // We'd rather not have a failure parsing one packet screw up the whole replay process