diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index 7b23e2df160..87c08c36f3a 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -124,6 +124,7 @@ public class GeyserSession implements CommandSender { @Setter private boolean spawned; + private boolean started; private boolean closed; @Setter @@ -166,10 +167,6 @@ public class GeyserSession implements CommandSender { @Setter private int craftSlot = 0; - @Getter - @Setter - private boolean started; - private MinecraftProtocol protocol; public GeyserSession(GeyserConnector connector, BedrockServerSession bedrockServerSession) { @@ -195,11 +192,47 @@ public GeyserSession(GeyserConnector connector, BedrockServerSession bedrockServ } public void connect(RemoteServer remoteServer) { - startGame(); - login(); this.remoteServer = remoteServer; + if (connector.getAuthType() != AuthType.ONLINE) { + connector.getLogger().info( + "Attempting to login using " + connector.getAuthType().name().toLowerCase() + " mode... " + + (connector.getAuthType() == AuthType.OFFLINE ? + "authentication is disabled." : "authentication will be encrypted" + ) + ); + authenticate(authData.getName()); + } else { + playerEntity.setDimension(2); + initialize(); + ChunkUtils.sendEmptyChunks(this, playerEntity.getPosition().toInt(), 0, false); + start(); + } + } + + public void start() { + if (!started) { + started = true; + PlayStatusPacket playStatusPacket = new PlayStatusPacket(); + playStatusPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); + upstream.sendPacket(playStatusPacket); + } + } + + public void initialize() { + startGame(); + + BiomeDefinitionListPacket biomeDefinitionListPacket = new BiomeDefinitionListPacket(); + biomeDefinitionListPacket.setTag(BiomeTranslator.BIOMES); + upstream.sendPacket(biomeDefinitionListPacket); - ChunkUtils.sendEmptyChunks(this, playerEntity.getPosition().toInt(), 0, false); + AvailableEntityIdentifiersPacket entityPacket = new AvailableEntityIdentifiersPacket(); + entityPacket.setTag(EntityIdentifierRegistry.ENTITY_IDENTIFIERS); + upstream.sendPacket(entityPacket); + + InventoryContentPacket creativePacket = new InventoryContentPacket(); + creativePacket.setContainerId(ContainerId.CREATIVE); + creativePacket.setContents(ItemRegistry.CREATIVE_ITEMS); + upstream.sendPacket(creativePacket); } public void fetchOurSkin(PlayerListPacket.Entry entry) { @@ -213,18 +246,6 @@ public void fetchOurSkin(PlayerListPacket.Entry entry) { getConnector().getLogger().debug("Sending skin for " + playerEntity.getUsername() + " " + authData.getUUID()); } - public void login() { - if (connector.getAuthType() != AuthType.ONLINE) { - connector.getLogger().info( - "Attempting to login using " + connector.getAuthType().name().toLowerCase() + " mode... " + - (connector.getAuthType() == AuthType.OFFLINE ? - "authentication is disabled." : "authentication will be encrypted" - ) - ); - authenticate(authData.getName()); - } - } - public void authenticate(String username) { authenticate(username, ""); } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java index 8d8c0affbbd..1c1583ce2e9 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaJoinGameTranslator.java @@ -53,15 +53,21 @@ public void translate(ServerJoinGamePacket packet, GeyserSession session) { PlayerEntity entity = session.getPlayerEntity(); entity.setEntityId(packet.getEntityId()); + if (!session.getUpstream().isInitialized()) { + entity.setDimension(DimensionUtils.javaToBedrock(packet.getDimension())); + session.initialize(); + } else { + if (DimensionUtils.javaToBedrock(packet.getDimension()) == entity.getDimension()) { + DimensionUtils.switchDimension(session, entity.getDimension() == 0 ? -1 : 0); + } + DimensionUtils.switchDimension(session, packet.getDimension()); + } + AdventureSettingsPacket bedrockPacket = new AdventureSettingsPacket(); bedrockPacket.setUniqueEntityId(session.getPlayerEntity().getGeyserId()); bedrockPacket.setPlayerPermission(PlayerPermission.MEMBER); session.sendUpstreamPacket(bedrockPacket); - PlayStatusPacket playStatus = new PlayStatusPacket(); - playStatus.setStatus(PlayStatusPacket.Status.LOGIN_SUCCESS); - // session.sendPacket(playStatus); - SetPlayerGameTypePacket playerGameTypePacket = new SetPlayerGameTypePacket(); playerGameTypePacket.setGamemode(packet.getGameMode().ordinal()); session.sendUpstreamPacket(playerGameTypePacket); @@ -79,9 +85,5 @@ public void translate(ServerJoinGamePacket packet, GeyserSession session) { List skinParts = Arrays.asList(SkinPart.values()); ClientSettingsPacket clientSettingsPacket = new ClientSettingsPacket(locale, (byte) session.getRenderDistance(), ChatVisibility.FULL, true, skinParts, Hand.MAIN_HAND); session.sendDownstreamPacket(clientSettingsPacket); - - if (DimensionUtils.javaToBedrock(packet.getDimension()) != entity.getDimension()) { - DimensionUtils.switchDimension(session, packet.getDimension()); - } } } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerListEntryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerListEntryTranslator.java index 8432e894fb0..a2851e25796 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerListEntryTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/player/JavaPlayerListEntryTranslator.java @@ -25,19 +25,11 @@ package org.geysermc.connector.network.translators.java.entity.player; -import com.nukkitx.protocol.bedrock.data.ContainerId; -import com.nukkitx.protocol.bedrock.packet.AvailableEntityIdentifiersPacket; -import com.nukkitx.protocol.bedrock.packet.BiomeDefinitionListPacket; -import com.nukkitx.protocol.bedrock.packet.InventoryContentPacket; -import com.nukkitx.protocol.bedrock.packet.PlayStatusPacket; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.entity.PlayerEntity; import org.geysermc.connector.network.session.GeyserSession; -import org.geysermc.connector.network.translators.BiomeTranslator; -import org.geysermc.connector.network.translators.EntityIdentifierRegistry; import org.geysermc.connector.network.translators.PacketTranslator; import org.geysermc.connector.network.translators.Translator; -import org.geysermc.connector.network.translators.item.ItemRegistry; import org.geysermc.connector.utils.SkinUtils; import com.github.steveice10.mc.protocol.data.game.PlayerListEntry; @@ -98,24 +90,6 @@ public void translate(ServerPlayerListEntryPacket packet, GeyserSession session) session.sendUpstreamPacket(translate); } - if (!session.isStarted()) { - session.setStarted(true); - BiomeDefinitionListPacket biomeDefinitionListPacket = new BiomeDefinitionListPacket(); - biomeDefinitionListPacket.setTag(BiomeTranslator.BIOMES); - session.sendUpstreamPacket(biomeDefinitionListPacket); - - AvailableEntityIdentifiersPacket entityPacket = new AvailableEntityIdentifiersPacket(); - entityPacket.setTag(EntityIdentifierRegistry.ENTITY_IDENTIFIERS); - session.sendUpstreamPacket(entityPacket); - - InventoryContentPacket creativePacket = new InventoryContentPacket(); - creativePacket.setContainerId(ContainerId.CREATIVE); - creativePacket.setContents(ItemRegistry.CREATIVE_ITEMS); - session.sendUpstreamPacket(creativePacket); - - PlayStatusPacket playStatusPacket = new PlayStatusPacket(); - playStatusPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); - session.sendUpstreamPacket(playStatusPacket); - } + session.start(); } }