Skip to content

Commit 5c1a862

Browse files
authored
Allow disconnecting any protocol with a compat codec (#255)
1 parent d170d4a commit 5c1a862

File tree

2 files changed

+40
-46
lines changed

2 files changed

+40
-46
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package org.cloudburstmc.protocol.bedrock.codec.compat;
22

33
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec;
4-
import org.cloudburstmc.protocol.bedrock.codec.compat.serializer.DisconnectSerializerCompat;
54
import org.cloudburstmc.protocol.bedrock.codec.compat.serializer.LoginSerializerCompat;
65
import org.cloudburstmc.protocol.bedrock.codec.compat.serializer.PlayStatusSerializerCompat;
76
import org.cloudburstmc.protocol.bedrock.codec.compat.serializer.RequestNetworkSettingsSerializerCompat;
7+
import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.DisconnectSerializer_v291;
8+
import org.cloudburstmc.protocol.bedrock.codec.v622.Bedrock_v622;
9+
import org.cloudburstmc.protocol.bedrock.codec.v622.serializer.DisconnectSerializer_v622;
10+
import org.cloudburstmc.protocol.bedrock.codec.v712.Bedrock_v712;
11+
import org.cloudburstmc.protocol.bedrock.codec.v712.serializer.DisconnectSerializer_v712;
812
import org.cloudburstmc.protocol.bedrock.data.PacketRecipient;
913
import org.cloudburstmc.protocol.bedrock.packet.DisconnectPacket;
1014
import org.cloudburstmc.protocol.bedrock.packet.LoginPacket;
@@ -14,22 +18,52 @@
1418
public class BedrockCompat {
1519
/**
1620
* This is for servers when figuring out the protocol of a client joining.
21+
* Certain protocols that are older will need to use {@link #disconnectCompat(int)} before disconnecting,
22+
* in order for the client to see a proper disconnect message.
1723
*/
1824
public static BedrockCodec CODEC = BedrockCodec.builder()
1925
.helper(() -> NoopBedrockCodecHelper.INSTANCE)
2026
.registerPacket(LoginPacket::new, LoginSerializerCompat.INSTANCE, 1, PacketRecipient.SERVER)
2127
.registerPacket(PlayStatusPacket::new, PlayStatusSerializerCompat.INSTANCE, 2, PacketRecipient.CLIENT)
22-
.registerPacket(DisconnectPacket::new, new DisconnectSerializerCompat(true), 5, PacketRecipient.BOTH)
28+
.registerPacket(DisconnectPacket::new, DisconnectSerializer_v712.INSTANCE, 5, PacketRecipient.BOTH)
2329
.registerPacket(RequestNetworkSettingsPacket::new, RequestNetworkSettingsSerializerCompat.INSTANCE, 193, PacketRecipient.SERVER)
2430
.protocolVersion(0)
2531
.minecraftVersion("0.0.0")
2632
.build();
2733

2834
/**
29-
* This is legacy version of the compat codec which does not use DisconnectFailReason in DisconnectPacket.
30-
* Use this for servers that do not support Minecraft: Bedrock Edition 1.20.40 and above.
35+
* A legacy version of the compat codec which does not use DisconnectFailReason in DisconnectPacket.
36+
* Use this for protocols lower than v622
3137
*/
32-
public static BedrockCodec CODEC_LEGACY = CODEC.toBuilder()
33-
.updateSerializer(DisconnectPacket.class, new DisconnectSerializerCompat(false))
38+
public static BedrockCodec CODEC_v291 = CODEC.toBuilder()
39+
.updateSerializer(DisconnectPacket.class, DisconnectSerializer_v291.INSTANCE)
3440
.build();
41+
42+
/**
43+
* A legacy version of the compat codec which does not use filteredMessage in DisconnectPacket.
44+
* Use this for protocols equal to or greater than v622, but less than v712
45+
*/
46+
public static BedrockCodec CODEC_v622 = CODEC.toBuilder()
47+
.updateSerializer(DisconnectPacket.class, DisconnectSerializer_v622.INSTANCE)
48+
.build();
49+
50+
/**
51+
* Certain older protocols have outdated {@link DisconnectPacket} formats.
52+
* Using the codec provided by this method before disconnecting a client will always
53+
* ensure they receive a well-formed DisconnectPacket.
54+
* <p>
55+
* Note that this compat codec should only be used if disconnecting the client upon receiving
56+
* its protocol version. Otherwise, use a proper codec that targets the specific protocol.
57+
*
58+
* @param protocolVersion the client's protocol version
59+
* @return a compat codec suitable for disconnecting
60+
*/
61+
public static BedrockCodec disconnectCompat(int protocolVersion) {
62+
if (protocolVersion < Bedrock_v622.CODEC.getProtocolVersion()) {
63+
return CODEC_v291;
64+
} else if (protocolVersion < Bedrock_v712.CODEC.getProtocolVersion()) {
65+
return CODEC_v622;
66+
}
67+
return CODEC; // v712 or above
68+
}
3569
}

bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/codec/compat/serializer/DisconnectSerializerCompat.java

-40
This file was deleted.

0 commit comments

Comments
 (0)