2012-04-14 110 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); 

这样,调度程序变得更加容易,简单的线条,其中时间等待可以改变一个变量,如果你想改变它你的代码。