Vamos a ver como escuchar eventos como cuando entra un jugador el servidor, o alguien se mueve, en Spigot Minecraft.
¿Qué es un evento?
Un evento es cuando una acción provoca la ejecución de otra parte del código sin tener conocimiento de ella, incluso llegando a modificar el comportamiento de la acción debido al código ejecutado durante el evento.
Un ejemplo de un evento podría ser correr código cuando un jugador se mueva, e incluso hacer que el jugador no pueda moverse.
¿Cómo escuchar eventos en Spigot?
Para escuchar eventos en Spigot necesitaremos crear una clase especial llamada Listener
, y registrarla en nuestro método onEnable
. ¡Vamos a ello!
Primero crearemos una clase con el nombre que queramos (por ejemplo, PlayerListener
), y habrá de implementar Listener
.
package me.polvallverdu.cursospigot;
import org.bukkit.event.Listener;
public class PlayerListener implements Listener {
}
Con la clase creada, necesitaremos registrar el Listener. Como queremos que esté registrada desde que el plugin es cargado, lo haremos en el onEnable
. Para registrar un Listener, se hace desde un método estático de la clase Bukkit
.
@Override
public void onEnable() {
Bukkit.getPluginManager().registerEvents(new PlayerListener(), this);
}
El método registerEvents
se encuentra en la clase PluginManager
. Este acepta dos argumentos, una clase instanciada que implemente Listener
, y el JavaPlugin
al que pertenece el Listener.
Está muy bien eso, pero de momento no hemos añadido nada de código...
Tipos de eventos en Spigot
Spigot tiene una GRAN variedad de eventos a los que podemos escuchar. Estos están divididos entre categorías:
-
Block (lista completa): Eventos relacionados con cambios en un bloque o interacciones con el mundo.
-
Enchantment (lista completa): Eventos desencadenados desde una mesa de encantamientos.
-
Entity (lista completa): Eventos relacionados con entidades, excluyendo algunos que directamente hacen referencia a tipos de entidad más específicos.
-
Hanging (lista completa): Eventos relacionados con entidades que cuelgan.
-
Inventory (lista completa): Eventos relacionados con la manipulación de inventarios.
-
Player (lista completa): Eventos relacionados con jugadores.
-
Raid (lista completa): Eventos relacionados con incursiones.
-
Server (lista completa): Eventos relacionados con cambios de estado programáticos en el servidor.
-
Vehicle (lista completa): Eventos relacionados con entidades vehiculares.
-
Weather (lista completa): Eventos relacionados con el clima.
-
World (lista completa): Eventos desencadenados por varios estados o cambios en el mundo.
Cada clase dentro de estos paquetes representa un evento. Todos los eventos extienden Event
, más alguna otra clase que les dé más información. Por ejemplo, si es un evento relacionado con jugadores, extenderá PlayerEvent
, que aún contiene más información.
Además, hay eventos que pueden ser cancelados. Estos los reconocemos porque implementan la interfaz Cancellable
. Si cancelamos un evento cancelable, la acción que llama ese evento no se reproducirá.
Evento de Ejemplo
Vamos a hacer que los jugadores no se puedan mover. Para ello, si buscamos en la lista de eventos de jugadores, vemos que existe el evento PlayerMoveEvent
, y que encima puede ser cancelado porque implementa Cancellable
. Manos a la obra.
Primero escucharemos este evento desde el Listener que hemos creador anteriormente. Lo haremos creando un método con la anotación @EventHandler
, y que de argumento acepte un PlayerMoveEvent
.
package me.polvallverdu.cursospigot;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;
public class PlayerListener implements Listener {
@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
}
}
Recomiendo que investigues un poco que tiene el objeto
event
.
Ahora haremos que se cancele. Para eso llamaremos el método setCancelled
, y lo pondremos en true
.
@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
event.setCancelled(true);
}
¡Vamos a probarlo en el servidor! Iniciamos el servidor con la tarea runServer
, y vamos a unirnos. Nada más entrar al servidor, veremos como realmente no nos podemos mover. Funciona todo perfectamente 😀.