From b75bc61a6476a363a5c7d1431a39bc4715ae72a5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 24 Jul 2022 20:35:49 +0100 Subject: [PATCH] InGamePacketHandler: don't bother checking for flag changes if the flag fields are identical we don't need to check this on a bit by bit level if the integers are the same. this saves 2-3 microseconds per packet on my machine, which doesn't sound like much, but it adds up when there are lots of players. --- .../mcpe/handler/InGamePacketHandler.php | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/network/mcpe/handler/InGamePacketHandler.php b/src/network/mcpe/handler/InGamePacketHandler.php index 00494c71e..c4e151d4f 100644 --- a/src/network/mcpe/handler/InGamePacketHandler.php +++ b/src/network/mcpe/handler/InGamePacketHandler.php @@ -145,6 +145,8 @@ class InGamePacketHandler extends PacketHandler{ /** @var UseItemTransactionData|null */ protected $lastRightClickData = null; + protected ?int $lastPlayerAuthInputFlags = null; + /** @var bool */ public $forceMoveSync = false; @@ -208,21 +210,25 @@ class InGamePacketHandler extends PacketHandler{ $this->forceMoveSync = false; $inputFlags = $packet->getInputFlags(); - $sneaking = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_SNEAKING, PlayerAuthInputFlags::STOP_SNEAKING); - $sprinting = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_SPRINTING, PlayerAuthInputFlags::STOP_SPRINTING); - $swimming = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_SWIMMING, PlayerAuthInputFlags::STOP_SWIMMING); - $gliding = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_GLIDING, PlayerAuthInputFlags::STOP_GLIDING); - $mismatch = - ($sneaking !== null && !$this->player->toggleSneak($sneaking)) | - ($sprinting !== null && !$this->player->toggleSprint($sprinting)) | - ($swimming !== null && !$this->player->toggleSwim($swimming)) | - ($gliding !== null && !$this->player->toggleGlide($gliding)); - if((bool) $mismatch){ - $this->player->sendData([$this->player]); - } + if($inputFlags !== $this->lastPlayerAuthInputFlags){ + $this->lastPlayerAuthInputFlags = $inputFlags; - if($packet->hasFlag(PlayerAuthInputFlags::START_JUMPING)){ - $this->player->jump(); + $sneaking = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_SNEAKING, PlayerAuthInputFlags::STOP_SNEAKING); + $sprinting = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_SPRINTING, PlayerAuthInputFlags::STOP_SPRINTING); + $swimming = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_SWIMMING, PlayerAuthInputFlags::STOP_SWIMMING); + $gliding = $this->resolveOnOffInputFlags($inputFlags, PlayerAuthInputFlags::START_GLIDING, PlayerAuthInputFlags::STOP_GLIDING); + $mismatch = + ($sneaking !== null && !$this->player->toggleSneak($sneaking)) | + ($sprinting !== null && !$this->player->toggleSprint($sprinting)) | + ($swimming !== null && !$this->player->toggleSwim($swimming)) | + ($gliding !== null && !$this->player->toggleGlide($gliding)); + if((bool) $mismatch){ + $this->player->sendData([$this->player]); + } + + if($packet->hasFlag(PlayerAuthInputFlags::START_JUMPING)){ + $this->player->jump(); + } } if(!$this->forceMoveSync){