From 998157c3c95962e5b9ab091581095ff105c054fb Mon Sep 17 00:00:00 2001 From: itqop Date: Tue, 11 Nov 2025 22:47:38 +0300 Subject: [PATCH] feat: add mixin login/leave messages --- gradle.properties | 2 +- .../whitelist/mixin/PlayerListMixin.java | 36 ++++++------------- .../mixin/ServerGamePacketListenerMixin.java | 22 ++++++++++++ src/main/resources/whitelist.mixins.json | 3 +- 4 files changed, 35 insertions(+), 28 deletions(-) create mode 100644 src/main/java/org/itqop/whitelist/mixin/ServerGamePacketListenerMixin.java diff --git a/gradle.properties b/gradle.properties index a784749..1f393c8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -29,7 +29,7 @@ mod_name=whitelist # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=All Rights Reserved # The mod version. See https://semver.org/ -mod_version=0.1-BETA +mod_version=0.2-BETA # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/src/main/java/org/itqop/whitelist/mixin/PlayerListMixin.java b/src/main/java/org/itqop/whitelist/mixin/PlayerListMixin.java index 1f70b56..74cf040 100644 --- a/src/main/java/org/itqop/whitelist/mixin/PlayerListMixin.java +++ b/src/main/java/org/itqop/whitelist/mixin/PlayerListMixin.java @@ -4,34 +4,18 @@ import net.minecraft.network.chat.Component; import net.minecraft.server.players.PlayerList; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(PlayerList.class) -public class PlayerListMixin { +public abstract class PlayerListMixin { - /** - * Suppress ALL player join/leave messages - * Intercepts ALL calls to broadcastSystemMessage and filters out join/leave messages - */ - @ModifyArg(method = "*", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/server/players/PlayerList;broadcastSystemMessage(Lnet/minecraft/network/chat/Component;Z)V"), - index = 0) - private Component suppressJoinLeaveMessages(Component original) { - String messageString = original.getString(); - - // Check if this is a join or leave message - // Common patterns: "Player joined the game", "Player left the game" - // Russian: "Игрок присоединился к игре", "Игрок покинул игру" - if (messageString.contains("joined the game") || - messageString.contains("left the game") || - messageString.contains("присоединился") || - messageString.contains("покинул")) { - // Return empty component to suppress the message - return Component.empty(); - } - - // For all other messages, return the original - return original; + @Redirect( + method = "placeNewPlayer", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/players/PlayerList;broadcastSystemMessage(Lnet/minecraft/network/chat/Component;Z)V" + ) + ) + private void itqop$skipJoinBroadcast(PlayerList self, Component message, boolean bypassHiddenChat) { } } diff --git a/src/main/java/org/itqop/whitelist/mixin/ServerGamePacketListenerMixin.java b/src/main/java/org/itqop/whitelist/mixin/ServerGamePacketListenerMixin.java new file mode 100644 index 0000000..e8901c0 --- /dev/null +++ b/src/main/java/org/itqop/whitelist/mixin/ServerGamePacketListenerMixin.java @@ -0,0 +1,22 @@ +package org.itqop.whitelist.mixin; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.server.players.PlayerList; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(ServerGamePacketListenerImpl.class) +public abstract class ServerGamePacketListenerMixin { + + @Redirect( + method = "removePlayerFromWorld", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/players/PlayerList;broadcastSystemMessage(Lnet/minecraft/network/chat/Component;Z)V" + ) + ) + private void itqop$skipLeaveBroadcast(PlayerList list, Component message, boolean overlay) { + } +} diff --git a/src/main/resources/whitelist.mixins.json b/src/main/resources/whitelist.mixins.json index 8fc79b1..b6c2702 100644 --- a/src/main/resources/whitelist.mixins.json +++ b/src/main/resources/whitelist.mixins.json @@ -5,7 +5,8 @@ "compatibilityLevel": "JAVA_21", "refmap": "whitelist.refmap.json", "mixins": [ - "PlayerListMixin" + "PlayerListMixin", + "ServerGamePacketListenerMixin" ], "injectors": { "defaultRequire": 1