Effects

Mit Hilfe der Effekt API in Sponge können wir auf dem Server Spezialeffekte verwenden. Durch die Verwendung von Viewern können wir Sounds abspielen und Partikel generieren.

Geräusche abspielen

Mit einem gegebenen Viewer können wir einfach ein Geräusch an einer bestimmten Stelle abspielen:

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);

Nun lasst uns das im Detail anschauen. Zu erst haben wir den SoundType der abgespielt werden soll. Als nächstes haben wir den Vector3d, der den Ort angibt. Dieser kann entweder händisch erstellt werden oder über die Methode Location#getPosition() abgerufen werden. Im obigen Beispiel, wird das Geräusch an den Koordinaten 1, 65, 1 abgespielt. Zu guter Letzt haben wir noch die Lautstärke des Geräusches. Die Lautstärke wird als Double angegeben und kann von null bis zwei gewählt werden.

Now that we can play basic sounds, we can go further in-depth with our sounds. Let’s say we wanted to play our sound at a specified pitch. We can use the PitchModulation class to modulate the pitch to a specified note. We can also use a SoundCategory to specify what sound category we are playing. An example of these are shown below:

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);

If a SoundCategory isn’t specified when playing a sound, SoundCategories#MASTER will be used.

Partikel erzeugen

Similarly to sounds, we can use the Viewer class to spawn particles within the world:

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);

Using a ParticleEffect.Builder, we can specify the type of particle we would like to spawn. With this, we also specify that fifty particles will be in the particle effect.

Now if we wanted to make a more specific particle, say the particle of a block, then we can use one of the serveral classes found in the org.spongepowered.api.effect.particle package. For example, let’s say we wanted to spawn the particle of a sand, ParticleTypes#BLOCK_CRACK. We would need to use the BlockParticle class and specify that we would like to use a sand block. This can be done like so:

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

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

Tränke erstellen

Similarly to particles and sounds, we need to use a builder to create our potion effect:

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();

Using this, we can create a haste PotionEffect that will last for ten ticks and have an amplifier of five. Unlike particles and sounds, potions cannot be applied to a Viewer. Instead, we need an entity that supports PotionEffectData, such as a player.

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);

This will get or create a PotionEffectData from a player. We then add our previous potion effect to the list and offer it back to the player.