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

Problem countdown

Discussion in 'Development' started by kaliiks, Feb 11, 2017.

  1. kaliiks

    kaliiks Zombie

    Messages:
    250
    PHP:
    } elseif (count($p) == 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?
     
  2. Awzaw

    Awzaw Zombie Pigman Poggit Admin

    Messages:
    726
    GitHub:
    awzaw
    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?!
     
  3. kaliiks

    kaliiks Zombie

    Messages:
    250
    Full Task
    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(), 00);
                    
    $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) == and $cfg->get("phase") == 1) {
                    
    $tostart $cfg->get("starttime");
                    
    $cfg->set("starttime"$tostart 1);
                    
    $cfg->save();
                } elseif (
    $cfg->get("starttime") !== 60 and count($p) !== and $cfg->get("phase") == 1) {
                    
    $cfg->set("starttime"30);
                    
    $cfg->save();
                    
    $p->sendMessage("Cancelled countdown!");
                } elseif (
    $cfg->get("starttime") == and $playercfg->get("team") == "red") {
                }
                }
                }


    }

    if i use only
    PHP:
      } elseif (count($p) == and $cfg->get("phase") == 1) {
                    
    $tostart $cfg->get("starttime");
                    
    $cfg->set("starttime"$tostart 1);
                    
    $cfg->save();
    always unset -2
     
    Last edited: Feb 12, 2017
  4. SkySeven

    SkySeven Baby Zombie

    Messages:
    145
    GitHub:
    SkySevenMC
    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 == || $time == || $time == || $time == || $time == || ){
     
    $p->sendMessage("§7Game will start in ".$time." seconds");
    }
     
    Last edited: Feb 12, 2017
    Muqsit, corytortoise and kaliiks like this.
  5. Awzaw

    Awzaw Zombie Pigman Poggit Admin

    Messages:
    726
    GitHub:
    awzaw
    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.
     
  6. Thunder33345

    Thunder33345 Moderator Staff Member

    Messages:
    2,137
    GitHub:
    Thunder33345
    you should use time() and you could have done
    if startTime%5==0 OR startTime>5
    out, starting in startTime
     
    Muqsit likes this.
  7. kaliiks

    kaliiks Zombie

    Messages:
    250
    Plugin is private
     
  8. kaliiks

    kaliiks Zombie

    Messages:
    250
    What if startTime%5==0 OR startTime>5 ????? I dont understand :/
     
  9. Thunder33345

    Thunder33345 Moderator Staff Member

    Messages:
    2,137
    GitHub:
    Thunder33345
    FYI: if $startTime mod 5 is 0 OR $startTime is smaller then 5
    https://eval.in/private/1c9223e525494a
    Code:
    PHP:
    <?php
    echo 4%5,"\n";
    echo 
    5%5,"\n";
    echo 
    6%5,"\n";
    Output:
    Code:
    4
    0
    1
    
     
  10. Awzaw

    Awzaw Zombie Pigman Poggit Admin

    Messages:
    726
    GitHub:
    awzaw
    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?!
     
  11. kaliiks

    kaliiks Zombie

    Messages:
    250
    Ok but it was already unsetting -2
     
  12. Thunder33345

    Thunder33345 Moderator Staff Member

    Messages:
    2,137
    GitHub:
    Thunder33345
    well still you shouldnt use something like this
     
  13. kaliiks

    kaliiks Zombie

    Messages:
    250
    Ok full plugin
    PHP:
    <?php

    namespace 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(), 00);
                    
    $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) == 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) !== and $cfg->get("phase") == 1
                    
    ) {
                        
    $cfg->set("starttime"30);
                        
    $cfg->save();
                        
    $p->sendMessage("Cancelled countdown!");
                    }


                }
            }
    }
     
  14. Awzaw

    Awzaw Zombie Pigman Poggit Admin

    Messages:
    726
    GitHub:
    awzaw
    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");
    }
     
    Last edited: Feb 12, 2017
  15. kaliiks

    kaliiks Zombie

    Messages:
    250
    When are online 2 players it every tick remove 2 from config (starttime) but i used -1 when is online 1 player works perfect
     
  16. Awzaw

    Awzaw Zombie Pigman Poggit Admin

    Messages:
    726
    GitHub:
    awzaw
    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)...
    ...
     
    Last edited: Feb 12, 2017
    corytortoise likes this.
  17. Muqsit

    Muqsit Chicken

    Messages:
    1,548
    GitHub:
    muqsit
    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.
     
  18. Awzaw

    Awzaw Zombie Pigman Poggit Admin

    Messages:
    726
    GitHub:
    awzaw
    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.
     
    Last edited: Feb 12, 2017
  19. kaliiks

    kaliiks Zombie

    Messages:
    250
    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(), 00);
                    
    $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) == 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) !== and $cfg->get("phase") == 1
                    
    ) {
                        
    $cfg->set("starttime"30);
                        
    $cfg->save();
                        
    $p->sendMessage("Cancelled countdown!");
                    }


                }
            }
    }
     
  20. Awzaw

    Awzaw Zombie Pigman Poggit Admin

    Messages:
    726
    GitHub:
    awzaw
    You haven't changed that line yet, it should be count($opl) because count($p) will always be 1, as I explained already.
     
  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.