Files
PocketMine-MP/src/pocketmine/inventory/ArmorInventory.php
Dylan K. Taylor f6481eab8f Implemented an InventoryEventProcessor, fixes #1986 (#2176)
* Implemented InventoryEventProcessor, fixes #1986
Event processors can now be registered and unregistered at will. Entity inventory/armor change events are now handled by event processors instead of the inventories themselves, which allows enabling/disabling the calling of these events at will.
This now avoids stupid things happening when initializing inventory contents, since the callers for those events are now registered _after_ the contents are initialized.
2018-06-09 17:37:10 +01:00

149 lines
3.5 KiB
PHP

<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\inventory;
use pocketmine\entity\Living;
use pocketmine\item\Item;
use pocketmine\network\mcpe\protocol\InventoryContentPacket;
use pocketmine\network\mcpe\protocol\InventorySlotPacket;
use pocketmine\network\mcpe\protocol\MobArmorEquipmentPacket;
use pocketmine\Player;
class ArmorInventory extends BaseInventory{
public const SLOT_HEAD = 0;
public const SLOT_CHEST = 1;
public const SLOT_LEGS = 2;
public const SLOT_FEET = 3;
/** @var Living */
protected $holder;
public function __construct(Living $holder){
$this->holder = $holder;
parent::__construct();
}
public function getHolder() : Living{
return $this->holder;
}
public function getName() : string{
return "Armor";
}
public function getDefaultSize() : int{
return 4;
}
public function getHelmet() : Item{
return $this->getItem(self::SLOT_HEAD);
}
public function getChestplate() : Item{
return $this->getItem(self::SLOT_CHEST);
}
public function getLeggings() : Item{
return $this->getItem(self::SLOT_LEGS);
}
public function getBoots() : Item{
return $this->getItem(self::SLOT_FEET);
}
public function setHelmet(Item $helmet) : bool{
return $this->setItem(self::SLOT_HEAD, $helmet);
}
public function setChestplate(Item $chestplate) : bool{
return $this->setItem(self::SLOT_CHEST, $chestplate);
}
public function setLeggings(Item $leggings) : bool{
return $this->setItem(self::SLOT_LEGS, $leggings);
}
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];
}
$armor = $this->getContents(true);
$pk = new MobArmorEquipmentPacket();
$pk->entityRuntimeId = $this->getHolder()->getId();
$pk->slots = $armor;
$pk->encode();
foreach($target as $player){
if($player === $this->getHolder()){
/** @var Player $player */
$pk2 = new InventorySlotPacket();
$pk2->windowId = $player->getWindowId($this);
$pk2->inventorySlot = $index;
$pk2->item = $this->getItem($index);
$player->dataPacket($pk2);
}else{
$player->dataPacket($pk);
}
}
}
public function sendContents($target) : void{
if($target instanceof Player){
$target = [$target];
}
$armor = $this->getContents(true);
$pk = new MobArmorEquipmentPacket();
$pk->entityRuntimeId = $this->getHolder()->getId();
$pk->slots = $armor;
$pk->encode();
foreach($target as $player){
if($player === $this->getHolder()){
$pk2 = new InventoryContentPacket();
$pk2->windowId = $player->getWindowId($this);
$pk2->items = $armor;
$player->dataPacket($pk2);
}else{
$player->dataPacket($pk);
}
}
}
/**
* @return Player[]
*/
public function getViewers() : array{
return array_merge(parent::getViewers(), $this->holder->getViewers());
}
}