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.
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). –
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 –
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. –