Creación de Eventos Personalizados en Hytale

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

Hytale permite a los modders reaccionar a acciones y sucesos dentro del juego mediante eventos personalizados. Este artículo explica cómo crear, manejar y registrar eventos en tu mod de Hytale.

Explorando el Código de HytaleServer.jar

Clase de Evento

Si quieres crear un evento en Hytale, primero importa la clase del evento que deseas manejar. Puedes encontrar la lista completa de eventos disponibles aquí.

Una vez importado, simplemente define una función que reciba el evento como argumento. Por ejemplo, para enviar un mensaje de bienvenida cuando un jugador se conecta al servidor:

public class ExampleEvent {

    public static void onPlayerReady(PlayerReadyEvent event) {
        Player player = event.getPlayer();
        player.sendMessage(Message.raw("Welcome " + player.getDisplayName()));
    }

}

En este ejemplo, cada vez que un jugador está listo (PlayerReadyEvent), el servidor enviará un mensaje personalizado de bienvenida con su nombre.


Registro del Evento

Todos los eventos deben ser registrados en la clase principal de tu plugin, normalmente dentro del método setup:

public class MyPlugin extends JavaPlugin {

    @Override
    public void setup() {
        this.getEventRegistry().registerGlobal(PlayerReadyEvent.class, ExampleEvent::onPlayerReady);
    }
}

Esto asegura que Hytale conozca tu función y la ejecute cada vez que ocurra el evento correspondiente.


Clases de Eventos ESC

Algunos eventos forman parte de los ESC Events (Entity System Component Events), que requieren un enfoque ligeramente diferente. Estos eventos permiten manipular directamente el sistema de entidades y sus componentes.

Por ejemplo, si quieres cancelar la creación de una receta cuando usa “fibre” como ingrediente:

class ExampleCancelCraft extends EntityEventSystem {
    public ExampleCancelCraft() {
        super(CraftRecipeEvent.Pre.class);
    }

    @Override
    public void handle(int index,
                       @NonNullDecl ArchetypeChunk archetypeChunk,
                       @NonNullDecl Store store,
                       @NonNullDecl CommandBuffer commandBuffer,
                       @NonNullDecl CraftRecipeEvent.Pre craftRecipeEvent) {
        CraftingRecipe recipe = craftRecipeEvent.getCraftedRecipe();
        if (recipe.getInput() != null) {
            for (MaterialQuantity mq : recipe.getInput()) {
                if (Objects.equals(mq.getItemId(), "Ingredient_Fibre")) {
                    craftRecipeEvent.setCancelled(true);
                    break;
                }
            }
        }
    }

    @Override
    public Query getQuery() {
        return Archetype.empty();
    }
}

Este ejemplo demuestra cómo inspeccionar los componentes de la entidad y cancelar eventos específicos cuando se cumplen ciertas condiciones.


Registro de Eventos ESC

Al igual que los eventos normales, los ESC Events deben ser registrados dentro de la clase principal del plugin, pero utilizando el EntityStoreRegistry:

public class MyPlugin extends JavaPlugin {

    @Override
    public void setup() {
        this.getEntityStoreRegistry().registerSystem(new ExampleCancelCraft());
    }
}

Una vez registrado, tu sistema se ejecutará automáticamente y podrá cancelar o modificar eventos de entidades según la lógica que hayas definido.


Conclusión

  1. Eventos Globales: Utiliza Event y registra con getEventRegistry().registerGlobal.
  2. Eventos ESC: Crea un EntityEventSystem y registra con getEntityStoreRegistry().registerSystem.
  3. Personalización: Puedes acceder a componentes como Player, CraftingRecipe, MaterialQuantity, etc.
  4. Cancelación de Eventos: ESC Events permiten cancelar acciones específicas, como recetas o interacciones.
  5. Registro Obligatorio: Todo evento debe registrarse en la clase principal de tu plugin para que funcione en Hytale.

Este sistema flexible permite reaccionar a prácticamente cualquier acción en el juego, desde la conexión de un jugador hasta la manipulación de recetas o entidades, ofreciendo un nivel avanzado de control para tu mod.