diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 559090fa08..24b6aa22a2 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -1302,7 +1302,7 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener, } $this->networkSession->syncAdventureSettings($this); - $this->inventory->sendCreativeContents(); + $this->networkSession->syncCreativeInventoryContents(); return true; } diff --git a/src/pocketmine/inventory/PlayerInventory.php b/src/pocketmine/inventory/PlayerInventory.php index 5629a706e8..206ad8660a 100644 --- a/src/pocketmine/inventory/PlayerInventory.php +++ b/src/pocketmine/inventory/PlayerInventory.php @@ -25,7 +25,6 @@ namespace pocketmine\inventory; use pocketmine\entity\Human; use pocketmine\item\Item; -use pocketmine\network\mcpe\protocol\InventoryContentPacket; use pocketmine\network\mcpe\protocol\MobEquipmentPacket; use pocketmine\network\mcpe\protocol\types\ContainerIds; use pocketmine\Player; @@ -156,23 +155,6 @@ class PlayerInventory extends BaseInventory{ return 9; } - public function sendCreativeContents() : void{ - //TODO: this mess shouldn't be in here - $holder = $this->getHolder(); - if(!($holder instanceof Player)){ - throw new \LogicException("Cannot send creative inventory contents to non-player inventory holder"); - } - - $items = []; - if(!$holder->isSpectator()){ //fill it for all gamemodes except spectator - foreach(CreativeInventory::getAll() as $i => $item){ - $items[$i] = clone $item; - } - } - - $holder->sendDataPacket(InventoryContentPacket::create(ContainerIds::CREATIVE, $items)); - } - /** * This override is here for documentation and code completion purposes only. * @return Human|Player diff --git a/src/pocketmine/network/mcpe/NetworkSession.php b/src/pocketmine/network/mcpe/NetworkSession.php index c5ab78e39b..c6cd8a9c3d 100644 --- a/src/pocketmine/network/mcpe/NetworkSession.php +++ b/src/pocketmine/network/mcpe/NetworkSession.php @@ -30,6 +30,7 @@ use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\event\server\DataPacketSendEvent; use pocketmine\form\Form; use pocketmine\GameMode; +use pocketmine\inventory\CreativeInventory; use pocketmine\inventory\Inventory; use pocketmine\math\Vector3; use pocketmine\network\BadPacketException; @@ -774,6 +775,17 @@ class NetworkSession{ } } + public function syncCreativeInventoryContents() : void{ + $items = []; + if(!$this->player->isSpectator()){ //fill it for all gamemodes except spectator + foreach(CreativeInventory::getAll() as $i => $item){ + $items[$i] = clone $item; + } + } + + $this->sendDataPacket(InventoryContentPacket::create(ContainerIds::CREATIVE, $items)); + } + public function onMobArmorChange(Living $mob) : void{ $inv = $mob->getArmorInventory(); $this->sendDataPacket(MobArmorEquipmentPacket::create($mob->getId(), $inv->getHelmet(), $inv->getChestplate(), $inv->getLeggings(), $inv->getBoots())); diff --git a/src/pocketmine/network/mcpe/handler/PreSpawnSessionHandler.php b/src/pocketmine/network/mcpe/handler/PreSpawnSessionHandler.php index ef8fd1f33d..63f8a11213 100644 --- a/src/pocketmine/network/mcpe/handler/PreSpawnSessionHandler.php +++ b/src/pocketmine/network/mcpe/handler/PreSpawnSessionHandler.php @@ -92,7 +92,7 @@ class PreSpawnSessionHandler extends SessionHandler{ $this->player->sendData($this->player); $this->session->syncAllInventoryContents(); - $this->player->getInventory()->sendCreativeContents(); + $this->session->syncCreativeInventoryContents(); $this->player->getInventory()->sendHeldItem($this->player); $this->session->queueCompressed($this->server->getCraftingManager()->getCraftingDataPacket());