跳到主要内容

精英脚本事件

EliteScript 是基于事件的。这意味着它们在特定事件触发时启动。以下是当前有效的事件:

事件详情直接目标 [?]
EliteMobDamagedByEliteMobEvent精英被另一个精英伤害攻击方精英的生物实体
EliteMobDamagedByPlayerEvent精英被玩家伤害造成伤害的玩家
EliteMobDamagedEvent精英被任何东西伤害❌
EliteMobDeathEvent精英死亡❌
EliteMobEnterCombatEvent精英与玩家进入战斗交战中的玩家
EliteMobExitCombatEvent精英退出战斗❌
EliteMobHealEvent精英治愈(包括完全治愈)❌
EliteMobSpawnEvent精英生成❌
EliteMobTargetPlayerEvent精英锁定玩家被锁定的玩家
PlayerDamagedByEliteMobEvent精英对玩家造成伤害受伤的玩家
ElitePhaseSwitchEventBoss因阶段切换而生成❌
ZoneEnterEvent (ScriptZoneEnterEvent)实体进入区域。需要设置区域!进入区域的实体
ZoneLeaveEvent (ScriptZoneLeaveEvent)实体离开区域。需要设置区域!离开区域的实体

“精英”指被 EliteMobs 作为精英追踪的实体,包括 Boss 和精英增援。 注意:ZoneEnterEvent 和 ZoneLeaveEvent 的计算开销较大,请谨慎使用!

Direct Target 由脚本目标使用,更多信息请参见此处。

YAML 中使用 ZoneEnterEvent 和 ZoneLeaveEvent。括号中的 ScriptZoneEnterEvent 和 ScriptZoneLeaveEvent 是底层 Java 事件名,不是可用的 YAML 别名。取消一个可取消事件会停止该事件分发顺序中的后续脚本和 Lua 能力,但不会停止已经运行的脚本中剩余的动作。区域进入和离开事件本身不可取消。

EliteMobDamagedEvent 覆盖任意来源的伤害;EliteMobDamagedByPlayerEvent 和 EliteMobDamagedByEliteMobEvent 覆盖各自的特定来源。 它们分别分发,并非互斥选项。同时列出通用和特定伤害事件时,只要冷却允许,一次攻击可能运行同一个脚本多次。通用监听器运行前已被取消的伤害不会触发它。

注意:事件名称是逐字符精确匹配的。 elitemobdeathevent 或 ELITEMOBDEATHEVENT 都会被拒绝并在控制台给出警告;只有 EliteMobDeathEvent 才有效。脚本层级各个部分(section)的名称也区分大小写:Events、Actions、Zone、Conditions 和 Cooldowns 必须完全按这样拼写。嵌套在某个动作下的 Conditions 块不区分大小写。这些部分内部的一切(targetType、radius、borderRadius、isAlive、Target 等)都不区分大小写,而每一个枚举值都是约定俗成、大小写精确的 UPPER_SNAKE_CASE 常量。

它们同时也驱动 Lua 的 on_zone_enter / on_zone_leave

在这里列出 ZoneEnterEvent 或 ZoneLeaveEvent,才会在 Boss 上启动每刻运行的区域监听器。而该监听器是唯一能触发同一 Boss 上 Lua 能力中顶层 on_zone_enter / on_zone_leave 钩子的东西。Lua 能力自己调用的 context.zones:watch_zone(...) 并不会触发它们。

ZoneEnterEvent 和 ZoneLeaveEvent 在实体进入或离开脚本所生成区域形状的并集时触发动作。其 DIRECT_TARGET 是进入或离开的实体。扫描器自身没有直接目标,因此不要用 DIRECT_TARGET 定义区域。固定位置和 SELF / SELF_SPAWN 是简单的区域原点。NEARBY_PLAYERS 也能在没有直接目标时解析原点,但区域会跟随选中的玩家移动,进入和离开表示实体相对于这片组合移动区域的位置变化。

区域监听器每 tick 扫描一次,即使脚本冷却阻止动作启动也一样。冷却减少的是动作执行次数,而不是检测区域成员的成本。刚启动的监听器会将首次扫描时已在区域内的实体视为进入。

区域事件只标识 Boss 和穿过边界的实体,不标识来源脚本或区域。一个脚本的监听器检测到的变化会分发给该 Boss 上所有匹配的脚本和 Lua 能力。因此,独立的多个监听器可能导致重复或跨区域激活。区域的 filter 控制扫描哪些生物实体,默认是 PLAYER。

每个脚本使用一个 Events 部分,可按需列出多个受支持的触发器。不含事件的脚本不会自动由事件触发,但仍可被其他脚本调用:

示例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
- EliteMobTargetPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,.3,0
Cooldowns:
local: 60
global: 20

此脚本会在精英被玩家攻击或锁定玩家时使其跳跃。