Bukkit Runnable Running Multiple Times

Discussion in 'Plugin Development' started by Acer_Mortem, Jan 12, 2014.

Thread Status:
Not open for further replies.
  1. Offline

    Acer_Mortem

    I'm trying to make a runnable where a monster does special abilities every few seconds, however for some reason, this always causes problems.

    Whenever two instances of the runnable are running at the same time, the second runnable always speeds up considerably. For example, a few seconds into the Runnable, it will run the " invincibleMessage(instancenumber);" method, even though that should only run after 29 seconds. Anyone know why this is happening?

    Code:
    public class CryptBossRunnable extends BukkitRunnable {
        private static InstanceMain plugin;
        private int instancenumber;
        private int time;
     
        public CryptBossRunnable(InstanceMain instance){
            plugin = instance;
        }
       
        public CryptBossRunnable(int number, Plugin pl, int thistime){
              instancenumber = number;
              time = thistime;
              }
         
        public void runTask(String name, int number){
            CryptBossRunnable task = new CryptBossRunnable(number, plugin, 0);
            task.runTaskTimer(plugin, 0L, 20L);
        }
       
        @Override
        public void run() {
            if(time == 1){
                messageOne(instancenumber);
            }
            else if(time == 3){
                removeFinalWall(instancenumber);
            }
            else if(time == 6){
                messageTwo(instancenumber);
            }
            else if(time == 8){
                if(plugin.cmm.getBoss(instancenumber) != null){
                   
                }else{
                plugin.cmm.spawnBoss(instancenumber);
                }
            }
            if(time > 8){
                if(plugin.cmm.getBoss(instancenumber) != null){
                    if(plugin.cmm.getBoss(instancenumber).isDead()){
                        this.cancel();
                        return;
                    }
                }
            }
            if(time > 9){
                adjustBar(instancenumber);
            }
            if(time == 1){
                if(instancenumber == 1){
                    if(plugin.ia.Crypt1Boss == false){
                        plugin.ia.Crypt1Boss = true;
                    }
                    else{
                        this.cancel();
                    }
                }
                else if(instancenumber == 2){
                    if(plugin.ia.Crypt2Boss == false){
                        plugin.ia.Crypt2Boss = true;
                    }
                    else{
                        this.cancel();
                    }
                }
                else if(instancenumber == 3){
                    if(plugin.ia.Crypt3Boss == false){
                        plugin.ia.Crypt3Boss = true;
                    }
                    else{
                        this.cancel();
                    }
                }
            }
            if(plugin.cmm.getBoss(instancenumber) != null){
            if(time == 10){
                setTarget(instancenumber);
            }
            if(time > 10){
                plugin.cmm.getBoss(instancenumber).setFireTicks(0);
            }
            if(time % 18 == 0 && time > 17){
                List<Entity> nearbyEnts = plugin.cmm.getBoss(instancenumber).getNearbyEntities(3, 2, 3);
                spinMessage(instancenumber);
                for(Entity ent : nearbyEnts){
                    if(ent instanceof Player){
                        ((Player) ent).damage(4, plugin.cmm.getBoss(instancenumber));
                        ent.getWorld().playEffect(ent.getLocation(), Effect.MOBSPAWNER_FLAMES, 1);
                        ent.getWorld().playSound(ent.getLocation(), Sound.ENDERMAN_SCREAM, 1, 1);
                    }
                }
            }
            else if(time % 29 == 0){
                invincibleMessage(instancenumber);
                plugin.cmm.getBoss(instancenumber).addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 100, 5));
                plugin.cmm.getBoss(instancenumber).getWorld().playEffect(plugin.cmm.getBoss(instancenumber).getLocation(), Effect.POTION_BREAK, 1);
                plugin.cmm.getBoss(instancenumber).getWorld().playEffect(plugin.cmm.getBoss(instancenumber).getLocation(), Effect.POTION_BREAK, 1);
            }
            else if(time % 33 == 0){
                int x = 670;
                int y = 4;
                int z = 555;
                Location teleport = new Location(plugin.cmm.getBoss(instancenumber).getWorld(), x, y, z);
                plugin.cmm.getBoss(instancenumber).teleport(teleport);
                plugin.cmm.getBoss(instancenumber).getWorld().playSound(plugin.cmm.getBoss(instancenumber).getLocation(), Sound.ENDERMAN_TELEPORT, 1, 1);
                teleportMessage(instancenumber);
            }
            else if(time % 45 == 0){
                spawnDeadMessage(instancenumber);
                plugin.cmm.getBoss(instancenumber).getWorld().playSound(plugin.cmm.getBoss(instancenumber).getLocation(), Sound.ENDERDRAGON_GROWL, 1, 1);
                plugin.cmm.getBoss(instancenumber).getWorld().spawnEntity(new Location(plugin.cmm.getBoss(instancenumber).getWorld(), 671.5, 4, 563.5), EntityType.ZOMBIE);
                plugin.cmm.getBoss(instancenumber).getWorld().spawnEntity(new Location(plugin.cmm.getBoss(instancenumber).getWorld(), 669.5, 4, 563.5), EntityType.ZOMBIE);
               
                plugin.cmm.getBoss(instancenumber).getWorld().playEffect(new Location(plugin.cmm.getBoss(instancenumber).getWorld(), 671.5, 4, 563.5), Effect.POTION_BREAK, 8);
                plugin.cmm.getBoss(instancenumber).getWorld().playEffect(new Location(plugin.cmm.getBoss(instancenumber).getWorld(), 669.5, 4, 563.5), Effect.POTION_BREAK, 8);
               
                plugin.cmm.getBoss(instancenumber).getWorld().spawnEntity(new Location(plugin.cmm.getBoss(instancenumber).getWorld(), 671.5, 4, 546.5), EntityType.ZOMBIE);
                plugin.cmm.getBoss(instancenumber).getWorld().spawnEntity(new Location(plugin.cmm.getBoss(instancenumber).getWorld(), 669.5, 4, 546.5), EntityType.ZOMBIE);
               
                plugin.cmm.getBoss(instancenumber).getWorld().playEffect(new Location(plugin.cmm.getBoss(instancenumber).getWorld(), 671.5, 4, 546.5), Effect.POTION_BREAK, 8);
                plugin.cmm.getBoss(instancenumber).getWorld().playEffect(new Location(plugin.cmm.getBoss(instancenumber).getWorld(), 669.5, 4, 546.5), Effect.POTION_BREAK, 8);
               
            }
            else if(time % 36 == 0){
                damageIncreaseMessage(instancenumber);
                plugin.cmm.getBoss(instancenumber).addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 120, 1));
                plugin.cmm.getBoss(instancenumber).addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 240, 0));
                plugin.cmm.getBoss(instancenumber).getWorld().playEffect(plugin.cmm.getBoss(instancenumber).getLocation(), Effect.POTION_BREAK, 4);
                plugin.cmm.getBoss(instancenumber).getWorld().playEffect(plugin.cmm.getBoss(instancenumber).getLocation(), Effect.POTION_BREAK, 4);
            }
            else if(time % 55 == 0){
                invisibleMessage(instancenumber);
                plugin.cmm.getBoss(instancenumber).addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 200, 0));
                plugin.cmm.getBoss(instancenumber).getWorld().playSound(plugin.cmm.getBoss(instancenumber).getLocation(), Sound.ENDERDRAGON_HIT, 1, 1);
            }
            else if(time % 52 == 0){
                regenerateMessage(instancenumber);
                if(plugin.cmm.getBoss(instancenumber).getHealth() != plugin.cmm.getBoss(instancenumber).getHealth()){
                    plugin.cmm.getBoss(instancenumber).setHealth(plugin.cmm.getBoss(instancenumber).getHealth() + 25);
                    plugin.cmm.getBoss(instancenumber).getWorld().playEffect(plugin.cmm.getBoss(instancenumber).getLocation(), Effect.POTION_BREAK, 9);
                    plugin.cmm.getBoss(instancenumber).getWorld().playEffect(plugin.cmm.getBoss(instancenumber).getLocation(), Effect.POTION_BREAK, 9);
                    plugin.cmm.getBoss(instancenumber).getWorld().playEffect(plugin.cmm.getBoss(instancenumber).getLocation(), Effect.POTION_BREAK, 9);
                }
            }
            }
            time++;
        }
     
  2. Offline

    Ironraptor3

    hm, maybe you could check if there already is a Runnable happening, for example (this may not work, just an example) :

    Code:java
    1. boolean running = false;
    2.  
    3. if (running == false) {
    4. running = true;
    5. new BukkitRunnable() {
    6. @Override
    7. public void run() {
    8. //do stuff
    9. //cancelation logic
    10. running = false;
    11. cancel();
    12. }
    13. }.runTaskTimer(plugin, delay, period
    14.  
     
Thread Status:
Not open for further replies.

Share This Page