*/ private \SplFixedArray $changedSlots; public function __construct( private InventoryWindow $inventoryWindow ){ parent::__construct(); $this->changedSlots = new \SplFixedArray($this->inventoryWindow->getInventory()->getSize()); } public function getInventoryWindow() : InventoryWindow{ return $this->inventoryWindow; } protected function internalSetContents(array $items) : void{ for($i = 0, $size = $this->getSize(); $i < $size; ++$i){ if(!isset($items[$i])){ $this->clear($i); }else{ $this->setItem($i, $items[$i]); } } } protected function internalSetItem(int $index, Item $item) : void{ if(!$item->equalsExact($this->inventoryWindow->getInventory()->getItem($index))){ $this->changedSlots[$index] = $item->isNull() ? VanillaItems::AIR() : clone $item; } } public function getSize() : int{ return $this->inventoryWindow->getInventory()->getSize(); } public function getItem(int $index) : Item{ return $this->changedSlots[$index] !== null ? clone $this->changedSlots[$index] : $this->inventoryWindow->getInventory()->getItem($index); } public function getContents(bool $includeEmpty = false) : array{ $contents = $this->inventoryWindow->getInventory()->getContents($includeEmpty); foreach($this->changedSlots as $index => $item){ if($item !== null){ if($includeEmpty || !$item->isNull()){ $contents[$index] = clone $item; }else{ unset($contents[$index]); } } } return $contents; } public function getMatchingItemCount(int $slot, Item $test, bool $checkTags) : int{ $slotItem = $this->changedSlots[$slot] ?? null; if($slotItem !== null){ return $slotItem->equals($test, true, $checkTags) ? $slotItem->getCount() : 0; } return $this->inventoryWindow->getInventory()->getMatchingItemCount($slot, $test, $checkTags); } /** * @return SlotChangeAction[] */ public function generateActions() : array{ $result = []; $inventory = $this->inventoryWindow->getInventory(); foreach($this->changedSlots as $index => $newItem){ if($newItem !== null){ $oldItem = $inventory->getItem($index); if(!$newItem->equalsExact($oldItem)){ $result[] = new SlotChangeAction($this->inventoryWindow, $index, $oldItem, $newItem); } } } return $result; } public function getViewers() : array{ return []; } public function removeAllWindows() : void{ //NOOP } public function onOpen(InventoryWindow $window) : void{ //NOOP } public function onClose(InventoryWindow $window) : void{ //NOOP } }