Creación de Comandos Personalizados en Hytale

Hytale: Guías, Mods, Opiniones | Videojuegos en CIBERED

Hytale permite a los modders extender la experiencia de juego mediante comandos personalizados. Estos comandos se crean en el servidor mediante Java y se registran a través del sistema de plugins.

Este artículo explica cómo crear un comando desde cero usando la clase AbstractPlayerCommand.

Explorando el Código de HytaleServer.jar

La clase AbstractPlayerCommand

Para crear un comando personalizado, debes extender la clase AbstractPlayerCommand. Esto proporciona un marco asíncrono que no se ejecuta en el hilo principal del servidor, lo cual evita bloquear la ejecución del juego durante operaciones largas.

Constructor

Al extender AbstractPlayerCommand, debes proporcionar un constructor que llame al constructor de BaseCommand con los siguientes parámetros:

  • Nombre del comando: el texto que los jugadores escribirán en el chat para ejecutar el comando.
  • Descripción: una breve explicación de lo que hace el comando.
  • Confirmación opcional: indica si el comando requiere que el jugador escriba --confirm al ejecutarlo.

Método execute

El comportamiento del comando se implementa sobrescribiendo el método execute. Este método recibe los siguientes parámetros:

  • CommandContext: siempre representa al jugador que ejecuta el comando.
  • Store: permite acceder a todos los componentes de las entidades.
  • Ref: referencia de la entidad del jugador que ejecuta el comando.
  • PlayerRef: referencia directa al jugador.
  • World: el mundo en el que se está ejecutando el comando.

Mediante el Store y el Ref, puedes acceder a cualquier componente de la entidad, como Player, UUIDComponent o TransformComponent.

Ejemplo de comando

public class ExampleCommand extends AbstractPlayerCommand {

  public ExampleCommand() {
    super("test", "Super test command!");
  }

  @Override
  protected void execute(@Nonnull CommandContext commandContext, @Nonnull Store<EntityStore> store, @Nonnull Ref<EntityStore> ref, @Nonnull PlayerRef playerRef, @Nonnull World world) {
    Player player = store.getComponent(ref, Player.getComponentType()); // también un componente
    UUIDComponent component = store.getComponent(ref, UUIDComponent.getComponentType());
    TransformComponent transform = store.getComponent(ref, TransformComponent.getComponentType());
    
    player.sendMessage(Message.raw("Player#getUuid() : " + player.getUuid())); // retorna UUID desde UUIDComponent
    player.sendMessage(Message.raw("UUIDComponent : " + component.getUuid()));
    player.sendMessage(Message.raw("equal : " + player.getUuid().equals(component.getUuid()))); // ambos son iguales
    player.sendMessage(Message.raw("Transform : " + transform.getPosition()));
  }

}

En este ejemplo, el comando test permite al jugador verificar su UUID y la posición de su transformación en el mundo.


Registro del comando

Una vez creado el comando, debe registrarse en el plugin para que Hytale lo reconozca. Esto se hace dentro de la clase principal del plugin extendiendo JavaPlugin:

public class MyPlugin extends JavaPlugin {

    @Override
    public void setup() {
        this.getCommandRegistry().registerCommand(new ExampleCommand());
    }
}

Después de este registro, los jugadores podrán ejecutar el comando test en el chat del servidor y el método execute, se ejecutará automáticamente para cada jugador que lo invoque.


Conclusión

  1. Extiende AbstractPlayerCommand para crear un comando personalizado.
  2. Define un constructor con nombre, descripción y confirmación opcional.
  3. Sobrescribe execute para implementar la lógica del comando.
  4. Accede a componentes del jugador mediante Store y Ref.
  5. Registra el comando en tu plugin usando getCommandRegistry().registerCommand.

Este sistema combina facilidad de uso con potencia avanzada, permitiendo que cualquier modder manipule datos de jugadores, NPCs y entidades dentro del mundo de Hytale de manera segura y eficiente.