From 4ce6525065ced2032c7677f3035e077f24dc64f0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Apr 2020 16:50:52 +0100 Subject: [PATCH] NetworkSession: incomplete abstraction of SetActorDataPacket handling this needs to have the metadata properties separated too, but that's a job that's going to get VERY messy. --- src/entity/Entity.php | 8 ++++---- src/network/mcpe/NetworkSession.php | 10 ++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 84fafbdcf..4613006aa 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -48,7 +48,6 @@ use pocketmine\network\mcpe\protocol\AddActorPacket; use pocketmine\network\mcpe\protocol\AnimatePacket; use pocketmine\network\mcpe\protocol\MoveActorAbsolutePacket; use pocketmine\network\mcpe\protocol\RemoveActorPacket; -use pocketmine\network\mcpe\protocol\SetActorDataPacket; use pocketmine\network\mcpe\protocol\SetActorMotionPacket; use pocketmine\network\mcpe\protocol\types\entity\Attribute as NetworkAttribute; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataCollection; @@ -1647,17 +1646,18 @@ abstract class Entity{ $player = [$player]; } - $pk = SetActorDataPacket::create($this->getId(), $data ?? $this->getSyncedNetworkData(false)); + $data = $data ?? $this->getSyncedNetworkData(false); foreach($player as $p){ if($p === $this){ continue; } - $p->getNetworkSession()->sendDataPacket(clone $pk); + $p->getNetworkSession()->syncActorData($this, $data); } if($this instanceof Player){ - $this->getNetworkSession()->sendDataPacket($pk); + //TODO: bad hack, remove + $this->getNetworkSession()->syncActorData($this, $data); } } diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 0017f764e..c82bf2f06 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -70,6 +70,7 @@ use pocketmine\network\mcpe\protocol\PlayStatusPacket; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\network\mcpe\protocol\ServerboundPacket; use pocketmine\network\mcpe\protocol\ServerToClientHandshakePacket; +use pocketmine\network\mcpe\protocol\SetActorDataPacket; use pocketmine\network\mcpe\protocol\SetPlayerGameTypePacket; use pocketmine\network\mcpe\protocol\SetSpawnPositionPacket; use pocketmine\network\mcpe\protocol\SetTitlePacket; @@ -80,6 +81,7 @@ use pocketmine\network\mcpe\protocol\types\command\CommandData; use pocketmine\network\mcpe\protocol\types\command\CommandEnum; use pocketmine\network\mcpe\protocol\types\command\CommandParameter; use pocketmine\network\mcpe\protocol\types\entity\Attribute as NetworkAttribute; +use pocketmine\network\mcpe\protocol\types\entity\MetadataProperty; use pocketmine\network\mcpe\protocol\types\inventory\ContainerIds; use pocketmine\network\mcpe\protocol\types\PlayerListEntry; use pocketmine\network\mcpe\protocol\types\PlayerPermissions; @@ -691,6 +693,14 @@ class NetworkSession{ } } + /** + * @param MetadataProperty[] $properties + * @phpstan-param array $properties + */ + public function syncActorData(Entity $entity, array $properties) : void{ + $this->sendDataPacket(SetActorDataPacket::create($entity->getId(), $properties)); + } + public function onEntityEffectAdded(Living $entity, EffectInstance $effect, bool $replacesOldEffect) : void{ $this->sendDataPacket(MobEffectPacket::add($entity->getId(), $replacesOldEffect, $effect->getId(), $effect->getAmplifier(), $effect->isVisible(), $effect->getDuration())); }