diff --git a/network b/network index dcea2ba..9f3c0b7 160000 --- a/network +++ b/network @@ -1 +1 @@ -Subproject commit dcea2bab06ab35a53912b686a7dc59e0eb5bf62a +Subproject commit 9f3c0b7e72fb6f8934a7d36a518c74afe02c8a6d diff --git a/src/main/java/org/cloudburstmc/proxypass/ProxyPass.java b/src/main/java/org/cloudburstmc/proxypass/ProxyPass.java index 2c97375..26c6487 100644 --- a/src/main/java/org/cloudburstmc/proxypass/ProxyPass.java +++ b/src/main/java/org/cloudburstmc/proxypass/ProxyPass.java @@ -12,9 +12,11 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import dev.kastle.netty.channel.nethernet.NetherNetChannelFactory; +import dev.kastle.netty.channel.nethernet.config.NetherChannelOption; import dev.kastle.netty.channel.nethernet.config.NetherNetAddress; import dev.kastle.netty.channel.nethernet.signaling.NetherNetClientSignaling; import dev.kastle.netty.channel.nethernet.signaling.NetherNetDiscoverySignaling; +import dev.kastle.netty.channel.nethernet.signaling.NetherNetXboxRpcSignaling; import dev.kastle.netty.channel.nethernet.signaling.NetherNetServerSignaling; import dev.kastle.netty.channel.nethernet.signaling.NetherNetXboxSignaling; import dev.kastle.webrtc.PeerConnectionFactory; @@ -160,6 +162,7 @@ public void writeObjectFieldValueSeparator(JsonGenerator generator) throws IOExc private SocketAddress targetAddress; private InetSocketAddress proxyAddress; private Configuration configuration; + private ServerAddress serverAddress; private Path baseDir; private Path sessionsDir; private Path dataDir; @@ -230,8 +233,8 @@ public void boot() throws IOException { } } - ServerAddress serverAddress = new ServerAddress(configuration.getDestination(), account, client); - targetAddress = serverAddress.getAddress(); + this.serverAddress = new ServerAddress(configuration.getDestination(), account, client); + this.targetAddress = serverAddress.getAddress(); Object object = this.loadGzipNBT("block_palette.nbt"); @@ -360,9 +363,15 @@ public void newClient(SocketAddress socketAddress, Consumer NetherNetClientSignaling signaling; if (socketAddress instanceof NetherNetAddress) { - signaling = new NetherNetXboxSignaling( - account.authManager().getMinecraftSession().getCached().getAuthorizationHeader() - ); + if (this.serverAddress.getNetworkProtocol().equalsIgnoreCase("NETHERNET_JSONRPC")) { + signaling = new NetherNetXboxRpcSignaling( + account.authManager().getMinecraftSession().getCached().getAuthorizationHeader() + ); + } else { + signaling = new NetherNetXboxSignaling( + account.authManager().getMinecraftSession().getCached().getAuthorizationHeader() + ); + } } else { signaling = new NetherNetDiscoverySignaling(); } @@ -398,6 +407,7 @@ protected void initSession(ProxyClientSession session) { }); } else { bootstrap + .option(NetherChannelOption.NETHER_CLIENT_HANDSHAKE_TIMEOUT_MS, 6000) .handler(new NetherNetBedrockChannelInitializer() { @Override protected ProxyClientSession createSession0(BedrockPeer peer, int subClientId) { diff --git a/src/main/java/org/cloudburstmc/proxypass/network/bedrock/session/ServerAddress.java b/src/main/java/org/cloudburstmc/proxypass/network/bedrock/session/ServerAddress.java index dafcb4e..458f852 100644 --- a/src/main/java/org/cloudburstmc/proxypass/network/bedrock/session/ServerAddress.java +++ b/src/main/java/org/cloudburstmc/proxypass/network/bedrock/session/ServerAddress.java @@ -30,6 +30,8 @@ public class ServerAddress { @Getter private SocketAddress address; + @Getter + private String networkProtocol; private String host; private int port; @@ -125,19 +127,19 @@ public ServerAddress(Destination destination, Account account, HttpClient client throw new IllegalArgumentException("Realms API provided no server address!"); } + this.networkProtocol = protocol; + if (protocol.equalsIgnoreCase("NETHERNET")) { this.address = new NetherNetAddress(fullAddress); return; - } else { - String[] parts = fullAddress.split(":"); - this.host = parts[0]; - if (parts.length > 1) { - this.port = Integer.parseInt(parts[1]); - } else { - this.port = 19132; - } - log.info("Resolved Realm '{}' to {}:{}", realmName, this.host, this.port); } + + if (protocol.equalsIgnoreCase("NETHERNET_JSONRPC")) { + this.address = new NetherNetAddress(fullAddress); + return; + } + + throw new IllegalArgumentException("Unsupported Realms network protocol: " + protocol); } else { log.warn("Could not find Realm with name: {}", realmName); } @@ -181,6 +183,7 @@ public ServerAddress(Destination destination, Account account, HttpClient client } this.host = experience.getResult().getIpV4Address(); this.port = experience.getResult().getPort(); + this.networkProtocol = experience.getResult().getNetworkProtocol(); log.info("Resolved experience ID {} to {}:{}", experienceId, this.host, this.port); } catch (IOException e) { log.error("Failed to fetch experience", e);