2016-04-09 4 views
3

コマンドを最初に実行した後、プレイヤーが手で書籍を右クリックしたときにチェックします。私はRunnableをタイマーとして実行しようとしました。そのスケジューラーは、プレーヤーが自分の手で本を右クリックしているかどうかをチェックしています。 Runnableは私に 'run'メソッドをオーバーライドさせました。オーバーライドからのScheduledEventイベントハンドラ

@Override 
public void onEnable() { 

this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() { 

    @Override 
    public void run() { 
     //Here I want to check if the player right clicked with a book in their hand. 
    } 
} 
+0

なぜ複数回実行されるタスクの中にイベントリスナーを登録したいのですか?リッスンしたいイベントごとに、リスナー内に1つのメソッドを実装するだけで済みます(このメソッドはイベントが発生するたびに呼び出され、繰り返しタスクは必要ありません)。 –

+0

このコマンドを実行すると、書籍を右クリックするまで右クリックしているかどうか確認したいです。 –

+0

これは別の方法で行う必要があります。イベントは一度しか登録できません。私はPlayerInteractEventを登録し、プレーヤーが書籍を右クリックするたびに、クリックした時間とその名前をリストに挿入します。プレイヤーがコマンドを実行するたびに、最近彼らが本を右クリックしたかどうかを確認することができます。 –

答えて

1

をプレイヤーがコマンドを実行した場合、あなたはどこかでプレイヤーのUUIDを格納する必要が知るために:

これは私が試したものです。まず、Set<UUID>を作成して、コマンドを実行したすべてのプレイヤーのすべての一意のIDを一時的に保存します。このセットに格納されているプレイヤーを見ると、コマンドを実行したことがわかります。 UUIDは36文字の文字列で、すべてのプレーヤーでユニークで、すべてのサーバーで同じです。 Setは次のようになります。

final Set<UUID> players = new HashSet<>(); 

次に、あなたのコマンドを作成する必要があります。

@Override 
public boolean onCommand(CommandSender sender, Command cmd, String cl, String[] args) { 
    //Check if your command was executed 
    if(cmd.getName().equalsIgnorecase("yourCommand")){ 
     //Check if the executor of the command is a player and not a commandblock or console 
     if(sender instanceof Player){ 

      Player player = (Player) sender; 

      //Add the player's unique ID to the set 
      players.add(player.getUniqueId()); 
     } 
    } 
} 

さて、次に何をするか、プレイヤーが本をクリックしたときに見にPlayerInteractEventをリッスンです:私はこのようなことを行うだろう。あなたのプレーヤーがSetにいるとわかると、彼らはコマンドを実行したことを知っています。

@EventHandler 
public void onInteract(PlayerInteractEvent event){ 
    //Check if the player right clicked. 
    if(event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK){ 
     //Check if the Set contains this player 
     if(players.contains(event.getPlayer().getUniqueId()){ 
      //Check if the player had an item in their hand 
      if(event.getPlayer().getItemInHand().getType() == Material.BOOK){ 
       //Remove player from the set so they have to execute the command again before right clicking the book again 
       players.remove(event.getPlayer().getUniqueId()); 
       //Here you can do whatever you want to do when the player executed the command and right clicks a book. 
      } 
     } 
    } 
} 

それでは、私がやったことは、プレイヤーがコマンドを実行したとき、Setに保存され:ここで私はEventHandlerがあることになるだろう方法です。次にPlayerInteractEventを聞きます。これは基本的にプレーヤーが対話するたびに呼び出されるコールバックメソッドです。これは、プレイヤーがプレッシャープレートを歩いているとき、ブロック上を右か左にクリックしたときなどです。

その中でPlayerInteractEventには、プレイヤーが右クリックした場合にそのプレーヤーが格納されているかどうかがチェックされますブロック内を右クリックして、プレイヤーが手に本を持っているかどうかを確認します。それでも問題がなければ、Setからプレイヤーを削除して、同じ操作を実行するためにもう一度コマンドを実行する必要があります。

イベントを登録してListenerを実装することも忘れないでください。

Setについて詳しく知りたい場合は、Javadocsはhereです。

関連する問題