Generar murciélago invisible – convertir org.bukkit.Entity a org.bukkit.craftbukkit.v1_8_R3.entity.CraftBat;
Estoy creando un Plugin que necesita algunos murciélagos invisibles. Por lo tanto, tengo un método que genera y almacena mis murciélagos. Este es el código que tengo actualmente:
public class BatManager {
private static final List<entity> bats = new ArrayList<>();
public static void spawnBat(Location location) {
Entity entity = location.getWorld().spawnEntity(location, EntityType.BAT);
try {
CraftBat l = (CraftBat) entity;
l.getHandle().setInvisible(true);
} catch (RuntimeException e) {
e.printStackTrace();
}
bats.add(entity);
}
Este código se compila, pero no hace que el murciélago sea invisible. Sospecho fuertemente que creo una copia del objeto en algún momento y establezco la invisibilidad allí. Sin embargo, no estoy seguro de cómo puedo establecer la invisibilidad sin la conversión a CraftBat, ya que no conozco métodos para hacer que un org.bukkit.Entity
sea invisible por sí solo.
¿Cómo puedo corregir esto?
Estoy abierto a otras sugerencias sobre la invisibilidad también, pero específicamente no quiero usar efectos de pociones, ya que dejan algunas partículas para que el jugador las vea.
davy.ai
Una posible solución es convertir la entidad generada directamente en una CraftEntity y luego establecer su etiqueta de datos NMS (net.minecraft.server) para incluir la etiqueta de invisibilidad. Aquí está una versión actualizada del método spawnBat que implementa este enfoque:
Explicación:
entity
devuelto porspawnEntity
es una instancia de la interfazorg.bukkit.entity.Entity
.getBukkitEntity
, que devuelve una instancia de la claseorg.bukkit.craftbukkit.entity.CraftEntity
.org.bukkit.entity.Entity
, todavía podemos usarla como un identificador para el murciélago generado.CraftEntity
a su contraparte NMS llamando agetHandle
, que devuelve una instancia de la clase de entidad del paquetenet.minecraft.server
correspondiente a la entidad Bukkit.getDataWatcher
en la entidad NMS y usando una constanteDataWatcherObject
(13) correspondiente al tipo de datosENTITY_FLAG
y la posición de bits. El valor de byte de 0x20 corresponde a la máscara de bits para la bandera “está invisible”.Tenga en cuenta que este código supone que está utilizando la versión 1.16.4 de Minecraft y la versión correspondiente de la API Bukkit. Si está utilizando una versión diferente, puede que necesite ajustar las clases NMS y las constantes del monitor de datos en consecuencia.