From 3ac72c83bdd606dee83a8501bad5ecac35a5717b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E9=9B=A8=E8=90=BD?= Date: Sun, 10 Nov 2024 15:26:53 +0800 Subject: [PATCH] Fix disconnection issues in #1540. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 秋雨落 --- .../mixin/core/network/ConnectionMixin.java | 13 +++++++ .../server/management/PlayerListMixin.java | 36 +++++++++---------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ConnectionMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ConnectionMixin.java index 5285979c6..cb15d5e44 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ConnectionMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ConnectionMixin.java @@ -3,13 +3,19 @@ import com.mojang.authlib.properties.Property; import io.izzel.arclight.common.bridge.core.network.NetworkManagerBridge; import net.minecraft.network.Connection; +import net.minecraft.network.DisconnectionDetails; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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.UUID; @Mixin(Connection.class) public class ConnectionMixin implements NetworkManagerBridge { + @Shadow public boolean disconnectionHandled; public java.util.UUID spoofedUUID; public com.mojang.authlib.properties.Property[] spoofedProfile; public String hostname; @@ -43,4 +49,11 @@ public class ConnectionMixin implements NetworkManagerBridge { public void bridge$setHostname(String hostname) { this.hostname = hostname; } + + @Inject(method = "handleDisconnection", at = @At("HEAD"), cancellable = true) + private void arclight$noDisconnectTwiceWarn(CallbackInfo ci) { + if (disconnectionHandled) { + ci.cancel(); + } + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java index feaaec8ef..42f142ebf 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java @@ -214,14 +214,14 @@ public abstract class PlayerListMixin implements PlayerListBridge { public ServerPlayer bridge$canPlayerLogin(SocketAddress socketAddress, GameProfile gameProfile, ServerLoginPacketListenerImpl handler) { UUID uuid = gameProfile.getId(); List list = Lists.newArrayList(); - for (ServerPlayer entityplayer : this.players) { - if (entityplayer.getUUID().equals(uuid)) { - list.add(entityplayer); + for (ServerPlayer player : this.players) { + if (player.getUUID().equals(uuid)) { + list.add(player); } } - for (ServerPlayer entityplayer : list) { - this.save(entityplayer); - entityplayer.connection.disconnect(Component.translatable("multiplayer.disconnect.duplicate_login")); + for (ServerPlayer player : list) { + this.save(player); + player.connection.disconnect(Component.translatable("multiplayer.disconnect.duplicate_login")); } ServerPlayer entity = new ServerPlayer(this.server, this.server.getLevel(Level.OVERWORLD), gameProfile, ClientInformation.createDefault()); ((ServerPlayerEntityBridge) entity).bridge$setTransferCookieConnection((CraftPlayer.TransferCookieConnection) handler); @@ -231,22 +231,22 @@ public abstract class PlayerListMixin implements PlayerListBridge { InetAddress realAddress = handler == null ? ((InetSocketAddress) socketAddress).getAddress() : ((InetSocketAddress) handler.connection.channel.remoteAddress()).getAddress(); PlayerLoginEvent event = new PlayerLoginEvent(player, hostname, ((InetSocketAddress) socketAddress).getAddress(), realAddress); - if (this.getBans().isBanned(gameProfile) && !this.getBans().get(gameProfile).hasExpired()) { - UserBanListEntry gameprofilebanentry = this.bans.get(gameProfile); - var chatmessage = Component.translatable("multiplayer.disconnect.banned.reason", gameprofilebanentry.getReason()); - if (gameprofilebanentry.getExpires() != null) { - chatmessage.append(Component.translatable("multiplayer.disconnect.banned.expiration", BAN_DATE_FORMAT.format(gameprofilebanentry.getExpires()))); + if (this.getBans().isBanned(gameProfile) && this.getBans().get(gameProfile) != null && !this.getBans().get(gameProfile).hasExpired()) { + UserBanListEntry entry = this.bans.get(gameProfile); + var message = Component.translatable("multiplayer.disconnect.banned.reason", entry.getReason()); + if (entry.getExpires() != null) { + message.append(Component.translatable("multiplayer.disconnect.banned.expiration", BAN_DATE_FORMAT.format(entry.getExpires()))); } - event.disallow(PlayerLoginEvent.Result.KICK_BANNED, CraftChatMessage.fromComponent(chatmessage)); + event.disallow(PlayerLoginEvent.Result.KICK_BANNED, CraftChatMessage.fromComponent(message)); } else if (!this.isWhiteListed(gameProfile)) { event.disallow(PlayerLoginEvent.Result.KICK_WHITELIST, SpigotConfig.whitelistMessage); - } else if (this.getIpBans().isBanned(socketAddress) && !this.getIpBans().get(socketAddress).hasExpired()) { - IpBanListEntry ipbanentry = this.ipBans.get(socketAddress); - var chatmessage = Component.translatable("multiplayer.disconnect.banned_ip.reason", ipbanentry.getReason()); - if (ipbanentry.getExpires() != null) { - chatmessage.append(Component.translatable("multiplayer.disconnect.banned_ip.expiration", BAN_DATE_FORMAT.format(ipbanentry.getExpires()))); + } else if (this.getIpBans().isBanned(socketAddress) && this.getIpBans().get(socketAddress) != null && !this.getIpBans().get(socketAddress).hasExpired()) { + IpBanListEntry entry = this.ipBans.get(socketAddress); + var message = Component.translatable("multiplayer.disconnect.banned_ip.reason", entry.getReason()); + if (entry.getExpires() != null) { + message.append(Component.translatable("multiplayer.disconnect.banned_ip.expiration", BAN_DATE_FORMAT.format(entry.getExpires()))); } - event.disallow(PlayerLoginEvent.Result.KICK_BANNED, CraftChatMessage.fromComponent(chatmessage)); + event.disallow(PlayerLoginEvent.Result.KICK_BANNED, CraftChatMessage.fromComponent(message)); } else if (this.players.size() >= this.maxPlayers && !this.canBypassPlayerLimit(gameProfile)) { event.disallow(PlayerLoginEvent.Result.KICK_FULL, SpigotConfig.serverFullMessage); }