From 9a04481bec0c0faf6c4b5492990f37e4b93f89a5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 9 Jun 2023 01:24:57 +0100 Subject: [PATCH] Entity: broadcast teleports as regular movements fixes #5810 probably fixes #4986 #5810 was caused by the workaround for #4394, which broke in 1.20 for reasons I'm still unclear on. As FLAG_TELEPORT does not work at all for non-player entities, and causes bugs with player entities, sending the teleport movement without the flag is the least buggy way to solve all of these issues. Having the client interpolate teleport movements is not ideal, but there doesn't seem to be a way to reliably prevent it without causing even more bugs, so this will have to do. --- src/entity/Entity.php | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 0266407c9..8624aa51a 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -781,29 +781,21 @@ abstract class Entity{ } protected function broadcastMovement(bool $teleport = false) : void{ - if($teleport){ - //TODO: HACK! workaround for https://github.com/pmmp/PocketMine-MP/issues/4394 - //this happens because MoveActor*Packet doesn't clear interpolation targets on the client, so the entity - //snaps to the teleport position, but then lerps back to the original position if a normal movement for the - //entity was recently broadcasted. This can be seen with players throwing ender pearls. - //TODO: remove this if the bug ever gets fixed (lol) - foreach($this->hasSpawned as $player){ - $this->despawnFrom($player); - $this->spawnTo($player); - } - }else{ - NetworkBroadcastUtils::broadcastPackets($this->hasSpawned, [MoveActorAbsolutePacket::create( - $this->id, - $this->getOffsetPosition($this->location), - $this->location->pitch, - $this->location->yaw, - $this->location->yaw, - ( - //TODO: if the above hack for #4394 gets removed, we should be setting FLAG_TELEPORT here - ($this->onGround ? MoveActorAbsolutePacket::FLAG_GROUND : 0) - ) - )]); - } + NetworkBroadcastUtils::broadcastPackets($this->hasSpawned, [MoveActorAbsolutePacket::create( + $this->id, + $this->getOffsetPosition($this->location), + $this->location->pitch, + $this->location->yaw, + $this->location->yaw, + ( + //TODO: We should be setting FLAG_TELEPORT here to disable client-side movement interpolation, but it + //breaks player teleporting (observers see the player rubberband back to the pre-teleport position while + //the teleported player sees themselves at the correct position), and does nothing whatsoever for + //non-player entities (movement is still interpolated). Both of these are client bugs. + //See https://github.com/pmmp/PocketMine-MP/issues/4394 + ($this->onGround ? MoveActorAbsolutePacket::FLAG_GROUND : 0) + ) + )]); } protected function broadcastMotion() : void{