Elite 脚本目标
目标是 Elite 脚本的核心部分,是动作和区域工作所必需的。
目标类型
目标类型设置脚本要定位哪些实体或位置。
| 目标类型 | 详情 | 特殊要求 |
|---|---|---|
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 动作! |
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 | 设置目标位置的偏移量。 | 不能定位实体! |
示例
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions
- action: STRIKE_LIGHTNING
Target:
targetType: SELF
offset: "0,2,0"
这会在 Boss 上方 2 个方块处生成闪电。请注意,STRIKE_LIGHTNING 使用位置且不影响实体,因此可以设置偏移量。
你不能设置偏移量来发送消息,因为消息是发送给玩家的。但是,你可以为区域设置偏移量,然后该区域可以定位实体。
range
设置在 NEARBY_PLAYERS 目标类型中扫描附近玩家的范围。
| 值 | 详情 | 默认值 |
|---|---|---|
range | 设置扫描玩家目标的范围,单位为方块。 | 20.0 |
示例
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: MESSAGE
Target:
targetType: NEARBY_PLAYERS
range: 25.0
sValue: "&2定位到 25 方块内的玩家!"
当 Boss 死亡时,这会向 Boss 25 方块内的玩家发送消息。
location
设置 LOCATION 目标类型的位置。
| 值 | 详情 | 默认值 |
|---|---|---|
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 目标类型的位置列表。
| 值 | 详情 | 默认值 |
|---|---|---|
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 脚本非常重要。
区域分为两部分工作:
第 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 并非适用于每个区域。更多信息请参阅脚本区域页面。
区域跟踪
设置区域是否会随目标移动,例如当 Boss 移动时区域是否会移动(对于 targetType: SELF)。
| 值 | 详情 | 默认值 |
|---|---|---|
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 个刻度,即 3 秒。
这意味着 Boss 有 3 秒的警告阶段,然后进入伤害阶段,即使区域设置为不跟踪,警告区域和伤害区域也将位于同一位置。
区域特定目标属性
区域具有以下特定属性:
coverage
设置实际用于动作的区域的百分比。仅适用于位置目标(定位玩家或其他实体时不起作用)。
| 值 | 详情 | 默认值 |
|---|---|---|
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。这意味着每个脚本都将作用于相同的位置。