From a4f184bd21d5acba07e7971f1613b99088104b38 Mon Sep 17 00:00:00 2001 From: jhqwqmc Date: Mon, 29 Dec 2025 09:36:00 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=AE=8C=E5=96=84intention=E5=8C=85?= =?UTF-8?q?=E6=84=8F=E5=A4=96=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 29 +++++++++++-------- .../plugin/user/BukkitServerPlayer.java | 5 ++++ .../plugin/user/FakeBukkitServerPlayer.java | 4 +++ .../core/plugin/network/NetWorkUser.java | 2 ++ 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index ab216e841..3617b243a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -2142,19 +2142,24 @@ public class BukkitNetworkManager implements NetworkManager, Listener { @Override public void onPacketReceive(NetWorkUser user, ByteBufPacketEvent event) { FriendlyByteBuf buf = event.getBuffer(); - int protocolVersion = buf.readVarInt(); - buf.readUtf(); // serverAddress - buf.readUnsignedShort(); // serverPort - ConnectionState nextState = switch (buf.readVarInt()) { - case 1 -> ConnectionState.STATUS; - case 2, 3 -> ConnectionState.LOGIN; - default -> null; - }; + int protocolVersion; + ConnectionState nextState; + try { + protocolVersion = buf.readVarInt(); + buf.readUtf(); // serverAddress + buf.readUnsignedShort(); // serverPort + nextState = switch (buf.readVarInt()) { + case 1 -> ConnectionState.STATUS; + case 2, 3 -> ConnectionState.LOGIN; + default -> null; + }; + } catch (Throwable e) { // 客户端乱发包 + Debugger.COMMON.warn(() -> "Failed to read intention packet", e); + user.forceDisconnect(); + return; + } if (nextState == null) { // 如果乱发包直接强行断开连接 - Channel channel = user.nettyChannel(); - if (channel != null) { - channel.pipeline().disconnect(); - } + user.forceDisconnect(); return; } if (BukkitNetworkManager.instance.hasViaVersion) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 8348b311d..ea4192b42 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -506,6 +506,11 @@ public class BukkitServerPlayer extends Player { } } + @Override + public void forceDisconnect() { + this.nettyChannel().pipeline().disconnect(); + } + @Override public ConnectionState decoderState() { return decoderState; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java index d4bef6ccf..2b6b7a5ac 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java @@ -25,6 +25,10 @@ public class FakeBukkitServerPlayer extends BukkitServerPlayer { public void kick(Component message) { } + @Override + public void forceDisconnect() { + } + @Override public boolean isFakePlayer() { return true; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java index e925eb355..df46bdf4d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java @@ -58,6 +58,8 @@ public interface NetWorkUser { void kick(Component message); + void forceDisconnect(); + void simulatePacket(Object packet); @ApiStatus.Internal From 90f264c9a2db2ffc291b800a52aae263d09e940b Mon Sep 17 00:00:00 2001 From: jhqwqmc Date: Mon, 29 Dec 2025 22:03:13 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/legacy/build.gradle.kts | 2 - .../bukkit/util/LegacyAuthLibUtils.java | 17 -- .../plugin/network/BukkitNetworkManager.java | 208 +++++++++++------- .../bukkit/plugin/network/PacketIds.java | 12 + .../plugin/network/id/PacketIdHelper.java | 3 + .../plugin/network/id/PacketIds1_20.java | 30 +++ .../plugin/network/id/PacketIds1_20_5.java | 32 +++ .../minecraft/NetworkReflections.java | 11 + .../plugin/user/BukkitServerPlayer.java | 26 ++- .../plugin/user/FakeBukkitServerPlayer.java | 7 +- .../core/plugin/network/NetWorkUser.java | 4 +- 11 files changed, 234 insertions(+), 118 deletions(-) delete mode 100644 bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyAuthLibUtils.java diff --git a/bukkit/legacy/build.gradle.kts b/bukkit/legacy/build.gradle.kts index 0196a21b3..25457c556 100644 --- a/bukkit/legacy/build.gradle.kts +++ b/bukkit/legacy/build.gradle.kts @@ -10,8 +10,6 @@ repositories { dependencies { // Platform compileOnly("io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT") - // authlib - compileOnly("com.mojang:authlib:6.0.58") } java { diff --git a/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyAuthLibUtils.java b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyAuthLibUtils.java deleted file mode 100644 index 7a7701d71..000000000 --- a/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyAuthLibUtils.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.momirealms.craftengine.bukkit.util; - -import com.mojang.authlib.GameProfile; - -import java.util.UUID; - -public final class LegacyAuthLibUtils { - private LegacyAuthLibUtils() {} - - public static String getName(GameProfile profile) { - return profile.getName(); - } - - public static UUID getId(GameProfile profile) { - return profile.getId(); - } -} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index 3617b243a..6bb45e2ce 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -5,7 +5,6 @@ import com.google.common.collect.Sets; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import com.mojang.authlib.GameProfile; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.datafixers.util.Either; import com.mojang.serialization.DataResult; @@ -271,22 +270,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener { private void registerByteBufferPacketListener(final ByteBufferPacketListener listener, int id, String name, ConnectionState state, PacketFlow direction) { if (id == -1) return; - ByteBufferPacketListenerHolder[] listeners = switch (direction) { - case SERVERBOUND -> switch (state) { - case HANDSHAKING -> c2sHandshakingPacketListeners; - case STATUS -> c2sStatusPacketListeners; - case LOGIN -> c2sLoginPacketListeners; - case PLAY -> c2sPlayPacketListeners; - case CONFIGURATION -> c2sConfigurationPacketListeners; - }; - case CLIENTBOUND -> switch (state) { - case HANDSHAKING -> s2cHandshakingPacketListeners; - case STATUS -> s2cStatusPacketListeners; - case LOGIN -> s2cLoginPacketListeners; - case PLAY -> s2cPlayPacketListeners; - case CONFIGURATION -> s2cConfigurationPacketListeners; - }; - }; + ByteBufferPacketListenerHolder[] listeners = direction == PacketFlow.SERVERBOUND ? c2sPacketListeners[state.ordinal()] : s2cPacketListeners[state.ordinal()]; if (id < 0 || id >= listeners.length) { throw new IllegalArgumentException("Invalid packet id: " + id); } @@ -412,13 +396,14 @@ public class BukkitNetworkManager implements NetworkManager, Listener { registerNMSPacketConsumer(new ServerDataListener(), NetworkReflections.clazz$ClientboundServerDataPacket); registerNMSPacketConsumer(new ChatSessionUpdateListener(), NetworkReflections.clazz$ServerboundChatSessionUpdatePacket); registerNMSPacketConsumer(new PlayerChatListener(), NetworkReflections.clazz$ClientboundPlayerChatPacket); - registerNMSPacketConsumer(new LoginAcknowledgedListener(), NetworkReflections.clazz$ServerboundLoginAcknowledgedPacket); - registerNMSPacketConsumer(new ConfigurationAcknowledgedListener(), NetworkReflections.clazz$ServerboundConfigurationAcknowledgedPacket); - registerNMSPacketConsumer(new C2SFinishConfigurationListener(), NetworkReflections.clazz$ServerboundFinishConfigurationPacket); registerNMSPacketConsumer(new S2CFinishConfigurationListener(), NetworkReflections.clazz$ClientboundFinishConfigurationPacket); - registerNMSPacketConsumer(new LoginFinishedListener(), NetworkReflections.clazz$ClientboundLoginFinishedPacket); - registerNMSPacketConsumer(new StartConfigurationListener(), NetworkReflections.clazz$ClientboundStartConfigurationPacket); - registerByteBufferPacketListener(new IntentionListener(), this.packetIds.clientIntentionPacket(), "ClientIntentionPacket", ConnectionState.HANDSHAKING, PacketFlow.SERVERBOUND); + registerByteBufferPacketListener(new C2SFinishConfigurationListener(), this.packetIds.serverboundFinishConfigurationPacket(), "ServerboundFinishConfigurationPacket", ConnectionState.CONFIGURATION, PacketFlow.SERVERBOUND); // 1.20.2+ c2s to play (configuration) + registerByteBufferPacketListener(new ByteBufferLoginListener(), this.packetIds.clientboundLoginPacket(), "ClientboundLoginPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); // 1.20.2+ c2s to play (configuration -> play) + registerByteBufferPacketListener(new LoginAcknowledgedListener(), this.packetIds.serverboundLoginAcknowledgedPacket(), "ServerboundLoginAcknowledgedPacket", ConnectionState.LOGIN, PacketFlow.SERVERBOUND); // 1.20.2+ to configuration (login) + registerByteBufferPacketListener(new LoginFinishedListener(), this.packetIds.clientboundLoginFinishedPacket(), "ClientboundLoginFinishedPacket", ConnectionState.LOGIN, PacketFlow.CLIENTBOUND); // 1.20.1 to play (login) + registerByteBufferPacketListener(new StartConfigurationListener(), this.packetIds.clientboundStartConfigurationPacket(), "ClientboundStartConfigurationPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); // 1.20.2+ s2c to configuration (play) + registerByteBufferPacketListener(new ConfigurationAcknowledgedListener(), this.packetIds.serverboundConfigurationAcknowledgedPacket(), "ServerboundConfigurationAcknowledgedPacket", ConnectionState.PLAY, PacketFlow.SERVERBOUND); // 1.20.2+ c2s to configuration (play) + registerByteBufferPacketListener(new IntentionListener(), this.packetIds.clientIntentionPacket(), "ClientIntentionPacket", ConnectionState.HANDSHAKING, PacketFlow.SERVERBOUND); // to status or login (handshaking) registerByteBufferPacketListener(new StatusResponseListener(), this.packetIds.clientboundStatusResponsePacket(), "ClientboundStatusResponsePacket", ConnectionState.STATUS, PacketFlow.CLIENTBOUND); registerByteBufferPacketListener(new ForgetLevelChunkListener(), this.packetIds.clientboundForgetLevelChunkPacket(), "ClientboundForgetLevelChunkPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); registerByteBufferPacketListener(new SetScoreListener1_20_3(), VersionHelper.isOrAbove1_20_3() ? this.packetIds.clientboundSetScorePacket() : -1, "ClientboundSetScorePacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); @@ -1035,10 +1020,11 @@ public class BukkitNetworkManager implements NetworkManager, Listener { } } + // outbound(encode|s2c) protected void handleS2CByteBufPacket(NetWorkUser user, ByteBufPacketEvent event) { int packetID = event.packetID(); ByteBufferPacketListenerHolder[] listener = s2cPacketListeners[user.encoderState().ordinal()]; - if (packetID >= listener.length) { // fixme 为什么会这样 + if (packetID >= listener.length) { this.plugin.logger().warn( "Failed to map the Packet ID " + packetID + " to a PacketType constant. " + "Bound: CLIENT, Connection state: " + user.encoderState() + ", " + @@ -1057,13 +1043,14 @@ public class BukkitNetworkManager implements NetworkManager, Listener { } } + // inbound(decode|c2s) protected void handleC2SByteBufPacket(NetWorkUser user, ByteBufPacketEvent event) { int packetID = event.packetID(); ByteBufferPacketListenerHolder[] listener = c2sPacketListeners[user.decoderState().ordinal()]; - if (packetID >= listener.length) { // fixme 为什么会这样 + if (packetID >= listener.length) { this.plugin.logger().warn( "Failed to map the Packet ID " + packetID + " to a PacketType constant. " + - "Bound: SERVER, Connection state: " + user.encoderState() + ", " + + "Bound: SERVER, Connection state: " + user.decoderState() + ", " + "Server version: " + VersionHelper.MINECRAFT_VERSION.version(), new Throwable() ); @@ -1965,17 +1952,14 @@ public class BukkitNetworkManager implements NetworkManager, Listener { if (!VersionHelper.isOrAbove1_20_2() || !Config.sendPackOnJoin()) { // 防止后期调试进配置阶段造成问题 user.setShouldProcessFinishConfiguration(false); - user.setEncoderState(ConnectionState.PLAY); return; } if (!user.shouldProcessFinishConfiguration()) { - user.setEncoderState(ConnectionState.PLAY); return; } Object packetListener = FastNMS.INSTANCE.method$Connection$getPacketListener(user.connection()); if (!CoreReflections.clazz$ServerConfigurationPacketListenerImpl.isInstance(packetListener)) { - user.setEncoderState(ConnectionState.PLAY); return; } @@ -2014,55 +1998,50 @@ public class BukkitNetworkManager implements NetworkManager, Listener { // 请求资源包 ResourcePackHost host = CraftEngine.instance().packManager().resourcePackHost(); host.requestResourcePackDownloadLink(user.uuid()).whenComplete((dataList, t) -> { + Queue configurationTasks; try { - Queue configurationTasks; - try { - configurationTasks = (Queue) CoreReflections.methodHandle$ServerConfigurationPacketListenerImpl$configurationTasksGetter.invokeExact(packetListener); - } catch (Throwable e) { - CraftEngine.instance().logger().warn("Failed to get configuration tasks for player " + user.name(), e); - FastNMS.INSTANCE.method$ServerConfigurationPacketListenerImpl$returnToWorld(packetListener); - return; - } - if (t != null) { - CraftEngine.instance().logger().warn("Failed to get pack data for player " + user.name(), t); - returnToWorld(user, configurationTasks, packetListener); - return; - } - if (dataList.isEmpty()) { - returnToWorld(user, configurationTasks, packetListener); - return; - } - // 向配置阶段连接的任务重加入资源包的任务 - for (ResourcePackDownloadData data : dataList) { - configurationTasks.add(FastNMS.INSTANCE.constructor$ServerResourcePackConfigurationTask(ResourcePackUtils.createServerResourcePackInfo(data.uuid(), data.url(), data.sha1()))); - user.addResourcePackUUID(data.uuid()); - } - // 最后再加入一个 JoinWorldTask 并开始资源包任务 - returnToWorld(user, configurationTasks, packetListener); - } finally { - user.setEncoderState(ConnectionState.PLAY); + configurationTasks = (Queue) CoreReflections.methodHandle$ServerConfigurationPacketListenerImpl$configurationTasksGetter.invokeExact(packetListener); + } catch (Throwable e) { + CraftEngine.instance().logger().warn("Failed to get configuration tasks for player " + user.name(), e); + FastNMS.INSTANCE.method$ServerConfigurationPacketListenerImpl$returnToWorld(packetListener); + return; } + if (t != null) { + CraftEngine.instance().logger().warn("Failed to get pack data for player " + user.name(), t); + returnToWorld(user, configurationTasks, packetListener); + return; + } + if (dataList.isEmpty()) { + returnToWorld(user, configurationTasks, packetListener); + return; + } + // 向配置阶段连接的任务重加入资源包的任务 + for (ResourcePackDownloadData data : dataList) { + configurationTasks.add(FastNMS.INSTANCE.constructor$ServerResourcePackConfigurationTask(ResourcePackUtils.createServerResourcePackInfo(data.uuid(), data.url(), data.sha1()))); + user.addResourcePackUUID(data.uuid()); + } + // 最后再加入一个 JoinWorldTask 并开始资源包任务 + returnToWorld(user, configurationTasks, packetListener); }); } } - public static class LoginFinishedListener implements NMSPacketListener { + public static class LoginFinishedListener implements ByteBufferPacketListener { @Override - public void onPacketSend(NetWorkUser user, NMSPacketEvent event, Object packet) { - if (VersionHelper.isOrAbove1_20_2()) { - user.setEncoderState(ConnectionState.CONFIGURATION); - } else { + public void onPacketSend(NetWorkUser user, ByteBufPacketEvent event) { + if (!VersionHelper.isOrAbove1_20_2()) { + /* + 发送这个包以后在1.20.1会从login切换到play + 1. send ClientboundGameProfilePacket + 2. placeNewPlayer 在 ServerLoginPacketListenerImpl + 3. new ServerGamePacketListenerImpl 在 PlayerList 的 placeNewPlayer + */ user.setConnectionState(ConnectionState.PLAY); } - GameProfile gameProfile = FastNMS.INSTANCE.field$ClientboundLoginFinishedPacket$gameProfile(packet); - if (VersionHelper.isOrAbove1_21_9()) { - user.setVerifiedName(gameProfile.name()); - user.setVerifiedUUID(gameProfile.id()); - } else { - user.setVerifiedName(LegacyAuthLibUtils.getName(gameProfile)); - user.setVerifiedUUID(LegacyAuthLibUtils.getId(gameProfile)); - } + FriendlyByteBuf buffer = event.getBuffer(); + user.setVerifiedUUID(buffer.readUUID()); + user.setVerifiedName(buffer.readUtf(16)); } } @@ -2105,35 +2084,97 @@ public class BukkitNetworkManager implements NetworkManager, Listener { } } - public static class LoginAcknowledgedListener implements NMSPacketListener { + public static class LoginAcknowledgedListener implements ByteBufferPacketListener { @Override - public void onPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) { - user.setDecoderState(ConnectionState.CONFIGURATION); + public void onPacketReceive(NetWorkUser user, ByteBufPacketEvent event) { + /* + 1.20.2+ + 1. receive ServerboundLoginAcknowledgedPacket + 2. new ServerConfigurationPacketListenerImpl 然后直接 startConfiguration + 3. send ClientboundCustomPayloadPacket(BrandPayload) to client + + 1.20.5+ + 1. receive ServerboundLoginAcknowledgedPacket + 2. set outbound(encode|s2c) to configuration + 3. set inbound(decode|c2s) to configuration + 4. startConfiguration + 5. send ClientboundCustomPayloadPacket(BrandPayload) to client + */ + user.setConnectionState(ConnectionState.CONFIGURATION); } } - public static class ConfigurationAcknowledgedListener implements NMSPacketListener { + public static class C2SFinishConfigurationListener implements ByteBufferPacketListener { @Override - public void onPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) { - user.setDecoderState(ConnectionState.CONFIGURATION); + public void onPacketReceive(NetWorkUser user, ByteBufPacketEvent event) { + /* + 1.20.2+ + 1. receive ServerboundFinishConfigurationPacket + 2. placeNewPlayer + 3. new ServerGamePacketListenerImpl 在 PlayerList + 4. send ClientboundLoginPacket to client + + 1.20.5+ + 1. receive ServerboundFinishConfigurationPacket + 2. set outbound(encode|s2c) to play + 3. placeNewPlayer + 4. set inbound(decode|c2s) to play + 5. send ClientboundLoginPacket to client + */ + user.setEncoderState(ConnectionState.PLAY); } } - public static class C2SFinishConfigurationListener implements NMSPacketListener { + public static class ByteBufferLoginListener implements ByteBufferPacketListener { @Override - public void onPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) { - user.setDecoderState(ConnectionState.PLAY); + public void onPacketSend(NetWorkUser user, ByteBufPacketEvent event) { + if (VersionHelper.isOrAbove1_20_2()) { + /* + 1.20.2+ + 1. send ClientboundLoginPacket to client + + 1.20.5+ + 1. set inbound(decode|c2s) to play + 2. send ClientboundLoginPacket to client + */ + user.setDecoderState(ConnectionState.PLAY); + } } } - public static class StartConfigurationListener implements NMSPacketListener { + public static class ConfigurationAcknowledgedListener implements ByteBufferPacketListener { @Override - public void onPacketSend(NetWorkUser user, NMSPacketEvent event, Object packet) { - user.setEncoderState(ConnectionState.CONFIGURATION); + public void onPacketReceive(NetWorkUser user, ByteBufPacketEvent event) { + /* + 1.20.2+ + 1. receive ServerboundConfigurationAcknowledgedPacket + 2. setListener ServerConfigurationPacketListenerImpl + + 1.20.5+ + 1. receive ServerboundConfigurationAcknowledgedPacket + 2. set inbound(decode|c2s) to configuration + */ + user.setDecoderState(ConnectionState.CONFIGURATION); // in + } + } + + public static class StartConfigurationListener implements ByteBufferPacketListener { + + @Override + public void onPacketSend(NetWorkUser user, ByteBufPacketEvent event) { + /* + 1.20.2+ + 1. send ClientboundStartConfigurationPacket + + 1.20.5+ + 1. send ClientboundStartConfigurationPacket + 2. set outbound(encode|s2c) to configuration + */ + user.setEncoderState(ConnectionState.CONFIGURATION); // out } } @@ -2155,11 +2196,11 @@ public class BukkitNetworkManager implements NetworkManager, Listener { }; } catch (Throwable e) { // 客户端乱发包 Debugger.COMMON.warn(() -> "Failed to read intention packet", e); - user.forceDisconnect(); + user.kick(null); return; } if (nextState == null) { // 如果乱发包直接强行断开连接 - user.forceDisconnect(); + user.kick(null); return; } if (BukkitNetworkManager.instance.hasViaVersion) { @@ -2169,6 +2210,9 @@ public class BukkitNetworkManager implements NetworkManager, Listener { } } user.setProtocolVersion(ProtocolVersion.getById(protocolVersion)); + /* + 1.20+ 直接切换 + */ user.setConnectionState(nextState); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java index f0999c467..21debac94 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -81,4 +81,16 @@ public interface PacketIds { int clientIntentionPacket(); int clientboundStatusResponsePacket(); + + int serverboundFinishConfigurationPacket(); + + int clientboundLoginPacket(); + + int clientboundLoginFinishedPacket(); + + int serverboundLoginAcknowledgedPacket(); + + int clientboundStartConfigurationPacket(); + + int serverboundConfigurationAcknowledgedPacket(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIdHelper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIdHelper.java index 11b9ab96b..1f753d0bc 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIdHelper.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIdHelper.java @@ -28,6 +28,9 @@ public final class PacketIdHelper { } public static int byClazz(Class clazz, PacketFlow direction, ConnectionState state) { + if (clazz == null) { + return -1; + } return byClazz.getOrDefault(state, Map.of()).getOrDefault(direction, Map.of()).getOrDefault(clazz, -1); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java index 69fb036cd..7ad54acd7 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java @@ -206,4 +206,34 @@ public class PacketIds1_20 implements PacketIds { public int clientboundStatusResponsePacket() { return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundStatusResponsePacket, PacketFlow.CLIENTBOUND, ConnectionState.STATUS); } + + @Override + public int serverboundFinishConfigurationPacket() { + return PacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundFinishConfigurationPacket, PacketFlow.SERVERBOUND, ConnectionState.CONFIGURATION); + } + + @Override + public int clientboundLoginPacket() { + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundLoginPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); + } + + @Override + public int clientboundLoginFinishedPacket() { + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundLoginFinishedPacket, PacketFlow.CLIENTBOUND, ConnectionState.LOGIN); + } + + @Override + public int serverboundLoginAcknowledgedPacket() { + return PacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundLoginAcknowledgedPacket, PacketFlow.SERVERBOUND, ConnectionState.LOGIN); + } + + @Override + public int clientboundStartConfigurationPacket() { + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundStartConfigurationPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); + } + + @Override + public int serverboundConfigurationAcknowledgedPacket() { + return PacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundConfigurationAcknowledgedPacket, PacketFlow.SERVERBOUND, ConnectionState.PLAY); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java index 0ad2dace8..f260d27a1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java @@ -1,8 +1,10 @@ package net.momirealms.craftengine.bukkit.plugin.network.id; import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections; import net.momirealms.craftengine.core.plugin.network.ConnectionState; import net.momirealms.craftengine.core.plugin.network.PacketFlow; +import net.momirealms.craftengine.core.util.VersionHelper; public class PacketIds1_20_5 implements PacketIds { @@ -205,4 +207,34 @@ public class PacketIds1_20_5 implements PacketIds { public int clientboundStatusResponsePacket() { return PacketIdHelper.byName("minecraft:status_response", PacketFlow.CLIENTBOUND, ConnectionState.STATUS); } + + @Override + public int serverboundFinishConfigurationPacket() { + return PacketIdHelper.byName("minecraft:finish_configuration", PacketFlow.SERVERBOUND, ConnectionState.CONFIGURATION); + } + + @Override + public int clientboundLoginPacket() { + return PacketIdHelper.byName("minecraft:login", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); + } + + @Override + public int clientboundLoginFinishedPacket() { + return PacketIdHelper.byName(VersionHelper.isOrAbove1_21_2() ? "minecraft:login_finished" : "minecraft:game_profile", PacketFlow.CLIENTBOUND, ConnectionState.LOGIN); + } + + @Override + public int serverboundLoginAcknowledgedPacket() { + return PacketIdHelper.byName("minecraft:login_acknowledged", PacketFlow.SERVERBOUND, ConnectionState.LOGIN); + } + + @Override + public int clientboundStartConfigurationPacket() { + return PacketIdHelper.byName("minecraft:start_configuration", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); + } + + @Override + public int serverboundConfigurationAcknowledgedPacket() { + return PacketIdHelper.byName("minecraft:configuration_acknowledged", PacketFlow.SERVERBOUND, ConnectionState.PLAY); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java index dfa391ad9..a1981b6a9 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java @@ -1817,4 +1817,15 @@ public final class NetworkReflections { ), VersionHelper.isOrAbove1_20_2() ); + + public static final Class clazz$ClientboundLoginDisconnectPacket = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "network.protocol.login.PacketLoginOutDisconnect", + "network.protocol.login.ClientboundLoginDisconnectPacket" + ) + ); + + public static final Constructor constructor$ClientboundLoginDisconnectPacket = requireNonNull( + ReflectionUtils.getDeclaredConstructor(clazz$ClientboundLoginDisconnectPacket, CoreReflections.clazz$Component) + ); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index ea4192b42..58a25b755 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -41,6 +41,7 @@ import net.momirealms.craftengine.core.plugin.context.CooldownData; import net.momirealms.craftengine.core.plugin.entityculling.CullingData; import net.momirealms.craftengine.core.plugin.entityculling.EntityCulling; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; +import net.momirealms.craftengine.core.plugin.logger.Debugger; import net.momirealms.craftengine.core.plugin.network.ConnectionState; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; import net.momirealms.craftengine.core.plugin.network.ProtocolVersion; @@ -94,8 +95,8 @@ public class BukkitServerPlayer extends Player { private UUID uuid; private boolean isNameVerified; private boolean isUUIDVerified; - private ConnectionState decoderState; - private ConnectionState encoderState; + private ConnectionState decoderState; // inbound(decode|c2s) + private ConnectionState encoderState; // outbound(encode|s2c) private boolean shouldProcessFinishConfiguration = true; private final Set resourcePackUUID = Collections.synchronizedSet(new HashSet<>()); // some references @@ -493,9 +494,18 @@ public class BukkitServerPlayer extends Player { } @Override - public void kick(Component message) { + public void kick(@Nullable Component message) { + Object reason = message != null ? ComponentUtils.adventureToMinecraft(message) : null; + if (this.encoderState == ConnectionState.HANDSHAKING || this.encoderState == ConnectionState.STATUS) { + FastNMS.INSTANCE.method$Connection$disconnect(this.connection(), reason); + return; + } try { - Object reason = ComponentUtils.adventureToMinecraft(message); + if (this.encoderState == ConnectionState.LOGIN) { + this.sendPacket(NetworkReflections.constructor$ClientboundLoginDisconnectPacket.newInstance(reason), false); + FastNMS.INSTANCE.method$Connection$disconnect(this.connection(), reason); + return; + } Object kickPacket = NetworkReflections.constructor$ClientboundDisconnectPacket.newInstance(reason); this.sendPacket(kickPacket, false, () -> FastNMS.INSTANCE.method$Connection$disconnect(this.connection(), reason)); this.nettyChannel().config().setAutoRead(false); @@ -506,11 +516,6 @@ public class BukkitServerPlayer extends Player { } } - @Override - public void forceDisconnect() { - this.nettyChannel().pipeline().disconnect(); - } - @Override public ConnectionState decoderState() { return decoderState; @@ -534,14 +539,17 @@ public class BukkitServerPlayer extends Player { public void setConnectionState(ConnectionState connectionState) { this.encoderState = connectionState; this.decoderState = connectionState; + Debugger.COMMON.warn(() -> "Set connection state to " + connectionState, new Throwable()); } public void setDecoderState(ConnectionState decoderState) { this.decoderState = decoderState; + Debugger.COMMON.warn(() -> "Set decoder state to " + decoderState, new Throwable()); } public void setEncoderState(ConnectionState encoderState) { this.encoderState = encoderState; + Debugger.COMMON.warn(() -> "Set encoder state to " + encoderState, new Throwable()); } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java index 2b6b7a5ac..c9ba1c834 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java @@ -4,6 +4,7 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import org.jetbrains.annotations.Nullable; public class FakeBukkitServerPlayer extends BukkitServerPlayer { @@ -22,11 +23,7 @@ public class FakeBukkitServerPlayer extends BukkitServerPlayer { } @Override - public void kick(Component message) { - } - - @Override - public void forceDisconnect() { + public void kick(@Nullable Component message) { } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java index df46bdf4d..037dfde20 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java @@ -56,9 +56,7 @@ public interface NetWorkUser { void sendCustomPayload(Key channel, byte[] data); - void kick(Component message); - - void forceDisconnect(); + void kick(@Nullable Component message); void simulatePacket(Object packet); From 1d1e24c126733219de033acd2e7e859975a61c8c Mon Sep 17 00:00:00 2001 From: jhqwqmc Date: Mon, 29 Dec 2025 22:23:04 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=80=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nameplates/CustomNameplateHatSettings.java | 14 +++++++------- bukkit/paper-loader/build.gradle.kts | 2 +- gradle.properties | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/nameplates/CustomNameplateHatSettings.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/nameplates/CustomNameplateHatSettings.java index 02177e24b..ff0a67165 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/nameplates/CustomNameplateHatSettings.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/nameplates/CustomNameplateHatSettings.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.bukkit.compatibility.nameplates; +import com.destroystokyo.paper.event.player.PlayerArmorChangeEvent; import io.papermc.paper.event.entity.EntityEquipmentChangedEvent; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; @@ -39,13 +40,12 @@ public final class CustomNameplateHatSettings implements Listener { } @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) - public void onEquipmentChange(EntityEquipmentChangedEvent event) { - if (!(event.getEntity() instanceof Player player)) return; - Map equipmentChanges = event.getEquipmentChanges(); - EntityEquipmentChangedEvent.EquipmentChange equipmentChange = equipmentChanges.get(EquipmentSlot.HEAD); - if (equipmentChange == null) return; - ItemStack newItem = equipmentChange.newItem(); - updateHatHeight(player, newItem); + public void onPlayerArmorChange(PlayerArmorChangeEvent event) { + if (event.getSlot() != EquipmentSlot.HEAD) { + return; + } + ItemStack newItem = event.getNewItem(); + updateHatHeight(event.getPlayer(), newItem); } @EventHandler(priority = EventPriority.HIGHEST) diff --git a/bukkit/paper-loader/build.gradle.kts b/bukkit/paper-loader/build.gradle.kts index 55924d350..68b291b7f 100644 --- a/bukkit/paper-loader/build.gradle.kts +++ b/bukkit/paper-loader/build.gradle.kts @@ -131,7 +131,7 @@ paper { // leveler register("AuraSkills") { required = false } register("AureliumSkills") { required = false } - register("McMMO") { required = false } + register("mcMMO") { required = false } register("MMOCore") { required = false } register("Jobs") { required = false } register("EcoSkills") { required = false } diff --git a/gradle.properties b/gradle.properties index 00fd1f293..a0ba9c6bb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -58,7 +58,7 @@ authlib_version=7.0.60 concurrent_util_version=0.0.8-SNAPSHOT bucket4j_version=8.15.0 itembridge_version=1.0.17 -levelerbridge_version=1.0.6 +levelerbridge_version=1.0.7 # Proxy settings systemProp.socks.proxyHost=127.0.0.1 From fc54ebdb987c11bdf3d5a76a22e218bc61d1b1d0 Mon Sep 17 00:00:00 2001 From: jhqwqmc Date: Mon, 29 Dec 2025 22:56:18 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/plugin/network/BukkitNetworkManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index 6bb45e2ce..a2bff9e02 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -397,7 +397,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener { registerNMSPacketConsumer(new ChatSessionUpdateListener(), NetworkReflections.clazz$ServerboundChatSessionUpdatePacket); registerNMSPacketConsumer(new PlayerChatListener(), NetworkReflections.clazz$ClientboundPlayerChatPacket); registerNMSPacketConsumer(new S2CFinishConfigurationListener(), NetworkReflections.clazz$ClientboundFinishConfigurationPacket); - registerByteBufferPacketListener(new C2SFinishConfigurationListener(), this.packetIds.serverboundFinishConfigurationPacket(), "ServerboundFinishConfigurationPacket", ConnectionState.CONFIGURATION, PacketFlow.SERVERBOUND); // 1.20.2+ c2s to play (configuration) + registerByteBufferPacketListener(new C2SFinishConfigurationListener(), this.packetIds.serverboundFinishConfigurationPacket(), "ServerboundFinishConfigurationPacket", ConnectionState.CONFIGURATION, PacketFlow.SERVERBOUND); // 1.20.2+ s2c to play (configuration) registerByteBufferPacketListener(new ByteBufferLoginListener(), this.packetIds.clientboundLoginPacket(), "ClientboundLoginPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); // 1.20.2+ c2s to play (configuration -> play) registerByteBufferPacketListener(new LoginAcknowledgedListener(), this.packetIds.serverboundLoginAcknowledgedPacket(), "ServerboundLoginAcknowledgedPacket", ConnectionState.LOGIN, PacketFlow.SERVERBOUND); // 1.20.2+ to configuration (login) registerByteBufferPacketListener(new LoginFinishedListener(), this.packetIds.clientboundLoginFinishedPacket(), "ClientboundLoginFinishedPacket", ConnectionState.LOGIN, PacketFlow.CLIENTBOUND); // 1.20.1 to play (login) From 0f280b06e8fe973454afff1f2708210c1ea857f1 Mon Sep 17 00:00:00 2001 From: jhqwqmc Date: Mon, 29 Dec 2025 23:34:46 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/plugin/network/BukkitNetworkManager.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index a2bff9e02..568c2aded 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -397,6 +397,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener { registerNMSPacketConsumer(new ChatSessionUpdateListener(), NetworkReflections.clazz$ServerboundChatSessionUpdatePacket); registerNMSPacketConsumer(new PlayerChatListener(), NetworkReflections.clazz$ClientboundPlayerChatPacket); registerNMSPacketConsumer(new S2CFinishConfigurationListener(), NetworkReflections.clazz$ClientboundFinishConfigurationPacket); + // 状态切换相关监听器 - 开始 + // fixme 因为会比 packetevents 在同一秒慢半拍切换,所以说会出现一下下的错误提示,只需要推迟 1 tick 发送即可 registerByteBufferPacketListener(new C2SFinishConfigurationListener(), this.packetIds.serverboundFinishConfigurationPacket(), "ServerboundFinishConfigurationPacket", ConnectionState.CONFIGURATION, PacketFlow.SERVERBOUND); // 1.20.2+ s2c to play (configuration) registerByteBufferPacketListener(new ByteBufferLoginListener(), this.packetIds.clientboundLoginPacket(), "ClientboundLoginPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); // 1.20.2+ c2s to play (configuration -> play) registerByteBufferPacketListener(new LoginAcknowledgedListener(), this.packetIds.serverboundLoginAcknowledgedPacket(), "ServerboundLoginAcknowledgedPacket", ConnectionState.LOGIN, PacketFlow.SERVERBOUND); // 1.20.2+ to configuration (login) @@ -404,6 +406,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener { registerByteBufferPacketListener(new StartConfigurationListener(), this.packetIds.clientboundStartConfigurationPacket(), "ClientboundStartConfigurationPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); // 1.20.2+ s2c to configuration (play) registerByteBufferPacketListener(new ConfigurationAcknowledgedListener(), this.packetIds.serverboundConfigurationAcknowledgedPacket(), "ServerboundConfigurationAcknowledgedPacket", ConnectionState.PLAY, PacketFlow.SERVERBOUND); // 1.20.2+ c2s to configuration (play) registerByteBufferPacketListener(new IntentionListener(), this.packetIds.clientIntentionPacket(), "ClientIntentionPacket", ConnectionState.HANDSHAKING, PacketFlow.SERVERBOUND); // to status or login (handshaking) + // 状态切换相关监听器 - 结束 registerByteBufferPacketListener(new StatusResponseListener(), this.packetIds.clientboundStatusResponsePacket(), "ClientboundStatusResponsePacket", ConnectionState.STATUS, PacketFlow.CLIENTBOUND); registerByteBufferPacketListener(new ForgetLevelChunkListener(), this.packetIds.clientboundForgetLevelChunkPacket(), "ClientboundForgetLevelChunkPacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND); registerByteBufferPacketListener(new SetScoreListener1_20_3(), VersionHelper.isOrAbove1_20_3() ? this.packetIds.clientboundSetScorePacket() : -1, "ClientboundSetScorePacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND);