跳到主要内容

创建能力

webapp_banner.jpg

编写能力的两种方式​

基于文件的能力放在 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_spawnBoss 生成时
on_game_tick运行实例处于活动状态,且未暂停或受抑制时的每个服务器 tick
on_boss_damagedBoss 受到任何来源的伤害时
on_boss_damaged_by_playerBoss 受到玩家的伤害时
on_reinforcement_damaged_by_player增援受到玩家伤害时;钩子在其召唤者上运行
on_boss_damaged_by_eliteBoss 受到另一个精英怪的伤害时
on_player_damaged_by_bossBoss 对玩家造成伤害时
on_enter_combatBoss 进入战斗时
on_exit_combatBoss 脱离战斗时
on_healBoss 治疗时
on_boss_target_changed玩家目标事件,包括初次获取目标;并非每次目标改变或丢失
on_deathBoss 死亡时
on_phase_switchBoss 切换阶段时
on_mind_action原生 Mind 向附加能力请求动作时

也接受 on_zone_enter 和 on_zone_leave。内置派发器从同一 Boss 的 EliteScript 区域监听器接收这些事件,不从 Lua 区域监视器接收。请参阅本页顶部的警告。

每个附加 Lua 能力都拥有针对该 Boss 的独立运行实例和状态。上方示例刻意不设冷却,每次派发匹配的攻击事件都会执行。需要时请显式添加冷却检查和设置;仅有元数据不会限制 Lua 钩子。伤害可能同时派发通用钩子和更具体的钩子,因此同时定义两者可能运行两个处理器。取消、移除和失败行为请参阅生命周期指南。

关于在这些钩子内部你实际可以调用什么,请参阅 Lua 入门指南、Boss 钩子与生命周期和 Boss 实体。