+0

Inventarios y EntityEquipments con Spigot



Vamos a ver que es un inventario en Spigot, y como funcionan en Minecraft.

¿Qué es un inventario?

Un inventario en Minecraft es básicamente un espacio que tiene un jugador, una entidad, o incluso un bloque, donde se pueden guardar y/o equipar ítems. No tiene más misterio.

Los inventarios se organizan por slots, que básicamente son como posiciones dentro de un inventario. Cada slot tiene un número asignado como un índice. Las posiciones de los slots varían dependiendo del tipo de inventario, por ejemplo, tenemos inventarios de cofre, el inventario de un jugador o incluso el inventario de un caballo. Para saber qué números corresponden a cada slot hay una web muy útil llamada mcutils.com, la cual tiene una colección de imágenes que indica todas las posiciones de los slots, de todos los inventarios de Minecraft.

Imagen con la posición de los slots de un cofre doble en Minecraft

Imagen con la posición de los slots de un cofre doble en Minecraft

¿Cómo manipular inventarios en Spigot?

Hemos de diferenciar entre dos términos, un inventario y un equipamiento.

Las entidades como zombie o esqueleto tienen equipamiento, pero no un inventario accesible, lo que significa que se pueden equipar una espada o una pechera, pero no podemos acceder a un inventario propio de ellos.

En cambio, los inventarios son inventarios (jeje) que se pueden acceder, como por ejemplo podemos acceder a un inventario de un caballo y colocar algo, o podemos acceder a inventarios de cofres o a nuestro propio inventario.

Equipamiento

Si obtenemos una instancia de una clase que implementa Mob, veremos que tenemos acceso a métodos relacionados con un EntityEquipment, el cual funciona con slots ya predefinidos, llamados EquipmentSlots.

Los EquipmentSlots representas slots para diferentes tipos de ítem, como pecheras, mano principal, etc.

zombie.getEquipment().setItem(EquipmentSlot.CHEST, new ItemStack(Material.DIAMOND_CHESTPLATE));

Inventarios

Ahora sí, vamos a ver como manipular inventarios en Spigot. Para empezar, necesitaremos conseguir una instancia de la clase Inventory. Si queremos conseguir la de un jugador, la podemos obtener con el método getInventory. Una vez tenemos la instancia en un inventario, podemos hacer un montón de operaciones, desde conseguir ítems del inventario, modificarlos, borrarlos o también podemos añadirlos.

Todas estas operaciones se realizan con ItemStacks, y los slots mencionados anteriormente.

Si queremos borrar el inventario entero del jugador y darle una espada con encantamientos, haríamos lo siguiente:

ItemStack espada = new ItemStack(Material.DIAMOND_SWORD);  
espada.addEnchantment(Enchantment.DAMAGE_ALL, 3);  
 
Inventory inventory = player.getInventory();  
inventory.clear();  
inventory.addItem(espada);

Eventos

Spigot contiene una gran variedad de eventos para poder detectar cuando un jugador realiza una operación en su inventario, o en el de otros. Uno de los más usados es InventoryClickEvent el cual es llamado cuando alguien clica en cualquier inventario.

Si queremos hacer que los jugadores no puedan mover items de su inventario, sería tan sencillo como cancelar este evento, ya que implementa la interface Cancellable.

@EventHandler  
public void onInventoryClick(InventoryClickEvent e) {  
    e.setCancelled(true);  
}