2012-04-14 48 views
2

我目前有一個延遲任務,只要點擊一個按鈕就會運行。 單擊此按鈕將布爾值切換爲true,7秒後,延遲任務再次將其設置爲false創建另一個任務時取消延遲任務

但是,會發生什麼情況是,如果一個人多次單擊該按鈕,布爾值會打開和關閉,打開和關閉等等,因爲延遲的任務堆積如山。 如果多次單擊按鈕而不是將所有延遲的任務彼此堆疊在一起,是否有簡單延長延遲任務的方法?

因此,假設一旦點擊按鈕,延遲任務將等待7秒鐘,然後將布爾值從true切換爲false。 我該如何更改代碼,以便在延遲任務未執行時再次按下該按鈕時,它將取消上一個任務,並簡單地執行下一個延遲任務(我正在使用這個服務器,因此取消上一個任務可能不會這意味着這是實際的延遲任務,但其他任務)?

@EventHandler 
public void damage (EntityDamageEvent event) { 
    Entity victim = event.getEntity(); 
    if (event instanceof EntityDamageByEntityEvent) { 
     EntityDamageByEntityEvent edbeEvent = (EntityDamageByEntityEvent) event; 
     if(edbeEvent.getDamager() instanceof Player && victim instanceof Player) { 
      EntityDamageByEntityEvent edbeEvent1 = (EntityDamageByEntityEvent) event; 
      Entity attacker = edbeEvent1.getDamager(); 
      //Checks if both players are humans and not NPCS. 
      final Player player = (Player) victim; 
      final Player player2 = (Player) attacker; 
      //Saving the players as the variable Player. 
      Damagelist.add(player); 

      Damagelist.add(player2); 
      //Adds both players to the hashmap to be used by other classes. 
      isDamaged = true; 
      //Toggles the boolean to true. 
      int delay = plugin.getConfig().getInt("StunDuration") * 20; 
      //The above line gets the delay time from the config.yml file. 
      plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { 
       public void run() {   

        Damagelist.remove(player); 
        Damagelist.remove(player2); 
        //After an x amount of time, removes players from hashmap. 
        isDamaged = false; 
        playeradd = true; 
        //Toggles the booleans around. 
       } 
      }, delay); 
     } 
    } 
} 

回答

1

爲了確保事件不會對你可以使用isDamaged變量來驗證,如果代碼應運行相同的傷害事件中運行隨後的時間。

既然你驗證事件之後isDamagedtrue你只需要做出對這種價值的情況下儘可能的高,而且如果它是真的,那麼只返回了這將阻止另一個計劃整個方法的檢查正在創建任務。

如果你想停止玩家傷害,那麼你也可以取消整個事件,然後再返回到其他插件,在冷卻期間沒有任何傷害。

// End event, add setCancelled(true), and exit method if the isDamaged modifier is set to true 
if (isDamaged) { 
    event.setCancelled(true); 
    return; 
} 

這裏是您的代碼修改,以顯示一個示例使用。

@EventHandler 
public void damage (EntityDamageEvent event) { 
    // Get the victim of the damage event. 
    Entity victim = event.getEntity(); 

    // End event, add setCancelled(true), and exit method if the isDamaged modifier is set to true 
    if (isDamaged) { 
     event.setCancelled(true); 
     return; 
    } 

    if (event instanceof EntityDamageByEntityEvent) { 
     // Get the attacker of the event. 
     EntityDamageByEntityEvent edbeEvent = (EntityDamageByEntityEvent) event; 
     Entity attacker = edbeEvent.getDamager(); 

     // Continue only if both players are humans and not NPCS. 
     if(edbeEvent.getDamager() instanceof Player && victim instanceof Player) { 

      // Saving the players as the variable Player. 
      final Player player = (Player) victim; 
      final Player player2 = (Player) attacker; 

      // Add both players to the hashmap to be used by other classes. 
      Damagelist.add(player); 
      Damagelist.add(player2); 

      // Toggle to true. 
      isDamaged = true; 

      // Get delay time from the config.yml file. 
      int delay = plugin.getConfig().getInt("StunDuration") * 20; 

      // Setup delayed task to end cooldown set under StunDuration. 
      plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { 
       // Define task to be run by scheduler. 
       public void run() {   
        // After amount of time set by StunDuration, remove players from hashmap. 
        Damagelist.remove(player); 
        Damagelist.remove(player2); 

        // Toggle back to false; 
        isDamaged = false; 
        playeradd = true; 
       } 
      }, delay); 
     } 
    } 
} 
-2

如果您使用自己的線程,這將會容易得多。 簡單地擴展Thread,並使用類來實現:

Thread.sleep(timeinmilliseconds); 

這樣,調度程序變得更加容易,簡單的線條,其中時間等待可以改變一個變量,如果你想改變它你的代碼。