]> git.lizzy.rs Git - LightOverlay.git/blobdiff - fabric/src/main/java/me/shedaniel/lightoverlay/fabric/mixin/MixinClientConnection.java
Update to 1.17
[LightOverlay.git] / fabric / src / main / java / me / shedaniel / lightoverlay / fabric / mixin / MixinClientConnection.java
index ac553e6e78157b1917fbd353d243864bf4dac8d4..446f8aff74bfdd2ee5373ca248a99b81f1ecb819 100644 (file)
@@ -2,6 +2,7 @@ package me.shedaniel.lightoverlay.fabric.mixin;
 
 import me.shedaniel.lightoverlay.common.CubicChunkPos;
 import me.shedaniel.lightoverlay.common.LightOverlay;
+import net.minecraft.client.multiplayer.ClientPacketListener;
 import net.minecraft.network.Connection;
 import net.minecraft.network.PacketListener;
 import net.minecraft.network.protocol.Packet;
@@ -9,6 +10,7 @@ import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket;
 import net.minecraft.network.protocol.game.ClientboundLightUpdatePacket;
 import net.minecraft.network.protocol.game.ClientboundSectionBlocksUpdatePacket;
 import net.minecraft.network.protocol.game.ClientboundSetChunkCacheCenterPacket;
+import net.minecraft.util.Mth;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
@@ -17,21 +19,30 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 @Mixin(Connection.class)
 public class MixinClientConnection {
     @Inject(method = "genericsFtw", at = @At("HEAD"))
-    private static void handlePacket(Packet packet, PacketListener listener, CallbackInfo ci) {
-        if (packet instanceof ClientboundBlockUpdatePacket) {
-            LightOverlay.queueChunkAndNear(new CubicChunkPos(((ClientboundBlockUpdatePacket) packet).getPos()));
-        } else if (packet instanceof ClientboundSetChunkCacheCenterPacket) {
-            for (int y = 0; y <= 15; y++) {
-                LightOverlay.queueChunkAndNear(new CubicChunkPos(((ClientboundSetChunkCacheCenterPacket) packet).getX(), y, ((ClientboundSetChunkCacheCenterPacket) packet).getZ()));
-            }
-        } else if (packet instanceof ClientboundSectionBlocksUpdatePacket) {
-            for (int y = 0; y <= 15; y++) {
-                LightOverlay.queueChunkAndNear(new CubicChunkPos(((ClientboundSectionBlocksUpdatePacket) packet).sectionPos.getX(), y, ((ClientboundSectionBlocksUpdatePacket) packet).sectionPos.getZ()));
-            }
-        } else if (packet instanceof ClientboundLightUpdatePacket) {
-            for (int y = 0; y <= 15; y++) {
-                LightOverlay.queueChunk(new CubicChunkPos(((ClientboundLightUpdatePacket) packet).getX(), y, ((ClientboundLightUpdatePacket) packet).getZ()));
+    private static void handlePacket(Packet<?> packet, PacketListener listener, CallbackInfo ci) {
+        try {
+            if (!(listener instanceof ClientPacketListener packetListener)) return;
+            var level = packetListener.getLevel();
+            if (level == null) return;
+            if (packet instanceof ClientboundBlockUpdatePacket p) {
+                LightOverlay.queueChunkAndNear(new CubicChunkPos(p.getPos()));
+            } else if (packet instanceof ClientboundSetChunkCacheCenterPacket p) {
+                var height = Mth.ceil(level.getHeight() / 32.0);
+                var start = Math.floorDiv(level.getMinBuildHeight(), 32);
+                for (int y = start; y < start + height; y++) {
+                    LightOverlay.queueChunkAndNear(new CubicChunkPos(p.getX(), y, p.getZ()));
+                }
+            } else if (packet instanceof ClientboundSectionBlocksUpdatePacket p) {
+                LightOverlay.queueChunkAndNear(new CubicChunkPos(p.sectionPos.getX(), p.sectionPos.getY() >> 1, p.sectionPos.getZ()));
+            } else if (packet instanceof ClientboundLightUpdatePacket p) {
+                var height = Mth.ceil(level.getHeight() / 32.0);
+                var start = Math.floorDiv(level.getMinBuildHeight(), 32);
+                for (int y = start; y < start + height; y++) {
+                    LightOverlay.queueChunk(new CubicChunkPos(p.getX(), y, p.getZ()));
+                }
             }
+        } catch (Throwable throwable) {
+            new RuntimeException("Light Overlay failed to process packet", throwable).printStackTrace();
         }
     }
 }