2015-07-13 21 views
-1

My Bukkit插件會執行一個計時器,該計時器會穿上護甲,倒計時然後移除護甲,然後當我再次運行計時器時速度更快?爲什麼是這樣?我希望用戶能夠多次使用該命令而無需再次登錄。有人能幫我嗎?我的Bukkit定時器運行一次,當我再次執行命令時,它的速度更快

if(args[0].equalsIgnoreCase("BlackWing")) 
     { 
      final ItemStack[] oldarmor1; 
      oldarmor1 = p.getInventory().getArmorContents(); 
      ItemStack ib = new ItemStack(Material.CHAINMAIL_BOOTS, 1); 
      ib.addEnchantment(Enchantment.PROTECTION_FALL, 4); 
      ib.addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1); 
      ItemStack il=new ItemStack(Material.CHAINMAIL_LEGGINGS, 1); 
      il.addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1); 
      ItemStack ic = new ItemStack(Material.CHAINMAIL_CHESTPLATE, 1); 
      ic.addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1); 
      ItemStack ih = new ItemStack(Material.CHAINMAIL_HELMET, 1); 
      ih.addEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 1); 
      ItemStack[] armors1 = { ib , 
       il, 
       ic, 
       ih}; 
      p.getInventory().setArmorContents(armors1); 
      PotionEffect pe = new PotionEffect(PotionEffectType.JUMP, 600, 5); 
      p.addPotionEffect(pe); 
      ItemStack ironsword = new ItemStack(Material.IRON_SWORD,1); 
      ironsword.addEnchantment(Enchantment.DAMAGE_ALL, 3); 
      p.getInventory().setItem(0, ironsword); 
      getServer().getScheduler().scheduleAsyncRepeatingTask(this, new Runnable(){ 

       public void run(){ 

        if (number != 0){ 

         p.sendMessage(ChatColor.RED + "[FairyTail] " + ChatColor.GRAY + number + " seconds left"); 
         number=number -1; 
        }else{ 
         p.getInventory().setArmorContents(oldarmor1); 



        } 
        } 


      }, 0L, 20L); 

     } 
     number=30; 

回答

0

查看您提供的代碼片段,倒計時的計劃任務不會被取消。第二次命令由同一玩家執行時,實際上會有兩個任務在後臺運行,這兩個任務都會減少number(秒數),因此會導致倒數快兩倍。要解決這個問題,你可以確保一旦任務完成倒計時秒數被取消。在這種情況下編寫一個擴展BukkitRunnable的新類可能會非常有用,因爲這些類可以自行取消(例如在30秒結束的情況下)。

+0

那麼我會做什麼來取消它? – user4806359

+0

你可以在'BukkitScheduler'類中使用cancelTask​​(id)方法,或者編寫自己的擴展了'BukkitRunnable'的類,然後使用this.cancel()。調度任務時,任務的ID將以int形式返回:'int id = getServer()。getScheduler()。scheduleSync ...' –

相關問題