创建能力
编写能力的两种方式
基于文件的能力放在 plugins/EliteMobs/powers 中,包括子文件夹。有两种格式:
| 格式 | 文件 | 适用场景 |
|---|---|---|
| Lua | *.lua | 使用 Boss 钩子、循环和状态编写行为。大多数内置能力使用此格式。 |
| EliteScript | *.yml | 本页其余部分所记录的声明式事件/动作格式。仍然完全受支持。 |
随附的 71 个能力中,68 个使用 Lua。只有 bonus_coins.yml、custom_summon.yml 和 elite_script.yml 仍是基于 YAML 的 Java 能力。编写新行为时,请从 Lua 入门指南 和 Boss 钩子与生命周期 开始。
两种格式在 Boss 中的引用方式相同,都通过 powers 列表。
所有子文件夹中的文件名都应唯一。注册表使用文件名,不使用包含文件夹的路径,因此子文件夹不能隔离重名文件。两个文件同名时,EliteMobs 会加载完整路径排序在前的那个,并为另一个记录 Duplicate content filename,除非两个文件的内容完全相同。编辑后运行 /em reload 并检查加载警告。
.lua 能力会覆盖同名的 .yml 能力当 Boss 请求 attack_fire.yml 时,EliteMobs 会先查找成功加载的 attack_fire.lua。请求 .yaml 时也采用相同规则。Lua 替代文件加载成功后,旧引用即可继续使用。新配置应直接写出 .lua 文件名,并匹配注册文件名的大小写。
.lua 文件只会写入一次,编辑过的文件绝不会被覆盖只有在 powers 下找不到对应文件时,才会写入随附的 Lua 能力。当某次更新修复了随附能力时,EliteMobs 会列出此前各随附版本的校验和。与其中之一相符的未编辑副本会被移至 plugins/MagmaCore/outdated files/EliteMobs/,并在同一次启动中写入当前版本。你编辑过的文件永远不会相符,因此会保持原样,也不会获得上游修复。请为修改后的副本取独立文件名,并将保留的预制文件与打算使用的版本进行比较。
on_zone_enter / on_zone_leave 不会由 Lua 区域触发两个钩子名都受支持,但创建 Lua 区域不会触发它们。内置事件来源是 EliteScript 区域监听器:同一 Boss 的 YAML 脚本在 Events: 中列出 ZoneEnterEvent 或 ZoneLeaveEvent 并定义可用区域时,该监听器才会启动。这些事件会传给该 Boss 上所有匹配的能力,且不标识来源 YAML 区域。仅在纯 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:
EliteScript 有五个部分:Events、Conditions、Zone、Actions 和 Cooldowns。要让脚本执行操作,请提供非空的 Actions 列表。由其他脚本或落地回调调用的脚本可以省略 Events;没有调用方时,这种脚本不会自行运行。Conditions 和 Cooldowns 是映射,不是列表。
让我们看一个简单的示例:
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,0.5,0
Cooldowns:
local: 60
global: 20
受到符合条件的玩家攻击时,此脚本将精英怪向上推,并启动 60 tick 的局部冷却和 20 tick 的全局冷却。在 20 TPS 下分别为三秒和一秒。全局冷却只影响会检查它的能力,不会阻止每个钩子或动作。事件触发的 YAML 脚本在局部或全局值为正数时检查冷却。被调用脚本的行为请参阅下方冷却指南。
现在你已经了解了脚本结构的一般格式,是时候学习每个部分可以做什么了!
事件
点击上面的链接了解如何使用事件!
目标
点击上面的链接了解如何使用目标!
动作
点击上面的链接了解如何使用动作!
区域
点击上面的链接了解如何使用区域!
条件
点击上面的链接了解如何使用条件!
冷却
点击上面的链接了解如何使用冷却时间!
添加多个 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
duration: 20
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 200
global: 60
Example2 使用 DIRECT_TARGET 将受伤玩家点燃 20 tick。局部冷却为 200 tick,在 20 TPS 下可阻止此脚本十秒内再次由事件触发。60 tick 的全局冷却与检查 Boss 冷却的能力共享。其他脚本仍可以独立施加燃烧。
创建独立能力
将独立 YAML 能力放入 plugins/EliteMobs/powers。eliteScript 块包含行为,下方可选元数据字段控制加载、分类、显示及冷却元数据。示例:
isEnabled: true
powerType: UNIQUE
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,.3,0
Cooldowns:
local: 60
global: 20
isEnabled
控制配置的能力是否启用,默认值为 true。对于自定义 Lua,禁用配套元数据文件会阻止发现该 Lua 文件。随附的 Lua 能力即使配套文件被禁用仍会加载,但会被标记为禁用,详见下文。
powerType
能力类型提供默认抽取池和环绕物品环分类所用的类别元数据。可用值:
UNIQUE:用于显式分配。自动生成共享列表时会排除它,但仍可手动加入自然能力列表。DEFENSIVE/MISCELLANEOUS/OFFENSIVE:对应共享列表缺失时,用于生成该列表。是否可分配取决于配置的抽取池、启用状态和怪物等级。MAJOR_ZOMBIE、MAJOR_SKELETON、MAJOR_BLAZE、MAJOR_ENDERMAN、MAJOR_GHAST:这五种计为主要能力,其余均为次要能力。自然分配使用实体的majorPowers列表,不会在运行时检查类型后缀是否匹配实体。
powerType 如何抵达自然精英怪:EliteMobPowers.yml
自然精英怪从 plugins/EliteMobs/EliteMobPowers.yml 抽取能力,而非只依据 powerType。该文件包含:
| 键 | 含义 |
|---|---|
defensivePowers | 自然精英怪可以随机抽到的防御性能力 |
offensivePowers | 自然精英怪可以随机抽到的攻击性能力 |
miscellaneousPowers | 自然精英怪可以随机抽到的杂项能力 |
majorPowers.<ENTITY_TYPE> | 该实体类型可以随机抽到的主要能力 |
disabledPowers.<ENTITY_TYPE> | 在应用共享列表之后,从该实体类型中移除的能力 |
缺失的共享防御、攻击和杂项列表会用已加载的对应类型能力生成。主要能力的默认值按实体类型显式指定。现有列表会保留,因此后来添加能力不会自动将其加入列表,需要手动编辑。反过来,生成缺失的杂项列表时,已存在的自定义 Lua 能力可能进入该默认抽取池。
这些列表中既接受 .lua 文件名,也接受旧式的 .yml 名称;生成的默认值使用 .yml 别名写入。无法解析到任何能力的名称会被跳过,并输出一条指明文件与键名的控制台警告。
自然能力槽位分别在等级 10、20、30、40 解锁防御、攻击、杂项和主要能力。各类别的第二个槽位在等级 50、60、70、80 解锁。抽取池为空或禁用时,可能获得较少能力。编辑列表不会改变能力的主要/次要分类。
effect
设置能力环绕物品的材质。MAJOR_* 类型使用主要环,其余类型使用次要环。该值必须是物品材质,或无需额外数据的粒子名称(此时会以粒子形式环绕)。其他任何值都会禁用该效果,并记录 Disabled invalid power trail。
未设置 effect 或值为空的能力不会向环中添加物品。自定义 Lua 能力未在可选 YAML 元数据文件中指定 effect 时,默认如此。
目前,独立 YAML EliteScript 不会将此元数据复制到运行时轨迹中。因此,为此类 YAML 能力设置 effect 不会添加环绕物品。自定义 Lua 能力会复制配套文件中的 effect。
| 键 | 值 | 默认值 |
|---|---|---|
effect | 材质 | 无 |
powerCooldown
设置能力元数据中的冷却时间,单位为 tick。YAML EliteScript 使用自己的 Cooldowns.local 和 Cooldowns.global,初始化时会替换这些元数据值。Lua 能力必须使用文档中的冷却 API 来检查和设置冷却。
| 键 | 值 | 默认值 |
|---|---|---|
powerCooldown | 整数 | 0 |
globalCooldown
设置全局冷却元数据,单位为 tick。全局冷却仅阻止会检查它的能力,并不无条件锁住所有钩子和动作。对于 YAML 脚本,请配置脚本自身的 Cooldowns 部分。
| 键 | 值 | 默认值 |
|---|---|---|
globalCooldown | 整数 | 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
}
如果同一目录中没有同名的 .yml 元数据文件,自定义 Lua 能力会使用以下默认值:
powerType为MISCELLANEOUS。effect未设置。
对于自定义 my_power.lua,可在旁边添加 my_power.yml,包含 isEnabled、powerType、effect、powerCooldown 和 globalCooldown。例如,powerType: UNIQUE 可将其排除在默认杂项抽取池之外。禁用元数据文件会阻止加载此自定义 Lua 文件。
放在随附预制 Lua 能力旁边、主文件名相同的 .yml 或 .yaml 文件同样会作用于它。其中的 isEnabled、effect、powerCooldown 和 globalCooldown 值会替换内置值,包括你省略的键的默认值,因此省略 effect 会移除该能力的环绕物品。powerType 只有在设置时才会替换内置类型。禁用的文件不会阻止随附能力加载。
自然精英怪使用 EliteMobPowers.yml 中的显式抽取池,添加自定义能力时请检查这些列表。要直接分配给 Boss,将 .lua 文件名加入其 powers: 列表。
Boss Lua 能力可用的钩子
| 钩子 | 触发时机 |
|---|---|
on_spawn | Boss 生成时 |
on_game_tick | 运行实例处于活动状态,且未暂停或受抑制时的每个服务器 tick |
on_boss_damaged | Boss 受到任何来源的伤害时 |
on_boss_damaged_by_player | Boss 受到玩家的伤害时 |
on_reinforcement_damaged_by_player | 增援受到玩家伤害时;钩子在其召唤者上运行 |
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 | 玩家目标事件,包括初次获取目标;并非每次目标改变或丢失 |
on_death | Boss 死亡时 |
on_phase_switch | Boss 切换阶段时 |
on_mind_action | 原生 Mind 向附加能力请求动作时 |
也接受 on_zone_enter 和 on_zone_leave。内置派发器从同一 Boss 的 EliteScript 区域监听器接收这些事件,不从 Lua 区域监视器接收。请参阅本页顶部的警告。
每个附加 Lua 能力都拥有针对该 Boss 的独立运行实例和状态。上方示例刻意不设冷却,每次派发匹配的攻击事件都会执行。需要时请显式添加冷却检查和设置;仅有元数据不会限制 Lua 钩子。伤害可能同时派发通用钩子和更具体的钩子,因此同时定义两者可能运行两个处理器。取消、移除和失败行为请参阅生命周期指南。
关于在这些钩子内部你实际可以调用什么,请参阅 Lua 入门指南、Boss 钩子与生命周期和 Boss 实体。
