diff --git a/common/src/main/java/pro/mikey/xray/XRay.java b/common/src/main/java/pro/mikey/xray/XRay.java index a5c76285..b03ad61c 100644 --- a/common/src/main/java/pro/mikey/xray/XRay.java +++ b/common/src/main/java/pro/mikey/xray/XRay.java @@ -17,6 +17,7 @@ public enum XRay { INSTANCE; public static final String MOD_ID = "xray"; + public static final Identifier SERVER_DISABLE_CHANNEL = id("disable"); private static final Logger LOGGER = LogManager.getLogger(); public static final XPlatShim XPLAT = ServiceLoader.load(XPlatShim.class).findFirst().orElseThrow(); diff --git a/common/src/main/java/pro/mikey/xray/core/ScanController.java b/common/src/main/java/pro/mikey/xray/core/ScanController.java index 3649c8b5..3ab615a6 100644 --- a/common/src/main/java/pro/mikey/xray/core/ScanController.java +++ b/common/src/main/java/pro/mikey/xray/core/ScanController.java @@ -51,6 +51,7 @@ public enum ScanController { // Draw states private boolean xrayActive = false; // Off by default + private boolean serverDisabled = false; public void init() { this.scanStore.load(); @@ -62,12 +63,15 @@ public void init() { // Public accessors public boolean isXRayActive() { - return this.xrayActive && Minecraft.getInstance().level != null && Minecraft.getInstance().player != null; + return this.xrayActive && !this.serverDisabled && Minecraft.getInstance().level != null && Minecraft.getInstance().player != null; } public void toggleXRay() { if (!xrayActive) // enable drawing { + if (serverDisabled) { + return; + } syncRenderList.clear(); // first, clear the buffer xrayActive = true; // then, enable drawing requestBlockFinder(true); // finally, force a refresh @@ -83,6 +87,17 @@ public void toggleXRay() { } } + public void disableOnServer() { + serverDisabled = true; + xrayActive = false; + syncRenderList.clear(); + OutlineRender.clearVBOs(); + } + + public void onDisconnect() { + serverDisabled = false; + } + public boolean isLavaActive() { return XRay.config().lavaActive.get(); } diff --git a/common/src/main/java/pro/mikey/xray/mixins/ClientCommonPacketListenerMixin.java b/common/src/main/java/pro/mikey/xray/mixins/ClientCommonPacketListenerMixin.java new file mode 100644 index 00000000..54524eba --- /dev/null +++ b/common/src/main/java/pro/mikey/xray/mixins/ClientCommonPacketListenerMixin.java @@ -0,0 +1,18 @@ +package pro.mikey.xray.mixins; + +import net.minecraft.client.multiplayer.ClientCommonPacketListenerImpl; +import net.minecraft.network.DisconnectionDetails; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import pro.mikey.xray.core.ScanController; + +@Mixin(ClientCommonPacketListenerImpl.class) +public class ClientCommonPacketListenerMixin { + + @Inject(method = "onDisconnect(Lnet/minecraft/network/DisconnectionDetails;)V", at = @At("HEAD")) + private void onDisconnect(DisconnectionDetails details, CallbackInfo ci) { + ScanController.INSTANCE.onDisconnect(); + } +} diff --git a/common/src/main/java/pro/mikey/xray/mixins/ClientPacketListenerMixin.java b/common/src/main/java/pro/mikey/xray/mixins/ClientPacketListenerMixin.java new file mode 100644 index 00000000..9a22ff16 --- /dev/null +++ b/common/src/main/java/pro/mikey/xray/mixins/ClientPacketListenerMixin.java @@ -0,0 +1,21 @@ +package pro.mikey.xray.mixins; + +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import pro.mikey.xray.XRay; +import pro.mikey.xray.core.ScanController; + +@Mixin(ClientPacketListener.class) +public class ClientPacketListenerMixin { + + @Inject(method = "handleCustomPayload(Lnet/minecraft/network/protocol/common/custom/CustomPacketPayload;)V", at = @At("HEAD")) + private void onCustomPayload(CustomPacketPayload payload, CallbackInfo ci) { + if (XRay.SERVER_DISABLE_CHANNEL.equals(payload.type().id())) { + ScanController.INSTANCE.disableOnServer(); + } + } +} diff --git a/fabric/src/main/resources/xray.mixins.json b/fabric/src/main/resources/xray.mixins.json index a5517939..5169e00e 100644 --- a/fabric/src/main/resources/xray.mixins.json +++ b/fabric/src/main/resources/xray.mixins.json @@ -3,7 +3,9 @@ "package": "pro.mikey.xray.mixins", "compatibilityLevel": "JAVA_17", "client": [ - "LevelMixin" + "LevelMixin", + "ClientPacketListenerMixin", + "ClientCommonPacketListenerMixin" ], "mixins": [ ], diff --git a/neoforge/src/main/resources/xray.mixins.json b/neoforge/src/main/resources/xray.mixins.json index a5517939..5169e00e 100644 --- a/neoforge/src/main/resources/xray.mixins.json +++ b/neoforge/src/main/resources/xray.mixins.json @@ -3,7 +3,9 @@ "package": "pro.mikey.xray.mixins", "compatibilityLevel": "JAVA_17", "client": [ - "LevelMixin" + "LevelMixin", + "ClientPacketListenerMixin", + "ClientCommonPacketListenerMixin" ], "mixins": [ ],