diff --git a/pom.xml b/pom.xml index 3a98fd6..0bbd5af 100644 --- a/pom.xml +++ b/pom.xml @@ -67,8 +67,8 @@ org.geysermc - connector - 1.4.3-SNAPSHOT + core + 2.0.0-SNAPSHOT com.nukkitx.network diff --git a/src/main/java/org/geysermc/connect/MasterServer.java b/src/main/java/org/geysermc/connect/MasterServer.java index 2d82041..9034134 100644 --- a/src/main/java/org/geysermc/connect/MasterServer.java +++ b/src/main/java/org/geysermc/connect/MasterServer.java @@ -30,16 +30,16 @@ import io.netty.channel.DefaultEventLoopGroup; import io.netty.util.concurrent.DefaultThreadFactory; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.Getter; -import org.geysermc.connect.storage.DisabledStorageManager; -import org.geysermc.connect.utils.Server; -import org.geysermc.connect.utils.ServerCategory; -import org.geysermc.connector.GeyserConnector; -import org.geysermc.connector.network.BedrockProtocol; -import org.geysermc.connector.utils.FileUtils; import org.geysermc.connect.proxy.GeyserProxyBootstrap; import org.geysermc.connect.storage.AbstractStorageManager; +import org.geysermc.connect.storage.DisabledStorageManager; import org.geysermc.connect.utils.Logger; import org.geysermc.connect.utils.Player; +import org.geysermc.connect.utils.Server; +import org.geysermc.connect.utils.ServerCategory; +import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.network.MinecraftProtocol; +import org.geysermc.geyser.util.FileUtils; import java.io.File; import java.io.IOException; @@ -142,7 +142,7 @@ public class MasterServer { @Override public BedrockPong onQuery(InetSocketAddress address) { - int playerCount = players.size() + GeyserConnector.getInstance().getSessionManager().size(); + int playerCount = players.size() + GeyserImpl.getInstance().getSessionManager().size(); String subMotd = geyserConnectConfig.getSubmotd(); if (subMotd == null || subMotd.isEmpty()) { @@ -157,8 +157,8 @@ public class MasterServer { bdPong.setMaximumPlayerCount(geyserConnectConfig.getMaxPlayers()); bdPong.setGameType("Survival"); bdPong.setIpv4Port(port); - bdPong.setProtocolVersion(BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()); - bdPong.setVersion(BedrockProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion()); + bdPong.setProtocolVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()); + bdPong.setVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion()); return bdPong; } @@ -191,7 +191,7 @@ public class MasterServer { public void createGeyserProxy() { if (geyserProxy == null) { // Make sure Geyser doesn't start the listener - GeyserConnector.setShouldStartListener(false); + GeyserImpl.setShouldStartListener(false); this.geyserProxy = new GeyserProxyBootstrap(); geyserProxy.onEnable(); diff --git a/src/main/java/org/geysermc/connect/PacketHandler.java b/src/main/java/org/geysermc/connect/PacketHandler.java index 9202dda..989815c 100644 --- a/src/main/java/org/geysermc/connect/PacketHandler.java +++ b/src/main/java/org/geysermc/connect/PacketHandler.java @@ -42,20 +42,21 @@ import com.nukkitx.protocol.bedrock.data.ExperimentData; 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.geysermc.connect.ui.FormID; import org.geysermc.connect.ui.UIHandler; import org.geysermc.connect.utils.Player; import org.geysermc.connect.utils.Server; -import org.geysermc.connector.entity.attribute.GeyserAttributeType; -import org.geysermc.connector.network.BedrockProtocol; -import org.geysermc.connector.network.session.auth.AuthData; -import org.geysermc.connector.network.session.auth.BedrockClientData; -import org.geysermc.connector.registry.Registries; -import org.geysermc.connector.utils.FileUtils; import org.geysermc.cumulus.Form; import org.geysermc.cumulus.response.CustomFormResponse; import org.geysermc.cumulus.response.FormResponse; import org.geysermc.cumulus.response.SimpleFormResponse; +import org.geysermc.geyser.entity.attribute.GeyserAttributeType; +import org.geysermc.geyser.network.MinecraftProtocol; +import org.geysermc.geyser.registry.Registries; +import org.geysermc.geyser.session.auth.AuthData; +import org.geysermc.geyser.session.auth.BedrockClientData; +import org.geysermc.geyser.util.FileUtils; import java.io.File; import java.io.IOException; @@ -83,7 +84,7 @@ public class PacketHandler implements BedrockPacketHandler { public void disconnect(DisconnectReason reason) { if (player != null) { - masterServer.getLogger().info(player.getAuthData().getName() + " has disconnected from the master server (" + reason + ")"); + masterServer.getLogger().info(player.getAuthData().name() + " has disconnected from the master server (" + reason + ")"); masterServer.getStorageManager().saveServers(player); masterServer.getPlayers().remove(player); @@ -94,16 +95,16 @@ public class PacketHandler implements BedrockPacketHandler { public boolean handle(LoginPacket packet) { masterServer.getLogger().debug("Login: " + packet.toString()); - BedrockPacketCodec packetCodec = BedrockProtocol.getBedrockCodec(packet.getProtocolVersion()); + BedrockPacketCodec packetCodec = MinecraftProtocol.getBedrockCodec(packet.getProtocolVersion()); if (packetCodec == null) { - session.setPacketCodec(BedrockProtocol.DEFAULT_BEDROCK_CODEC); + session.setPacketCodec(MinecraftProtocol.DEFAULT_BEDROCK_CODEC); String message = "disconnectionScreen.internalError.cantConnect"; PlayStatusPacket status = new PlayStatusPacket(); - if (packet.getProtocolVersion() > BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { + if (packet.getProtocolVersion() > MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { status.setStatus(PlayStatusPacket.Status.LOGIN_FAILED_SERVER_OLD); message = "disconnectionScreen.outdatedServer"; - } else if (packet.getProtocolVersion() < BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { + } else if (packet.getProtocolVersion() < MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { status.setStatus(PlayStatusPacket.Status.LOGIN_FAILED_CLIENT_OLD); message = "disconnectionScreen.outdatedClient"; } @@ -207,7 +208,7 @@ public class PacketHandler implements BedrockPacketHandler { public boolean handle(ResourcePackClientResponsePacket packet) { switch (packet.getStatus()) { case COMPLETED: - masterServer.getLogger().info("Logged in " + player.getAuthData().getName() + " (" + player.getAuthData().getXboxUUID() + ", " + player.getAuthData().getUUID() + ")"); + masterServer.getLogger().info("Logged in " + player.getAuthData().name() + " (" + player.getAuthData().xuid() + ", " + player.getAuthData().uuid() + ")"); player.sendStartGame(); break; case HAVE_ALL_PACKS: @@ -221,6 +222,11 @@ public class PacketHandler implements BedrockPacketHandler { stack.getExperiments().add(new ExperimentData("data_driven_items", true)); } + if (session.getPacketCodec().getProtocolVersion() <= Bedrock_v471.V471_CODEC.getProtocolVersion()) { + // Allow extended world height in the overworld to work for pre-1.18 clients + stack.getExperiments().add(new ExperimentData("caves_and_cliffs", true)); + } + session.sendPacket(stack); break; default: @@ -233,7 +239,7 @@ public class PacketHandler implements BedrockPacketHandler { @Override public boolean handle(SetLocalPlayerAsInitializedPacket packet) { - masterServer.getLogger().debug("Player initialized: " + player.getAuthData().getName()); + masterServer.getLogger().debug("Player initialized: " + player.getAuthData().name()); // Handle the virtual host if specified GeyserConnectConfig.VirtualHostSection vhost = MasterServer.getInstance().getGeyserConnectConfig().getVhost(); @@ -264,7 +270,7 @@ public class PacketHandler implements BedrockPacketHandler { } // Log the virtual host usage - masterServer.getLogger().info(player.getAuthData().getName() + " is using virtualhost: " + address + ":" + port + (!online ? " (offline)" : "")); + masterServer.getLogger().info(player.getAuthData().name() + " is using virtualhost: " + address + ":" + port + (!online ? " (offline)" : "")); // Send the player to the wanted server player.sendToServer(new Server(address, port, online, false)); diff --git a/src/main/java/org/geysermc/connect/proxy/GeyserProxyBootstrap.java b/src/main/java/org/geysermc/connect/proxy/GeyserProxyBootstrap.java index 8512b28..8c82d37 100644 --- a/src/main/java/org/geysermc/connect/proxy/GeyserProxyBootstrap.java +++ b/src/main/java/org/geysermc/connect/proxy/GeyserProxyBootstrap.java @@ -28,15 +28,15 @@ package org.geysermc.connect.proxy; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import org.geysermc.common.PlatformType; -import org.geysermc.connector.GeyserConnector; -import org.geysermc.connector.bootstrap.GeyserBootstrap; -import org.geysermc.connector.command.CommandManager; -import org.geysermc.connector.configuration.GeyserConfiguration; -import org.geysermc.connector.dump.BootstrapDumpInfo; -import org.geysermc.connector.ping.GeyserLegacyPingPassthrough; -import org.geysermc.connector.ping.IGeyserPingPassthrough; 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.configuration.GeyserConfiguration; +import org.geysermc.geyser.dump.BootstrapDumpInfo; +import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough; +import org.geysermc.geyser.ping.IGeyserPingPassthrough; import java.io.BufferedReader; import java.io.IOException; @@ -54,7 +54,7 @@ public class GeyserProxyBootstrap implements GeyserBootstrap { private GeyserProxyLogger geyserLogger; private IGeyserPingPassthrough geyserPingPassthrough; - private GeyserConnector connector; + private GeyserImpl geyser; @Override public void onEnable() { @@ -83,19 +83,19 @@ public class GeyserProxyBootstrap implements GeyserBootstrap { GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger); // Create the connector and command manager - connector = GeyserConnector.start(PlatformType.STANDALONE, this); - geyserCommandManager = new GeyserProxyCommandManager(connector); + geyser = GeyserImpl.start(PlatformType.STANDALONE, this); + geyserCommandManager = new GeyserProxyCommandManager(geyser); // Start the ping passthrough thread, again don't think there is a point - geyserPingPassthrough = GeyserLegacyPingPassthrough.init(connector); + geyserPingPassthrough = GeyserLegacyPingPassthrough.init(geyser); // Swap the normal handler to our custom handler so we can change some - connector.getBedrockServer().setHandler(new ProxyConnectorServerEventHandler(connector)); + geyser.getBedrockServer().setHandler(new ProxyConnectorServerEventHandler(geyser)); } @Override public void onDisable() { - connector.shutdown(); + geyser.shutdown(); } @Override diff --git a/src/main/java/org/geysermc/connect/proxy/GeyserProxyCommandManager.java b/src/main/java/org/geysermc/connect/proxy/GeyserProxyCommandManager.java index 8fef7a7..c3635b9 100644 --- a/src/main/java/org/geysermc/connect/proxy/GeyserProxyCommandManager.java +++ b/src/main/java/org/geysermc/connect/proxy/GeyserProxyCommandManager.java @@ -25,13 +25,13 @@ package org.geysermc.connect.proxy; -import org.geysermc.connector.GeyserConnector; -import org.geysermc.connector.command.CommandManager; +import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.command.CommandManager; public class GeyserProxyCommandManager extends CommandManager { - public GeyserProxyCommandManager(GeyserConnector connector) { - super(connector); + public GeyserProxyCommandManager(GeyserImpl geyser) { + super(geyser); } @Override diff --git a/src/main/java/org/geysermc/connect/proxy/GeyserProxyConfiguration.java b/src/main/java/org/geysermc/connect/proxy/GeyserProxyConfiguration.java index c00877e..d7a93ae 100644 --- a/src/main/java/org/geysermc/connect/proxy/GeyserProxyConfiguration.java +++ b/src/main/java/org/geysermc/connect/proxy/GeyserProxyConfiguration.java @@ -27,7 +27,7 @@ package org.geysermc.connect.proxy; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Getter; -import org.geysermc.connector.configuration.GeyserJacksonConfiguration; +import org.geysermc.geyser.configuration.GeyserJacksonConfiguration; import java.nio.file.Path; import java.nio.file.Paths; diff --git a/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java b/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java index 580f48f..b842023 100644 --- a/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java +++ b/src/main/java/org/geysermc/connect/proxy/GeyserProxySession.java @@ -27,12 +27,13 @@ package org.geysermc.connect.proxy; import com.nukkitx.protocol.bedrock.BedrockServerSession; import io.netty.channel.EventLoop; -import org.geysermc.connector.GeyserConnector; -import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.session.GeyserSession; public class GeyserProxySession extends GeyserSession { - public GeyserProxySession(GeyserConnector connector, BedrockServerSession bedrockServerSession, EventLoop eventLoop) { - super(connector, bedrockServerSession, eventLoop); + public GeyserProxySession(GeyserImpl geyser, BedrockServerSession bedrockServerSession, EventLoop eventLoop) { + super(geyser, bedrockServerSession, eventLoop); + sentSpawnPacket = true; } @Override diff --git a/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java b/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java index 8551d51..c067813 100644 --- a/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java +++ b/src/main/java/org/geysermc/connect/proxy/ProxyConnectorServerEventHandler.java @@ -26,17 +26,13 @@ package org.geysermc.connect.proxy; import com.nukkitx.protocol.bedrock.BedrockServerSession; -import org.geysermc.connector.GeyserConnector; -import org.geysermc.connector.network.ConnectorServerEventHandler; -import org.geysermc.connect.MasterServer; -import org.geysermc.connect.utils.Player; - -import java.util.concurrent.TimeUnit; +import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.network.ConnectorServerEventHandler; public class ProxyConnectorServerEventHandler extends ConnectorServerEventHandler { - public ProxyConnectorServerEventHandler(GeyserConnector connector) { - super(connector); + public ProxyConnectorServerEventHandler(GeyserImpl geyser) { + super(geyser); } @Override diff --git a/src/main/java/org/geysermc/connect/storage/JsonStorageManager.java b/src/main/java/org/geysermc/connect/storage/JsonStorageManager.java index 6f79913..cd07ed8 100644 --- a/src/main/java/org/geysermc/connect/storage/JsonStorageManager.java +++ b/src/main/java/org/geysermc/connect/storage/JsonStorageManager.java @@ -51,7 +51,7 @@ public class JsonStorageManager extends AbstractStorageManager { @Override public void saveServers(Player player) { try { - mapper.writeValue(dataFolder.resolve(player.getAuthData().getXboxUUID() + ".json").toFile(), player.getServers()); + mapper.writeValue(dataFolder.resolve(player.getAuthData().xuid() + ".json").toFile(), player.getServers()); } catch (IOException ignored) { } } @@ -60,7 +60,7 @@ public class JsonStorageManager extends AbstractStorageManager { List servers = new ArrayList<>(); try { - List loadedServers = mapper.readValue(dataFolder.resolve(player.getAuthData().getXboxUUID() + ".json").toFile(), new TypeReference>(){}); + List loadedServers = mapper.readValue(dataFolder.resolve(player.getAuthData().xuid() + ".json").toFile(), new TypeReference<>(){}); servers.addAll(loadedServers); } catch (IOException ignored) { } diff --git a/src/main/java/org/geysermc/connect/storage/MySQLStorageManager.java b/src/main/java/org/geysermc/connect/storage/MySQLStorageManager.java index 16addc7..a9ae067 100644 --- a/src/main/java/org/geysermc/connect/storage/MySQLStorageManager.java +++ b/src/main/java/org/geysermc/connect/storage/MySQLStorageManager.java @@ -50,9 +50,9 @@ public class MySQLStorageManager extends AbstractStorageManager { GeyserConnectConfig.MySQLConnectionSection connectionInformation = MasterServer.getInstance().getGeyserConnectConfig().getCustomServers().getMysql(); connection = DriverManager.getConnection("jdbc:mysql://" + connectionInformation.getHost() + ":" + connectionInformation.getPort() + "/" + connectionInformation.getDatabase(), connectionInformation.getUser(), connectionInformation.getPass()); - Statement createPlayersTable = connection.createStatement(); - createPlayersTable.executeUpdate("CREATE TABLE IF NOT EXISTS players (xuid VARCHAR(32), servers TEXT, PRIMARY KEY(xuid));"); - createPlayersTable.close(); + try (Statement createPlayersTable = connection.createStatement()) { + createPlayersTable.executeUpdate("CREATE TABLE IF NOT EXISTS players (xuid VARCHAR(32), servers TEXT, PRIMARY KEY(xuid));"); + } } catch (ClassNotFoundException | SQLException e) { MasterServer.getInstance().getLogger().severe("Unable to connect to MySQL database!", e); } @@ -67,10 +67,8 @@ public class MySQLStorageManager extends AbstractStorageManager { @Override public void saveServers(Player player) { - try { - Statement updatePlayersServers = connection.createStatement(); - updatePlayersServers.executeUpdate("REPLACE INTO players(xuid, servers) VALUES('" + player.getAuthData().getXboxUUID() + "', '" + mapper.writeValueAsString(player.getServers()) + "');"); - updatePlayersServers.close(); + try (Statement updatePlayersServers = connection.createStatement()) { + updatePlayersServers.executeUpdate("REPLACE INTO players(xuid, servers) VALUES('" + player.getAuthData().xuid() + "', '" + mapper.writeValueAsString(player.getServers()) + "');"); } catch (IOException | SQLException ignored) { } } @@ -78,16 +76,13 @@ public class MySQLStorageManager extends AbstractStorageManager { public List loadServers(Player player) { List servers = new ArrayList<>(); - try { - Statement getPlayersServers = connection.createStatement(); - ResultSet rs = getPlayersServers.executeQuery("SELECT servers FROM players WHERE xuid='" + player.getAuthData().getXboxUUID() + "';"); + try (Statement getPlayersServers = connection.createStatement()) { + ResultSet rs = getPlayersServers.executeQuery("SELECT servers FROM players WHERE xuid='" + player.getAuthData().xuid() + "';"); while (rs.next()) { - List loadedServers = mapper.readValue(rs.getString("servers"), new TypeReference>(){}); + List loadedServers = mapper.readValue(rs.getString("servers"), new TypeReference<>(){}); servers.addAll(loadedServers); } - - getPlayersServers.close(); } catch (IOException | SQLException ignored) { } return servers; diff --git a/src/main/java/org/geysermc/connect/storage/SQLiteStorageManager.java b/src/main/java/org/geysermc/connect/storage/SQLiteStorageManager.java index 6a3dcfd..a9ec6c0 100644 --- a/src/main/java/org/geysermc/connect/storage/SQLiteStorageManager.java +++ b/src/main/java/org/geysermc/connect/storage/SQLiteStorageManager.java @@ -48,9 +48,9 @@ public class SQLiteStorageManager extends AbstractStorageManager { Class.forName("org.sqlite.JDBC"); connection = DriverManager.getConnection("jdbc:sqlite:players.db"); - Statement createPlayersTable = connection.createStatement(); - createPlayersTable.executeUpdate("CREATE TABLE IF NOT EXISTS players (xuid TEXT, servers TEXT, PRIMARY KEY(xuid));"); - createPlayersTable.close(); + try (Statement createPlayersTable = connection.createStatement()) { + createPlayersTable.executeUpdate("CREATE TABLE IF NOT EXISTS players (xuid TEXT, servers TEXT, PRIMARY KEY(xuid));"); + } } catch (ClassNotFoundException | SQLException e) { MasterServer.getInstance().getLogger().severe("Unable to load sqlite database!", e); } @@ -65,10 +65,8 @@ public class SQLiteStorageManager extends AbstractStorageManager { @Override public void saveServers(Player player) { - try { - Statement updatePlayersServers = connection.createStatement(); - updatePlayersServers.executeUpdate("INSERT OR REPLACE INTO players(xuid, servers) VALUES('" + player.getAuthData().getXboxUUID() + "', '" + mapper.writeValueAsString(player.getServers()) + "');"); - updatePlayersServers.close(); + try (Statement updatePlayersServers = connection.createStatement()) { + updatePlayersServers.executeUpdate("INSERT OR REPLACE INTO players(xuid, servers) VALUES('" + player.getAuthData().xuid() + "', '" + mapper.writeValueAsString(player.getServers()) + "');"); } catch (IOException | SQLException ignored) { } } @@ -76,16 +74,13 @@ public class SQLiteStorageManager extends AbstractStorageManager { public List loadServers(Player player) { List servers = new ArrayList<>(); - try { - Statement getPlayersServers = connection.createStatement(); - ResultSet rs = getPlayersServers.executeQuery("SELECT servers FROM players WHERE xuid='" + player.getAuthData().getXboxUUID() + "';"); + try (Statement getPlayersServers = connection.createStatement()) { + ResultSet rs = getPlayersServers.executeQuery("SELECT servers FROM players WHERE xuid='" + player.getAuthData().xuid() + "';"); while (rs.next()) { - List loadedServers = mapper.readValue(rs.getString("servers"), new TypeReference>() {}); + List loadedServers = mapper.readValue(rs.getString("servers"), new TypeReference<>() {}); servers.addAll(loadedServers); } - - getPlayersServers.close(); } catch (IOException | SQLException ignored) { } return servers; diff --git a/src/main/java/org/geysermc/connect/utils/Logger.java b/src/main/java/org/geysermc/connect/utils/Logger.java index d015c05..ef7c72b 100644 --- a/src/main/java/org/geysermc/connect/utils/Logger.java +++ b/src/main/java/org/geysermc/connect/utils/Logger.java @@ -29,8 +29,8 @@ import lombok.extern.log4j.Log4j2; import net.minecrell.terminalconsole.SimpleTerminalConsole; import org.apache.logging.log4j.core.config.Configurator; import org.geysermc.connect.MasterServer; -import org.geysermc.connector.GeyserLogger; -import org.geysermc.connector.common.ChatColor; +import org.geysermc.geyser.GeyserLogger; +import org.geysermc.geyser.text.ChatColor; @Log4j2 public class Logger extends SimpleTerminalConsole implements GeyserLogger { diff --git a/src/main/java/org/geysermc/connect/utils/PaletteManger.java b/src/main/java/org/geysermc/connect/utils/PaletteManger.java deleted file mode 100644 index e7b124a..0000000 --- a/src/main/java/org/geysermc/connect/utils/PaletteManger.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @author GeyserMC - * @link https://github.com/GeyserMC/GeyserConnect - */ - -package org.geysermc.connect.utils; - -import com.nukkitx.nbt.*; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * This class is mostly copied from core Geyser - */ -public class PaletteManger { - - public static final byte[] EMPTY_LEVEL_CHUNK_DATA; - private static final NbtMap EMPTY_TAG = NbtMap.EMPTY; - - static { - /* Create empty chunk data */ - try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { - outputStream.write(new byte[258]); // Biomes + Border Size + Extra Data Size - - try (NBTOutputStream nbtOutputStream = NbtUtils.createNetworkWriter(outputStream)) { - nbtOutputStream.writeTag(EMPTY_TAG); - } - - EMPTY_LEVEL_CHUNK_DATA = outputStream.toByteArray(); - } catch (IOException e) { - throw new AssertionError("Unable to generate empty level chunk data"); - } - } - - public static void init() { - // no-op - } -} diff --git a/src/main/java/org/geysermc/connect/utils/Player.java b/src/main/java/org/geysermc/connect/utils/Player.java index 4ec8a0d..af4e394 100644 --- a/src/main/java/org/geysermc/connect/utils/Player.java +++ b/src/main/java/org/geysermc/connect/utils/Player.java @@ -31,25 +31,26 @@ import com.nukkitx.math.vector.Vector3i; 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; import lombok.Setter; -import org.geysermc.connect.GeyserConnect; import org.geysermc.connect.MasterServer; import org.geysermc.connect.proxy.GeyserProxySession; import org.geysermc.connect.ui.FormID; import org.geysermc.connect.ui.UIHandler; -import org.geysermc.connector.GeyserConnector; -import org.geysermc.connector.common.AuthType; -import org.geysermc.connector.network.UpstreamPacketHandler; -import org.geysermc.connector.network.session.auth.AuthData; -import org.geysermc.connector.network.session.auth.BedrockClientData; -import org.geysermc.connector.registry.BlockRegistries; -import org.geysermc.connector.registry.Registries; -import org.geysermc.connector.registry.type.ItemMappings; -import org.geysermc.connector.utils.DimensionUtils; import org.geysermc.cumulus.Form; +import org.geysermc.geyser.GeyserImpl; +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; import java.util.ArrayList; import java.util.List; @@ -146,7 +147,11 @@ public class Player { settings.setRewindHistorySize(0); settings.setServerAuthoritativeBlockBreaking(false); startGamePacket.setPlayerMovementSettings(settings); - + + if (session.getPacketCodec().getProtocolVersion() <= Bedrock_v471.V471_CODEC.getProtocolVersion()) { + startGamePacket.getExperiments().add(new ExperimentData("caves_and_cliffs", true)); + } + startGamePacket.setVanillaVersion("*"); session.sendPacket(startGamePacket); @@ -161,7 +166,7 @@ public class Player { data.setChunkX(0); data.setChunkZ(0); data.setSubChunksLength(0); - data.setData(PaletteManger.EMPTY_LEVEL_CHUNK_DATA); + data.setData(ChunkUtils.EMPTY_CHUNK_DATA); data.setCachingEnabled(false); session.sendPacket(data); @@ -171,7 +176,7 @@ public class Player { session.sendPacket(biomeDefinitionListPacket); AvailableEntityIdentifiersPacket entityPacket = new AvailableEntityIdentifiersPacket(); - entityPacket.setIdentifiers(Registries.ENTITY_IDENTIFIERS.get()); + entityPacket.setIdentifiers(Registries.BEDROCK_ENTITY_IDENTIFIERS.get()); session.sendPacket(entityPacket); // Send a CreativeContentPacket - required for 1.16.100 @@ -228,11 +233,11 @@ public class Player { transferPacket.setPort(currentServer.getPort()); session.sendPacket(transferPacket); } else { - GeyserProxySession geyserSession = new GeyserProxySession(GeyserConnector.getInstance(), session, MasterServer.getInstance().getEventLoopGroup().next()); - session.setPacketHandler(new UpstreamPacketHandler(GeyserConnector.getInstance(), geyserSession)); + GeyserProxySession geyserSession = new GeyserProxySession(GeyserImpl.getInstance(), session, MasterServer.getInstance().getEventLoopGroup().next()); + session.setPacketHandler(new UpstreamPacketHandler(GeyserImpl.getInstance(), geyserSession)); // The player will be tracked from Geyser from here MasterServer.getInstance().getPlayers().remove(this); - GeyserConnector.getInstance().getSessionManager().addPendingSession(geyserSession); + GeyserImpl.getInstance().getSessionManager().addPendingSession(geyserSession); geyserSession.getUpstream().getSession().setPacketCodec(session.getPacketCodec()); @@ -253,6 +258,10 @@ public class Player { SetLocalPlayerAsInitializedPacket initializedPacket = new SetLocalPlayerAsInitializedPacket(); initializedPacket.setRuntimeEntityId(geyserSession.getPlayerEntity().getGeyserId()); session.getPacketHandler().handle(initializedPacket); + + if (geyserSession.getRemoteAuthType() != AuthType.ONLINE) { + geyserSession.authenticate(geyserSession.getAuthData().name()); + } } } diff --git a/src/main/java/org/geysermc/connect/utils/WebUtils.java b/src/main/java/org/geysermc/connect/utils/WebUtils.java index 98e4616..be7344e 100644 --- a/src/main/java/org/geysermc/connect/utils/WebUtils.java +++ b/src/main/java/org/geysermc/connect/utils/WebUtils.java @@ -34,7 +34,7 @@ import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; -public class WebUtils extends org.geysermc.connector.utils.WebUtils { +public class WebUtils { /** * Makes a web request to the given URL and returns the body as a string *