From 6efb1db1076d9b2219653572933e8b834cfc41f5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 8 Nov 2021 23:03:41 +0000 Subject: [PATCH] Fixed inventories not working after dying with inventory open closes #4185 closes #4177 --- src/network/mcpe/NetworkSession.php | 3 ++- src/network/mcpe/handler/DeathPacketHandler.php | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index ee7c349971..2fe44e3acb 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -111,6 +111,7 @@ use pocketmine\player\UsedChunkStatus; use pocketmine\player\XboxLivePlayerInfo; use pocketmine\Server; use pocketmine\timings\Timings; +use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\ObjectSet; use pocketmine\utils\TextFormat; use pocketmine\utils\Utils; @@ -714,7 +715,7 @@ class NetworkSession{ public function onServerDeath() : void{ if($this->handler instanceof InGamePacketHandler){ //TODO: this is a bad fix for pre-spawn death, this shouldn't be reachable at all at this stage :( - $this->setHandler(new DeathPacketHandler($this->player, $this)); + $this->setHandler(new DeathPacketHandler($this->player, $this, $this->invManager ?? throw new AssumptionFailedError())); } } diff --git a/src/network/mcpe/handler/DeathPacketHandler.php b/src/network/mcpe/handler/DeathPacketHandler.php index c3421f1a5f..bc56729c9b 100644 --- a/src/network/mcpe/handler/DeathPacketHandler.php +++ b/src/network/mcpe/handler/DeathPacketHandler.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace pocketmine\network\mcpe\handler; +use pocketmine\network\mcpe\InventoryManager; use pocketmine\network\mcpe\NetworkSession; +use pocketmine\network\mcpe\protocol\ContainerClosePacket; use pocketmine\network\mcpe\protocol\PlayerActionPacket; use pocketmine\network\mcpe\protocol\RespawnPacket; use pocketmine\network\mcpe\protocol\types\PlayerAction; @@ -35,10 +37,12 @@ class DeathPacketHandler extends PacketHandler{ private $player; /** @var NetworkSession */ private $session; + private InventoryManager $inventoryManager; - public function __construct(Player $player, NetworkSession $session){ + public function __construct(Player $player, NetworkSession $session, InventoryManager $inventoryManager){ $this->player = $player; $this->session = $session; + $this->inventoryManager = $inventoryManager; } public function setUp() : void{ @@ -58,6 +62,11 @@ class DeathPacketHandler extends PacketHandler{ return false; } + public function handleContainerClose(ContainerClosePacket $packet) : bool{ + $this->inventoryManager->onClientRemoveWindow($packet->windowId); + return true; + } + public function handleRespawn(RespawnPacket $packet) : bool{ if($packet->respawnState === RespawnPacket::CLIENT_READY_TO_SPAWN){ $this->session->sendDataPacket(RespawnPacket::create(