Elite Script 目标
目标用于选择动作、条件和区域所使用的实体或位置。Target 必须写成 YAML 映射。targetType 默认为 SELF,range 默认为 20.0,track 默认为 true。目标字段名不区分大小写,但目标类型的枚举值必须大写。
目标类型
目标类型设置脚本将定位哪些实体或位置。
DIRECT_TARGET 是事件提供的实体:除了玩家,也可能是发起攻击的精英怪或穿越区域的实体。只能在兼容的事件中使用它;没有直接目标时,它不会选中任何内容。它不会自动选择 Boss 当前的战斗目标。附近目标类型会搜索 Boss 周围与坐标轴对齐的长方体,不按距离排序。
实体目标可向位置动作提供实体当前脚部的位置。反向转换不会自动发生:LOCATION、LOCATIONS 和 LANDING_LOCATION 无法选择占据这些位置的实体。要查找实体,请在该处创建区域。玩家选择器本身不会排除旁观者或其他战斗中的玩家;具体动作可能另有资格检查。
| 目标类型 | 详情 | 特殊说明 |
|---|---|---|
NEARBY_PLAYERS | 范围内的玩家 | range 可选,默认 20.0 |
NEARBY_MOBS | 范围内的非玩家活体实体,不包括 Boss | range 可选,默认 20.0 |
NEARBY_ELITES | 范围内受追踪的精英怪,不包括 Boss | range 可选,默认 20.0 |
WORLD_PLAYERS | 所在世界中的玩家 | ❌ |
ALL_PLAYERS | 服务器中的玩家 | ❌ |
DIRECT_TARGET | 事件提供的实体 | 需要兼容的事件 |
SELF | 施放能力的精英怪 | ❌ |
SELF_SPAWN | 向位置动作提供 Boss 已保存的生成位置 | 实体动作仍会获得 Boss 本身 |
LOCATION | 特定位置 | 需要 location |
LOCATIONS | 多个特定位置 | 需要 locations |
ZONE_FULL | 定位区域内部 | 需要 Zone |
ZONE_BORDER | 定位区域边界 | 需要 Zone |
ACTION_TARGET | 使用所属动作的目标上下文 | 仅用于 FILTERING 模式的动作条件及相对向量,不能独立用作动作目标 |
LANDING_LOCATION | 定位方块或实体落地处的位置。 | 只能用于 SPAWN_FALLING_BLOCK 和 SUMMON_ENTITY 动作的 landingScripts! |
INHERIT_SCRIPT_TARGET | 继承运行本脚本的那个脚本的目标 | 只有当该脚本被另一个脚本调用时才能运行! |
INHERIT_SCRIPT_ZONE_FULL | 定位从运行本脚本的那个脚本继承而来的区域内部 | 需要在调用本脚本的那个脚本中设置 Zone! |
INHERIT_SCRIPT_ZONE_BORDER | 定位从运行本脚本的那个脚本继承而来的区域边界 | 需要在调用本脚本的那个脚本中设置 Zone! |
示例
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: MESSAGE
Target:
targetType: ALL_PLAYERS
sValue: "&2Hello World!"
这会向目标发送一条消息。由于目标设置为 ALL_PLAYERS,它会把该消息发送给所有在线玩家。
共享属性
以下设置用于解析目标位置。它们不会移动实体,也不会改变接收动作的实体。
| 配置项 | 详情 | 特殊说明 |
|---|---|---|
offset | 设置目标位置的偏移量。 | 不能定位实体! |
relativeOffset | 使用相对向量蓝图偏移目标位置,方向由向量的起点与终点目标决定。 | 不能定位实体! |
偏移适用于从 SELF、DIRECT_TARGET 等实体目标解析的位置,适用于 SELF_SPAWN、LOCATION 和 LOCATIONS,也适用于 ZONE_FULL、ZONE_BORDER 及其继承变体从区域中采样的每个位置。要移动整个区域,请改为像下例一样在区域自身的 Target 上设置偏移。同样的规则也适用于 Lua 脚本工具。
offset 使用世界 X/Y/Z 坐标轴,不随实体朝向旋转。它先于 relativeOffset 应用。LANDING_LOCATION 和 INHERIT_SCRIPT_TARGET 的结果会跳过这些附加偏移。相对向量中的 ACTION_TARGET 直接使用提供的动作位置,忽略自身的偏移设置。
示例
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: SELF
offset: "0,2,0"
这会在 Boss 上方 2 格处降下闪电。STRIKE_LIGHTNING 选择位置,所以其目标支持偏移。这道闪电仅为视觉效果,不会伤害实体。
你不能为发送消息设置偏移量,因为消息是发送给玩家的。不过,你可以为区域设置偏移量,再由区域去定位实体。
range
设置 NEARBY_PLAYERS、NEARBY_MOBS 和 NEARBY_ELITES 搜索长方体的半宽。同一个固定值用于 X、Y、Z 三个轴;这不是球形距离限制。生物和精英怪查询会排除施法 Boss。
使用固定的非负数可获得一致的搜索区域。~ 范围可能在每个轴上分别采样,并使用下文覆盖率部分所述的浮点采样器;它不能保证只抽取一个半径来生成立方体。
| 配置项 | 详情 | 默认值 |
|---|---|---|
range | 附近玩家、生物和精英怪查询的半宽,单位为方块。 | 20.0 |
示例
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: MESSAGE
Target:
targetType: NEARBY_PLAYERS
range: 25.0
sValue: "&2Targeted players within 25 blocks!"
当 Boss 死亡时,这会向从 Boss 位置沿各坐标轴向两侧延伸 25 格的长方体内的玩家发送消息。
location
为 LOCATION 目标类型设置位置。
| 配置项 | 详情 | 默认值 |
|---|---|---|
location | 设置将被定位的世界位置。 | none |
位置格式为 location: worldname,x,y,z,yaw,pitch。也接受 worldname,x,y,z(yaw 和 pitch 默认为 0),以及不带世界的 x,y,z,yaw,pitch;但后一种写法会使位置没有世界,通常不适用。仅含三个值的 x,y,z 无效,控制台会显示 Attempted to deserialize an invalid location!。
请使用已加载的世界或 same_as_boss。解析过程不会加载世界;格式错误或无法解析世界可能导致使用目标时报错。坐标始终是绝对坐标,包括使用 same_as_boss 时;该占位符只改变世界。
若配置的世界未加载,且 Boss 所在世界名为 <configuredWorld>_<number>,目标会使用该实例世界。已加载的配置世界不会被此回退规则替换。
注意,same_as_boss 是世界名称的有效占位符,例如 same_as_boss,100,64,100,0,0 就是一个有效的位置,它会定位到与 Boss 所在世界相同的世界。
示例
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: LOCATION
location: "myWorld,100,64,200,0,0"
这会在名为 myWorld 的世界中 x=100、y=64、z=200 的位置降下一道闪电。
locations
为 LOCATIONS 目标类型设置多个位置。
| 配置项 | 详情 | 默认值 |
|---|---|---|
locations | 设置将被定位的世界位置列表。 | none |
每个位置使用 worldname,x,y,z,yaw,pitch 格式,也支持与 location 相同的其他格式。
注意,same_as_boss 是世界名称的有效占位符,例如 same_as_boss,100,64,100,0,0 就是一个有效的位置,它会定位到与 Boss 所在世界相同的世界。
示例
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: LOCATIONS
locations:
- "myWorld,100,64,200,0,0"
- "same_as_boss,-100,12,130,0,0"
这会在名为 myWorld 的世界中 x=100、y=64、z=200 的位置降下一道闪电,并在与 Boss 相同的世界中 x=-100、y=12、z=130 的位置降下另一道闪电。
定位区域
区域将原点目标与使用其几何形状的动作分开。Zone.Target 提供原点;动作的 ZONE_FULL 或 ZONE_BORDER 目标从生成的形状中选择结果。多个原点可生成多个形状。实体结果会去重,但重叠形状仍可能提供重复的粒子位置。
区域分两个部分来工作:
第 1 部分 - 设置区域的位置
区域需要知道它们应当处于何处,为此你要像处理任何其他基于位置的效果(比如闪电)一样使用目标系统。
示例
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
这段配置展示了半径 10、高度 1、从 Boss 脚部向上延伸的圆柱。它还没有动作,只是一个片段;可运行的脚本需要下文中的 Actions。filter: PLAYER 作用于实体查询,不会过滤粒子使用的几何位置。
某些区域,例如 STATIC_RAY,拥有两个或更多目标。这是因为射线是线,而线由两个点定义。这一点在区域页面中有更详尽的介绍,但它们本质上都以相同的方式工作。
第 2 部分 - 定位区域内部
使用 targetType: ZONE_FULL 选择完整形状,或使用 targetType: ZONE_BORDER 选择边界。位置动作获得采样的几何位置;实体动作则根据区域过滤器和包含检查获得符合条件的实体。这两种结果集合的类型不同。
示例
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL
这会在圆柱内的采样位置生成粒子,而不是在玩家位置生成。动作执行 12 次,间隔 5 tick。区域粒子动作未显式设置 coverage 时,默认覆盖率约为 30%。filter: PLAYER 不会将这些粒子限制在玩家身上。
注意,并非每个区域都支持 ZONE_BORDER。关于这一点的更多内容请见脚本区域页面。
Zone track(区域跟踪)
像下例一样,在动作的 Target 上设置 track。为 true 时,通常会在请求区域形状时重新解析移动的原点。为 false 时,该动作在 wait 之前缓存区域形状,固定原点;后续实体查询仍会查找当时位于缓存形状内的实体。它不会锁定施法时在场的玩家。
| 配置项 | 详情 | 默认值 |
|---|---|---|
track | 重新解析动作目标,而不是缓存区域原点和采样位置。 | true |
animationDuration 为正数时,无论 track 如何设置,动作都会在开始时缓存动画形状。它缓存的是形状,而非其位置的静态列表,因此动画仍会继续。更多说明见此处。
示例
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL
track: false
沿用第 1 部分和第 2 部分中的同一个示例,现在该区域被设置为不跟踪。这意味着区域会在 Boss 的位置生成,但即使 Boss 不断远离,区域仍会停留在它最初生成的位置。
缓存在动作启动时、该动作的等待时间之前准备。延迟 RUN_SCRIPT 也会延迟被调用脚本的启动及其缓存建立时间。
若要先警告、再在原位置造成伤害,请立即启动两个脚本,并在伤害动作上设置 wait。若必须保证位置不受移动或先前动作影响,请为两者指定相同的固定原点。
下面是一个取自 Frost Palace Sanctum 的正确示例,展示了一个带有警告阶段和伤害阶段的能力。
示例
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL
track: false
- action: SPAWN_PARTICLE
wait: 60
times: 13
repeatEvery: 3
particles:
- particle: FLAME
amount: 0
x: 0
y: 1
z: 0
speed: 0.2
- particle: FLAME
amount: 0
x: 0.5
y: 1
z: 0.5
speed: 0.2
- particle: FLAME
amount: 0
x: 0
y: 1
z: 0.5
speed: 0.2
- particle: FLAME
amount: 0
x: 0.5
y: 1
z: 0
speed: 0.2
- particle: FLAME
amount: 0
x: -0.5
y: 1
z: -0.5
speed: 0.2
- particle: FLAME
amount: 0
x: -0.5
y: 1
z: 0
speed: 0.2
- particle: FLAME
amount: 0
x: 0
y: 1
z: -0.5
speed: 0.2
- particle: FLAME
amount: 0
x: -0.5
y: 1
z: 0.5
speed: 0.2
- particle: FLAME
amount: 0
x: 0.5
y: 1
z: -0.5
speed: 0.2
Target:
targetType: ZONE_FULL
track: false
- action: RUN_SCRIPT
scripts:
- DamageCylinder
- action: PLAY_ANIMATION
sValue: fire_zone
Target:
targetType: SELF
- action: SET_MOB_AI
duration: 100
bValue: false
Target:
targetType: SELF
Cooldowns:
local: 1200
global: 300
DamageCylinder:
Zone:
radius: 10.0
shape: CYLINDER
height: 10
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
offset: 0,-1,0
Actions:
- action: DAMAGE
wait: 60
repeatEvery: 10
times: 4
multiplier: 4
Target:
targetType: ZONE_FULL
track: false
- action: SET_ON_FIRE
wait: 60
duration: 80
Target:
targetType: ZONE_FULL
track: false
这个脚本做了很多事情,但它被清晰地拆分为两个脚本:VisualCylinder 和 DamageCylinder。
VisualCylinder 首先运行,并带有 RUN_SCRIPT 动作,该动作会在 VisualCylinder 运行的同时立即也运行 DamageCylinder。
然而,DamageCylinder 中的每一个动作都被设置为等待 60 tick,也就是 3 秒。
警告持续 3 秒,然后延迟的效果开始。两个脚本立即启动时会记录相同的 Boss 水平位置,但体积不同:视觉圆柱从脚部开始,高度为 1;伤害圆柱从低 1 格处开始,高度为 10。DAMAGE 以 10 tick 间隔执行四次;SET_ON_FIRE 在等待后执行一次,请求 80 tick 的着火时间。动画需要带有 fire_zone 的兼容自定义模型。
动作的每次运行都保留自己的缓存。同一脚本的重叠施法不会互相覆盖缓存的位置,新的施法也永远不会复用之前施法缓存的位置。
区域专属的目标属性
区域拥有以下专属属性:
coverage
设置实际用于该动作的区域百分比。仅对位置目标有效(在定位玩家或其他实体时无效)。
| 配置项 | 详情 | 默认值 |
|---|---|---|
coverage | 保留区域位置的比例,例如 0.5 表示约一半。建议使用 0 到 1 的固定值。 | 1.0 |
0.3~1.0 这样的范围会抽取从 0.3 开始、到 1.0 为止(不包含 1.0)的值,且可能为每个点分别抽取覆盖率。请使用固定比例以获得可预测的覆盖率。显式设置 coverage: 1.0 会保留所有采样位置;区域 SPAWN_PARTICLE 动作省略覆盖率时默认为 0.3。覆盖率不会减少实体查询结果。静态区域使用 track: false 时会缓存并重复使用采样的位置集合,而不是每次重复执行都重新抽取。
示例
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
Actions:
- action: SPAWN_PARTICLE
times: 12
repeatEvery: 5
particles:
- particle: SMOKE_NORMAL
Target:
targetType: ZONE_FULL
track: false
coverage: 0.5
此时每个采样位置都有 50% 的概率被保留用于粒子。最终数量约为一半,并非恰好一半。
继承目标
当一个脚本运行(或"调用")另一个脚本时,可以将区域和目标信息从第一个脚本传递给第二个脚本。
用途示例
- 改进的脚本运行器
脚本运行器是一种唯一功能就是运行大量其他脚本的脚本。它们用于让脚本管理更加轻松,尤其是在处理多个需要精确计时的脚本时。
借助目标继承,多个脚本可以使用同一个区域或目标,从而可能减少数百行重复的脚本编写。
- 套娃式目标过滤 / 俄罗斯套娃式目标过滤
实际解析并过滤实体目标的父动作,可通过自己的 scripts 列表将缓存结果传给子脚本。父子目标类型必须兼容。RUN_SCRIPT 本身不执行逐目标过滤路径,因此给它添加 FILTERING 条件不会生成可继承的过滤列表。
检查标签时,在实体动作上将 ACTION_TARGET 与 FILTERING 配合使用。随机概率需要脚本级条件或 BLOCKING 条件,不是逐实体的过滤掷骰。isAlive 检查的是 Bukkit 有效性,因此反转它不能可靠地触发玩家死亡后的行为。
- 复杂区域
最后,可以分层叠加目标来创建复杂区域,并在需要时选择性地使用条件;甚至可以利用脚本条件以及只从脚本动作中运行所列脚本之一的能力,来创建半随机化的区域。
注意: 在本节中,"父脚本" 指运行 "继承脚本" 的那个脚本,而继承脚本则是将使用所继承目标的脚本。
在使用目标继承时,务必仔细查看父脚本,以确保传递下去的是正确的数据。
INHERIT_SCRIPT_TARGET
INHERIT_SCRIPT_TARGET 读取的是调用子脚本的特定父动作的目标解析器或缓存,而非父脚本所有目标的并集。应将其放在子脚本的动作或区域原点上,不要放在顶层 Conditions 中:顶层条件求值时尚无继承的动作数据,继承的目标在那里会因错误而失败。
只有当父动作的 Target 设置了 track: false 时,父动作才会传递其已解析并经过条件过滤的目标。在默认的 track: true 下,子脚本会重新解析父动作的目标,且不应用父动作的过滤。RUN_SCRIPT 父动作从不解析自己的目标,因此其子脚本总是会重新解析实体。在 track: false 下,子脚本确实会复用父动作在其动作开始时缓存的位置。还需注意:
-
传递实体目标时,子脚本既可以将其用于实体动作,也可以用于位置动作。位置动作会接收这些实体的位置。
-
在传递位置目标时,只能使用位置。继承位置的实体动作会因错误而失败。从位置获取实体的唯一方法,是在该位置创建一个区域并查找其中的实体。 因此,虽然传递位置然后再获取实体并非不可能,但需要一些额外的工作。
继承区域
在使用 INHERIT_SCRIPT_ZONE_FULL 或 INHERIT_SCRIPT_ZONE_BORDER 时,父脚本必须定义一个区域,否则继承脚本将无法正确运行。
使用 track: false 的动作会在开始等待之前缓存区域形状。开启跟踪的动作通常不缓存形状,而会重新解析移动的原点。传递父动作数据可复用缓存形状;设置 track: true 并不会固定共享位置。
继承的区域目标使用父脚本自身的 Zone,以及调用动作缓存的形状(如果它缓存了的话)。INHERIT_SCRIPT_ZONE_FULL 的实体查询与 ZONE_FULL 一样使用完整体积检查。如果父脚本没有有效的区域,或者该脚本不是由其他脚本调用的,动作会因错误而失败。
要共享固定原点,请为调用动作的 Target 设置 track: false。这样,即使子脚本自身的动作需要等待,子脚本也会复用父动作在其动作开始时缓存的形状。