diff --git a/connector/src/main/java/org/geysermc/connector/entity/Entity.java b/connector/src/main/java/org/geysermc/connector/entity/Entity.java index af8e4e31a..69dcaf0ff 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/Entity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/Entity.java @@ -82,6 +82,7 @@ public class Entity { this.valid = false; this.movePending = false; + this.dimension = 0; } public void spawnEntity(GeyserSession session) { @@ -132,6 +133,7 @@ public class Entity { public void moveAbsolute(Vector3f position, Vector3f rotation) { setPosition(position); setRotation(rotation); + this.movePending = true; } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java index 2b85bcf21..51082170d 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java @@ -31,6 +31,7 @@ import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.packet.MoveEntityAbsolutePacket; import com.nukkitx.protocol.bedrock.packet.MovePlayerPacket; import com.nukkitx.protocol.bedrock.packet.SetEntityDataPacket; +import org.geysermc.api.ChatColor; import org.geysermc.connector.entity.Entity; import org.geysermc.connector.entity.PlayerEntity; import org.geysermc.connector.entity.type.EntityType; @@ -39,12 +40,12 @@ import org.geysermc.connector.network.translators.PacketTranslator; import org.geysermc.connector.network.translators.block.BlockEntry; public class BedrockMovePlayerTranslator extends PacketTranslator<MovePlayerPacket> { + @Override public void translate(MovePlayerPacket packet, GeyserSession session) { PlayerEntity entity = session.getPlayerEntity(); if (entity == null || !session.isSpawned()) return; - // can cause invalid moves when packet queue is not empty if (!session.getUpstream().isInitialized()) { MoveEntityAbsolutePacket moveEntityBack = new MoveEntityAbsolutePacket(); moveEntityBack.setRuntimeEntityId(entity.getGeyserId()); @@ -57,7 +58,7 @@ public class BedrockMovePlayerTranslator extends PacketTranslator<MovePlayerPack } if (!isValidMove(session, packet.getMode(), entity.getPosition(), packet.getPosition())) { - session.getConnector().getLogger().info("Recalculating position..."); + session.getConnector().getLogger().debug("Recalculating position..."); recalculatePosition(session, entity, entity.getPosition()); return; } @@ -102,7 +103,7 @@ public class BedrockMovePlayerTranslator extends PacketTranslator<MovePlayerPack zRange = -zRange; if ((xRange + yRange + zRange) > 100) { - session.getConnector().getLogger().warning(session.getName() + " moved too quickly." + + session.getConnector().getLogger().debug(ChatColor.RED + session.getName() + " moved too quickly." + " current position: " + currentPosition + ", new position: " + newPosition); return false; @@ -122,7 +123,7 @@ public class BedrockMovePlayerTranslator extends PacketTranslator<MovePlayerPack movePlayerPacket.setRuntimeEntityId(entity.getGeyserId()); movePlayerPacket.setPosition(entity.getPosition()); movePlayerPacket.setRotation(entity.getBedrockRotation()); - movePlayerPacket.setMode(MovePlayerPacket.Mode.NORMAL); + movePlayerPacket.setMode(MovePlayerPacket.Mode.RESET); movePlayerPacket.setOnGround(true); entity.setMovePending(false); session.getUpstream().sendPacket(movePlayerPacket); 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 717b0e8e7..32057c169 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 @@ -59,7 +59,6 @@ public class JavaJoinGameTranslator extends PacketTranslator<ServerJoinGamePacke session.getUpstream().sendPacket(entityDataPacket); session.setRenderDistance(packet.getViewDistance() + 1); // +1 to be sure it includes every chunk - System.out.println(session.getRenderDistance()); if (session.getRenderDistance() > 32) session.setRenderDistance(32); // <3 u ViaVersion but I don't like crashing clients x) ChunkRadiusUpdatedPacket packet1 = new ChunkRadiusUpdatedPacket(); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java index 30e2135b7..f5f86e19b 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaRespawnTranslator.java @@ -26,7 +26,9 @@ package org.geysermc.connector.network.translators.java; import com.github.steveice10.mc.protocol.packet.ingame.server.ServerRespawnPacket; +import com.nukkitx.protocol.bedrock.packet.ChangeDimensionPacket; import com.nukkitx.protocol.bedrock.packet.PlayStatusPacket; +import com.nukkitx.protocol.bedrock.packet.SetPlayerGameTypePacket; import org.geysermc.connector.entity.Entity; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; @@ -39,10 +41,34 @@ public class JavaRespawnTranslator extends PacketTranslator<ServerRespawnPacket> if (entity == null) return; - if (entity.getDimension() == packet.getDimension()) { - PlayStatusPacket playStatusPacket = new PlayStatusPacket(); - playStatusPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); - session.getUpstream().sendPacket(playStatusPacket); + if (entity.getDimension() == getDimension(packet.getDimension())) + return; + + entity.setDimension(getDimension(packet.getDimension())); + + ChangeDimensionPacket changeDimensionPacket = new ChangeDimensionPacket(); + changeDimensionPacket.setDimension(getDimension(packet.getDimension())); + changeDimensionPacket.setRespawn(false); + changeDimensionPacket.setPosition(entity.getPosition()); + session.getUpstream().sendPacket(changeDimensionPacket); + + SetPlayerGameTypePacket playerGameTypePacket = new SetPlayerGameTypePacket(); + playerGameTypePacket.setGamemode(packet.getGamemode().ordinal()); + session.getUpstream().sendPacket(playerGameTypePacket); + + PlayStatusPacket playStatusPacket = new PlayStatusPacket(); + playStatusPacket.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); + session.getUpstream().sendPacket(playStatusPacket); + } + + private int getDimension(int javaDimension) { + switch (javaDimension) { + case -1: + return 1; + case 1: + return 2; } + + return javaDimension; } }