PocketMine-MP 5.23.3 git-f7687af337d001ddbcc47b8e773f014a33faa662
Loading...
Searching...
No Matches
SlotChangeAction.php
1<?php
2
3/*
4 *
5 * ____ _ _ __ __ _ __ __ ____
6 * | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
7 * | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
8 * | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
9 * |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
10 *
11 * This program is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License as published by
13 * the Free Software Foundation, either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * @author PocketMine Team
17 * @link http://www.pocketmine.net/
18 *
19 *
20 */
21
22declare(strict_types=1);
23
24namespace pocketmine\inventory\transaction\action;
25
31
36 public function __construct(
37 protected Inventory $inventory,
38 private int $inventorySlot,
39 Item $sourceItem,
40 Item $targetItem
41 ){
42 parent::__construct($sourceItem, $targetItem);
43 }
44
48 public function getInventory() : Inventory{
49 return $this->inventory;
50 }
51
55 public function getSlot() : int{
56 return $this->inventorySlot;
57 }
58
64 public function validate(Player $source) : void{
65 if(!$this->inventory->slotExists($this->inventorySlot)){
66 throw new TransactionValidationException("Slot does not exist");
67 }
68 if(!$this->inventory->getItem($this->inventorySlot)->equalsExact($this->sourceItem)){
69 throw new TransactionValidationException("Slot does not contain expected original item");
70 }
71 if($this->targetItem->getCount() > $this->targetItem->getMaxStackSize()){
72 throw new TransactionValidationException("Target item exceeds item type max stack size");
73 }
74 if($this->targetItem->getCount() > $this->inventory->getMaxStackSize()){
75 throw new TransactionValidationException("Target item exceeds inventory max stack size");
76 }
77 if($this->inventory instanceof SlotValidatedInventory && !$this->targetItem->isNull()){
78 foreach($this->inventory->getSlotValidators() as $validator){
79 $ret = $validator->validate($this->inventory, $this->targetItem, $this->inventorySlot);
80 if($ret !== null){
81 throw new TransactionValidationException("Target item is not accepted by the inventory at slot #" . $this->inventorySlot . ": " . $ret->getMessage(), 0, $ret);
82 }
83 }
84 }
85 }
86
90 public function execute(Player $source) : void{
91 $this->inventory->setItem($this->inventorySlot, $this->targetItem);
92 }
93}