Elite Script 目标
目标是 Elite Scripts 的核心部分,是动作(Actions)和区域(Zones)正常工作所必需的。
目标类型
目标类型设置脚本将定位哪些实体或位置。
| Target Type | 详情 | 特殊说明 |
|---|---|---|
NEARBY_PLAYERS | 处于范围内的玩家 | 需要 range |
NEARBY_MOBS | 处于范围内的怪物 | 需要 range |
NEARBY_ELITES | 处于范围内的精英怪 | 需要 range |
WORLD_PLAYERS | 所在世界中的玩家 | ❌ |
ALL_PLAYERS | 服务器中的玩家 | ❌ |
DIRECT_TARGET | 事件中的玩家 | 需要兼容的事件 |
SELF | 施放能力的精英怪 | ❌ |
SELF_SPAWN | 定位 Boss 的生成位置 | ❌ |
LOCATION | 特定位置 | 需要 location |
LOCATIONS | 多个特定位置 | 需要 locations |
ZONE_FULL | 定位区域内部 | 需要 Zone |
ZONE_BORDER | 定位区域边界 | 需要 Zone |
ACTION_TARGET | 继承某个动作的目标。 | 只能用于动作条件和相对向量!! |
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,它会把该消息发送给所有在线玩家。
共享属性
以下设置可应用于所有目标。
| Values | 详情 | 特殊说明 |
|---|---|---|
offset | 设置目标位置的偏移量。 | 不能定位实体! |
relativeOffset | 为目标位置设置相对偏移量。接受相对向量蓝图,使偏移量能够相对于 Boss 的朝向方向进行计算。 | 不能定位实体! |
示例
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: SELF
offset: "0,2,0"
这会在 Boss 上方 2 格处降下闪电。注意,STRIKE_LIGHTNING 使用位置,不会作用于实体,因此可以使用偏移量。
你不能为发送消息设置偏移量,因为消息是发送给玩家的。不过,你可以为区域设置偏移量,再由区域去定位实体。
range
设置 NEARBY_PLAYERS 目标类型扫描附近玩家的范围。
| Values | 详情 | 默认值 |
|---|---|---|
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 目标类型设置位置。
| Values | 详情 | 默认值 |
|---|---|---|
location | 设置将被定位的世界位置。 | none |
位置使用 location: worldname,x,y,z,pitch,yaw 的格式。
注意,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 目标类型设置多个位置。
| Values | 详情 | 默认值 |
|---|---|---|
locations | 设置将被定位的世界位置列表。 | none |
位置使用 worldname,x,y,z,pitch,yaw 的格式。
注意,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 的位置降下另一道闪电。
定位区域
区域拥有多个目标,理解它们的运作方式对于充分发挥 Elite Scripting 的潜力至关重要。
区域分两个部分来工作:
第 1 部分 - 设置区域的位置
区域需要知道它们应当处于何处,为此你要像处理任何其他基于位置的效果(比如闪电)一样使用目标系统。
示例
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
这会在 Boss 周围生成一个圆柱形区域。注意,本示例中尚未设置任何动作,这部分将在下文介绍。
某些区域,例如 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
沿用第一部分中的同一个区域,我们现在加入了动作。该动作的目标是 ZONE_FULL,这意味着它会在整个区域内部生成粒子。
注意,并非每个区域都支持 ZONE_BORDER。关于这一点的更多内容请见脚本区域页面。
Zone track(区域跟踪)
设置区域是否会随目标移动,例如对于 targetType: SELF,区域是否会在 Boss 移动时随之移动。
| Values | 详情 | 默认值 |
|---|---|---|
track | 设置区域是否会随目标一起移动。 | true |
注意,可动画的区域无法跟踪。关于这一点的更多内容请见此处。
示例
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 调用的整个脚本。
下面是一个取自 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 秒。
这意味着 Boss 有一个 3 秒的警告阶段,随后才进入伤害阶段;并且即使区域被设置为不跟踪,警告区域和伤害区域也会处于同一位置。
区域专属的目标属性
区域拥有以下专属属性:
coverage
设置实际用于该动作的区域百分比。仅对位置目标有效(在定位玩家或其他实体时无效)。
| Values | 详情 | 默认值 |
|---|---|---|
coverage | 设置区域被覆盖的百分比。你可以使用 ~ 来随机化该值,例如:1.0~0.3。 | 1.0 |
示例
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% 的区域会被粒子覆盖。
继承目标
当一个脚本运行(或"调用")另一个脚本时,可以将区域和目标信息从第一个脚本传递给第二个脚本。
用途示例
- 改进的脚本运行器
脚本运行器是一种唯一功能就是运行大量其他脚本的脚本。它们用于让脚本管理更加轻松,尤其是在处理多个需要精确计时的脚本时。
借助目标继承,多个脚本可以使用同一个区域或目标,从而可能减少数百行重复的脚本编写。
- 套娃式目标过滤 / 俄罗斯套娃式目标过滤
过滤条件可以应用于某个动作中的目标。通过将这些目标传递给使用不同过滤器的另一个脚本,就可以分层叠加条件,并根据越来越具体的标准对同一组目标应用不同的效果。
举例来说,可以创建一个查找玩家的区域,并制作一个动作来检查区域中的所有玩家是否都带有某个特定标签。随后可将有效目标传递给另一个脚本,在那里另一个动作可以运行一个随机检查条件,并根据该几率应用某种效果。接着还可以将这些目标进一步传递给又一个脚本,在那里另一个条件可以检查这些目标是否仍然存活,并在它们死亡时执行某些特殊行为。
当然,这些只是示例。这是一个高度灵活的系统。
- 复杂区域
最后,可以分层叠加目标来创建复杂区域,并在需要时选择性地使用条件;甚至可以利用脚本条件以及只从脚本动作中运行所列脚本之一的能力,来创建半随机化的区域。
注意: 在本节中,"父脚本" 指运行 "继承脚本" 的那个脚本,而继承脚本则是将使用所继承目标的脚本。
在使用目标继承时,务必仔细查看父脚本,以确保传递下去的是正确的数据。
INHERIT_SCRIPT_TARGET
在使用 INHERIT_SCRIPT_TARGET 时,父脚本的目标将被传递给继承脚本。这有几个需要注意的地方:
-
在传递实体目标时,可以运行需要位置的动作(例如生成粒子),因为会使用这些实体的位置。当然,也可以使用需要实体的动作。
-
在传递位置目标时,只能使用位置。从位置获取实体的唯一方法,是在该位置创建一个区域并查找其中的实体。 因此,虽然传递位置然后再获取实体并非不可能,但需要一些额外的工作。
继承区域
在使用 INHERIT_SCRIPT_ZONE_FULL 或 INHERIT_SCRIPT_ZONE_BORDER 时,父脚本必须定义一个区域,否则继承脚本将无法正确运行。
此外,区域可以选择性地被跟踪。这一设置也会随区域一同传递。
-
未跟踪的区域将始终在继承脚本所定义的位置创建区域。这意味着每次动作运行时,继承脚本中的动作都会使用这些区域设置来创建全新的区域,而这些区域的位置将由动作来定义。
-
如果父脚本被设置为定位
ZONE_FULL或ZONE_BORDER,已跟踪的区域可以将完全相同的区域位置传递给所有继承脚本。这意味着每个脚本都将作用于相同的位置。