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

How do I get the servers query count?

Discussion in 'Development' started by rektpixel, Oct 10, 2017.

  1. rektpixel

    rektpixel Baby Zombie

    Messages:
    186
    I want to get the player count using the servers query count (not getting all the online players) I have this:
    PHP:
    $player->sendMessage("§aThere are " $this->getPlayerCount " §aPlayers Online");
    but it doesn't seem to work.
    here is the rest of the code if needed to solve:
    PHP:
    <?php
    namespace itsmemes\join;

    use 
    pocketmine\event\Listener;
    use 
    pocketmine\plugin\PluginBase;
    use 
    pocketmine\command\Command;
    use 
    pocketmine\command\CommandSender;
    use 
    pocketmine\plugin\Plugin;
    use 
    pocketmine\event\player\PlayerJoinEvent;
    use 
    pocketmine\Server;
    use 
    pocketmine\Player;
    use 
    pocketmine\math\Vector3;
    use 
    pocketmine\utils\Config;
    use 
    pocketmine\event\server\QueryRegenerateEvent;

    class 
    Main extends PluginBase implements Listener{
     
        public function 
    onEnable() {
            
    $this->getServer()->getPluginManager()->registerEvents($this$this);
        }

        public function 
    onJoin(PlayerJoinEvent $join){
            
    $player $join->getPlayer();
            
    $player->setGamemode(2);
            
    $player->teleport(new \pocketmine\math\Vector3(4945, -890));
            
    $player->sendMessage("§aThere are " $this->getPlayerCount " Players Online");
            return 
    true;
        }
    }
    error:
    Code:
    [20:30:29] [Server thread/CRITICAL]: Could not pass event 'pocketmine\event\player\PlayerJoinEvent' to 'JoinEvent v1.5': Undefined property: itsmemes\join\Main::$getPlayerCount on itsmemes\join\Main
    [20:30:29] [Server thread/CRITICAL]: ErrorException: "Undefined property: itsmemes\join\Main::$getPlayerCount" (EXCEPTION) in "JoinEvent/src/itsmemes/join/Main" at line 27
    [20:30:29] [Server thread/DEBUG]: #0 JoinEvent/src/itsmemes/join/Main(27): pocketmine\error_handler(integer 8, string Undefined property: itsmemes\join\Main::$getPlayerCount, string C:\Users\Admin\Creative Cloud Files\Desktop\PrymePE Test Server\plugins\JoinEvent\src\itsmemes\join\Main.php, integer 27, array Array())
    [20:30:29] [Server thread/DEBUG]: #1 src/pocketmine/plugin/MethodEventExecutor(38): itsmemes\join\Main->onJoin(pocketmine\event\player\PlayerJoinEvent object)
    [20:30:29] [Server thread/DEBUG]: #2 src/pocketmine/plugin/RegisteredListener(98): pocketmine\plugin\MethodEventExecutor->execute(itsmemes\join\Main object, pocketmine\event\player\PlayerJoinEvent object)
    [20:30:29] [Server thread/DEBUG]: #3 src/pocketmine/plugin/PluginManager(721): pocketmine\plugin\RegisteredListener->callEvent(pocketmine\event\player\PlayerJoinEvent object)
    [20:30:29] [Server thread/DEBUG]: #4 src/pocketmine/Player(951): pocketmine\plugin\PluginManager->callEvent(pocketmine\event\player\PlayerJoinEvent object)
    [20:30:29] [Server thread/DEBUG]: #5 src/pocketmine/Player(891): pocketmine\Player->doFirstSpawn()
    [20:30:29] [Server thread/DEBUG]: #6 src/pocketmine/level/Level(2387): pocketmine\Player->sendChunk(integer 1, integer -53, pocketmine\network\mcpe\protocol\BatchPacket object)
    [20:30:29] [Server thread/DEBUG]: #7 src/pocketmine/level/Level(2428): pocketmine\level\Level->sendChunkFromCache(integer 1, integer -53)
    [20:30:29] [Server thread/DEBUG]: #8 src/pocketmine/level/format/io/ChunkRequestTask(91): pocketmine\level\Level->chunkRequestCallback(integer 1, integer -53, pocketmine\network\mcpe\protocol\BatchPacket object)
    [20:30:29] [Server thread/DEBUG]: #9 src/pocketmine/scheduler/AsyncPool(164): pocketmine\level\format\io\ChunkRequestTask->onCompletion(pocketmine\Server object)
    [20:30:29] [Server thread/DEBUG]: #10 src/pocketmine/scheduler/ServerScheduler(342): pocketmine\scheduler\AsyncPool->collectTasks()
    [20:30:29] [Server thread/DEBUG]: #11 src/pocketmine/Server(2510): pocketmine\scheduler\ServerScheduler->mainThreadHeartbeat(integer 397)
    [20:30:29] [Server thread/DEBUG]: #12 src/pocketmine/Server(2257): pocketmine\Server->tick()
    [20:30:29] [Server thread/DEBUG]: #13 src/pocketmine/Server(2136): pocketmine\Server->tickProcessor()
    [20:30:29] [Server thread/DEBUG]: #14 src/pocketmine/Server(1718): pocketmine\Server->start()
    [20:30:29] [Server thread/DEBUG]: #15 src/pocketmine/PocketMine(556): pocketmine\Server->__construct(BaseClassLoader object, pocketmine\utils\MainLogger object, string phar://C:/Users/Admin/Creative Cloud Files/Desktop/PrymePE Test Server/PocketMine-MP.phar/, string C:\Users\Admin\Creative Cloud Files\Desktop\PrymePE Test Server\, string C:\Users\Admin\Creative Cloud Files\Desktop\PrymePE Test Server\plugins\)
    [20:30:29] [Server thread/DEBUG]: #16 C:/Users/Admin/Creative Cloud Files/Desktop/PrymePE Test Server/PocketMine-MP.phar(1): require(string phar://C:/Users/Admin/Creative Cloud Files/Desktop/PrymePE Test Server/PocketMine-MP.phar/src/pocketmine/PocketMine.php)
    
    and would it use pocketmine\event\server\QueryRegenerateEvent ? I'm a bit confused
     
  2. rektpixel

    rektpixel Baby Zombie

    Messages:
    186
    as I mentioned; I don't want to getOnlinePlayers. I don't want to do this because I have multiple servers which there slots are connected with CombinedSlots to the main lobby server.
     
  3. Irish

    Irish Baby Zombie

    Messages:
    156
    GitHub:
    irishpacks
    You can use an AsyncTask to query the amount of players on the other server and use QueryRegenerateEvent to set the player count or if you know how, MySQL is a good way as well.
     
    Last edited: Oct 10, 2017
    Levi likes this.
  4. robske_110 (Tim)

    robske_110 (Tim) Wither Skeleton Poggit Reviewer

    Messages:
    1,342
    GitHub:
    robske110
    You could use https://github.com/robske110/SignServerStats and interface with its API
    PHP:
    /** @var $sss robske_110\SSS\SignServerStats */
    $sss->addServer("example.com"1234);
    PHP:
    public function onSSSasyncUpdate(robske_110\SSS\event\SSSasyncUpdateEvent $event){
        
    $serverPlayersArray $event->getPlugin()->getPlayerData();
        if(isset(
    $serverPlayersArray["example.com"."@".1234])){
            
    $playerCount $serverPlayersArray["example.com"."@".1234];
        }else{
            
    //The information is going to be here in the next event!
        
    }
    }
     
  5. rektpixel

    rektpixel Baby Zombie

    Messages:
    186
    There must be a more simple way tho.. like look at the plugin FakePlayers they set the query simply:
    PHP:
        public function onQueryRegenerate(QueryRegenerateEvent $event) {
            
    $event->setPlayerCount($this->config->get("players-count"));
            
    $event->setMaxPlayerCount($this->config->get("max-players-count"));
        }
    }
    how is it not this easy to get the count
     
  6. SOFe

    SOFe Administrator Staff Member PMMP Team Poggit Admin

    Messages:
    1,968
    GitHub:
    sof3
    Do you simply want to know the player count as displayed in QueryRegenerateEvent? You can use the Server->getQueryInformation() to get the latest query result.
     
    rektpixel and jasonwynn10 like this.
  7. rektpixel

    rektpixel Baby Zombie

    Messages:
    186
    What if I use CombinedSlots to get the query count..
    PHP:
        public function queryRegen(QueryRegenerateEvent $ev)
        {
            
    $totalPlayers 0;
            
    $maxPlayers 0;
            foreach (
    $this->server as $server) {
                
    $server explode(":"$server);
                try {
                    
    $this->Query->Connect($server[0], $server[1], $this->timeout);
                    
    $array = ($this->Query->GetInfo());
                    
    $totalPlayers $totalPlayers $array['Players'];
                    
    $maxPlayers $maxPlayers $array['MaxPlayers'];
                } catch (
    MinecraftQueryException $e) {
                    
    $this->getLogger()->critical($e->getMessage());
                }
            }
            
    $localPlayersCount count($this->getServer()->getOnlinePlayers());
            
    $localMaxPlayerCount $this->getServer()->getMaxPlayers();
            
    $ev->setPlayerCount($localPlayersCount $totalPlayers);
            
    $ev->setMaxPlayerCount($localMaxPlayerCount $maxPlayers);
        }
    }
    this with CombinedSlots would work..? (if in CombinedSlots plugin)
    PHP:
        public function onJoin(PlayerJoinEvent $join){
        {
            
    $totalPlayers 0;
            
    $maxPlayers 0;
            foreach (
    $this->server as $server) {
                
    $server explode(":"$server);
                try {
                    
    $this->Query->Connect($server[0], $server[1], $this->timeout);
                    
    $array = ($this->Query->GetInfo());

                    
    $totalPlayers $totalPlayers $array['Players'];
                    
    $maxPlayers $maxPlayers $array['MaxPlayers'];
                } catch (
    MinecraftQueryException $e) {
                    
    $this->getLogger()->critical($e->getMessage());
                }
            }
            
    $localPlayersCount count($this->getServer()->getOnlinePlayers());
            
    $localMaxPlayerCount $this->getServer()->getMaxPlayers();
            
    $online $localPlayersCount $totalPlayers;
            
    $player $join->getPlayer();
            
    $player->sendMessage("§aThere are§e " $online " §aPlayers Online");
            return 
    true;
        }
        }
    }
     
    Last edited: Oct 11, 2017
  8. jasonwynn10

    jasonwynn10 Moderator Poggit Reviewer

    Messages:
    1,489
    GitHub:
    jasonwynn10
    Unfortunately, you won't be able to get any query information out of my CombinedSlots plugin, but you should look up on these forums for how to use poggit virions. I made a library which queries servers for their data. The virion can be found here should you decide to use it: https://github.com/jasonwynn10/libpmquery
     
    rektpixel likes this.
  9. rektpixel

    rektpixel Baby Zombie

    Messages:
    186
    oh well I did this and it worked:
    PHP:
        public function getTotal(){
            
    $config $this->getConfig()->get("servers");
            foreach(
    $config as $servers){
                
    $content file_get_contents("http://mcapi.ca/query/".$servers."/mcpe");
                
    $decode json_decode($contenttrue);
                if(!isset(
    $decode["error"])){
                    
    $this->maxCount $this->maxCount $decode["players"]["max"];
                    
    $this->playerCount $this->playerCount $decode["players"]["online"];
                } else {
                    
    $this->getLogger()->notice($servers ." is not online or something went wrong while querying.");
                }
            }
        }

        public function 
    onJoin(PlayerJoinEvent $join){
            
    $join->setJoinMessage("");
            
    $localTotalPlayers count($this->getServer()->getOnlinePlayers());
            
    $localPlayers $this->getServer()->getMaxPlayers();
            
    $totalPlayerCount $localTotalPlayers $this->playerCount;
           
            
    $player $join->getPlayer();
            
    $player->addTitle("#bla#nk#"" "459545);
            
    $player->setGamemode(2);
            
    $player->teleport(new \pocketmine\math\Vector3(4945, -890));
            if (
    $player->hasPlayedBefore() == true) {
                
    $player->sendMessage("§dServer > §7Good to see you back " $player->getNameTag() . "§r§7!");
                
    $player->sendMessage("§6===============================");
                
    $player->sendMessage(" ");
                
    $player->sendMessage("          #bl#ank# §bNetwork");
                
    $player->sendMessage("    §bThere are§d ". ($totalPlayerCount) ." §bPlayers Online");
                
    $player->sendMessage(" ");
                
    $player->sendMessage("§6===============================");
                }else{
                    
    $player->sendMessage("§dServer > §7Hello " $player->getNameTag() . "§r§7!");
                    
    $player->sendMessage("§6===============================");
                    
    $player->sendMessage(" ");
                    
    $player->sendMessage("      §bWelcome to #bla#nk# §bNetwork");
                    
    $player->sendMessage("    §bThere are§d ". ($totalPlayerCount) ." §bPlayers Online");
                    
    $player->sendMessage(" ");
                    
    $player->sendMessage("§6===============================");
                    return 
    true;
    This way it'll be displayed from the servers I add in the config but I still get the same thing as I wanted. The first part of that is from CombinedSlots so thanks heaps :D
    Also that title on join does not display, it dosn't show any errors :/ ?
     
    jasonwynn10 likes this.
  10. jasonwynn10

    jasonwynn10 Moderator Poggit Reviewer

    Messages:
    1,489
    GitHub:
    jasonwynn10
    Use a delayed task for join titles
     
    rektpixel likes this.
  11. SOFe

    SOFe Administrator Staff Member PMMP Team Poggit Admin

    Messages:
    1,968
    GitHub:
    sof3
    This will be horribly laggy. As I mentioned, trying to query a server waits for the other server's response, which could be very lengthy.
     
    zk408Dev likes this.
  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.