diff --git a/src/pocketmine/entity/Living.php b/src/pocketmine/entity/Living.php index a1072cab0..f73a10092 100644 --- a/src/pocketmine/entity/Living.php +++ b/src/pocketmine/entity/Living.php @@ -33,6 +33,8 @@ use pocketmine\event\entity\EntityDeathEvent; use pocketmine\event\entity\EntityEffectAddEvent; use pocketmine\event\entity\EntityEffectRemoveEvent; use pocketmine\inventory\ArmorInventory; +use pocketmine\inventory\CallbackInventoryChangeListener; +use pocketmine\inventory\Inventory; use pocketmine\item\Armor; use pocketmine\item\Consumable; use pocketmine\item\Durable; @@ -94,6 +96,13 @@ abstract class Living extends Entity implements Damageable{ $this->armorInventory = new ArmorInventory($this); //TODO: load/save armor inventory contents + $this->armorInventory->addChangeListeners(CallbackInventoryChangeListener::onAnyChange( + function(Inventory $unused) : void{ + foreach($this->getViewers() as $viewer){ + $viewer->getNetworkSession()->onMobArmorChange($this); + } + } + )); $health = $this->getMaxHealth(); diff --git a/src/pocketmine/inventory/ArmorInventory.php b/src/pocketmine/inventory/ArmorInventory.php index 39dff581a..3643f1d64 100644 --- a/src/pocketmine/inventory/ArmorInventory.php +++ b/src/pocketmine/inventory/ArmorInventory.php @@ -25,10 +25,6 @@ namespace pocketmine\inventory; use pocketmine\entity\Living; use pocketmine\item\Item; -use pocketmine\network\mcpe\protocol\MobArmorEquipmentPacket; -use pocketmine\Player; -use function array_merge; -use function array_search; class ArmorInventory extends BaseInventory{ public const SLOT_HEAD = 0; @@ -79,51 +75,4 @@ class ArmorInventory extends BaseInventory{ public function setBoots(Item $boots) : bool{ return $this->setItem(self::SLOT_FEET, $boots); } - - public function sendSlot(int $index, $target) : void{ - if($target instanceof Player){ - $target = [$target]; - } - - /** @var Player[] $target */ - - if(($k = array_search($this->holder, $target, true)) !== false){ - $target[$k]->getNetworkSession()->syncInventorySlot($this, $index); - unset($target[$k]); - } - if(!empty($target)){ - //TODO: this should be handled by change listeners - $pk = new MobArmorEquipmentPacket(); - $pk->entityRuntimeId = $this->getHolder()->getId(); - $pk->slots = $this->getContents(true); - $this->holder->getWorld()->getServer()->broadcastPacket($target, $pk); - } - } - - public function sendContents($target) : void{ - if($target instanceof Player){ - $target = [$target]; - } - - $armor = $this->getContents(true); - - if(($k = array_search($this->holder, $target, true)) !== false){ - $target[$k]->getNetworkSession()->syncInventoryContents($this); - unset($target[$k]); - } - if(!empty($target)){ - //TODO: this should be handled by change listeners - $pk = new MobArmorEquipmentPacket(); - $pk->entityRuntimeId = $this->getHolder()->getId(); - $pk->slots = $armor; - $this->holder->getWorld()->getServer()->broadcastPacket($target, $pk); - } - } - - /** - * @return Player[] - */ - public function getViewers() : array{ - return array_merge(parent::getViewers(), $this->holder->getViewers()); - } } diff --git a/src/pocketmine/network/mcpe/NetworkSession.php b/src/pocketmine/network/mcpe/NetworkSession.php index 3cd7cac2f..969c0ef52 100644 --- a/src/pocketmine/network/mcpe/NetworkSession.php +++ b/src/pocketmine/network/mcpe/NetworkSession.php @@ -48,6 +48,7 @@ use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\DisconnectPacket; use pocketmine\network\mcpe\protocol\InventoryContentPacket; use pocketmine\network\mcpe\protocol\InventorySlotPacket; +use pocketmine\network\mcpe\protocol\MobArmorEquipmentPacket; use pocketmine\network\mcpe\protocol\MobEffectPacket; use pocketmine\network\mcpe\protocol\ModalFormRequestPacket; use pocketmine\network\mcpe\protocol\MovePlayerPacket; @@ -817,6 +818,13 @@ class NetworkSession{ } } + public function onMobArmorChange(Living $mob) : void{ + $pk = new MobArmorEquipmentPacket(); + $pk->entityRuntimeId = $mob->getId(); + $pk->slots = $mob->getArmorInventory()->getContents(true); //beware this order might change in the future + $this->sendDataPacket($pk); + } + public function tick() : bool{ if($this->handler instanceof LoginSessionHandler){ if(time() >= $this->connectTime + 10){