Efectos

Utilizando la API de efectos en Sponge, podemos crear efectos especiales para ser utilizados en un servidor. Utilizando un Viewer, podemos reproducir sonidos o generar partículas en el servidor.

Reproducción de Sonidos

Con algún Viewer dado, podemos simplemente reproducir un sonido en una ubicación:

import org.spongepowered.api.effect.Viewer;
import org.spongepowered.api.effect.sound.SoundTypes;

import com.flowpowered.math.vector.Vector3d;

viewer.playSound(SoundTypes.ENTITY_CREEPER_PRIMED, new Vector3d(1, 65, 1), 1);

Ahora desglosemos esto. Primero, tenemos el SoundType en reproducción. Esto es simplemente el sonido que será reproducido. A continuación tenemos una posición Vector3d. Esta posición puede ser construida o puede ser recuperada de una Ubicación utilizando el método Location#getPosition(). En el ejemplo anterior, el sonido se reproducirá en las coordenadas 1, 65, 1. Por último, tenemos el volumen al que el sonido será reproducido. El volumen es un doble, que va en el rango de cero a dos.

Ahora que podemos reproducir sonido básicos, podemos ir más profundo con nuestros sonidos. Digamos que queremos reproducir nuestro sonido en un tono específico. Podemos utilizar la clase PitchModulation para modular el tono a una nota específica. También podemos utilizar una SoundCategory para especificar que categoría de sonido estamos reproduciendo. Un ejemplo de estos se muestra a continuación:

import org.spongepowered.api.effect.sound.PitchModulation;
import org.spongepowered.api.effect.sound.SoundCategories;

viewer.playSound(SoundTypes.ENTITY_CREEPER_PRIMED, SoundCategories.HOSTILE,
    new Vector3d(1, 65, 1), 1, PitchModulation.AFLAT0);

Si una SoundCategory no está especificada cuando se reproduce un sonido, se utilizará SoundCategories#MASTER.

Generación de Partículas

Similarmente a los sonidos, podemos utilizar la clase Viewer para generar partículas dentro del mundo:

import org.spongepowered.api.effect.particle.ParticleEffect;
import org.spongepowered.api.effect.particle.ParticleTypes;

ParticleEffect effect = ParticleEffect.builder()
    .type(ParticleTypes.LAVA).count(50).build();
viewer.spawnParticles(effect, position);

Utilizando un ParticleEffect.Builder, podemos especificar el tipo de partícula que nos gustaría generar. Con esto, también especificamos que cincuenta partículas estarán en el efecto de partículas.

Ahora, si queremos realizar una partícula más específica, digamos la partícula de un bloque, entonces podemos utilizar una de las varias clases encontradas en el paquete org.spongepowered.api.effect.particle. Por ejemplo, decimos que queremos generar la partícula de una arena, ParticleTypes#BLOCK_CRACK. Necesitaríamos utilizar la clase BlockParticle y especificar que nos gustaría utilizar un bloque de arena. Esto se puede hacer así:

import org.spongepowered.api.effect.particle.BlockParticle;

BlockParticle blockParticle = BlockParticle.builder()
    .type(ParticleTypes.BLOCK_CRACK).block(BlockTypes.SAND.getDefaultState()).build();
viewer.spawnParticles(blockParticle, position);

Creación de Pociones

De manera similar a las pociones y sonidos, necesitamos usar un constructor para crear nuestro efecto de poción:

import org.spongepowered.api.effect.potion.PotionEffect;
import org.spongepowered.api.effect.potion.PotionEffectTypes;

PotionEffect potion = PotionEffect.builder().potionType(PotionEffectTypes.HASTE)
    .duration(10).amplifier(5).build();

Utilizando esto, podemos crear un :javadoc:`PotionEffect`de precipitación que durará diez ticks y tendrá un amplificador de cinco. A diferencia de las partículas y los sonidos, las pociones no pueden ser aplicadas a un ``Viewer``. En cambio, necesitamos una entidad que soporte PotionEffectData, como un jugador.

import org.spongepowered.api.data.manipulator.mutable.PotionEffectData;
import org.spongepowered.api.entity.living.player.Player;

PotionEffectData effects = player.getOrCreate(PotionEffectData.class).get();
effects.addElement(potion);
player.offer(effects);

Esto obtendrá o creará un PotionEffectData de un jugador. Luego agregaremos nuestro anterior efecto de poción a la lista y se lo ofreceremos otra vez al jugador.