diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 5c4075eac..0017f764e 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -680,12 +680,14 @@ class NetworkSession{ $this->sendDataPacket($pk); } - public function syncAttributes(Living $entity, bool $sendAll = false) : void{ - $entries = $sendAll ? $entity->getAttributeMap()->getAll() : $entity->getAttributeMap()->needSend(); - if(count($entries) > 0){ + /** + * @param Attribute[] $attributes + */ + public function syncAttributes(Living $entity, array $attributes) : void{ + if(count($attributes) > 0){ $this->sendDataPacket(UpdateAttributesPacket::create($entity->getId(), array_map(function(Attribute $attr) : NetworkAttribute{ return new NetworkAttribute($attr->getId(), $attr->getMinValue(), $attr->getMaxValue(), $attr->getValue(), $attr->getDefaultValue()); - }, $entries))); + }, $attributes))); } } diff --git a/src/network/mcpe/handler/PreSpawnPacketHandler.php b/src/network/mcpe/handler/PreSpawnPacketHandler.php index 726cdb7de..f475d5370 100644 --- a/src/network/mcpe/handler/PreSpawnPacketHandler.php +++ b/src/network/mcpe/handler/PreSpawnPacketHandler.php @@ -86,7 +86,7 @@ class PreSpawnPacketHandler extends PacketHandler{ $this->player->setImmobile(); //HACK: fix client-side falling pre-spawn - $this->session->syncAttributes($this->player, true); + $this->session->syncAttributes($this->player, $this->player->getAttributeMap()->getAll()); $this->session->syncAvailableCommands(); $this->session->syncAdventureSettings($this->player); foreach($this->player->getEffects()->all() as $effect){ diff --git a/src/player/Player.php b/src/player/Player.php index 1d4f8169a..0730fb164 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -1291,8 +1291,9 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener, $this->lastUpdate = $currentTick; //TODO: move this to network session ticking (this is specifically related to net sync) - $this->networkSession->syncAttributes($this); - foreach($this->attributeMap->getAll() as $attribute){ + $dirtyAttributes = $this->attributeMap->needSend(); + $this->networkSession->syncAttributes($this, $dirtyAttributes); + foreach($dirtyAttributes as $attribute){ $attribute->markSynchronized(); }