创建能力
编写能力的两种方式
每个能力都位于 ~/plugins/EliteMobs/powers 中(子文件夹同样会被扫描),共有两种格式:
| 格式 | 文件 | 适用场景 |
|---|---|---|
| Lua | *.lua | 一切新内容。完整的脚本语言,拥有全部 Boss 钩子、循环与状态。随插件附带的能力用的就是它。 |
| EliteScript | *.yml | 本页其余部分所记录的声明式事件/动作格式。仍然完全受支持。 |
EliteMobs 随附的 68 个能力中,几乎全部已经是 Lua。 只有 bonus_coins.yml、custom_summon.yml 和 elite_script.yml 仍然是基于 YAML 的 Java 能力。如果你要从零编写一个新能力,Lua 是背后能力最强的那条路 —— 请从 Lua 入门指南 和 Boss 钩子与生命周期 开始。
两种格式在 Boss 中的引用方式相同,都通过 powers 列表。
.lua 能力会覆盖同名的 .yml 能力当某个 Boss 请求 attack_fire.yml 时,EliteMobs 会先查找 attack_fire.lua,如果存在就使用它。这正是那些按 Lua 迁移之前的能力名编写的旧 Boss 配置至今仍能原样工作的原因 —— 你不必重写你的 powers: 列表。新配置应当直接写出 .lua 文件名。
.lua 文件只会写入一次,绝不会被覆盖随插件附带的每个 Lua 能力,只有在 powers 文件夹中尚不存在该文件时才会被写入。一旦你编辑了其中某个文件,EliteMobs 在更新时就不会覆盖你的版本 —— 但你同时也不再能收到上游对它的修复。如果你想要一份修改过的副本,最好给它换一个新文件名。
on_zone_enter / on_zone_leave 不会由 Lua 区域触发这两个钩子名都会被 Boss 脚本提供器接受,也不会导致加载错误,但 Lua 能力中没有任何东西能让它们触发。它们只会从 EliteScript 的区域监听器派发,而该监听器是在同一个 Boss 上某个 YAML eliteScript: 的 Events: 中列出了 ZoneEnterEvent 或 ZoneLeaveEvent 时才启动的。只带 Lua 能力的 Boss 会正常加载包含这些钩子的文件,然后永远不会调用它们。
除非你是刻意要把它与这样一个 YAML 区域脚本配对,否则不要围绕这两个钩子来构建 Lua 能力。请改用 context.zones:watch_zone(...)(它自己的 on_enter / on_leave 回调会被直接调用)、EliteScript 的 Zone 块,或者在 on_game_tick 中轮询。参见钩子与生命周期和脚本事件。
EliteMobs 脚本系统
以下页面介绍了如何创建 Elite 脚本!
这是一项高级功能,需要对 EliteMobs 有深入的了解。
注意:Elite 脚本可以作为能力文件添加,也可以添加到自定义 Boss 文件中! 如果用作能力文件,你可以像往常一样使用自定义 Boss 的 powers 配置设置,将它们作为普通能力添加到 Boss 中。
添加 EliteScript
要开始向 Boss 添加 EliteScript,请在 Boss 文件中添加以下条目:
eliteScript:
注意:以下内容对大小写和空格极其敏感!请确保你的空格、换行符和整体格式与示例一致!
现在你已经声明了脚本的开始,可以添加你的特定脚本了。在此示例中,我们将创建一个名为 Example 的脚本:
eliteScript:
Example:
EliteScripts 有 5 个不同的部分:Events、Conditions、Zones、Actions 和 Cooldowns。只有 Actions 是必需的。
让我们看一个简单的示例:
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,0.5,0
Cooldowns:
local: 60
global: 20
此脚本使精英怪在被玩家击中时向上弹起,并且在 3 秒内不会再次触发(由于 Cooldowns 部分的设置,其他能力也会在 1 秒内被阻止触发)。
现在你已经了解了脚本结构的一般格式,是时候学习每个部分可以做什么了!
Events
点击上面的链接了解如何使用事件!
Targets
点击上面的链接了解如何使用目标!
Actions
点击上面的链接了解如何使用动作!
Zones
点击上面的链接了解如何使用区域!
Conditions
点击上面的链接了解如何使用条件!
Cooldowns
点击上面的链接了解如何使用冷却时间!
添加多个 EliteScripts
你可以在一个事件上拥有多个动作,但如果你想在同一个 Boss 上拥有多个脚本呢?只需创建一个新的脚本条目即可!让我们扩展前面的示例并添加另一个脚本:
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,0.5,0
Cooldowns:
local: 60
global: 20
Example2:
Events:
- PlayerDamagedByEliteMobEvent
Actions:
- action: SET_ON_FIRE
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 200
global: 60
在这个示例中,我们添加了第二个名为 Example2 的脚本。Example2 会点燃被 Boss 伤害的玩家,这是因为 targetType 设置为 DIRECT_TARGET。
此脚本的冷却时间设置为 200 tick,这意味着 Boss 每 10 秒才能点燃玩家一次。
创建独立能力
独立能力几乎完全由 Elite 脚本组成。只有两个可选字段。不要忘记,独立能力必须放置在 ~plugins/EliteMobs/powers 文件夹中才能工作。
独立能力示例:
isEnabled: true
powerType: UNIQUE
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,.3,0
Cooldowns:
local: 60
global: 20
isEnabled
与插件其他地方一样,设置能力是否启用。
powerType
能力类型设置能力的分配方式。值为:
UNIQUE:能力仅应用于在能力部分设置了该能力的自定义 Boss。DEFENSIVE/MISCELLANEOUS/OFFENSIVE:任何精英怪都可以获得这些能力,它们将计入特定的能力子集。MAJOR_ZOMBIE、MAJOR_SKELETON、MAJOR_BLAZE、MAJOR_ENDERMAN、MAJOR_GHAST:只有相应实体类型的精英怪才能自然生成这些能力,它们将计为主要能力。这五种是唯一算作**主要(major)**能力的类型;其他所有类型都算作次要(minor)能力。
powerType 如何抵达自然精英怪:EliteMobPowers.yml
powerType 本身并不会把一个能力送到自然精英怪面前。自然精英怪实际抽取的来源是 ~/plugins/EliteMobs/EliteMobPowers.yml,它包含以下列表:
| 键 | 含义 |
|---|---|
defensivePowers | 自然精英怪可以随机抽到的防御性能力 |
offensivePowers | 自然精英怪可以随机抽到的攻击性能力 |
miscellaneousPowers | 自然精英怪可以随机抽到的杂项能力 |
majorPowers.<ENTITY_TYPE> | 该实体类型可以随机抽到的主要能力 |
disabledPowers.<ENTITY_TYPE> | 在应用共享列表之后,从该实体类型中移除的能力 |
该文件首次生成时,每个列表都会用所有已加载且 powerType 匹配的能力进行初始填充。在那之后该文件即为权威,并且永远不会被重新填充,因此你之后添加的能力 —— 包括你丢进 powers 文件夹的任何 .lua 文件 —— 在你自己把它加入相应列表之前,都不会开始出现在自然精英怪身上。
这些列表中既接受 .lua 文件名,也接受旧式的 .yml 名称;生成的默认值使用 .yml 别名写入。无法解析到任何能力的名称会被跳过,并输出一条指明文件与键名的控制台警告。
effect
设置能力使用的视觉效果或材质。这由一些硬编码的能力用来定义其视觉粒子或材质效果。
| 键 | 值 | 默认值 |
|---|---|---|
effect | String | none |
powerCooldown
设置单个能力的冷却时间(以 tick 为单位)。这控制此特定能力触发的频率。
| 键 | 值 | 默认值 |
|---|---|---|
powerCooldown | Integer | 0 |
globalCooldown
设置所有能力共享的全局冷却时间(以 tick 为单位)。此能力触发后,在全局冷却时间到期之前,其他能力无法触发。
| 键 | 值 | 默认值 |
|---|---|---|
globalCooldown | Integer | 0 |
制作独立的 Lua 能力
一个独立的 Lua 能力就是放在 ~/plugins/EliteMobs/powers 中的一个 .lua 文件(包括子文件夹 —— 该文件夹会被递归遍历)。它没有 YAML 外壳,也没有任何配置键:文件本身就是能力。
return {
api_version = 1,
on_player_damaged_by_boss = function(context)
if context.player == nil then
return
end
context.player:apply_potion_effect("BLINDNESS", 60, 0)
end
}
由于没有 YAML 头部可供读取,以这种方式发现的 Lua 能力会得到固定的元数据:
powerType为MISCELLANEOUS。你无法在文件中把它设为UNIQUE。(随 EliteMobs 附带的那些 Lua 能力在 Java 侧携带自己的类型,这就是它们能够是UNIQUE、OFFENSIVE、MAJOR_*等的原因。)effect未设置。
实际上这并不会让你的能力泄露到随机精英怪身上,因为自然精英怪的抽取池来自 EliteMobPowers.yml,而该文件一旦存在就不会被重新填充 —— 参见上文。要使用它,请把该能力加入某个 Boss 的 powers: 列表。
Boss Lua 能力可用的钩子
| 钩子 | 触发时机 |
|---|---|
on_spawn | Boss 生成时 |
on_game_tick | 每个服务器 tick |
on_boss_damaged | Boss 受到任何来源的伤害时 |
on_boss_damaged_by_player | Boss 受到玩家的伤害时 |
on_boss_damaged_by_elite | Boss 受到另一个精英怪的伤害时 |
on_player_damaged_by_boss | Boss 对玩家造成伤害时 |
on_enter_combat | Boss 进入战斗时 |
on_exit_combat | Boss 脱离战斗时 |
on_heal | Boss 治疗时 |
on_boss_target_changed | Boss 切换目标时 |
on_death | Boss 死亡时 |
on_phase_switch | Boss 切换阶段时 |
解析器同样接受 on_zone_enter 和 on_zone_leave,但 Lua 能力中没有任何东西能让它们触发 —— 它们只会从同一个 Boss 上的 EliteScript 区域监听器派发。参见本页顶部的警告。
关于在这些钩子内部你实际可以调用什么,请参阅 Lua 入门指南、Boss 钩子与生命周期和 Boss 实体。
