Separate held item index change listener logic from PlayerInventory

This commit is contained in:
Dylan K. Taylor
2021-01-12 16:44:25 +00:00
parent 01c867b608
commit c70c0b55df
5 changed files with 48 additions and 17 deletions

View File

@ -76,6 +76,8 @@ class InventoryManager{
* @phpstan-var array<int, array<int, Item>>
*/
private $initiatedSlotChanges = [];
/** @var int */
private $clientSelectedHotbarSlot = -1;
public function __construct(Player $player, NetworkSession $session){
$this->player = $player;
@ -84,6 +86,10 @@ class InventoryManager{
$this->add(ContainerIds::INVENTORY, $this->player->getInventory());
$this->add(ContainerIds::ARMOR, $this->player->getArmorInventory());
$this->add(ContainerIds::UI, $this->player->getCursorInventory());
$this->player->getInventory()->getHeldItemIndexChangeListeners()->add(function() : void{
$this->syncSelectedHotbarSlot();
});
}
private function add(int $id, Inventory $inventory) : void{
@ -206,13 +212,21 @@ class InventoryManager{
}
}
public function onClientSelectHotbarSlot(int $slot) : void{
$this->clientSelectedHotbarSlot = $slot;
}
public function syncSelectedHotbarSlot() : void{
$this->session->sendDataPacket(MobEquipmentPacket::create(
$this->player->getId(),
TypeConverter::getInstance()->coreItemStackToNet($this->player->getInventory()->getItemInHand()),
$this->player->getInventory()->getHeldItemIndex(),
ContainerIds::INVENTORY
));
$selected = $this->player->getInventory()->getHeldItemIndex();
if($selected !== $this->clientSelectedHotbarSlot){
$this->session->sendDataPacket(MobEquipmentPacket::create(
$this->player->getId(),
TypeConverter::getInstance()->coreItemStackToNet($this->player->getInventory()->getItemInHand()),
$selected,
ContainerIds::INVENTORY
));
$this->clientSelectedHotbarSlot = $selected;
}
}
public function syncCreative() : void{

View File

@ -448,6 +448,7 @@ class InGamePacketHandler extends PacketHandler{
}
public function handleMobEquipment(MobEquipmentPacket $packet) : bool{
$this->session->getInvManager()->onClientSelectHotbarSlot($packet->hotbarSlot);
if(!$this->player->selectHotbarSlot($packet->hotbarSlot)){
$this->session->getInvManager()->syncSelectedHotbarSlot();
}