跳到主要内容

6-1 RPG 插件概述

魔学导论

常用的插件中有一大类是 RPG 插件,即为玩家添加各种原版中所不存在的技能(例如空中二段跳)或者状态(例如魔法值)。RPG 插件无疑是插件家族当中最吸引人的类型之一,不仅由于它们极强的表现力,更由于插件只能使用有限的资源,功能相对模组更加受限,因此能够有创意地利用既有的各种机制来设计 RPG 插件是一种非常令人羡慕的能力。

在这一章里,我们将制作一个可以帮助玩家打败监守者或者远古守卫者的插件:

刺刀冲锋(Bayonet Charge)

当玩家在疾跑,并且手持指定的物品(例如铁剑)时,按下右键即可发动刺刀冲锋。

  • 冲锋期间移速大幅加快,并且受到的伤害减少。
  • 冲锋时间无限,但在停止疾跑、移动一定距离或撞上实体后将停止。
  • 由刺刀冲锋碰到的实体将受到大量伤害。
  • 根据已经冲刺的距离,刺刀冲锋结束后将进入冷却,期间玩家的速度将减慢,并且无法再次发动冲锋。

看上去就像这样:

Charging

遗憾的是,由于笔者所用的 GIF 编码器实在太过糟糕,没办法将 GIF 压缩到足以放在我们的网站上的大小,真是对不起(笑)。

当然,肯定有读者会说,用剑什么的太 Low 了,看上去一点也不像刺刀只能击杀生物多没意思啊,要是碰上能爆炸就好了,不过请大家先按捺下涌动的创意,跟着笔者来了解一些更基础的机制,例如如何显示上面的进度条,如何控制玩家的加减速等等。在学会运用这些基本知识后,要创建自定义的效果将是非常容易的。

BOSS 状态条

在屏幕上方显示的进度条,对,就是那个红色的,带有标题的长条,叫做 BOSS 状态条。在挑战末影龙或者凋灵时,你肯定见到过它(那时应该是紫色的)。BOSS 状态条的信息存储在服务器,因此可以由玩家来自定义,这使得它非常适合用于制作各种技能值以及经验进度等。

Paper 提供了两套 API 来让我们使用 BOSS 状态条:

  • Bukkit 原版:由 Bukkit 的开发者编写的,更古老的一组 API,像是自定义标题颜色一类的工作比较麻烦,但胜在可以支持更多传统派的服务器。
  • Adventure:在 Paper 中集成的一套新 API,它能够更方便地设定标题的字体、颜色等,但这项 API 在 Spigot 等服务器上无法使用。

考虑到大多数现代的服务器都毫无保留地使用着 Paper 或者 Paper 的衍生产品,我们选用 Adventure API 来完成 BOSS 状态条的创建,对于其它可选的地方也是如此。如果你需要编写一个支持较老服务器的插件,可以在本书的高级部分找到一些帮助,不过在那之前,最好先试试升级一下服务器。

用 Adventure 来创建 BOSS 状态条非常简单,大致就像下面这样:

val bar = BossBar.bossBar(
    Component.text("我的超级大僵尸"),
    1f,
    BossBar.Color.RED,
    BossBar.Overlay.PROGRESS
)

player.showBossBar(bar)

bossBar 函数的具体用法我们将在实例中展示,读者只需要大致了解,要提供一个标题,一个数字,还有一堆 BossBar.XXX 之类的东西就可以了。showBossBar 方法向指定的玩家展示 BOSS 状态条。

状态效果

相信你对游戏中的各种状态效果一定不陌生:速度、力量、生命恢复等等都是状态效果。通过状态效果赋予玩家特定方面的增强或削弱,是 RPG 插件常用的手段,例如,要调整玩家速度比较困难,但借助速度和缓慢效果,我们就可以让 Minecraft 帮我们考虑这些问题,使得问题大大简化。

Bukkit 为 LivingEntity 类(具备生命值的 Entity)提供了很方便的方法来施加状态效果:

e.addPotionEffect(
    PotionEffect(
        PotionEffectType.SPEED,             // 速度
        PotionEffect.INFINITE_DURATION,     // 持续时间无限
        2                                   // 等级 3(2 + 1)
    )
)

只需要构造一个 PotionEffect 对象描述状态效果,再将它传递给 addPotionEffect,即可将指定的效果应用到实体上。


上述的两种机制都很大程度上依赖于枚举(Enum) 的应用,例如 BossBar.Color.REDPotionEffectType.SPEED,它们表示一系列可能的值中的一个,那具体什么是枚举呢?这就要放在下一节介绍了。