Skip to content

Commit 8ba82dd

Browse files
authored
Fix: swimming near water surface. (#5992)
* Fix: swimming near water surface. * Only update if pose change.
1 parent bc26952 commit 8ba82dd

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

core/src/main/java/org/geysermc/geyser/entity/type/player/AvatarEntity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.cloudburstmc.protocol.bedrock.packet.AddPlayerPacket;
4242
import org.cloudburstmc.protocol.bedrock.packet.MovePlayerPacket;
4343
import org.geysermc.geyser.entity.EntityDefinition;
44+
import org.geysermc.geyser.entity.EntityDefinitions;
4445
import org.geysermc.geyser.entity.type.LivingEntity;
4546
import org.geysermc.geyser.level.block.Blocks;
4647
import org.geysermc.geyser.session.GeyserSession;
@@ -317,8 +318,7 @@ public void setPose(Pose pose) {
317318

318319
if (pose == Pose.SWIMMING) {
319320
// This is just for, so we know if player is swimming or crawling.
320-
// TODO test, changed from position (field) to position() (method), which adds offset
321-
if (session.getGeyser().getWorldManager().blockAt(session, position.toInt()).is(Blocks.WATER)) {
321+
if (session.getGeyser().getWorldManager().blockAt(session, position.down(EntityDefinitions.PLAYER.offset()).toInt()).is(Blocks.WATER)) {
322322
setFlag(EntityFlag.SWIMMING, true);
323323
} else {
324324
setFlag(EntityFlag.CRAWLING, true);

core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/input/BedrockPlayerAuthInputTranslator.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.geysermc.geyser.translator.protocol.PacketTranslator;
4747
import org.geysermc.geyser.translator.protocol.Translator;
4848
import org.geysermc.geyser.util.CooldownUtils;
49+
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.Pose;
4950
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode;
5051
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand;
5152
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.PlayerState;
@@ -185,7 +186,14 @@ public void translate(GeyserSession session, PlayerAuthInputPacket packet) {
185186

186187
// The player will calculate the "desired" pose at the end of every tick, if this pose still invalid then
187188
// it will consider the smaller pose, but we don't need to calculate that, we can go off what the client sent us.
188-
entity.setPose(entity.getDesiredPose());
189+
// Also set the session pose directly and set the metadata directly since we don't want setPose method inside entity to change
190+
// the current entity flag again.
191+
final Pose pose = entity.getDesiredPose();
192+
if (pose != session.getPose()) {
193+
session.setPose(pose);
194+
entity.setDimensionsFromPose(session.getPose());
195+
entity.updateBedrockMetadata();
196+
}
189197

190198
// Vehicle input is send before player movement
191199
processVehicleInput(session, packet, wasJumping);

0 commit comments

Comments
 (0)