+0

Creación y manipulación de Entidades y Jugadores con Spigot



Vamos a ver que son las entidades de Minecraft en Spigot.

Entidades en Minecraft

Una entidad en Minecraft es algo vivo, como un creeper o un jugador, o interactuable, como un armor stand. No tiene más misterio.

Desde Java estos son representados con un objecto, estos siendo una clase específica para cada tipo de entidad.

Jugador

Un jugador también es una entidad. En el ejemplo del evento de movimiento, el objeto event contiene un método getPlayer, el cual nos da la entidad del jugador (de la clase Player). Vamos a jugar un poco con la entidad.

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) {  
        event.setCancelled(true);
        Player player = event.getPlayer();
    }  
      
}

Si exploramos todos los métodos que tiene la entidad, podemos ver que se pueden hacer una barbaridad de cosas, como enviar un mensaje. Sí, eso es lo que haremos, vamos a enviarle un mensaje al jugador conforme no se puede mover. Para ello usaremos el método sendMessage.

package me.polvallverdu.cursospigot;  
  
import net.kyori.adventure.text.Component;  
import net.kyori.adventure.text.format.NamedTextColor;  
import org.bukkit.entity.Player;  
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) {  
        event.setCancelled(true);  
        Player player = event.getPlayer();  
        player.sendMessage(Component.text("NO TE PUEDES MOVER!").color(NamedTextColor.RED));  
    }  
  
}

Y ya estaría. Si probamos esto, veremos que nos saldrá el mensaje cada vez que nos movamos.

Living Entities (Entidades con vida)

Luego tenemos las LivingEntity, que son entidades que simplemente tienen vida, por ejemplo, un Zombie, o un Creeper. Estos tienen vida, se pueden mover, pueden morir, pueden atacar, etc.

Para hacer aparecer un Zombie cada vez que nos agachemos en el juego, usaremos el evento PlayerToggleSneakEvent.

package me.polvallverdu.cursospigot;  
  
import org.bukkit.entity.EntityType;  
import org.bukkit.entity.Player;  
import org.bukkit.event.EventHandler;  
import org.bukkit.event.Listener;  
import org.bukkit.event.player.PlayerToggleSneakEvent;  
  
public class PlayerListener implements Listener {  
  
    @EventHandler  
    public void onPlayerShift(PlayerToggleSneakEvent event) {  
        Player player = event.getPlayer();  
        player.getWorld().spawnEntity(player.getLocation(), EntityType.ZOMBIE);  
    }  
  
}

Uff, mucho código nuevo. Más adelante veremos cada clase y objeto importante de Spigot, de momento asumiremos cosas.

Primero de todo conseguimos el World, que contiene un método para spawnear entidades, y lo llamamos con dos argumentos: el primero es el Location, en este caso es donde se encuentra el jugador, y luego el tipo de entidad a partir del enum EntityType.

Si lo probamos dentro del juego, cuando shifteamos aparecerá un Zombie 🎉.

Entidades Básicas

Para terminar, tenemos las entidades básicas. Estas tienen nada más lo básico para existir. Significa que no tienen vida, no tienen consciencia propia, etc. Un ejemplo muy claro son los ArmorStand. Vamos a ver como modificar uno.

Aprovechando el evento de antes, haremos que aparezca un armor stand pequeño, lo que implica que tendremos que modificarlo desde el código. El método spawnEntity devuelve la entidad en sí. Vamos a aprovecharlo para hacer el ArmorStand pequeño con el método setSmall(true).

package me.polvallverdu.cursospigot;  
  
import org.bukkit.entity.ArmorStand;  
import org.bukkit.entity.EntityType;  
import org.bukkit.entity.Player;  
import org.bukkit.event.EventHandler;  
import org.bukkit.event.Listener;  
import org.bukkit.event.player.PlayerToggleSneakEvent;  
  
public class PlayerListener implements Listener {  
  
    @EventHandler  
    public void onPlayerShift(PlayerToggleSneakEvent event) {  
        Player player = event.getPlayer();  
        ArmorStand armorStand = (ArmorStand) player.getWorld().spawnEntity(player.getLocation(), EntityType.ARMOR_STAND);  
        armorStand.setSmall(true);  
    }  
  
}

Si probamos el código dentro del juego, vemos que aparece un Armor Stand pequeño 😀