Try: PHP: <?php namespace TeamCounter;use pocketmine\event\Listener;use pocketmine\event\player\PlayerJoinEvent;use pocketmine\event\player\PlayerQuitEvent;use pocketmine\utils\Config;use pocketmine\utils\TextFormat;use pocketmine\plugin\PluginBase;class Main extends PluginBase implements Listener{public function onEnable(){$this->getServer()->getPluginManager()->registerEvents($this, $this);$this->saveDefaultConfig;$this->time = new Config($this->getDataFolder() . "time.yml", Config::YAML);//sorry if config is wrong, rewrite it ;)}public function onJoin(PlayerJoinEvent $ev){//1 is number of seconds to check$this->getServer()->getScheduler()->scheduleRepeatingTask($t = new TimeTask($this, $ev->getPlayer()), 60*20);$this->time->set($ev->getPlayer() . "-task" . $task->getId());$this->time->set($ev->getPlayer() . "0");$this->time->save();}public function onQuit(PlayerQuitEvent $ev){$this->getServer()->getScheduler()->cancelTask($this->time>get($ev->getPlayer() . "-task"));}public function writeTime($time){$this->time->set($ev->getPlayer(), $time);}} TimeTask.php PHP: <?php namespace TeamCounter;use pocketmine\scheduler\PluginTask;class TimeTask extends PluginTask{public function _construct($main, $p){$this->main = $main;$this->p = $p;}public function onRun($t){$main->writeTime($main->time->get($p)+1);}}
It is meaningless to count the seconds every 20 ticks. Just save the Player join time in an array property with microtime(true) and microtime(true) - $this->joinTime[$player->getId()] when the Player quits or when plugin is disabled.
Take a look at how I do it in LegionPE. https://github.com/PEMapModder/LegionPE-Theta-Base/blob/master/src/legionpe/theta/Session.php#L145 https://github.com/PEMapModder/LegionPE-Theta-Base/blob/master/src/legionpe/theta/Session.php#L816 Note that I am in a context where $this represents only one player. If you don't create an object per player, you need to use an array instead.