2016-11-14 24 views
1

最近、私はBukkit Pluginの開発を開始しました。私は自分のコードで寝る/待っているのに助けが必要です。私はJavaにちょっと新しいので、あなたがそれを説明できるなら、私は感謝します。ここに私のコードは次のとおりです。bukkit - 待っていますか?

@EventHandler 
public void onTnt(PlayerInteractEntityEvent e) { 
    Player clicker = e.getPlayer(); 
    Player rightclick = (Player) e.getRightClicked(); 
    rightclick.sendMessage(ChatColor.GRAY + "~" + ChatColor.DARK_PURPLE + "AN INSTAKILLER HAS YOU AS A TARGET! SNEAK NOW!"); 
    rightclick.sendMessage(ChatColor.GRAY + "~" + ChatColor.DARK_RED + "AN INSTAKILLER HAS YOU AS A TARGET! SNEAK NOW!"); 
    rightclick.sendMessage(ChatColor.GRAY + "~" + ChatColor.GOLD + "AN INSTAKILLER HAS YOU AS A TARGET! SNEAK NOW!"); 
    /* Then wait 3 sec. I've tried Thread.Sleep, wait() and sleep(), no sucess*/ 

    if (!(rightclick.isSneaking())) { 
     rightclick.sendMessage(ChatColor.GRAY + "~" + ChatColor.GOLD + "Bye bye."); 
     rightclick.setHealth(0); 

    } 

} 
+0

私は待機またはスリープがここに右のアイデアだとは思わないが、新たなbukkitrunnableを作り、中に実行するようスケジュールを設定3秒、あなたのプラグインのスレッドをスリープしないように – zack6849

答えて

2

通常、あなたはサーバ全体を凍結するだろうと、このような何かのためにThread.sleepを使用したい、とのイベントがその時間内に処理されない(そのプレイヤーが上こっそり停止した場合でも、一方で彼らはまだ、サーバーが見ているものから忍び寄っています)。

は何をする必要が使用しているBukkitRunnable(あるいはRunnable定期とgetServer().getScheduler().scheduleSyncDelayedTask):

@EventHandler 
public void onTnt(PlayerInteractEntityEvent e) { 
    Player clicker = e.getPlayer(); 
    // Needs to be final to reference it later 
    final Player rightclick = (Player) e.getRightClicked(); 
    rightclick.sendMessage(ChatColor.GRAY + "~" + ChatColor.DARK_PURPLE + "AN INSTAKILLER HAS YOU AS A TARGET! SNEAK NOW!"); 
    rightclick.sendMessage(ChatColor.GRAY + "~" + ChatColor.DARK_RED + "AN INSTAKILLER HAS YOU AS A TARGET! SNEAK NOW!"); 
    rightclick.sendMessage(ChatColor.GRAY + "~" + ChatColor.GOLD + "AN INSTAKILLER HAS YOU AS A TARGET! SNEAK NOW!"); 


    BukkitRunnable task = new BukkitRunnable() { 
     @Override 
     public void run() { 
      if (!(rightclick.isSneaking())) { 
       rightclick.sendMessage(ChatColor.GRAY + "~" + ChatColor.GOLD + "Bye bye."); 
       rightclick.setHealth(0); 
      } 
     } 
    }; 
    // Run the task on this plugin in 3 seconds (60 ticks) 
    task.runTaskLater(this, 20 * 3); 
} 
0

私は、これは古い質問です、まだ私は追加したいという事実を認識しています何かをする方法を探しているユーザーがこれを見つけるかもしれないような何か。

Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() { 
// The stuff which should be accomplished after the timer runs out goes here. 
// Example: 
player.sendMessage("The time has ran out!"); 
}, time); 

さて、ここで何が起こっているかを理解するプロセスを取得してみましょう:

最も簡単なのは、これがスケジュールされたタスクを作成して行うことを言います。基本的には、遅延タスク(遅延タスクと繰り返しタスクの2種類のスケジュールされたタスクがあります)が作成されています。 上記のメソッドの最初の引数はthisです。これはあなたのメインクラス(org.bukkit.plugin.java.JavaPluginのサブクラス)のインスタンスであるはずです。つまり、スケジュールされたタスクがメインクラスにない場合は、thisをそのインスタンスに置き換える必要があります。 2番目の引数はnew Runnable() { ... }です。ここでは実際に実行可能ファイルを作成しています。タイマーがなくなったときに実行する必要があるものは、中括弧の中に入る必要があります。最後に、最後のパラメータ:これはTICKSで測定された実際の遅延です。これは、x秒間待機したい場合は、x * 20を掛けなければならないことを意味します。ティックは1/20秒に等しいので、5秒は100ティックに等しくなります。

あなたがラムダを使用する方法を知っている場合は、匿名クラスと交換することができる、

Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this,() -> player.sendMessage("The time has ran out!"), time); 
関連する問題