2

現在、ボタンをクリックするたびに実行される遅延タスクがあります。ボタンをクリックすると、ブール値が に切り替わり、true7 秒後に遅延タスクによって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);
        }
    }
}
4

1 に答える 1

1

同じ損傷イベントに対してイベントが次回実行されないようにするために、isDamaged変数を使用して、コードを実行する必要があるかどうかを検証できます。

イベントを検証した後にに設定isDamagedしたのでtrue、この値に対してイベントのできるだけ高い位置でチェックを行うだけで済みます。それが true の場合は、メソッド全体から戻り、別のスケジュールされたタスクの作成を停止します。

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

// 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);
        }
    }
}
于 2012-07-01T17:44:06.790 に答える