我的世界Bukkit服务器插件开发教程(十一)粒子、药水效果与音效
十一、粒子、药水效果与音效
太简单了吧!
1.粒子效果
1.1.基本操作
播放粒子,首先需要确定粒子需要播放的位置。需要注意,我们一次只能播放一个粒子,如果需要播放多个粒子的话……也不麻烦。
播放粒子的方法是spawnParticle方法,它有许多重载,最为简单的一种是:
void spawnParticle(@NotNull Particle var1, @NotNull Location var2, int var3);
Particle类是一个枚举类,它决定了粒子的形状。比如HEART就是爱心的形状,我们就以HEART为实例。
Location顾名思义,就是粒子的位置,最后一个参数表示播放的次数。
player.spawnParticle(Particle.HEART, player.getLocation(), 10);
如上,我们播放在玩家的位置10次爱心粒子。
1.2.我需要美观!
上面的虽然播放了粒子,却总感觉不够的逼格。
假如此刻有个拥有主角光环的玩家,TA 的周围应有一圈粒子,玩家和粒子在同一平面内,我们应该怎么播放这一堆粒子。
建立一个平面直角坐标系 x O y xOy xOy,任取一点 A ( x , y ) A(x,y) A(x,y),将玩家看成点 A A A,作以 A A A 为圆心,半径为 3 3 3 的圆,圆上任意一点 P ( x 1 , y 1 ) P(x1,y1) P(x1,y1),求 P P P 点坐标。设圆的步长为 3 3 3。(本题 150 150 150 分)
解:
x 1 = x + 3 × sin ( 3 × 3.14 ÷ 180 ) , x1=x+3 times sin(3 times 3.14 div 180), x1=x+3×sin(3×3.14÷180), y 1 = y + 3 × cos ( 3 × 3.14 ÷ 180 ) y1=y+3 times cos(3 times 3.14 div 180) y1=y+3×cos(3×3.14÷180)
答:我不会。
但是,在 Minecraft 坐标系中, y y y 轴是竖轴,这点很坑人。
private void drawCircle(double ao, double r, Player player) { Location location = player.getLocation(); double x = location.getX(); double y = location.getY(); double z = location.getZ(); for(int i = 0; i public GoodLuckEffect(@NotNull PotionEffectType type, int duration, int amplifier) { super(type, duration, amplifier); }}
整个PotionEffect类中也就只有apply方法值得我们重载了罢。它尝试添加此效果到指定的生物上,这里我们当然要添加成功:
@Overridepublic boolean apply(LivingEntity entity) { return true;}
给予我们的参数居然是个活性实体,我们可以设置该实体免受伤害的时间:
entity.setMaximumNoDamageTicks(getDuration() * 5);
完整代码:
public class GoodLuckEffect extends PotionEffect { public GoodLuckEffect(@NotNull PotionEffectType type, int duration, int amplifier) { super(type, duration, amplifier); } @Override public boolean apply(LivingEntity entity) { entity.sendMessage(“幸运之人免受伤害!”); entity.setMaximumNoDamageTicks(getDuration() * 5); return true; }} 3.音效
当我们右键傻子村民时,村民会发出“哼啊”的声音,这就是在村民所在位置播放音效。
3.1.指定位置播放音效
播放音效需要指定播放的位置,这样 Bukkit 可以计算声音传播的距离及其传播过程中的衰减。
凡是涉及到「位置」的都要提及World,于是乎我们应获取相应的世界和位置,才能播放音效。
void playSound(@NotNull Location var1, @NotNull Sound var2, float var3, float var4);
第一个参数var1表示播放的位置,后一个表示播放何种音效。
其后两个单浮点数中,第一个表示音量,只能小于等于 1,否则会被强制控制为 1,它表示了玩家使用的客户端音量的百分比是多少。第二个参数则是播放倍速。
player.getWorld().playSound(player.getLocation(), Sound.MUSIC_DISC_11, 1, 1);
如上,我们给player本身播放11号唱片,这样所有靠近该玩家的实体都可以听到11号唱片。
上一篇:我的世界Bukkit服务器插件开发教程(十)实体 下一篇:我的世界Bukkit服务器插件开发教程(十二)物品与监听事件