Effets

En utilisant l’API d’effets dans Sponge, nous pouvons créer des effets spéciaux à utiliser sur un serveur. En utilisant un Viewer, nous pouvons jouer des sons ou faire apparaître des particules sur le serveur.

Jouer des Sons

Avec n’importe quel Viewer, nous pouvons simplement jouer un son à un endroit :

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

Maintenant décomposons ceci. Tout d’abord, nous avons le SoundType qui est joué. C’est simplement le son qui va être joué. Ensuite nous avons une position Vector3d. Cette position peut être construite, ou elle peut être récupérée à partir d’une Location en utilisant la méthode Location#getPosition(). Dans l’exemple ci-dessus, le son sera joué aux coordonnées 1, 65, 1. Enfin, nous avons le volume auquel le son sera joué. Le volume est un double, qui doit être entre 0 et 2.

Maintenant que nous pouvons jouer des sons basiques, nous pouvons aller plus en profondeur avec nos sons. Disons que nous voulons jouer notre son à une hauteur spécifique. Nous pouvons utiliser la classe PitchModulation pour moduler la hauteur de la note spécifiée. Nous pouvons aussi utiliser un SoundCategory pour spécifier sur quelle catégorie sonore nous jouons. Un exemple de ceci est illustré ci-dessous :

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 un SoundCategory n’est pas spécifié lors de la lecture d’un son, SoundCategories#MASTER sera utilisé.

Faire Apparaître des Particules

De la même manière qu’avec les sons, nous pouvons utiliser la classe Viewer pour faire apparaître des particules dans le monde :

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

En utilisant un ParticleEffect.Builder, nous pouvons spécifier le type de particules que nous voulons faire apparaître. Avec cela, nous pouvons aussi spécifier que cinquante particules seront dans l’effet de particules.

Maintenant si nous voulons faire une particule plus spécifique, dissons la particule d’un block, alors nous pouvons utiliser une des nombreuses classes trouvées dans le package org.spongepowered.api.effect.particle. Par exemple, sdisons que nous voulons faire apparaître une particle de sasble, ParticleTypes#BLOCK_CRACK. Nous aurons besoin d’utiliser la classe BlockParticle et spécifier que nous aimerions utiliser un bloc de sable. Cela peut se faire comme ceci :

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

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

Créer des Potions

De la même manière que pour les particules et les sons, nous devons utiliser un builder pour créer notre effet de potion :

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

En utilisant ceci, nous pouvons créer un PotionEffect de Haste qui va rester pendant dix ticks et qui aura un amplificateur de cinq. Contrairement aux particules et aux sons, les potions ne peuvent pas être appliquées à un Viewer. À la place, nous avons besoin d’une entité qui supporte PotionEffectData, comme le joueur.

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

Cela va récupérer ou créer un PotionEffectData depuis un joueur. Ensuite, nous ajoutons alors notre effet de potion précédent à la liste et on l’offre en retour au joueur.