2016-04-09 3 views
3

Also ich möchte überprüfen, wenn ein Spieler richtig klickt mit einem Buch in der Hand nach dem ersten Ausführen eines Befehls. Ich habe versucht, Runnable als Timer laufen zu lassen und in diesem Scheduler zu überprüfen, ob der Spieler rechts mit einem Buch in der Hand klickt. Das Runnable hat mich gezwungen, die 'run'-Methode zu überschreiben.ScheduledEvent Eventhandler von Override

Dies ist, was ich versucht habe:

@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

Warum möchten Sie einen Ereignis-Listener in einer Aufgabe registrieren, die mehrmals ausgeführt wird? Für jedes Ereignis, das Sie hören möchten, müssen Sie nur eine Methode in einem Listener implementieren (die Methode wird jedes Mal aufgerufen, wenn das Ereignis ausgelöst wird, es ist keine wiederholte Aufgabe erforderlich). –

+0

Wenn sie diesen Befehl ausführen, möchte ich überprüfen, ob sie mit der rechten Maustaste auf ein Buch klicken, bis sie mit der rechten Maustaste auf ein Buch klicken –

+0

Okay, das müsste aber anders gemacht werden. Ereignisse können nur einmal registriert werden. Ich würde das PlayerInteractEvent registrieren und jedes Mal, wenn ein Spieler mit der rechten Maustaste auf ein Buch klickt, die Zeit, auf die er geklickt hat, und seine Namen in eine Liste einfügen. Wenn der Spieler den Befehl ausführt, können Sie überprüfen, ob er vor kurzem mit dem Buch rechts geklickt hat. –

Antwort

1

Um zu wissen, ob der Spieler den Befehl ausgeführt wurde, können Sie den Spieler UUID irgendwo speichern müssen. Zuerst erstellen Sie eine Set<UUID>, die alle Unique IDs aller Spieler speichert, die den Befehl ausgeführt haben. Wenn Sie also einen Spieler in diesem Set sehen, wissen Sie, dass er den Befehl ausgeführt hat. A ist eine Zeichenfolge mit 36 ​​Zeichen, die für jeden Player eindeutig ist und auf jedem Server identisch ist. Sie machen die Set wie folgt aus:

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

Als nächstes müssen Sie Ihren Befehl machen. Ich würde das tun wie folgt aus:

@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()); 
     } 
    } 
} 

Nun, was Sie als nächstes tun ist hören für die PlayerInteractEvent zu sehen, wenn ein Spieler das Buch klickt. Wenn Sie sehen, dass sich der Player in der Set befindet, wissen Sie, dass er den Befehl ausgeführt hat. Hier ist, wie ich machen würde, dass EventHandler:

@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. 
      } 
     } 
    } 
} 

Also, was ich getan habe, wenn der Spieler den Befehl ausführt, speichern sie in einem Set. Als nächstes hören Sie nach dem PlayerInteractEvent. Dies ist grundsätzlich eine Callback-Methode, die jedes Mal aufgerufen wird, wenn ein Spieler interagiert. Dies kann der Fall sein, wenn ein Spieler eine Druckplatte betätigt, wenn ein Spieler rechts oder links auf einen Block klickt oder in der Luft usw.

In diesem PlayerInteractEvent überprüfe ich, ob der Player in diesem Set gespeichert ist, wenn der Spieler mit der rechten Maustaste klickt in der Luft oder rechts einen Block geklickt und prüfen, ob der Spieler ein Buch in der Hand hat. Wenn das alles korrekt ist, entferne ich den Player aus dem Set, so dass sie den Befehl noch einmal ausführen müssen, um die gleiche Aktion auszuführen.

Vergessen Sie auch nicht, Ereignisse zu registrieren und Listener zu implementieren.

Falls Sie mehr über die Set erfahren möchten, finden Sie die Javadocs here.