1 package me.shedaniel.lightoverlay.forge.mixin;
3 import me.shedaniel.lightoverlay.common.CubicChunkPos;
4 import me.shedaniel.lightoverlay.common.LightOverlay;
5 import net.minecraft.client.multiplayer.ClientPacketListener;
6 import net.minecraft.network.Connection;
7 import net.minecraft.network.PacketListener;
8 import net.minecraft.network.protocol.Packet;
9 import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket;
10 import net.minecraft.network.protocol.game.ClientboundLightUpdatePacket;
11 import net.minecraft.network.protocol.game.ClientboundSectionBlocksUpdatePacket;
12 import net.minecraft.network.protocol.game.ClientboundSetChunkCacheCenterPacket;
13 import net.minecraft.util.Mth;
14 import org.spongepowered.asm.mixin.Mixin;
15 import org.spongepowered.asm.mixin.injection.At;
16 import org.spongepowered.asm.mixin.injection.Inject;
17 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
19 @Mixin(Connection.class)
20 public class MixinClientConnection {
21 @Inject(method = "genericsFtw", at = @At("HEAD"))
22 private static void handlePacket(Packet packet, PacketListener listener, CallbackInfo ci) {
25 // public static void handlePacket(Packet packet, PacketListener listener) {
27 if (!(listener instanceof ClientPacketListener packetListener)) return;
28 var level = packetListener.getLevel();
29 if (level == null) return;
30 if (packet instanceof ClientboundBlockUpdatePacket p) {
31 LightOverlay.queueChunkAndNear(new CubicChunkPos(p.getPos()));
32 } else if (packet instanceof ClientboundSetChunkCacheCenterPacket p) {
33 var height = Mth.ceil(level.getHeight() / 32.0);
34 var start = Math.floorDiv(level.getMinBuildHeight(), 32);
35 for (int y = start; y < start + height; y++) {
36 LightOverlay.queueChunkAndNear(new CubicChunkPos(p.getX(), y, p.getZ()));
38 } else if (packet instanceof ClientboundSectionBlocksUpdatePacket p) {
39 LightOverlay.queueChunkAndNear(new CubicChunkPos(p.sectionPos.getX(), p.sectionPos.getY() >> 1, p.sectionPos.getZ()));
40 } else if (packet instanceof ClientboundLightUpdatePacket p) {
41 var height = Mth.ceil(level.getHeight() / 32.0);
42 var start = Math.floorDiv(level.getMinBuildHeight(), 32);
43 for (int y = start; y < start + height; y++) {
44 LightOverlay.queueChunk(new CubicChunkPos(p.getX(), y, p.getZ()));
47 } catch (Throwable throwable) {
48 new RuntimeException("Light Overlay failed to process packet", throwable).printStackTrace();