From a0de9b0d46baf9fe72e3347ed80b35b66dc1022b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 4 Jun 2020 13:39:26 +0100 Subject: [PATCH] Player: use real time to update rate limit, fixes #3554 (except in very extreme cases) --- src/pocketmine/Player.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index f8e8ba503..42f5c97a0 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -334,8 +334,10 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ /** @var bool[] map: raw UUID (string) => bool */ protected $hiddenPlayers = []; - /** @var int */ + /** @var float */ protected $moveRateLimit = 10 * self::MOVES_PER_TICK; + /** @var float|null */ + protected $lastMovementProcess = null; /** @var Vector3|null */ protected $forceMoveSync = null; @@ -1593,8 +1595,11 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ * Fires movement events and synchronizes player movement, every tick. */ protected function processMostRecentMovements() : void{ + $now = microtime(true); + $multiplier = $this->lastMovementProcess !== null ? ($now - $this->lastMovementProcess) * 20 : 1; $exceededRateLimit = $this->moveRateLimit < 0; - $this->moveRateLimit = min(self::MOVE_BACKLOG_SIZE, max(0, $this->moveRateLimit) + self::MOVES_PER_TICK); + $this->moveRateLimit = min(self::MOVE_BACKLOG_SIZE, max(0, $this->moveRateLimit) + self::MOVES_PER_TICK * $multiplier); + $this->lastMovementProcess = $now; $from = new Location($this->lastX, $this->lastY, $this->lastZ, $this->lastYaw, $this->lastPitch, $this->level); $to = $this->getLocation();