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; + } }