summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew <pugmatt@gmail.com>2021-03-15 20:36:40 -0400
committerMatthew <pugmatt@gmail.com>2021-03-15 20:36:40 -0400
commitce07489fb06d06614943515b5e5cd6656832b8a5 (patch)
tree1961603e1a9f952e73b4202e84de70fe90ed5a07
parent9be0412233ac4f3fa488f19325dec56966d85aaf (diff)
downloadBedrockConnect-ce07489fb06d06614943515b5e5cd6656832b8a5.tar.gz
BedrockConnect-ce07489fb06d06614943515b5e5cd6656832b8a5.tar.bz2
BedrockConnect-ce07489fb06d06614943515b5e5cd6656832b8a5.zip
Add multi-version support
-rw-r--r--serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java17
-rw-r--r--serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java21
-rw-r--r--serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java47
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;
+ }
+}