+0

Crear un comando con Spigot



Vamos a ver como crear comandos en Minecraft con Spigot.

¿Qué es un comando?

Un comando es una forma de interacción con el servidor mediante el mismo chat del juego. Estos empiezan con una barra (/) seguido del nombre, y opcionalmente pueden contener argumentos, que es información extra que le podemos pasar al servidor.

Además, existen los permisos, que hacen que podamos gestionar que jugadores pueden ejecutar ciertos comandos.

Creación de un comando

Bueno, vamos a empezar por la creación de un comando en nuestro plugin de Spigot. Para ello, empezaremos creando una clase llamada EjemploCommand, y ha de implementar CommandExecutor.

package me.polvallverdu.cursospigot.commands;  
  
import org.bukkit.command.Command;  
import org.bukkit.command.CommandExecutor;  
import org.bukkit.command.CommandSender;  
import org.jetbrains.annotations.NotNull;  
  
public class EjemploCommand implements CommandExecutor {  
  
    @Override  
    public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {  
        return false;  
    }  
      
}

Vemos que la implementación de esa interface nos crea el método onCommand, el cual se ejecutará cuando se ejecute nuestro comando. Si devolvemos false, significa que el comando ha fallado, en cambio, si devolvemos true, significa que el comando se ha ejecutado correctamente.

Vamos a analizar los argumentos de este método:

  • CommandSender sender: Este objeto representa quien ha ejecutado el comando. Puede ser la consola, un bloque de comandos, o un jugador.

  • Command command: Representa el comando en sí. Contiene información sobre este.

  • String label: el nombre del comando que se ha usado. Nuestro comando podrá tener aliases.

  • String[] args: Los argumentos que se han mandado al servidor.

Si no tienes los mismos nombres de los argumentos que tengo yo, recomiendo que los cambies a los que he proporcionado yo aquí.

Sabiendo esta información, haremos un comando que salude a la persona que ha enviado el comando. Vamos a usar el método sendMessage de CommandSender.

package me.polvallverdu.cursospigot.commands;  
  
import net.kyori.adventure.text.Component;  
import org.bukkit.command.Command;  
import org.bukkit.command.CommandExecutor;  
import org.bukkit.command.CommandSender;  
import org.jetbrains.annotations.NotNull;  
  
public class EjemploCommand implements CommandExecutor {  
  
    @Override  
    public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {  
        sender.sendMessage(Component.text("Buenass"));  
        return true;  
    }  
  
}

¡Ya tendríamos nuestro primer comando! Ahora solo hace falta registrarlo. Para ello, necesitamos registrarlo en nuestro plugin.yml, y cuando el plugin se inicia en el método onEnable de nuestra clase principal.

Para registrarlo en el plugin.yml, escribiremos lo siguiente:

commands:  
  ejemplo:  
    description: Comando para saludar  
    aliases:   
      - hola

He registrado el comando ejemplo, con el alias hola, y la descripción Comando para saludar. Aquí hay más información sobre el plugin.yml.

Por último lo registraremos en nuestra clase principal.

package me.polvallverdu.cursospigot;  
  
import me.polvallverdu.cursospigot.commands.EjemploCommand;  
import org.bukkit.Bukkit;  
import org.bukkit.plugin.java.JavaPlugin;  
  
public final class CursoSpigot extends JavaPlugin {  
  
    @Override  
    public void onEnable() {  
	    // ...
        getCommand("ejemplo").setExecutor(new EjemploCommand());  
    }  
  
	// ...
 
}

Ya tenemos el comando listo 🎉. Si iniciamos el juego, veremos que al ejecutar /ejemplo o /hola, correrá el comando que hemos creado.

Argumentos en el comando

Ahora veremos como leer los argumentos que se envían a un comando. Haremos que nuestro comando que saluda te salude por el nombre. Para ello, aceptaremos el nombre, y si el jugador no pone un nombre, cogeremos el nombre del jugador.

Volviendo a nuestro método onCommand, vemos que tenemos un argumento que contiene los argumentos (String[] args). Es una Array con strings, que representan los argumentos. Si realizamos las comprobaciones necesarias para ejecutar todo lo que hemos planeado, tendría que quedar un código así:

package me.polvallverdu.cursospigot.commands;  
  
import net.kyori.adventure.text.Component;  
import org.bukkit.command.Command;  
import org.bukkit.command.CommandExecutor;  
import org.bukkit.command.CommandSender;  
import org.bukkit.entity.Player;  
import org.jetbrains.annotations.NotNull;  
  
public class EjemploCommand implements CommandExecutor {  
  
    @Override  
    public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {  
        if (args.length == 0) {  // Comprobamos si no hay ningún argumento  
            if (sender instanceof Player player) {  // Comprobamos que el comando ha sido ejecutado por un jugador  
                player.sendMessage(Component.text("Hola ").append(player.displayName()));  
            } else {  
                sender.sendMessage(Component.text("Hola Desconocido :D"));  
            }  
        } else { // Si tiene argumentos entramos aquí  
            sender.sendMessage(Component.text("Hola " + args[0]));  
        }  
          
        return true;  
    }  
  
}

Recomiendo que analices detenidamente el código para que intentes entender qué está ocurriendo.

Ahora, para darle un toque más estético, actualizaremos el plugin.yml para añadir como usar el comando:

commands:  
  ejemplo:  
    description: Comando para saludar  
    aliases:  
      - hola  
    usage: "Usage: /hola [nombre]"

Si nos fijamos he puesto el argumento entre paréntesis cuadrados ([]). Esto es para indicar que ese argumento es opcional. Si queremos indicar que es obligatorio, usaremos los símbolos de mayor y menor (<>).

¡Ya estaría! Si lo probamos dentro del juego, veremos como funciona todo correctamente.

Permisos en los comandos

En Minecraft tenemos los permisos, que nos permiten determinar si un usuario puede realizar una acción. De momento no entraremos mucho en detalle, asumiremos que si comprobamos si un jugador tiene un permiso, no podrá correr el comando si no es administrador.

Para comprobar si un jugador tiene un permiso, lo podemos hacer desde el plugin.yml, o desde el código:

commands:  
  ejemplo:  
    description: Comando para saludar  
    aliases:  
      - hola  
    usage: "Usage: /hola [nombre]"  
    permission: cursospigot.commands.ejemplo
package me.polvallverdu.cursospigot.commands;  
  
import net.kyori.adventure.text.Component;  
import org.bukkit.command.Command;  
import org.bukkit.command.CommandExecutor;  
import org.bukkit.command.CommandSender;  
import org.bukkit.entity.Player;  
import org.jetbrains.annotations.NotNull;  
  
public class EjemploCommand implements CommandExecutor {  
  
    @Override  
    public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {  
        if (!sender.hasPermission("cursospigot.commands.ejemplo")) {  
            sender.sendMessage(Component.text("No tienes permiso!"));  
            return true;  
        }  
          
        if (args.length == 0) {  // Comprobamos si no hay ningún argumento  
            if (sender instanceof Player player) {  // Comprobamos que el comando ha sido ejecutado por un jugador  
                player.sendMessage(Component.text("Hola ").append(player.displayName()));  
            } else {  
                sender.sendMessage(Component.text("Hola Desconocido :D"));  
            }  
        } else { // Si tiene argumentos entramos aquí  
            sender.sendMessage(Component.text("Hola " + args[0]));  
        }  
  
        return true;  
    }  
  
}