1. The forums will be archived and moved to a read only mode in about 2 weeks (mid march).

Chat stays open after addWindow

Discussion in 'Development' started by Kabluinc, Jan 13, 2017.

  1. Kabluinc

    Kabluinc Baby Zombie

    Messages:
    129
    I'm using this code to open a chest when /chest is run

    PHP:
    <?php
    namespace 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(000, 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->2$player->z), $blocktruetrue);
      
    $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 $senderCommand $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($sender1));
                                    
    $this->using[strtolower($sender->getName())] = (int)$args[0];
                                    return 
    true;
                                    return 
    true;
                                }
                            }else {
                                if(
    $args[0] < || $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?
     
  2. HimbeersaftLP

    HimbeersaftLP Fish

    Messages:
    2,402
    GitHub:
    HimbeersaftLP
    Maybe damage the player?
     
  3. Kabluinc

    Kabluinc Baby Zombie

    Messages:
    129
    Damaging the player closes the chest too :/
     
  4. HimbeersaftLP

    HimbeersaftLP Fish

    Messages:
    2,402
    GitHub:
    HimbeersaftLP
    Dang, I'm sure there's a workarohnd for this
     
  5. Thunder33345

    Thunder33345 Moderator Staff Member

    Messages:
    2,137
    GitHub:
    Thunder33345
    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
     
    HimbeersaftLP likes this.
  6. HimbeersaftLP

    HimbeersaftLP Fish

    Messages:
    2,402
    GitHub:
    HimbeersaftLP
    Is there any proper way to do it then?
     
  7. Muqsit

    Muqsit Chicken

    Messages:
    1,548
    GitHub:
    muqsit
    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.
     
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.