NetworkSession: allow sending an arbitrary set of attributes for an entity

This commit is contained in:
Dylan K. Taylor 2020-04-29 16:45:09 +01:00
parent f6f714c158
commit d1b28ce17a
3 changed files with 10 additions and 7 deletions

View File

@ -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)));
}
}

View File

@ -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){

View File

@ -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();
}