MythicMobsSkill系统拆解
本文不强调如何使用,而是从一个开发者的视角去尝试分析。
神话暴徒 MythicMobs 中,有一个较为重要的子系统为 Skill
,本文将尝试拆解 Skill
系统。
技能由几个不同的部分组成:
- Mechanics 机制
- Effects 效果
- Triggers 触发器
- Targeters 目标选择器
- Health Modifiers 生命值修饰符
- Chance 几率
官方在 wiki 中首先就给出了一个例子:
1 |
|
由此引入了第一部分:
Mechanics —— 机制
同时也给出了标准语法:
1 |
|
这里可以查到所有官方提供的 Mechanics
参数(argument)部分简单直接,{key1=value1;key2=value2}
,机制部分就像是在调用一个函数,而参数等同于函数的参数。
在 MythicMobs 4.12 后加入了技能参数功能,现在你自定义的函数可以加参数了(奇怪的说法),标准定义为在本该是 value 的位置替换为占位符 <skill.paramsName>
。
占位符的定义可以在这里找到。
举个例子,如果我有一个 Skill:
1 |
|
那么调用它时就可以用 skill:SomeSkill{tickParams=50}
这样的方式,如果起了相同的参数名,则后面的会取代前面的。
类似的,替换了技能的名称的部分为占位符的,被称为 VariableSkill。
Effcts —— 效果
效果像是特殊的机制,可以在这里找到官方提供的内容。
用法与机制一致,但专为特殊效果设计。
Targeters —— 目标选择器
目标选择器是另一个实现技能的核心,当然了,没有目标的技能放来何用呢?
可以看到,MythicMobs 原版的 Targets 相当的多,足以覆盖大部分使用场景。
目标选择器则以 @
开头。
类似的,目标选择器也有参数,不再赘述。
Triggers —— 触发器
触发器代表着技能触发的时机,也就是说,没有这个放不了。
在这里可以找到原版触发器。
触发器以 ~
开头,通常是类似 ~onAttack
的形式出现。
这里有一个比较有意思的部分,目标选择器和触发器能够协同工作,比如 @Trigger ~onInteract
就代表着右键单击生物(与生物互动)的玩家将被点燃,因为他们是 @Trigger
。
Health Modifiers —— 生命值修饰符
这部分是可选的。
以 >
、<
、=
三个符号开头(竟然不支持 >= ?),后跟一个数字或区间,例如 >500
就是在生物生命值大于五百情况下才触发,同理 <20%
就是小于 20%,另外还有一个特殊的情况,=30%-50%
,这意味着会在 30% 到 50% 之间触发。
Chance —— 几率
这部分也是可选的。
这部分也是技能定义中最后一部分了,这意味着技能释放成功的几率。
1.0 对应着 100%,0.5 对应 50%。
至此,单个技能的使用的部分结束。
MetaSkill —— 元技能
语法如下:
1 |
|
internal_skillname 部分是元技能的标识符,唯一且不含空格,用于调用时的定位。
Cooldown 就是冷却时间,可以使用占位符。
技能通常从列表中的第一个执行到最后一个。如果使用元机制,其机制将在原始元技能的机制恢复执行之前执行。如果被调用的元技能中存在延迟,则原始元技能的机制将恢复执行,而被调用元技能中存在的机制将在延迟后执行。
直接说起来有些抽象,官网的例子非常合适。
而 Skills 部分不能有触发器,允许有目标选择器,当 MetaSkill 中一条 skill 未指定目标时,会继承来自于调用者的目标。
Conditions —— 条件
条件可以分为三种类型:
- 实体条件(Entity Conditions):这些条件检查实体的条件。
- 位置条件(Location Conditions):这些条件检查某个位置的条件。如果在定位实体时使用位置条件,它将检查实体位置的条件。
- 比较条件(Compare conditions):这些检查两个不同“事物”之间的某些条件。例如,如果目标位于角为两个坐标的立方体内,则“Cuboid”将返回true,而“StringEquals”将根据两个字符串是否匹配返回true或false。
条件也可以在元技能中的三个不同位置使用:
- 条件(Conditions):此部分中的条件检查脚轮的条件或脚轮的位置。
- 目标条件(TargetConditions):此部分中的条件检查从技能的目标者继承的目标或目标位置的条件。
- 触发条件(TriggerConditions):此部分中的条件检查触发技能的实体的条件。
格式:
1 |
|
条件中可以使用范围数字,#to#
或是 #-#
,## 的位置为数字。
条件可以用或(||)
或者与(&&)
运算符合并。
action 部分指定了条件的行为:
- required (or true) :符合条件运行
- cancel (or false) :符合条件不运行
- power [multiplier] :修改技能的功率
- cast [skill] :符合条件则额外释放技能
- castinstead [skill] :符合条件则改为释放其他技能
- orElseCast [skill] :MM 4.12 新增,不符合条件则改为释放其他技能
Premium 版中,给出了一种方式可以实现内联的条件,以实现更精细的条件管理,尽管普通版也可以使用 Skill 嵌套的方式实现,不过该种方式确实减少了一些需要书写的内容。
变量与数学运算
https://git.mythiccraft.io/mythiccraft/MythicMobs/-/wikis/Skills/Variables
https://git.mythiccraft.io/mythiccraft/MythicMobs/-/wikis/Skills/Math
在我看来,MM Skill 的定义绝对算得上 DSL 的一种,像是这种 DSL,完全可以使用 Antlr 来构建。