PHP: } elseif (count($p) == 1 and $cfg->get("phase") == 1) { $tostart = $cfg->get("starttime"); $cfg->set("starttime", $tostart - 1); $cfg->save(); My code work good when is one player on server.. but when join 2nd player it is not doing $cfg->set("starttime", $tostart - 1); but do it 2x so set every tick -2 WTF?
You'll have to post more code and explain the problem better than that to get help. Assuming $p is an array of online players, why would you expect '$cfg->set...' ever to be run when count($p) > 1, since your 'elseif...' checks that count($p) == 1?!
Full Task Spoiler PHP: class GameTask extends PluginTask{ public function __construct(Main $main){ parent::__construct($main); $this->main = $main; } public function onRun($currentTick){ foreach ($this->main->getServer()->getOnlinePlayers() as $p) { $cfg = new Config($this->main->getDataFolder() . "config.yml", Config::YAML); if($cfg->get("starttime") == 15){ $p->sendMessage("§7Game will start in 15 seconds"); } elseif($cfg->get("starttime") == 10){ $p->sendMessage("§7Game will start in 10 seconds"); } elseif($cfg->get("starttime") == 5){ $p->sendMessage("§7Game will start in 5 seconds"); } elseif($cfg->get("starttime") == 4){ $p->sendMessage("§7Game will start in 4 seconds"); } elseif($cfg->get("starttime") == 3){ $p->sendMessage("§7Game will start in 3 seconds"); } elseif($cfg->get("starttime") == 2){ $p->sendMessage("§7Game will start in 2 seconds"); } elseif($cfg->get("starttime") == 1){ $p->sendMessage("§7Game will start in 1 seconds"); } elseif ($cfg->get("end") == 0) { $plugin = $this->main->getServer()->getPluginManager()->getPlugin("FastTransfer"); $p->sendMessage("End!"); // $plugin->transferPlayer($p, "46.47.183.2", 19132); } elseif ($cfg->get("prestart") == "started") { $end = $cfg->get("end"); $cfg->set("end", $end - 1); $cfg->save(); $p->sendPopup("§7- §eRemain time: §f" . $end . " §7| §ePlayers §f" . $cfg->get("players") . "§7 | §eMap: §fNether"); } elseif ($cfg->get("prestart") == 0) { //$p->teleport($this->main->getServer()->getLevelByName("Arena"), new Vector3(1, 1, 1)); /* $cfg->set("prestart", "started"); $cfg->save();*/ $this->addArmor($p); $playercfg = new Config($this->main->getDataFolder() . "players/" . $p->getName() . ".yml", Config::YAML); if ($playercfg->get("kit") == "Figther") { $this->main->setKit(1, $p); } if ($playercfg->get("kit") == "Archer") { $this->main->setKit(2, $p); } if ($playercfg->get("kit") == "Builder") { $this->main->setKit(3, $p); } } elseif ($cfg->get("starttime") == 0) { if($p->getNameTag() == $p->getName()){ } $playercfg = new Config($this->main->getDataFolder() . "players/" . $p->getName() . ".yml", Config::YAML); $x = $playercfg->get("spawn-x"); $y = $playercfg->get("spawn-y"); $z = $playercfg->get("spawn-z"); $p->teleport($this->main->getServer()->getLevelByName("Arena1")->getSafeSpawn(), 0, 0); $p->sendTip("Game started"); $p->teleport(new Vector3($x, $y, $z), "Arena1"); $playercfg = new Config($this->main->getDataFolder() . "players/" . $p->getName() . ".yml", Config::YAML); $prestart = $cfg->get("prestart"); $cfg->set("prestart", $prestart - 1); $cfg->set("starttime", "started"); $cfg->set("phase", 2); $cfg->save(); $p->sendMessage("Wait " . $cfg->get("prestart")); } elseif (count($p) == 1 and $cfg->get("phase") == 1) { $tostart = $cfg->get("starttime"); $cfg->set("starttime", $tostart - 1); $cfg->save(); } elseif ($cfg->get("starttime") !== 60 and count($p) !== 0 and $cfg->get("phase") == 1) { $cfg->set("starttime", 30); $cfg->save(); $p->sendMessage("Cancelled countdown!"); } elseif ($cfg->get("starttime") == 0 and $playercfg->get("team") == "red") { } } }} if i use only PHP: } elseif (count($p) == 1 and $cfg->get("phase") == 1) { $tostart = $cfg->get("starttime"); $cfg->set("starttime", $tostart - 1); $cfg->save(); always unset -2
Your code is very long for that ! PHP: if($cfg->get("starttime") == 15){ $p->sendMessage("§7Game will start in 15 seconds"); } elseif($cfg->get("starttime") == 10){ $p->sendMessage("§7Game will start in 10 seconds"); } elseif($cfg->get("starttime") == 5){ $p->sendMessage("§7Game will start in 5 seconds"); } elseif($cfg->get("starttime") == 4){ $p->sendMessage("§7Game will start in 4 seconds"); } elseif($cfg->get("starttime") == 3){ $p->sendMessage("§7Game will start in 3 seconds"); } elseif($cfg->get("starttime") == 2){ $p->sendMessage("§7Game will start in 2 seconds"); } elseif($cfg->get("starttime") == 1){ $p->sendMessage("§7Game will start in 1 seconds"); } replace by : PHP: $time = $cfg->get("starttime");if($time == 15 || $time == 10 || $time == 5 || $time == 4 || $time == 3 || $time == 2 || $time == 1 || ){ $p->sendMessage("§7Game will start in ".$time." seconds");}
It's not easy for people to read code here, as you've probably noticed... If it's not a private plugin then I recommend using GitHub instead: all developers should learn to use it (locally, not the web editor), and your plugin will be all set to submit to poggit when it's ready.
you should use time() and you could have done if startTime%5==0 OR startTime>5 out, starting in startTime
FYI: if $startTime mod 5 is 0 OR $startTime is smaller then 5 https://eval.in/private/1c9223e525494a Code: PHP: <?phpecho 4%5,"\n";echo 5%5,"\n";echo 6%5,"\n"; Output: Code: 4 0 1
Fair enough... but most devs here only have time to help with open-source plugins since it makes it nearly impossible to fix code if you only provide snippets, not to mention that you plan to use their code without sharing it with the community :-/ Lucky for you that the PMMP team doesn't do the same thing, right?!
Ok full plugin Spoiler PHP: <?phpnamespace MicroBattle;use Core\BlockBreak;use pocketmine\plugin\PluginBase;use pocketmine\event\Listener;use pocketmine\scheduler\PluginTask;use pocketmine\event\player\PlayerMoveEvent;use pocketmine\level\particle\FloatingTextParticle;use pocketmine\event\player\PlayerDeathEvent;use pocketmine\Player;use pocketmine\math\Vector3;use pocketmine\utils\Config;use pocketmine\Server;use pocketmine\utils\TextFormat as C;use pocketmine\event\block\BlockBreakEvent;use pocketmine\event\block\BlockPlaceEvent;use pocketmine\event\player\PlayerJoinEvent;use pocketmine\event\player\PlayerQuitEvent;use pocketmine\event\player\PlayerCommandPreprocessEvent;use pocketmine\event\entity\EntityDamageEvent;class Main extends PluginBase implements Listener{ public $status; public function onEnable() { $this->getServer()->getPluginManager()->registerEvents($this, $this); $this->getLogger()->info("MicroBattle enabled"); @mkdir($this->getDataFolder()); @mkdir($this->getDataFolder() . "players"); $cfg = new Config($this->getDataFolder() . "config.yml", Config::YAML); $cfg->set("phase", 1); $cfg->set("prestart", 10); $cfg->set("starttime", 60); $cfg->set("end", 150); $cfg->save(); $this->getServer()->getScheduler()->scheduleRepeatingTask(new GameTask($this), 20); $this->getServer()->getScheduler()->scheduleRepeatingTask(new ParticleTask1($this), 20); }}class GameTask extends PluginTask{ public function __construct(Main $main) { parent::__construct($main); $this->main = $main; } public function onRun($currentTick) { foreach ($this->main->getServer()->getOnlinePlayers() as $p) { $cfg = new Config($this->main->getDataFolder() . "config.yml", Config::YAML); if ($cfg->get("end") == 0) { $plugin = $this->main->getServer()->getPluginManager()->getPlugin("FastTransfer"); $p->sendMessage("End!"); // $plugin->transferPlayer($p, "46.47.183.2", 19132); } elseif ($cfg->get("prestart") == "started") { $end = $cfg->get("end"); $cfg->set("end", $end - 1); $cfg->save(); $p->sendPopup("§7- §eRemain time: §f" . $end . " §7| §ePlayers §f" . $cfg->get("players") . "§7 | §eMap: §fNether"); } elseif ($cfg->get("prestart") == 0) { //$p->teleport($this->main->getServer()->getLevelByName("Arena"), new Vector3(1, 1, 1)); $cfg->set("prestart", "started"); $cfg->save(); // $this->addArmor($p); $playercfg = new Config($this->main->getDataFolder() . "players/" . $p->getName() . ".yml", Config::YAML); if ($playercfg->get("kit") == "Figther") { $this->main->setKit(1, $p); } if ($playercfg->get("kit") == "Archer") { $this->main->setKit(2, $p); } if ($playercfg->get("kit") == "Builder") { $this->main->setKit(3, $p); } } elseif ($cfg->get("starttime") == 0) { if ($p->getNameTag() == $p->getName()) { //RAND TEAM } $playercfg = new Config($this->main->getDataFolder() . "players/" . $p->getName() . ".yml", Config::YAML); $x = $playercfg->get("spawn-x"); $y = $playercfg->get("spawn-y"); $z = $playercfg->get("spawn-z"); $p->teleport($this->main->getServer()->getLevelByName("Arena1")->getSafeSpawn(), 0, 0); $p->sendTip("Game started"); $p->teleport(new Vector3($x, $y, $z), "Arena1"); $playercfg = new Config($this->main->getDataFolder() . "players/" . $p->getName() . ".yml", Config::YAML); $prestart = $cfg->get("prestart"); $cfg->set("prestart", $prestart - 1); $cfg->set("starttime", "started"); $cfg->set("phase", 2); $cfg->save(); $p->sendMessage("Wait " . $cfg->get("prestart")); } elseif (count($p) == 1 and $cfg->get("phase") == 1) { $tostart = $cfg->get("starttime"); $cfg->set("starttime", $tostart - 1); $cfg->save(); $p->sendMessage("Tostart " . $tostart); } elseif ($cfg->get("starttime") !== 60 and count($p) !== 0 and $cfg->get("phase") == 1 ) { $cfg->set("starttime", 30); $cfg->save(); $p->sendMessage("Cancelled countdown!"); } } }}
Much better What exactly do you mean by "unsetting -2"? Also this would be more readable: Code: $time = $cfg->get("starttime"); if(in_array($time, array(15, 10, 5, 4, 3, 2, 1))){ $p->sendMessage("§7Game will start in " . $time . " seconds"); }
When are online 2 players it every tick remove 2 from config (starttime) but i used -1 when is online 1 player works perfect
One big problem with this is that you are using the main config as if it were a variable. You should declare the variables you need for starttime etc in your main class instead - the only config you'll have to use in the task is that of each player. As for starttime, you use: PHP: foreach ($this->main->getServer()->getOnlinePlayers() as $p) { Within the loop, count($p) will always be 1 (since it's a "foreach") - and the loop repeats for each player, so your starttime will be decremented once for each player Add a variable called $allp, for example, and set it to $this->main->getServer()->getOnlinePlayers() before you loop, then check count($allp) instead: Code: $allp = $this->main->getServer()->getOnlinePlayers(); foreach($allp as $p){ ... if (count($allp)... ...
Once you've written the code, focus on improving it. Also, try not saving/setting/changing anything much in a loop (a loop can be a Repeating task in PMMP, or a for, while, foreach loop in PHP). Do as much less task as possible during a loop. Loops aren't meant to be exhausted so try not taking too much of advantage of a loop. It can reduce your code performance.
Muqsit is correct - reading and (worse) writing data from/to disk for every online player every 20 ticks is going to be awful for performance; use variables for that instead of config files. Also, you can't rely on your scheduled task to happen exactly once per second, so it's best to use time() instead as @Thunder33345 pointed out above.
Not work doing - 2 PHP: public function onRun($currentTick) { $opl = $this->main->getServer()->getOnlinePlayers(); foreach ($opl as $p) { $cfg = new Config($this->main->getDataFolder() . "config.yml", Config::YAML); if ($cfg->get("end") == 0) { $plugin = $this->main->getServer()->getPluginManager()->getPlugin("FastTransfer"); $p->sendMessage("End!"); // $plugin->transferPlayer($p, "46.47.183.2", 19132); } elseif ($cfg->get("prestart") == "started") { $end = $cfg->get("end"); $cfg->set("end", $end - 1); $cfg->save(); $p->sendPopup("§7- §eRemain time: §f" . $end . " §7| §ePlayers §f" . $cfg->get("players") . "§7 | §eMap: §fNether"); } elseif ($cfg->get("prestart") == 0) { //$p->teleport($this->main->getServer()->getLevelByName("Arena"), new Vector3(1, 1, 1)); $cfg->set("prestart", "started"); $cfg->save(); $this->addArmor($p); $playercfg = new Config($this->main->getDataFolder() . "players/" . $p->getName() . ".yml", Config::YAML); if ($playercfg->get("kit") == "Figther") { $this->main->setKit(1, $p); } if ($playercfg->get("kit") == "Archer") { $this->main->setKit(2, $p); } if ($playercfg->get("kit") == "Builder") { $this->main->setKit(3, $p); } } elseif ($cfg->get("starttime") == 0) { if ($p->getNameTag() == $p->getName()) { //RAND TEAM } $playercfg = new Config($this->main->getDataFolder() . "players/" . $p->getName() . ".yml", Config::YAML); $x = $playercfg->get("spawn-x"); $y = $playercfg->get("spawn-y"); $z = $playercfg->get("spawn-z"); $p->teleport($this->main->getServer()->getLevelByName("Arena1")->getSafeSpawn(), 0, 0); $p->sendTip("Game started"); $p->teleport(new Vector3($x, $y, $z), "Arena1"); $playercfg = new Config($this->main->getDataFolder() . "players/" . $p->getName() . ".yml", Config::YAML); $prestart = $cfg->get("prestart"); $cfg->set("prestart", $prestart - 1); $cfg->set("starttime", "started"); $cfg->set("phase", 2); $cfg->save(); $p->sendMessage("Wait " . $cfg->get("prestart")); } elseif (count($p) == 1 and $cfg->get("phase") == 1) { $tostart = $cfg->get("starttime"); $cfg->set("starttime", $tostart - 1); $cfg->save(); $p->sendMessage("Tostart " . $tostart); } elseif ($cfg->get("starttime") !== 60 and count($p) !== 0 and $cfg->get("phase") == 1 ) { $cfg->set("starttime", 30); $cfg->save(); $p->sendMessage("Cancelled countdown!"); } } }}
You haven't changed that line yet, it should be count($opl) because count($p) will always be 1, as I explained already.