• 我的世界Bukkit服务器插件开发教程(十一)粒子、药水效果与音效


    十一、粒子、药水效果与音效

    太简单了吧!


    1.粒子效果

    1.1.基本操作

    播放粒子,首先需要确定粒子需要播放的位置。需要注意,我们一次只能播放一个粒子,如果需要播放多个粒子的话……也不麻烦。

    播放粒子的方法是spawnParticle方法,它有许多重载,最为简单的一种是:

    void spawnParticle(@NotNull Particle var1, @NotNull Location var2, int var3);
    
    • 1

    Particle类是一个枚举类,它决定了粒子的形状。比如HEART就是爱心的形状,我们就以HEART为实例。

    Location顾名思义,就是粒子的位置,最后一个参数表示播放的次数。

    player.spawnParticle(Particle.HEART, player.getLocation(), 10);
    
    • 1

    如上,我们播放在玩家的位置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 <= 360; i += ao) {
    		double x1 = x + r * Math.sin((double)i * Math.PI / 180.0);
    		//y轴是竖轴,z才是纵轴!
    		double z1 = z + r * Math.cos((double)i * Math.PI / 180.0);
    
    		player.spawnParticle(Particle.HEART, new Location(player.getWorld(), x1, y, z1), 10);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    效果图:

    在这里插入图片描述


    2.药水效果

    自己添加一个新的药水效果是不可能的,亲这边建议你转 Mod 开发,插件开发也要看服务器心情呢。


    2.1.原版药水效果

    某个人犯了大错,腐竹为了惩罚 TA 而想给予 TA 无限的 中毒效果

    public PotionEffect(@NotNull PotionEffectType type, int duration, int amplifier);
    
    • 1

    可以看出,这是一个构造方法,PotionEffect类的构造方法还有着许多重载。这里是其中一种,我们看一看参数:

    type表示效果的类型,是一个枚举类。duration是持续时间,单位为tickamplifier指效果倍率,可以加快效率。

    如上,我们可以为玩家加入一个药水效果。我们可以使用Player类中的addPotionEffect方法为玩家添加药水效果。

    //给予玩家 100ticks 中毒效果,1x倍率
    player.addPotionEffect(new PotionEffect(PotionEffectType.POISON, 100, 1));
    
    • 1
    • 2

    自定义药水效果

    原版的药水效果不满足,我们还可以自定义药水效果,好比我们之前自定义实体一样(哎呀就是上一章,时间久了都不知道了),我们需要继承PotionEffect类。

    public class GoodLuckEffect extends PotionEffect {
        
        public GoodLuckEffect(@NotNull PotionEffectType type, int duration, int amplifier) {
            super(type, duration, amplifier);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    整个PotionEffect类中也就只有apply方法值得我们重载了罢。它尝试添加此效果到指定的生物上,这里我们当然要添加成功:

    @Override
    public boolean apply(LivingEntity entity) {
    	
    	return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    给予我们的参数居然是个活性实体,我们可以设置该实体免受伤害的时间:

    entity.setMaximumNoDamageTicks(getDuration() * 5);
    
    • 1

    完整代码:

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.音效

    当我们右键傻子村民时,村民会发出“哼啊”的声音,这就是在村民所在位置播放音效


    3.1.指定位置播放音效

    播放音效需要指定播放的位置,这样 Bukkit 可以计算声音传播的距离及其传播过程中的衰减。

    凡是涉及到「位置」的都要提及World,于是乎我们应获取相应的世界和位置,才能播放音效。

    void playSound(@NotNull Location var1, @NotNull Sound var2, float var3, float var4);
    
    • 1

    第一个参数var1表示播放的位置,后一个表示播放何种音效。

    其后两个单浮点数中,第一个表示音量,只能小于等于 1,否则会被强制控制为 1,它表示了玩家使用的客户端音量的百分比是多少。第二个参数则是播放倍速。

    player.getWorld().playSound(player.getLocation(), Sound.MUSIC_DISC_11, 1, 1);
    
    • 1

    如上,我们给player本身播放11号唱片,这样所有靠近该玩家的实体都可以听到11号唱片。


    上一篇:我的世界Bukkit服务器插件开发教程(十)实体
    下一篇:我的世界Bukkit服务器插件开发教程(十二)物品与监听事件

  • 相关阅读:
    C. LR-remainders
    【设计模式之模板方法模式 -- C++】
    VS Code 2022路线图:大量Spring Boot优化提上日程
    hadoop配置LZO压缩并测试
    2024深圳电子展,推动中国电子产业快速发展,助力中国数字经济实现高质量发展
    冷链行业商业供应链系统:实现全流程数字化协同,激活企业迸发市场活力
    mock.js mock规则
    html打印pdf相关的问题
    二叉树的遍历(非递归版)
    Spring5学习笔记之整合MyBatis
  • 原文地址:https://blog.csdn.net/weixin_45445598/article/details/127019135