es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for 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:

    public static void spawnBat(Location ubicación) {
        Entity entidad = ubicación.getWorld().spawnEntity(ubicación, EntityType.BAT);
        Entity bukkitEntity = entidad.getBukkitEntity();
        if (bukkitEntity instanceof CraftEntity) {
            CraftEntity craftEntity = (CraftEntity) bukkitEntity;
            net.minecraft.server.v1_16_R3.Entity nmsEntity = craftEntity.getHandle();
            nmsEntity.getDataWatcher().set(new DataWatcherObject<>(13, DataWatcherRegistry.a), (byte)0x20);
        }
        bats.add(entidad);
    }
    

    Explicación:

    • El objeto entity devuelto por spawnEntity es una instancia de la interfaz org.bukkit.entity.Entity.
    • Podemos obtener una referencia a su objeto de implementación CraftBukkit llamando a su método getBukkitEntity, que devuelve una instancia de la clase org.bukkit.craftbukkit.entity.CraftEntity.
    • Desde que esta clase extiende org.bukkit.entity.Entity, todavía podemos usarla como un identificador para el murciélago generado.
    • Luego podemos convertir CraftEntity a su contraparte NMS llamando a getHandle, que devuelve una instancia de la clase de entidad del paquete net.minecraft.server correspondiente a la entidad Bukkit.
    • Finalmente, podemos establecer el valor del monitor de datos NMS para la etiqueta de invisibilidad llamando al método getDataWatcher en la entidad NMS y usando una constante DataWatcherObject(13) correspondiente al tipo de datos ENTITY_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.

Comments are closed.