Reproducción de Sonidos en Hytale

Hytale: Guías, Mods, Opiniones | Videojuegos en CIBERED

Con tu plugin de Hytale, puedes reproducir sonidos para jugadores de manera localizada, 3D y categorizada.

Explorando el Código de HytaleServer.jar

Índices de Sonidos

Hytale tiene una gran variedad de sonidos disponibles como claves en el AssetMap.
Consulta la lista completa de sonidos aquí.

Para obtener el índice de un sonido, usa SoundEvent.getAssetMap():

int index = SoundEvent.getAssetMap().getIndex("SFX_Cactus_Large_Hit");

Este índice es necesario para reproducir el sonido a un jugador.


Transform Component

El TransformComponent indica dónde se reproduce el sonido.

Obtener Transform de un jugador

TransformComponent transform = store.getComponent(
    context.senderAsPlayerRef(),
    EntityModule.get().getTransformComponentType()
);

Crear un nuevo TransformComponent (opcional)

Vector3d position = new Vector3d(0, 0, 0); // Posición
Vector3f rotation = new Vector3f(0, 0, 0); // Rotación
TransformComponent transform = new TransformComponent(position, rotation);

Nota: No se recomienda crear un TransformComponent desde cero para jugadores, ya que si están lejos, no escucharán el sonido.


PlayerRef

Necesitas una referencia al jugador (Ref).
Si tienes el objeto Player, puedes obtenerla mediante:

Ref playerRef = player.getReference();

World

El sonido debe reproducirse dentro del método execute() del objeto World:

World world = player.getWorld();
world.execute(() -> {
    // Aquí dentro se reproducen los sonidos
});

Categorías de Sonido

El enum SoundCategory permite especificar el tipo de sonido:

  • Music → Música
  • Ambient → Sonidos ambientales
  • SFX → Efectos de sonido
  • UI → Interfaz de usuario

Esto ayuda a organizar el audio y controlar mezclas de volumen por categoría.


Reproduciendo Sonidos

Para reproducir un sonido 3D para un jugador, usa SoundUtil.playSoundEvent3dToPlayer:

int index = SoundEvent.getAssetMap().getIndex("SFX_Cactus_Large_Hit");
World world = player.getWorld();
EntityStore store = world.getEntityStore();
Ref playerRef = player.getReference();

world.execute(() -> {
    TransformComponent transform = store.getStore().getComponent(
        playerRef, 
        EntityModule.get().getTransformComponentType()
    );

    SoundUtil.playSoundEvent3dToPlayer(
        playerRef,         // Jugador objetivo
        index,             // Índice del sonido
        SoundCategory.UI,  // Categoría del sonido
        transform.getPosition(), // Posición del sonido
        store.getStore()         // EntityStore
    );
});

Este ejemplo reproduce un efecto de sonido de cactus al jugador, usando su posición actual en el mundo.


Tips de la integración de Sonidos

  • Categorías: Úsalas para efectos de interfaz separados de música y SFX.
  • Distancia: Reproducir sonidos con TransformComponent permite efectos 3D y distancia.
  • Jugador: Siempre se necesita PlayerRef para dirigir el sonido a un jugador específico.
  • World.execute(): Crucial para ejecutar acciones seguras en el hilo del mundo.