Эффекты

С помощью API эффектов в Sponge, вы можете создать особые эффекты для использования на сервере. Используя Viewer, можно проиграть звук или создать частицы на сервере.

Проигрывание звуков

С любым Viewer, вы можете проиграть звук в нужном месте:

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

Now let’s break this down. First, the SoundType specifies the sound that will be played. Next, we have a Vector3d position. This position can be constructed, or it can be retrieved from a Location using the Location#getPosition() method. In the example above, the sound will be played at the coordinates 1, 65, 1. Lastly, we have the volume that the sound will be played at. The volume is a double that ranges from zero to two.

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.

Создание частиц

Также, как и для звуков, Вы можете использовать класс Viewer для создания частиц:

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

ParticleEffect effect = ParticleEffect.builder()
        .type(ParticleTypes.LAVA)
        .quantity(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 several types found in the ParticleTypes class. For example, let’s say we wanted to spawn particles of a cracking block of sand, ParticleTypes#BLOCK_CRACK. We would need to use the ParticleOptions#BLOCK_STATE option and specify that we would like to use a sand block. This can be done like so:

import org.spongepowered.api.block.BlockTypes;
import org.spongepowered.api.effect.particle.ParticleOptions;

ParticleEffect particle = ParticleEffect.builder()
        .type(ParticleTypes.BLOCK_CRACK)
        .option(ParticleOptions.BLOCK_STATE, BlockTypes.SAND.getDefaultState())
        .build();
viewer.spawnParticles(particle, position);

Potion Effects

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

Этот код получает или создает PotionEffectData из игрока. Затем вы добавляете эффект зелья в список и возвращаете список игроку.