+0

Eventos y Callbacks



Vamos a aprender que son los Eventos o Callbacks de Fabric, como crearlos, y cuales hay.

¿Que es un evento?

Un Evento en Fabric es una parte del código que se ejecuta cuando ocurre una acción dentro del juego o cuando otro mod llama ese evento.

Un Callback es un gancho que se engancha a un evento para así permitir a los desarrolladores realizar acciones cuando esos eventos son llamados.

Eventos Cancelables

Algunos eventos pueden tener lo que se dice un ActionResult, que es básicamente una respuesta de un callback el cual dice si el evento puede seguir, el evento termina ahí o si se cancela. Esto es útil por si, por ejemplo, un evento de atacar a un jugador, si se cancela, el jugador no será dañado. Los tres estados son:

  • SUCCESS: Cancela la ejecución de los siguientes callbacks y sigue el código de manera normal.
  • PASS: Seguiré ejecutando los siguientes Listeners o Callbacks, y si no hay más, el ActionResult pasará a ser SUCCESS.
  • FAIL: El evento se cancela y nos seguirá con el código.

¿Qué eventos hay?

Cuando creamos un mod, normalmente incluimos la Fabric API, que ya trae unos eventos predefinidos, los cuales son llamados cuando ocurran acciones comunes dentro del juego. Estos son útiles porque así los desarrolladores no debemos de implementar todo el rato los mismos eventos.

Todos los eventos que hay en Fabric los podemos encontrar en la propia web fabricmc.net.

¿Cómo crear un evento?

Para crear un evento es muy sencillo. Primero de todo necesitaremos crear una interfaz, la cual contenderá el método que se llamará cuando se ejecute el evento y un objeto de tipo evento que nos servirá para registrar los diferentes hooks o callbacks que quieran escuchar a ese evento.

El ejemplo oficial de FabricMC es ideal para aprender a hacer eventos.

Como ejemplo, poner un evento que se va a llamar cuando una oveja sea esquilada. Para ello, crear una interfaz que es SheepShearCallback, la cual tiene el método que se llama, que tiene dos argumentos, el del jugador que ha esquilado la oveja y la oveja esquilada, junto con el objeto que devuelve, que es un ActionResult, y luego el objeto evento, que es el que se encargará de llamar a los hooks o callbacks cuando el evento se ha llamado.

public interface SheepShearCallback {
	Event<SheepShearCallback> EVENT = EventFactory.createArrayBacked(SheepShearCallback.class,
			(listeners) -> (player, sheep) -> {
				for (SheepShearCallback listener : listeners) {
					ActionResult result = listener.interact(player, sheep);
 
					if (result != ActionResult.PASS) {
						return result;
					}
				}
 
				return ActionResult.PASS;
			});
 
	ActionResult interact(PlayerEntity player, SheepEntity sheep);
}

Luego, para llamar al elemento, solo necesitamos el objeto event dentro de la interfaz, llamar al invoke, obtener el invoker y llamar al método.

ActionResult result = SheepShearCallback.EVENT.invoker().interact(player, sheep);

Ejemplo: Obtener instancia de un servidor.

Antes hemos hablado de la diferencia entre cliente y servidor. Hay veces en las que necesitaremos la instancia del servidor. ¿Qué pasa? Que cuando un cliente se ejecuta, no hay ninguna instancia de ningún servidor. Hasta que no carguemos un mundo individual, el cual ejecutará un servidor interno, no existe ningún servidor.

Para ello, nada más iniciarse el mod, lo que haremos es escuchar el evento ServerLifecycleEvents y guardar la instancia. Luego también escucharemos el evento de cuando el servidor se cierra para poner la instancia como null.

private static MinecraftServer SERVER = null;  
  
@Override  
public void onInitialize() {  
    ServerLifecycleEvents.SERVER_STARTING.register((server) -> SERVER = server);  
    ServerLifecycleEvents.SERVER_STOPPED.register((server) -> SERVER = null);  
}