From 20330df2a9ce631db91d699adfe1e97cf102be64 Mon Sep 17 00:00:00 2001 From: 3944Realms Date: Sat, 6 Jun 2026 04:29:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=80=80=E5=87=BA/=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E6=B6=88=E6=81=AF=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mixin/CrossServerModMixinPlugin.java | 2 +- .../crossmod/mixin/MixinPlayerList.java | 58 ++++++++++++++----- 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/forge-mod/src/main/java/com/leisuretimedock/crossmod/mixin/CrossServerModMixinPlugin.java b/forge-mod/src/main/java/com/leisuretimedock/crossmod/mixin/CrossServerModMixinPlugin.java index 93e0164..1352bff 100644 --- a/forge-mod/src/main/java/com/leisuretimedock/crossmod/mixin/CrossServerModMixinPlugin.java +++ b/forge-mod/src/main/java/com/leisuretimedock/crossmod/mixin/CrossServerModMixinPlugin.java @@ -20,7 +20,7 @@ public class CrossServerModMixinPlugin implements IMixinConfigPlugin { @Override public boolean shouldApplyMixin(String s, String s1) { - return !FMLEnvironment.dist.isDedicatedServer(); + return true; } @Override diff --git a/forge-mod/src/main/java/com/leisuretimedock/crossmod/mixin/MixinPlayerList.java b/forge-mod/src/main/java/com/leisuretimedock/crossmod/mixin/MixinPlayerList.java index 68a4d9b..2e4c2d1 100644 --- a/forge-mod/src/main/java/com/leisuretimedock/crossmod/mixin/MixinPlayerList.java +++ b/forge-mod/src/main/java/com/leisuretimedock/crossmod/mixin/MixinPlayerList.java @@ -3,6 +3,7 @@ package com.leisuretimedock.crossmod.mixin; import com.leisuretimedock.crossmod.config.CrossServerConfigManager; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.contents.TranslatableContents; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.PlayerList; import org.slf4j.Logger; import org.spongepowered.asm.mixin.Final; @@ -12,31 +13,56 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.function.Function; + @Mixin(PlayerList.class) public class MixinPlayerList { @Shadow @Final private static Logger LOGGER; + /** + * 拦截双参数版本 + */ @Inject( method = "broadcastSystemMessage(Lnet/minecraft/network/chat/Component;Z)V", - at = @At("HEAD"), cancellable = true + at = @At("HEAD"), + cancellable = true ) - private void send(Component message, boolean bypassHiddenChat, CallbackInfo ci) { - try { - if (CrossServerConfigManager.INSTANCE.isDisabledJoinQuitMessage()) { - // 更好的方式:检查消息的翻译键 - if (message.getContents() instanceof TranslatableContents translatable) { - String key = translatable.getKey(); - if ("multiplayer.player.joined".equals(key) || - "multiplayer.player.joined.renamed".equals(key) || - "multiplayer.player.left".equals(key)) { - ci.cancel(); - } - } - } - } catch (Exception e) { - LOGGER.warn("Exception while sending system message to client", e); + private void onBroadcastSystemMessage(Component message, boolean bypassHiddenChat, CallbackInfo ci) { + if (shouldCancel(message)) { + ci.cancel(); } } + + /** + * 拦截三参数版本 + */ + @Inject( + method = "broadcastSystemMessage(Lnet/minecraft/network/chat/Component;Ljava/util/function/Function;Z)V", + at = @At("HEAD"), + cancellable = true + ) + private void onBroadcastSystemMessage(Component serverMessage, Function playerMessageFactory, boolean bypassHiddenChat, CallbackInfo ci) { + if (shouldCancel(serverMessage)) { + ci.cancel(); + } + } + + private boolean shouldCancel(Component message) { + if (!CrossServerConfigManager.INSTANCE.isDisabledJoinQuitMessage()) { + return false; + } + + // 检查 TranslatableContents 的翻译键 + if (message.getContents() instanceof TranslatableContents translatable) { + String key = translatable.getKey(); + if ("multiplayer.player.joined".equals(key) || + "multiplayer.player.joined.renamed".equals(key) || + "multiplayer.player.left".equals(key)) { + return true; + } + } + return false; + } }