Vamos a ver que son las GUIs en Minecraft, y como crearlas en Spigot.
¿Qué es una GUI?
Una interfaz de usuario gráfica, o GUI, es una interfaz que se muestra en pantalla en la cual hay diferentes botones que permiten realizar acciones.
Supongamos que queremos hacer una forma sencilla y accesible de teletransportarse, la solución sería usar una GUI.
Ejemplo de GUI de Minecraft de Hypixel
¿Cómo crear una GUI en Spigot?
Crear una GUI en Spigot es muy sencillo. No tiene más misterio que gestionar una instancia de Inventory
.
Para crear un inventario, hemos de tener claro que nombre queremos ponerle y el tamaño que queremos que tenga. Una vez tengamos claro eso, llamaremos al método estático createInventory
de la clase Bukkit
y le pasaremos tres argumentos. El primero, nulo. El segundo, el tamaño del inventario. Y el tercero, el componente del nombre que le queramos poner al inventario.
¡Ojo! El tamaño del inventario ha de ser múltiple de 9, que significa que si queremos dos filas hemos de poner el tamaño 9 por 2, en este caso sería 18. Aquí dejo una imagen de referencia
Imagen con la posición de los slots de un cofre doble en Minecraft
Ya tenemos el inventario creado, ahora solo hace falta añadir los objetos, o en este caso, los ItemStack
s. Como hemos visto anteriormente, un objeto inventario tiene diferentes métodos para manipular los ItemStack
s dentro. En mi caso, voy a añadir unos cuantos de ejemplo.
Como último, queda mostrar el inventario al jugador con el método openInventory
de Player
.
Si ahora corremos el código dentro del juego, veremos como aparece un inventario abierto con los ítems que hemos creado. Ahora veremos como hacer un inventario interactuable.
¿Cómo interactuar con una GUI o Inventario en Spigot?
Hay muchas formas de registrar acciones hechas en un inventario, pero yo os voy a enseñar la que es más simple y fácil de entender.
Para registrar las acciones dentro de tu inventario, vamos a separarlo en dos partes:
- Detectar que el jugador tiene el nuestro inventario abierto (no otro).
- Detectar qué acción ha hecho en el inventario.
Para continuar necesitaremos crear un Listener y registrarlo. En este Listener voy a añadir una lista de UUID
s para registrar que jugadores han abierto el inventario. Así cuando abra el inventario algún jugador lo guardaré ahí y cuando el jugador lo cierre lo sacaré de ahí.
Para detectar cuando un jugador cierra un inventario podemos escuchar el evento InventaryCloseEvent
y el evento de cuando un jugador se va del servidor (PlayerQuitEvent
). Cuando un jugador se va del servidor también hemos de registrarlo como inventario cerrado.
Ahora solo queda registrar los clicks. Para registrar los clics dentro del inventario, usaremos el evento InventoryClickEvent
. Este evento también nos ayudará a cancelar cualquier acción que haga el jugador dentro del inventario, como por ejemplo, mover ítems.
Aprovechando que nuestra interfaz tiene 3 ítems, (un diamante, un lingote de hierro y un lingote de oro), haré que al hacer click te rellene el inventario de ese material.
Primero de todo, comprobaremos que el jugador esté en la lista de jugadores con nuestro menú abierto. Si el jugador no está en la lista, no vamos a correr más código del evento. Si el evento sigue, significa que el jugador sí que tiene el inventario abierto, con lo cual vamos a cancelar la acción y vamos a conseguir el ítem que ha clicado.
Luego haremos una comprobación de que el ítem que ha clicado es válido, que no sea nulo
Para terminar haremos un switch para realizar una acción determinada dependiendo de que item ha clicado el jugador. Si ningún item coincide con una acción, reproducirá un sonido.