diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 23faa6514..8affc11b0 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -50,6 +50,7 @@ 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; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataFlags; use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataProperties; @@ -62,6 +63,7 @@ use pocketmine\world\format\Chunk; use pocketmine\world\Position; use pocketmine\world\World; use function abs; +use function array_map; use function assert; use function cos; use function count; @@ -1518,7 +1520,9 @@ abstract class Entity{ $pk->yaw = $this->location->yaw; $pk->headYaw = $this->location->yaw; //TODO $pk->pitch = $this->location->pitch; - $pk->attributes = $this->attributeMap->getAll(); + $pk->attributes = array_map(function(Attribute $attr) : NetworkAttribute{ + return new NetworkAttribute($attr->getId(), $attr->getMinValue(), $attr->getMaxValue(), $attr->getValue(), $attr->getDefaultValue()); + }, $this->attributeMap->getAll()); $pk->metadata = $this->getSyncedNetworkData(false); $player->getNetworkSession()->sendDataPacket($pk); diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 205dd01ad..6da5497c0 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\network\mcpe; use Mdanter\Ecc\Crypto\Key\PublicKeyInterface; +use pocketmine\entity\Attribute; use pocketmine\entity\effect\EffectInstance; use pocketmine\entity\Human; use pocketmine\entity\Living; @@ -70,6 +71,7 @@ use pocketmine\network\mcpe\protocol\TransferPacket; 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\inventory\ContainerIds; use pocketmine\network\mcpe\protocol\types\PlayerListEntry; use pocketmine\network\mcpe\protocol\types\PlayerPermissions; @@ -658,7 +660,9 @@ class NetworkSession{ public function syncAttributes(Living $entity, bool $sendAll = false) : void{ $entries = $sendAll ? $entity->getAttributeMap()->getAll() : $entity->getAttributeMap()->needSend(); if(count($entries) > 0){ - $this->sendDataPacket(UpdateAttributesPacket::create($entity->getId(), $entries)); + $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))); foreach($entries as $entry){ $entry->markSynchronized(); } diff --git a/src/network/mcpe/protocol/AddActorPacket.php b/src/network/mcpe/protocol/AddActorPacket.php index 815b1743a..47c3f18f9 100644 --- a/src/network/mcpe/protocol/AddActorPacket.php +++ b/src/network/mcpe/protocol/AddActorPacket.php @@ -25,10 +25,9 @@ namespace pocketmine\network\mcpe\protocol; #include -use pocketmine\entity\Attribute; use pocketmine\math\Vector3; -use pocketmine\network\BadPacketException; use pocketmine\network\mcpe\handler\PacketHandler; +use pocketmine\network\mcpe\protocol\types\entity\Attribute; use pocketmine\network\mcpe\protocol\types\entity\EntityLegacyIds; use pocketmine\network\mcpe\protocol\types\entity\EntityLink; use pocketmine\network\mcpe\protocol\types\entity\MetadataProperty; @@ -190,20 +189,7 @@ class AddActorPacket extends DataPacket implements ClientboundPacket{ $min = $in->getLFloat(); $current = $in->getLFloat(); $max = $in->getLFloat(); - $attr = Attribute::get($id); - - if($attr !== null){ - try{ - $attr->setMinValue($min); - $attr->setMaxValue($max); - $attr->setValue($current); - }catch(\InvalidArgumentException $e){ - throw BadPacketException::wrap($e); //TODO: address this properly - } - $this->attributes[] = $attr; - }else{ - throw new BadPacketException("Unknown attribute type \"$id\""); - } + $this->attributes[] = new Attribute($id, $min, $max, $current, $current); } $this->metadata = $in->getEntityMetadata(); @@ -226,9 +212,9 @@ class AddActorPacket extends DataPacket implements ClientboundPacket{ $out->putUnsignedVarInt(count($this->attributes)); foreach($this->attributes as $attribute){ $out->putString($attribute->getId()); - $out->putLFloat($attribute->getMinValue()); - $out->putLFloat($attribute->getValue()); - $out->putLFloat($attribute->getMaxValue()); + $out->putLFloat($attribute->getMin()); + $out->putLFloat($attribute->getCurrent()); + $out->putLFloat($attribute->getMax()); } $out->putEntityMetadata($this->metadata); diff --git a/src/network/mcpe/protocol/UpdateAttributesPacket.php b/src/network/mcpe/protocol/UpdateAttributesPacket.php index 65c25dd12..347a1552c 100644 --- a/src/network/mcpe/protocol/UpdateAttributesPacket.php +++ b/src/network/mcpe/protocol/UpdateAttributesPacket.php @@ -25,8 +25,8 @@ namespace pocketmine\network\mcpe\protocol; #include -use pocketmine\entity\Attribute; use pocketmine\network\mcpe\handler\PacketHandler; +use pocketmine\network\mcpe\protocol\types\entity\Attribute; use pocketmine\network\mcpe\serializer\NetworkBinaryStream; use function array_values; diff --git a/src/network/mcpe/protocol/types/entity/Attribute.php b/src/network/mcpe/protocol/types/entity/Attribute.php new file mode 100644 index 000000000..84deb8c60 --- /dev/null +++ b/src/network/mcpe/protocol/types/entity/Attribute.php @@ -0,0 +1,65 @@ +id = $id; + $this->min = $min; + $this->max = $max; + $this->current = $current; + $this->default = $default; + } + + public function getId() : string{ + return $this->id; + } + + public function getMin() : float{ + return $this->min; + } + + public function getMax() : float{ + return $this->max; + } + + public function getCurrent() : float{ + return $this->current; + } + + public function getDefault() : float{ + return $this->default; + } +} diff --git a/src/network/mcpe/serializer/NetworkBinaryStream.php b/src/network/mcpe/serializer/NetworkBinaryStream.php index ebc0d9cab..9b0fdc6f7 100644 --- a/src/network/mcpe/serializer/NetworkBinaryStream.php +++ b/src/network/mcpe/serializer/NetworkBinaryStream.php @@ -25,7 +25,6 @@ namespace pocketmine\network\mcpe\serializer; #include -use pocketmine\entity\Attribute; use pocketmine\item\Durable; use pocketmine\item\Item; use pocketmine\item\ItemFactory; @@ -37,6 +36,7 @@ use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\TreeRoot; use pocketmine\network\BadPacketException; use pocketmine\network\mcpe\protocol\types\command\CommandOriginData; +use pocketmine\network\mcpe\protocol\types\entity\Attribute; use pocketmine\network\mcpe\protocol\types\entity\BlockPosMetadataProperty; use pocketmine\network\mcpe\protocol\types\entity\ByteMetadataProperty; use pocketmine\network\mcpe\protocol\types\entity\CompoundTagMetadataProperty; @@ -362,17 +362,7 @@ class NetworkBinaryStream extends BinaryStream{ $default = $this->getLFloat(); $id = $this->getString(); - $attr = Attribute::get($id); - if($attr !== null){ - $attr->setMinValue($min); - $attr->setMaxValue($max); - $attr->setValue($current); - $attr->setDefaultValue($default); - - $list[] = $attr; - }else{ - throw new BadPacketException("Unknown attribute type \"$id\""); - } + $list[] = new Attribute($id, $min, $max, $current, $default); } return $list; @@ -386,10 +376,10 @@ class NetworkBinaryStream extends BinaryStream{ public function putAttributeList(Attribute ...$attributes) : void{ $this->putUnsignedVarInt(count($attributes)); foreach($attributes as $attribute){ - $this->putLFloat($attribute->getMinValue()); - $this->putLFloat($attribute->getMaxValue()); - $this->putLFloat($attribute->getValue()); - $this->putLFloat($attribute->getDefaultValue()); + $this->putLFloat($attribute->getMin()); + $this->putLFloat($attribute->getMax()); + $this->putLFloat($attribute->getCurrent()); + $this->putLFloat($attribute->getDefault()); $this->putString($attribute->getId()); } }