diff --git a/pom.xml b/pom.xml
index be38f36..a7e90ba 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,9 +66,9 @@
provided
- org.geysermc
+ org.geysermc.geyser
core
- 2.0.7-SNAPSHOT
+ 2.1.0-SNAPSHOT
net.minecrell
diff --git a/src/main/java/org/geysermc/connect/MasterServer.java b/src/main/java/org/geysermc/connect/MasterServer.java
index 374ae96..b40a013 100644
--- a/src/main/java/org/geysermc/connect/MasterServer.java
+++ b/src/main/java/org/geysermc/connect/MasterServer.java
@@ -35,7 +35,7 @@ import org.geysermc.connect.storage.AbstractStorageManager;
import org.geysermc.connect.storage.DisabledStorageManager;
import org.geysermc.connect.utils.*;
import org.geysermc.geyser.GeyserImpl;
-import org.geysermc.geyser.network.MinecraftProtocol;
+import org.geysermc.geyser.network.GameProtocol;
import org.geysermc.geyser.util.FileUtils;
import java.io.File;
@@ -154,8 +154,8 @@ public class MasterServer {
bdPong.setMaximumPlayerCount(geyserConnectConfig.getMaxPlayers());
bdPong.setGameType("Survival");
bdPong.setIpv4Port(port);
- bdPong.setProtocolVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion());
- bdPong.setVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion());
+ bdPong.setProtocolVersion(GameProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion());
+ bdPong.setVersion(GameProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion());
return bdPong;
}
diff --git a/src/main/java/org/geysermc/connect/PacketHandler.java b/src/main/java/org/geysermc/connect/PacketHandler.java
index 53b05b2..c989ce3 100644
--- a/src/main/java/org/geysermc/connect/PacketHandler.java
+++ b/src/main/java/org/geysermc/connect/PacketHandler.java
@@ -39,10 +39,12 @@ import com.nukkitx.protocol.bedrock.BedrockPacketCodec;
import com.nukkitx.protocol.bedrock.BedrockServerSession;
import com.nukkitx.protocol.bedrock.data.AttributeData;
import com.nukkitx.protocol.bedrock.data.ExperimentData;
+import com.nukkitx.protocol.bedrock.data.PacketCompressionAlgorithm;
import com.nukkitx.protocol.bedrock.handler.BedrockPacketHandler;
import com.nukkitx.protocol.bedrock.packet.*;
import com.nukkitx.protocol.bedrock.util.EncryptionUtils;
import com.nukkitx.protocol.bedrock.v471.Bedrock_v471;
+import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.connect.proxy.GeyserProxySession;
import org.geysermc.connect.ui.FormID;
import org.geysermc.connect.ui.UIHandler;
@@ -54,12 +56,13 @@ import org.geysermc.cumulus.response.CustomFormResponse;
import org.geysermc.cumulus.response.FormResponse;
import org.geysermc.cumulus.response.SimpleFormResponse;
import org.geysermc.geyser.GeyserImpl;
+import org.geysermc.geyser.api.network.AuthType;
+import org.geysermc.geyser.api.network.RemoteServer;
import org.geysermc.geyser.entity.attribute.GeyserAttributeType;
-import org.geysermc.geyser.network.MinecraftProtocol;
+import org.geysermc.geyser.network.GameProtocol;
import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.session.PendingMicrosoftAuthentication.*;
import org.geysermc.geyser.session.auth.AuthData;
-import org.geysermc.geyser.session.auth.AuthType;
import org.geysermc.geyser.session.auth.BedrockClientData;
import org.geysermc.geyser.util.FileUtils;
@@ -96,20 +99,34 @@ public class PacketHandler implements BedrockPacketHandler {
}
}
- @Override
- public boolean handle(LoginPacket packet) {
- masterServer.getLogger().debug("Login: " + packet.toString());
+ private boolean checkedProtocol = false;
- BedrockPacketCodec packetCodec = MinecraftProtocol.getBedrockCodec(packet.getProtocolVersion());
+ @Override
+ public boolean handle(RequestNetworkSettingsPacket packet) {
+ if (checkProtocol(packet.getProtocolVersion())) {
+ PacketCompressionAlgorithm algorithm = PacketCompressionAlgorithm.ZLIB;
+
+ NetworkSettingsPacket responsePacket = new NetworkSettingsPacket();
+ responsePacket.setCompressionAlgorithm(algorithm);
+ responsePacket.setCompressionThreshold(512);
+ session.sendPacketImmediately(responsePacket);
+
+ session.setCompression(algorithm);
+ }
+ return true;
+ }
+
+ private boolean checkProtocol(int protocolVersion) {
+ BedrockPacketCodec packetCodec = GameProtocol.getBedrockCodec(protocolVersion);
if (packetCodec == null) {
- session.setPacketCodec(MinecraftProtocol.DEFAULT_BEDROCK_CODEC);
+ session.setPacketCodec(GameProtocol.DEFAULT_BEDROCK_CODEC);
String message = "disconnectionScreen.internalError.cantConnect";
PlayStatusPacket status = new PlayStatusPacket();
- if (packet.getProtocolVersion() > MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) {
+ if (protocolVersion > GameProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) {
status.setStatus(PlayStatusPacket.Status.LOGIN_FAILED_SERVER_OLD);
message = "disconnectionScreen.outdatedServer";
- } else if (packet.getProtocolVersion() < MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) {
+ } else if (protocolVersion < GameProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) {
status.setStatus(PlayStatusPacket.Status.LOGIN_FAILED_CLIENT_OLD);
message = "disconnectionScreen.outdatedClient";
}
@@ -121,6 +138,19 @@ public class PacketHandler implements BedrockPacketHandler {
// Set the session codec
session.setPacketCodec(packetCodec);
+ return true;
+ }
+
+ @Override
+ public boolean handle(LoginPacket packet) {
+ masterServer.getLogger().debug("Login: " + packet.toString());
+
+ if (!checkedProtocol) {
+ if (!checkProtocol(packet.getProtocolVersion())) {
+ return false;
+ }
+ checkedProtocol = true;
+ }
// Read the raw chain data
JsonNode rawChainData;
@@ -224,9 +254,7 @@ public class PacketHandler implements BedrockPacketHandler {
int port = task.getPort();
player.setCurrentServer(new Server(address, port, true, false));
GeyserProxySession session = player.createGeyserSession(false);
- session.setRemoteAddress(address);
- session.setRemotePort(port);
- session.setRemoteAuthType(AuthType.ONLINE);
+ session.remoteServer(player.getCurrentServer());
session.onMicrosoftLoginComplete(task);
} else {
@@ -239,7 +267,7 @@ public class PacketHandler implements BedrockPacketHandler {
stack.setForcedToAccept(false);
stack.setGameVersion("*");
- if (Registries.ITEMS.forVersion(session.getPacketCodec().getProtocolVersion()).getFurnaceMinecartData() != null) {
+ if (!Registries.ITEMS.forVersion(session.getPacketCodec().getProtocolVersion()).getComponentItemData().isEmpty()) {
// Allow custom items to work
stack.getExperiments().add(new ExperimentData("data_driven_items", true));
}
diff --git a/src/main/java/org/geysermc/connect/proxy/GeyserProxyBootstrap.java b/src/main/java/org/geysermc/connect/proxy/GeyserProxyBootstrap.java
index d1ea323..3b06e5b 100644
--- a/src/main/java/org/geysermc/connect/proxy/GeyserProxyBootstrap.java
+++ b/src/main/java/org/geysermc/connect/proxy/GeyserProxyBootstrap.java
@@ -32,7 +32,7 @@ import org.geysermc.connect.GeyserConnectConfig;
import org.geysermc.connect.MasterServer;
import org.geysermc.geyser.GeyserBootstrap;
import org.geysermc.geyser.GeyserImpl;
-import org.geysermc.geyser.command.CommandManager;
+import org.geysermc.geyser.command.GeyserCommandManager;
import org.geysermc.geyser.configuration.GeyserConfiguration;
import org.geysermc.geyser.dump.BootstrapDumpInfo;
import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough;
@@ -92,7 +92,8 @@ public class GeyserProxyBootstrap implements GeyserBootstrap {
GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger);
// Create the connector and command manager
- geyser = GeyserImpl.start(PlatformType.STANDALONE, this);
+ geyser = GeyserImpl.load(PlatformType.STANDALONE, this);
+ GeyserImpl.start();
geyserCommandManager = new GeyserProxyCommandManager(geyser);
// Start the ping passthrough thread, again don't think there is a point
@@ -118,7 +119,7 @@ public class GeyserProxyBootstrap implements GeyserBootstrap {
}
@Override
- public CommandManager getGeyserCommandManager() {
+ public GeyserCommandManager getGeyserCommandManager() {
return geyserCommandManager;
}
diff --git a/src/main/java/org/geysermc/connect/proxy/GeyserProxyCommandManager.java b/src/main/java/org/geysermc/connect/proxy/GeyserProxyCommandManager.java
index c3635b9..962835c 100644
--- a/src/main/java/org/geysermc/connect/proxy/GeyserProxyCommandManager.java
+++ b/src/main/java/org/geysermc/connect/proxy/GeyserProxyCommandManager.java
@@ -26,16 +26,16 @@
package org.geysermc.connect.proxy;
import org.geysermc.geyser.GeyserImpl;
-import org.geysermc.geyser.command.CommandManager;
+import org.geysermc.geyser.command.GeyserCommandManager;
-public class GeyserProxyCommandManager extends CommandManager {
+public class GeyserProxyCommandManager extends GeyserCommandManager {
public GeyserProxyCommandManager(GeyserImpl geyser) {
super(geyser);
}
@Override
- public String getDescription(String command) {
+ public String description(String command) {
return ""; // this is not sent over the protocol, so we return none
}
}
diff --git a/src/main/java/org/geysermc/connect/utils/Player.java b/src/main/java/org/geysermc/connect/utils/Player.java
index 8f65e03..972fc44 100644
--- a/src/main/java/org/geysermc/connect/utils/Player.java
+++ b/src/main/java/org/geysermc/connect/utils/Player.java
@@ -33,7 +33,6 @@ import com.nukkitx.nbt.NbtMap;
import com.nukkitx.protocol.bedrock.BedrockServerSession;
import com.nukkitx.protocol.bedrock.data.*;
import com.nukkitx.protocol.bedrock.packet.*;
-import com.nukkitx.protocol.bedrock.v471.Bedrock_v471;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
import lombok.Getter;
@@ -43,13 +42,12 @@ import org.geysermc.connect.proxy.GeyserProxySession;
import org.geysermc.connect.ui.FormID;
import org.geysermc.cumulus.Form;
import org.geysermc.geyser.GeyserImpl;
-import org.geysermc.geyser.level.BedrockDimension;
+import org.geysermc.geyser.api.network.AuthType;
import org.geysermc.geyser.network.UpstreamPacketHandler;
import org.geysermc.geyser.registry.BlockRegistries;
import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.registry.type.ItemMappings;
import org.geysermc.geyser.session.auth.AuthData;
-import org.geysermc.geyser.session.auth.AuthType;
import org.geysermc.geyser.session.auth.BedrockClientData;
import org.geysermc.geyser.util.ChunkUtils;
import org.geysermc.geyser.util.DimensionUtils;
@@ -159,9 +157,9 @@ public class Player {
startGamePacket.setVanillaVersion("*");
session.sendPacket(startGamePacket);
- if (itemMappings.getFurnaceMinecartData() != null) {
+ if (!itemMappings.getComponentItemData().isEmpty()) {
ItemComponentPacket itemComponentPacket = new ItemComponentPacket();
- itemComponentPacket.getItems().add(itemMappings.getFurnaceMinecartData());
+ itemComponentPacket.getItems().addAll(itemMappings.getComponentItemData());
session.sendPacket(itemComponentPacket);
}
@@ -242,9 +240,7 @@ public class Player {
geyserSession.setDimension(DimensionUtils.THE_END);
- geyserSession.setRemoteAddress(currentServer.getAddress());
- geyserSession.setRemotePort(currentServer.getPort());
- geyserSession.setRemoteAuthType(currentServer.isOnline() ? AuthType.ONLINE : AuthType.OFFLINE);
+ geyserSession.remoteServer(currentServer);
// Tell Geyser to handle the login
SetLocalPlayerAsInitializedPacket initializedPacket = new SetLocalPlayerAsInitializedPacket();
@@ -258,7 +254,7 @@ public class Player {
}
}
- if (geyserSession.getRemoteAuthType() != AuthType.ONLINE) {
+ if (geyserSession.remoteServer().authType() != AuthType.ONLINE) {
geyserSession.authenticate(geyserSession.getAuthData().name());
}
}
diff --git a/src/main/java/org/geysermc/connect/utils/Server.java b/src/main/java/org/geysermc/connect/utils/Server.java
index a7da7a2..2777f45 100644
--- a/src/main/java/org/geysermc/connect/utils/Server.java
+++ b/src/main/java/org/geysermc/connect/utils/Server.java
@@ -29,12 +29,15 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
+import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.cumulus.util.FormImage;
+import org.geysermc.geyser.api.network.AuthType;
+import org.geysermc.geyser.api.network.RemoteServer;
@Getter
@AllArgsConstructor
@NoArgsConstructor
-public class Server {
+public class Server implements RemoteServer {
private String address;
private int port = -1;
@@ -85,4 +88,29 @@ public class Server {
return FormImage.of(FormImage.Type.URL, "https://eu.mc-api.net/v3/server/favicon/" + address + ":" + port + ".png?use-fallback-icon=true");
}
}
+
+ @Override
+ public String address() {
+ return address;
+ }
+
+ @Override
+ public int port() {
+ return port;
+ }
+
+ @Override
+ public @NonNull AuthType authType() {
+ return this.online ? AuthType.ONLINE : AuthType.OFFLINE;
+ }
+
+ @Override
+ public String minecraftVersion() {
+ return null;
+ }
+
+ @Override
+ public int protocolVersion() {
+ return 0;
+ }
}