效果
通过对 Sponge 中的效果 API 的使用,我们可以在服务端创建特殊的效果(Effect)。通过使用 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);
现在让我们分析一下。首先,我们有一个定义了要播放的声音类型的 SoundType 对象。然后我们有一个 Vector3d
用于设定播放的位置。这一位置可以手动生成,也可以通过 Location
的 Location#getPosition() 方法得到。在上面的示例中,声音将于 1, 65, 1
的位置播放。最后,我们有一个用于设置声音音量的数。这个音量是一个介于零和二之间的双精度浮点数。
现在我们可以播放基本的声音了,然后让我们接着更深入地调整声音。我们这里需要设置声音的音调为一个特定的值。因此,我们使用 PitchModulation 类以设置音量为一个特定的值。我们也可以使用 SoundCategory 以指定声音是什么类别的。下面是一段示例代码:
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);
如果在播放声音时尚未指定 SoundCategory
,那么默认的将会是 SoundCategories#MASTER 。
生成粒子效果
和声音类似,我们可以通过 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);
通过使用 ParticleEffect.Builder ,我们可以指定我们想要生成的粒子效果的类型,同时,我们还指定了五十种粒子效果。
现在,如果我们想要更精确地指定一种粒子,我们可以通过使用 ParticleTypes 类提供的各种粒子类型来完成这一点。比方说我们想生成正在被破坏的沙子方块的粒子效果,那么我们就需要用到 ParticleTypes#BLOCK_CRACK,同时我们还需要通过 ParticleOptions#BLOCK_STATE 指定我们想要使用沙子方块,也就是下面这个样子:
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);
药水效果
和声音及粒子效果一样,药水效果也需要用到 Builder,就像下面这样:
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();
通过这样使用,我们生成了一个名为“急迫 V(Haste V)”的 PotionEffect ,并且其持续十个 Tick (译者注:0.5秒)。和声音及粒子不同,药水不能应用于一个 Viewer
。我们反而要去寻找一个支持 PotionEffectData 的实体,比如玩家。
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
,我们将药水效果加入,并把该 PotionEffectData
设置回玩家。