2012-04-14 15 views
2

私は現在、ボタンをクリックするたびに実行される遅延タスクを持っています。 ボタンをクリックするとブール値がtrueに切り替わり、7秒後に遅延タスクによってfalseに再び設定されます。他のタスクが作成されたときに遅延タスクをキャンセルする

しかし、人がボタンを何回かクリックすると、遅延タスクが積み重なっているため、ブール値のオン/オフやオン/オフなどの切り替えが行われます。 すべての遅延タスクをお互いに積み重ねるのではなく、ボタンを何度もクリックすると、単に遅延したタスクを延長する方法はありますか?

遅延タスクは、ボタンをクリックするとブール値をtrueからfalseに切り替える前に7秒間待機するとします。 遅延したタスクが実行されていないときにボタンを再度押すと、直前のタスクをキャンセルし、単に次の遅延タスクを実行するようにコードを変更します(私はこれをサーバーに使用しています。それは実際に遅延されたタスクであったが、他のタスクであったことを意味する)?イベントは、コードが実行する必要がある場合は、検証するisDamaged変数を使用することができ、同じダメージイベントの回目以降を実行していないことを確実にするために

@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

。あなたは単にできるだけイベントで、最大高、その後、ちょうど別にスケジュール停止するメソッド全体の外に戻る該当する場合は、この値に対するチェックをする必要があるイベントを検証した後trueisDamagedを設定しているので

タスクが作成されます。

また、プレーヤーのダメージを止めたい場合は、イベント全体をキャンセルして戻ってから、他のプラグインにパスして、クールダウン期間中にアクセスする必要がないようにすることもできます。

// 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.sleep(timeinmilliseconds); 

この方法では、スケジューラのプログラミングは時間が変数に変更することができます待っていた方がはるかに簡単、シンプルなライン、次のようになります。 単にThreadを拡張し、行うには、そのクラスを使用しますあなたのコード。

関連する問題