Improved handling of temporary inventory windows

evacuation behaviour is now consistent regardless of who is doing it
This commit is contained in:
Dylan K. Taylor 2021-11-08 23:36:58 +00:00
parent 6efb1db107
commit ab002ca06d
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D
7 changed files with 14 additions and 46 deletions

View File

@ -24,10 +24,10 @@ declare(strict_types=1);
namespace pocketmine\block\inventory; namespace pocketmine\block\inventory;
use pocketmine\inventory\SimpleInventory; use pocketmine\inventory\SimpleInventory;
use pocketmine\player\Player; use pocketmine\inventory\TemporaryInventory;
use pocketmine\world\Position; use pocketmine\world\Position;
class AnvilInventory extends SimpleInventory implements BlockInventory{ class AnvilInventory extends SimpleInventory implements BlockInventory, TemporaryInventory{
use BlockInventoryTrait; use BlockInventoryTrait;
public const SLOT_INPUT = 0; public const SLOT_INPUT = 0;
@ -37,13 +37,4 @@ class AnvilInventory extends SimpleInventory implements BlockInventory{
$this->holder = $holder; $this->holder = $holder;
parent::__construct(2); parent::__construct(2);
} }
public function onClose(Player $who) : void{
parent::onClose($who);
foreach($this->getContents() as $item){
$who->dropItem($item);
}
$this->clearAll();
}
} }

View File

@ -24,23 +24,14 @@ declare(strict_types=1);
namespace pocketmine\block\inventory; namespace pocketmine\block\inventory;
use pocketmine\crafting\CraftingGrid; use pocketmine\crafting\CraftingGrid;
use pocketmine\player\Player; use pocketmine\inventory\TemporaryInventory;
use pocketmine\world\Position; use pocketmine\world\Position;
final class CraftingTableInventory extends CraftingGrid implements BlockInventory{ final class CraftingTableInventory extends CraftingGrid implements BlockInventory, TemporaryInventory{
use BlockInventoryTrait; use BlockInventoryTrait;
public function __construct(Position $holder){ public function __construct(Position $holder){
$this->holder = $holder; $this->holder = $holder;
parent::__construct(CraftingGrid::SIZE_BIG); parent::__construct(CraftingGrid::SIZE_BIG);
} }
public function onClose(Player $who) : void{
parent::onClose($who);
foreach($this->getContents() as $item){
$who->dropItem($item);
}
$this->clearAll();
}
} }

View File

@ -24,10 +24,10 @@ declare(strict_types=1);
namespace pocketmine\block\inventory; namespace pocketmine\block\inventory;
use pocketmine\inventory\SimpleInventory; use pocketmine\inventory\SimpleInventory;
use pocketmine\player\Player; use pocketmine\inventory\TemporaryInventory;
use pocketmine\world\Position; use pocketmine\world\Position;
class EnchantInventory extends SimpleInventory implements BlockInventory{ class EnchantInventory extends SimpleInventory implements BlockInventory, TemporaryInventory{
use BlockInventoryTrait; use BlockInventoryTrait;
public const SLOT_INPUT = 0; public const SLOT_INPUT = 0;
@ -37,13 +37,4 @@ class EnchantInventory extends SimpleInventory implements BlockInventory{
$this->holder = $holder; $this->holder = $holder;
parent::__construct(2); parent::__construct(2);
} }
public function onClose(Player $who) : void{
parent::onClose($who);
foreach($this->getContents() as $item){
$who->dropItem($item);
}
$this->clearAll();
}
} }

View File

@ -24,10 +24,11 @@ declare(strict_types=1);
namespace pocketmine\block\inventory; namespace pocketmine\block\inventory;
use pocketmine\inventory\SimpleInventory; use pocketmine\inventory\SimpleInventory;
use pocketmine\inventory\TemporaryInventory;
use pocketmine\player\Player; use pocketmine\player\Player;
use pocketmine\world\Position; use pocketmine\world\Position;
final class LoomInventory extends SimpleInventory implements BlockInventory{ final class LoomInventory extends SimpleInventory implements BlockInventory, TemporaryInventory{
use BlockInventoryTrait; use BlockInventoryTrait;
public const SLOT_BANNER = 0; public const SLOT_BANNER = 0;
@ -38,13 +39,4 @@ final class LoomInventory extends SimpleInventory implements BlockInventory{
$this->holder = $holder; $this->holder = $holder;
parent::__construct($size); parent::__construct($size);
} }
public function onClose(Player $who) : void{
parent::onClose($who);
foreach($this->getContents() as $item){
$who->dropItem($item);
}
$this->clearAll();
}
} }

View File

@ -26,7 +26,7 @@ namespace pocketmine\inventory;
use pocketmine\crafting\CraftingGrid; use pocketmine\crafting\CraftingGrid;
use pocketmine\player\Player; use pocketmine\player\Player;
final class PlayerCraftingInventory extends CraftingGrid{ final class PlayerCraftingInventory extends CraftingGrid implements TemporaryInventory{
public function __construct(private Player $holder){ public function __construct(private Player $holder){
parent::__construct(CraftingGrid::SIZE_SMALL); parent::__construct(CraftingGrid::SIZE_SMALL);

View File

@ -25,7 +25,7 @@ namespace pocketmine\inventory;
use pocketmine\player\Player; use pocketmine\player\Player;
class PlayerCursorInventory extends SimpleInventory{ class PlayerCursorInventory extends SimpleInventory implements TemporaryInventory{
/** @var Player */ /** @var Player */
protected $holder; protected $holder;

View File

@ -77,6 +77,7 @@ use pocketmine\inventory\CallbackInventoryListener;
use pocketmine\inventory\Inventory; use pocketmine\inventory\Inventory;
use pocketmine\inventory\PlayerCraftingInventory; use pocketmine\inventory\PlayerCraftingInventory;
use pocketmine\inventory\PlayerCursorInventory; use pocketmine\inventory\PlayerCursorInventory;
use pocketmine\inventory\TemporaryInventory;
use pocketmine\inventory\transaction\action\DropItemAction; use pocketmine\inventory\transaction\action\DropItemAction;
use pocketmine\inventory\transaction\InventoryTransaction; use pocketmine\inventory\transaction\InventoryTransaction;
use pocketmine\inventory\transaction\TransactionBuilderInventory; use pocketmine\inventory\transaction\TransactionBuilderInventory;
@ -2322,8 +2323,10 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{
* inventory. * inventory.
*/ */
public function doCloseInventory() : void{ public function doCloseInventory() : void{
/** @var Inventory[] $inventories */
$inventories = [$this->craftingGrid, $this->cursorInventory]; $inventories = [$this->craftingGrid, $this->cursorInventory];
if($this->currentWindow instanceof TemporaryInventory){
$inventories[] = $this->currentWindow;
}
$transaction = new InventoryTransaction($this); $transaction = new InventoryTransaction($this);
$mainInventoryTransactionBuilder = new TransactionBuilderInventory($this->inventory); $mainInventoryTransactionBuilder = new TransactionBuilderInventory($this->inventory);