diff options
| author | Matthew <pugmatt@gmail.com> | 2021-03-15 20:36:40 -0400 |
|---|---|---|
| committer | Matthew <pugmatt@gmail.com> | 2021-03-15 20:36:40 -0400 |
| commit | ce07489fb06d06614943515b5e5cd6656832b8a5 (patch) | |
| tree | 1961603e1a9f952e73b4202e84de70fe90ed5a07 | |
| parent | 9be0412233ac4f3fa488f19325dec56966d85aaf (diff) | |
| download | BedrockConnect-ce07489fb06d06614943515b5e5cd6656832b8a5.tar.gz BedrockConnect-ce07489fb06d06614943515b5e5cd6656832b8a5.tar.bz2 BedrockConnect-ce07489fb06d06614943515b5e5cd6656832b8a5.zip | |
Add multi-version support
3 files changed, 66 insertions, 19 deletions
diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java index e2a2b41..a31fd25 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; import com.nukkitx.protocol.bedrock.*; import com.nukkitx.protocol.bedrock.v428.Bedrock_v428; import main.com.pyratron.pugmatt.bedrockconnect.listeners.PacketHandler; +import main.com.pyratron.pugmatt.bedrockconnect.utils.BedrockProtocol; import javax.annotation.Nonnull; @@ -20,16 +21,6 @@ public class Server { public BedrockServer server; public BedrockPong pong; - public static BedrockPacketCodec codec; - - public int getProtocol() { - return codec.getProtocolVersion(); - } - - public BedrockPacketCodec getCodec() { - return codec; - } - public static final ObjectMapper JSON_MAPPER = new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); public static final YAMLMapper YAML_MAPPER = (YAMLMapper) new YAMLMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); @@ -63,7 +54,7 @@ public class Server { players = new ArrayList<>(); InetSocketAddress bindAddress = new InetSocketAddress("0.0.0.0", Integer.parseInt(port)); - codec = Bedrock_v428.V428_CODEC; + server = new BedrockServer(bindAddress); pong = new BedrockPong(); pong.setEdition("MCPE"); @@ -73,8 +64,8 @@ public class Server { pong.setMaximumPlayerCount(20); pong.setGameType("Survival"); pong.setIpv4Port(Integer.parseInt(port)); - pong.setProtocolVersion(codec.getProtocolVersion()); - pong.setVersion(codec.getMinecraftVersion()); + pong.setProtocolVersion(BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()); + pong.setVersion(BedrockProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion()); server.setHandler(new BedrockServerEventHandler() { @Override public boolean onConnectionRequest(InetSocketAddress address) { diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java index 88ce095..29c1529 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java @@ -9,6 +9,7 @@ import com.nukkitx.math.vector.Vector3f; import com.nukkitx.nbt.NbtUtils; import com.nukkitx.network.util.Preconditions; import com.nukkitx.protocol.bedrock.BedrockClient; +import com.nukkitx.protocol.bedrock.BedrockPacketCodec; import com.nukkitx.protocol.bedrock.data.AttributeData; import com.nukkitx.protocol.bedrock.packet.*; import com.nimbusds.jose.JOSEException; @@ -32,6 +33,7 @@ import main.com.pyratron.pugmatt.bedrockconnect.Whitelist; import main.com.pyratron.pugmatt.bedrockconnect.gui.MainFormButton; import main.com.pyratron.pugmatt.bedrockconnect.gui.UIComponents; import main.com.pyratron.pugmatt.bedrockconnect.gui.UIForms; +import main.com.pyratron.pugmatt.bedrockconnect.utils.BedrockProtocol; import net.minidev.json.JSONObject; import java.io.ByteArrayOutputStream; @@ -313,7 +315,7 @@ public class PacketHandler implements BedrockPacketHandler { ResourcePackStackPacket rs = new ResourcePackStackPacket(); //rs.setExperimental(false); rs.setForcedToAccept(false); - rs.setGameVersion(Server.codec.getMinecraftVersion()); + rs.setGameVersion("*"); session.sendPacket(rs); break; default: @@ -328,17 +330,24 @@ public class PacketHandler implements BedrockPacketHandler { @Override public boolean handle(LoginPacket packet) { - int protocolVersion = packet.getProtocolVersion(); - if (protocolVersion != server.getProtocol()) { + BedrockPacketCodec packetCodec = BedrockProtocol.getBedrockCodec(packet.getProtocolVersion()); + + if (packetCodec == null) { + session.setPacketCodec(BedrockProtocol.DEFAULT_BEDROCK_CODEC); + PlayStatusPacket status = new PlayStatusPacket(); - if (protocolVersion > server.getProtocol()) { + + if (packet.getProtocolVersion() > BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { status.setStatus(PlayStatusPacket.Status.LOGIN_FAILED_SERVER_OLD); - } else { + } + else if (packet.getProtocolVersion() < BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { status.setStatus(PlayStatusPacket.Status.LOGIN_FAILED_CLIENT_OLD); } + session.sendPacket(status); } - session.setPacketCodec(server.getCodec()); + + session.setPacketCodec(packetCodec); JsonNode certData; try { diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java new file mode 100644 index 0000000..f23fd9b --- /dev/null +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java @@ -0,0 +1,47 @@ +package main.com.pyratron.pugmatt.bedrockconnect.utils; + +import com.nukkitx.protocol.bedrock.BedrockPacketCodec; +import com.nukkitx.protocol.bedrock.v419.Bedrock_v419; +import com.nukkitx.protocol.bedrock.v422.Bedrock_v422; +import com.nukkitx.protocol.bedrock.v428.Bedrock_v428; + +import java.util.ArrayList; +import java.util.List; + +// Referenced from: https://github.com/GeyserMC/Geyser/blob/master/connector/src/main/java/org/geysermc/connector/network/BedrockProtocol.java + +public class BedrockProtocol { + /** + * Latest available version + */ + public static final BedrockPacketCodec DEFAULT_BEDROCK_CODEC = Bedrock_v428.V428_CODEC; + + /** + * A list of all supported Bedrock versions that can join BedrockConnect + */ + public static final List<BedrockPacketCodec> SUPPORTED_BEDROCK_CODECS = new ArrayList<>(); + + static { + SUPPORTED_BEDROCK_CODECS.add(Bedrock_v419.V419_CODEC.toBuilder() + .minecraftVersion("1.16.100/1.16.101") + .build()); + SUPPORTED_BEDROCK_CODECS.add(Bedrock_v422.V422_CODEC.toBuilder() + .minecraftVersion("1.16.200/1.16.201") + .build()); + SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC); + } + + /** + * Gets the {@link BedrockPacketCodec} of the given protocol version. + * @param protocolVersion The protocol version to attempt to find + * @return The packet codec, or null if the client's protocol is unsupported + */ + public static BedrockPacketCodec getBedrockCodec(int protocolVersion) { + for (BedrockPacketCodec packetCodec : SUPPORTED_BEDROCK_CODECS) { + if (packetCodec.getProtocolVersion() == protocolVersion) { + return packetCodec; + } + } + return null; + } +} |
