跳到主要内容

创建能力

webapp_banner.jpg

编写能力的两种方式

每个能力都位于 ~/plugins/EliteMobs/powers 中(子文件夹同样会被扫描),共有两种格式:

格式文件适用场景
Lua*.lua一切新内容。完整的脚本语言,拥有全部 Boss 钩子、循环与状态。随插件附带的能力用的就是它。
EliteScript*.yml本页其余部分所记录的声明式事件/动作格式。仍然完全受支持。

EliteMobs 随附的 68 个能力中,几乎全部已经是 Lua。 只有 bonus_coins.ymlcustom_summon.ymlelite_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: 中列出了 ZoneEnterEventZoneLeaveEvent 时才启动的。只带 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 个不同的部分:EventsConditionsZonesActionsCooldowns。只有 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

Events

点击上面的链接了解如何使用事件!

Targets

Targets

点击上面的链接了解如何使用目标!

Actions

Actions

点击上面的链接了解如何使用动作!

Zones

Zones

点击上面的链接了解如何使用区域!

Conditions

Conditions

点击上面的链接了解如何使用条件!

Cooldowns

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_ZOMBIEMAJOR_SKELETONMAJOR_BLAZEMAJOR_ENDERMANMAJOR_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

设置能力使用的视觉效果或材质。这由一些硬编码的能力用来定义其视觉粒子或材质效果。

默认值
effectStringnone

powerCooldown

设置单个能力的冷却时间(以 tick 为单位)。这控制此特定能力触发的频率。

默认值
powerCooldownInteger0

globalCooldown

设置所有能力共享的全局冷却时间(以 tick 为单位)。此能力触发后,在全局冷却时间到期之前,其他能力无法触发。

默认值
globalCooldownInteger0

制作独立的 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 能力会得到固定的元数据:

  • powerTypeMISCELLANEOUS。你无法在文件中把它设为 UNIQUE。(随 EliteMobs 附带的那些 Lua 能力在 Java 侧携带自己的类型,这就是它们能够是 UNIQUEOFFENSIVEMAJOR_* 等的原因。)
  • effect 未设置

实际上这并不会让你的能力泄露到随机精英怪身上,因为自然精英怪的抽取池来自 EliteMobPowers.yml,而该文件一旦存在就不会被重新填充 —— 参见上文。要使用它,请把该能力加入某个 Boss 的 powers: 列表。

Boss Lua 能力可用的钩子

钩子触发时机
on_spawnBoss 生成时
on_game_tick每个服务器 tick
on_boss_damagedBoss 受到任何来源的伤害时
on_boss_damaged_by_playerBoss 受到玩家的伤害时
on_boss_damaged_by_eliteBoss 受到另一个精英怪的伤害时
on_player_damaged_by_bossBoss 对玩家造成伤害时
on_enter_combatBoss 进入战斗时
on_exit_combatBoss 脱离战斗时
on_healBoss 治疗时
on_boss_target_changedBoss 切换目标时
on_deathBoss 死亡时
on_phase_switchBoss 切换阶段时

解析器同样接受 on_zone_enteron_zone_leave,但 Lua 能力中没有任何东西能让它们触发 —— 它们只会从同一个 Boss 上的 EliteScript 区域监听器派发。参见本页顶部的警告。

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