Skip to content

Les commandes

Alan Vion edited this page Aug 18, 2023 · 1 revision

Pour créer des commandes, il y a deux façons.

1 - La classique avec le CommandExecutor mais en utilisant celui du BukkitService => BukkitCommandExecutor.

public class DemoCommandExecutor implements BukkitCommandExecutor {
  public String name() {
    return "demo"
  }

  public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    sender.sendMessage("Ceci est une commande de démonstration");
    return true;
  }
}

2 - La moderne avec le Executor.

public class DemoExecutor implements Executor {
  public void configuration(ConfigurationBuilder configuration) {
    configuration.name("demo");
  }

  public boolean execute(CommandSender sender, Input input) {
    sender.sendMessage("Ceci est une commande de démonstration");
    return true;
  }
}

Ensuite pour enregistrer vos commandes, il suffit de passé par le BukkitOnEnableEvent en utilisant l'injecteur.

@KernelEventHandler
public class BukkitOnEnableHandler {
  private final Injectors injectors;

  private BukkitOnEnableHandler(Injectors injectors) {
    this.injectors = injectors;
  }

  @KernelEventHandler
  private void on(BukkitOnEnableEvent event) {
    this.injectors.inject("package.of.your.commands");
  }
}

Pour les deux types de commande, il est bien sur possible d'indiquer les mêmes données qui se trouvaient à l'origine dans le plugin.yml, en réécrivant les methodes adequat (pour la 1ère façon) ou en utilisant le ConfigurationBuilder (pour la 2nd façon).


Vu que la première façon est la même chose que pour le CommandExecutor d'origine de Bukkit, je vais passer outre et venir directement sur la seconde façon afin d'apporter plus de détail.


Le ConfigurationBuilder permet de construire vos commandes très précisément en utilisant des variables bien défini.

Exemple, il est possible de donné en argument un joueur et de le récupéré directement via l'objet Input:

public class DemoExecutor implements Executor {
  public void configuration(ConfigurationBuilder configuration) {
    configuration.name("demo")
      .usage("/demo <Player>")
      .add(
        configuration.argument().name(
          "player",
          ConverterType.PLAYER
        )
      );
  }

  public boolean execute(CommandSender sender, Input input) {
    final Player player = input.argumentOf("player");
    player.sendMessage("Ceci est une demonstration.");
    return true;
  }
}

Il existe plusieurs type de convertisseur:

ConverterType.STRING
ConverterType.BYTE
ConverterType.SHORT
ConverterType.INTEGER
ConverterType.LONG
ConverterType.FLOAT
ConverterType.DOUBLE
ConverterType.PLAYER
ConverterType.MATERIAL

Et il est possible d'en recréer de nouveau avec l'interface InputConverter

public class DateInputConverter implement InputConverter<Date> {
  public String name() {
    return "date";
  }

  public Date convert(String input) {
    return new Date(Long.parseLong(input));
  }
}

Ensuite pour l'enregistrer, tout commande pour l'enregistrement des commandes il est possible de passer par l'injection en injectant directement le package qui contient tout vos convertisseurs.

Et pour l'utiliser:

public class DemoExecutor implements Executor {
  public void configuration(ConfigurationBuilder configuration) {
    configuration.name("demo")
      .usage("/demo <Date>")
      .add(
        configuration.argument().name(
          "my-date",
          "date"
        )
      );
  }

  public boolean execute(CommandSender sender, Input input) {
    final Date date = input.argumentOf("my-date");
    sender.sendMessage("Ceci est une demonstration qui affiche le temps suivant: " + date.getTime());
    return true;
  }
}

Clone this wiki locally