I'm using this code to open a chest when /chest is run Spoiler: Code PHP: <?phpnamespace PrivateVault;use pocketmine\block\Block;use pocketmine\command\Command;use pocketmine\command\CommandSender;use pocketmine\event\inventory\InventoryCloseEvent;use pocketmine\event\Listener;use pocketmine\event\player\PlayerJoinEvent;use pocketmine\event\player\PlayerQuitEvent;use pocketmine\inventory\ChestInventory;use pocketmine\item\enchantment\Enchantment;use pocketmine\item\Item;use pocketmine\level\Position;use pocketmine\math\Vector3;use pocketmine\nbt\NBT;use pocketmine\nbt\tag\CompoundTag;use pocketmine\nbt\tag\IntTag;use pocketmine\nbt\tag\ListTag;use pocketmine\nbt\tag\StringTag;use pocketmine\Player;use pocketmine\plugin\PluginBase;use pocketmine\tile\Chest;use pocketmine\tile\Tile;use pocketmine\utils\Config;use pocketmine\utils\TextFormat;use pocketmine\item\ItemBlock;use pocketmine\permission\Permission;class main extends PluginBase implements Listener { public $using = array(); public function onEnable() { $this->getServer()->getLogger()->info(TextFormat::GREEN."<<PlayerVault>> ENABLED"); $this->saveDefaultConfig(); $this->getServer()->getPluginManager()->registerEvents($this, $this); @mkdir($this->getDataFolder()); @mkdir($this->getDataFolder() . "players/"); for($i = 0; $i < 4; $i++) { $vaultperms = new Permission("vault.use." . $i, "PrivateVaults permission", "default"); $this->getServer()->getPluginManager()->addPermission($vaultperms); } } public function onDisable() { $this->getServer()->getLogger()->info(TextFormat::GREEN."<<PlayerVault>> DISABLED"); } public function onJoin(PlayerJoinEvent $event) { $this->using[strtolower($event->getPlayer()->getName())] = null; } public function hasPrivateVault($player) { if($player instanceof Player) { $player = $player->getName(); } $player = strtolower($player); return is_file($this->getDataFolder() . "players/" . $player . ".yml"); } public function createVault($player, $number) { if($player instanceof Player) { $player = $player->getName(); } $player = strtolower($player); $cfg = new Config($this->getDataFolder() . "players/" . $player . ".yml", Config::YAML); $cfg->set("items", array()); for ($i = 0; $i < 26; $i++) { $cfg->setNested("$number.items." . $i, array(0, 0, 0, array())); } $cfg->save(); } public function loadVault(Player $player, $number) { $x=$player->getX(); $y=$player->getY() - 3; $z=$player->getZ(); $block = Block::get(54); $player->getLevel()->setBlock(new Vector3($player->x, $player->y - 2, $player->z), $block, true, true); $nbt = new CompoundTag("", [ new ListTag("Items", []), new StringTag("id", Tile::CHEST), new IntTag("x", floor($player->x)), new IntTag("y", floor($player->y) - 2), new IntTag("z", floor($player->z)) ]); $nbt->Items->setTagType(NBT::TAG_Compound); $tile = Tile::createTile("Chest", $player->getLevel()->getChunk($player->getX() >> 4, $player->getZ() >> 4), $nbt); if($player instanceof Player) { $player = $player->getName(); } $player = strtolower($player); $cfg = new Config($this->getDataFolder() . "players/" . $player . ".yml", Config::YAML); $tile->getInventory()->clearAll(); for ($i = 0; $i < 26; $i++) { $ite = $cfg->getNested("$number.items." . $i); $item = Item::get($ite[0]); $item->setDamage($ite[1]); $item->setCount($ite[2]); foreach ($ite[3] as $key => $en) { $enchantment = Enchantment::getEnchantment($en[0]); $enchantment->setLevel($en[1]); $item->addEnchantment($enchantment); } $tile->getInventory()->setItem($i, $item); } return $tile->getInventory(); } public function onInventoryClose(InventoryCloseEvent $event) { $inventory = $event->getInventory(); $player = $event->getPlayer(); if($inventory instanceof ChestInventory) { if($this->using[strtolower($player->getName())] !== null) { if($player instanceof Player) { $player = $player->getName(); } $player = strtolower($player); $cfg = new Config($this->getDataFolder() . "players/" . $player . ".yml", Config::YAML); for ($i = 0; $i < 26; $i++) { $item = $inventory->getItem($i); $id = $item->getId(); $damage = $item->getDamage(); $count = $item->getCount(); $enchantments = $item->getEnchantments(); $ens = array(); foreach ($enchantments as $en) { $ide = $en->getId(); $level = $en->getLevel(); array_push($ens, array($ide, $level)); } $number = $this->using[strtolower($event->getPlayer()->getName())]; $cfg->setNested("$number.items." . $i, array($id, $damage, $count, $ens)); $cfg->save(); } $realChest = $inventory->getHolder(); $event->getPlayer()->getLevel()->setBlock(new Vector3($realChest->getX(), 128, $realChest->getZ()), Block::get(Block::AIR)); $this->using[strtolower($event->getPlayer()->getName())] = null; } } } public function saveVault($player, $inventory, $number) { if($player instanceof Player) { $player = $player->getName(); } $player = strtolower($player); if($inventory instanceof ChestInventory) { $cfg = new Config($this->getDataFolder() . "players/" . $player . ".yml", Config::YAML); for ($i = 0; $i < 26; $i++) { $item = $inventory->getItem($i); $id = $item->getId(); $damage = $item->getDamage(); $count = $item->getCount(); $enchantments = $item->getEnchantments(); $ens = array(); foreach ($enchantments as $en) { $id = $en->getId(); $level = $en->getLevel(); array_push($ens, array($id, $level)); } $cfg->setNested("$number.items." . $i, array($id, $damage, $count, $ens)); $cfg->save(); } $realChest = $inventory->getHolder(); $realChest->getLevel()->setBlock(new Vector3($realChest->getX(), 128, $realChest->getZ()), Block::get(Block::AIR)); } } public function onQuit(PlayerQuitEvent $event) { if($this->using[strtolower($event->getPlayer()->getName())] !== null) { $chest = $event->getPlayer()->getLevel()->getTile(new Position($event->getPlayer()->x, $event->getPlayer()->y, $event->getPlayer()->z)); if($chest instanceof Chest) { $inv = $chest->getInventory(); $this->saveVault($event->getPlayer(), $inv, $this->using[strtolower($event->getPlayer()->getName())]); unset($this->using[strtolower($event->getPlayer()->getName())]); } } } public function onCommand(CommandSender $sender, Command $cmd, $label, array $args) { if($sender instanceof Player) { switch ($cmd->getName()) { case "chest": if($this->hasPrivateVault($sender)) { if($sender->hasPermission("vault.use.1")) { $args[0] = 1; $sender->addWindow($this->loadVault($sender, 1)); $this->using[strtolower($sender->getName())] = (int)$args[0]; return true; return true; } }else { if($args[0] < 1 || $args[0] > 3) { $sender->sendMessage("§l§eUse /chest [1-3]"); return true; }else { $sender->addWindow($this->loadVault($sender, $args[0])); $sender->sendTip("§aOpening §6Wi§fFi Chest"); $this->using[strtolower($sender->getName())] = (int)$args[0]; return true; }else { $sender->sendMessage("§l§eYou do not have permission to have more than 1 chest!"); return true; } } } }else { $sender->sendMessage("§l§eCreating chest.."); for($i = 0; $i < 4; $i++) { $this->createVault($sender, $i); } $sender->sendMessage("§l§aYour §6Wi§fFi §a Chest is created. run /chest again to open!"); return true; } } } return true; }} The problem that I'm having is that when /chest is run, it opens a chest window but the chat keyboard stays open, when I try to close the keyboard by tapping anywhere in the chest screen, the chest closes. anyway to fix this?
like do a damage THEN open the chest? also just FYI that's a bad copy of private value it have a lot of duplication flaws
No, #blameMojang. This didn't use to happen during 0.16 and before. What you can do is... just after executing the command, tap anywhere (not the keyboard tho) on your screen once.