Elite 脚本相对向量
用途
相对向量是相对于特定但动态位置的向量。
例如,要把玩家拉向移动中的 Boss,可计算从玩家位置到 Boss 位置的向量。固定向量无法跟随双方的位置变化。
相对向量可用于瞄准投射物、发射下落方块和设置朝向。作为相对偏移时,可将增援放到玩家后方,或让射线延伸到目标以外。
使用上下文
相对向量在动作上下文中使用,使用 YAML 键 RelativeVector:。这包括以下动作:
SUMMON_ENTITY- 设置生成实体的速度(移动方向和速度)SUMMON_REINFORCEMENT- 设置生成增援的速度SPAWN_PARTICLE- 在每个particles:条目内部提供运动向量;动作层级的字段不用于此用途PUSH- 设置推动速度SPAWN_FALLING_BLOCK- 设置掉落方块速度SET_FACING- 设置实体面向的方向
其他动作会解析有效的 RelativeVector: 块,但不使用它。这些键不区分大小写,因此粒子条目接受 RelativeVector: 和 relativeVector:。目标类型的值仍须使用文档中的大写形式。
对速度动作而言,RelativeVector 优先于 vValue,两者不会相加。PUSH 为所有选中实体计算同一个向量,并在一 tick 后应用。SET_FACING 也为所有选中实体计算同一个方向。
要修改目标位置,请将 relativeOffset: 放在 Target、FinalTarget、Target2 或 FinalTarget2 等目标块内。动作层级的 relativeOffset: 会记录 Failed to read key relativeOffset ...。只有当动作没有 Target 块时它才会生效,因为此时默认的 SELF 目标会从动作本身读取目标键。详见下方相对偏移部分。
向量如何工作?
如果你不知道或不记得什么是向量或它们如何工作,你可以将向量视为从一个点指向另一个点的箭头。
因此,向量的属性之一是它们的长度。这个长度很重要;对于箭来说,这个长度是箭被射出的速度,对于尝试从特定位置获取偏移点来说,它是距该点的距离。距离越远,向量长度就越大,距离越近,长度就越短。
对于某些机制,你可能不想依赖两点之间的距离,因为你只想获得一个方向。幸运的是,你可以使用向量归一化,它保证保留方向但将长度更改为 1.0。然后,你可以使用乘数轻松修改向量,直到你对它提供的偏移或它给出的速度感到满意为止。
属性
| 值 | 详情 | 必需? | 默认值 |
|---|---|---|---|
SourceTarget | 向量起始点的目标 | ✅ | none |
DestinationTarget | 向量终点的目标 | ✅ | none |
normalize | 设置是否应归一化向量 | ❌ | false |
multiplier | 乘以向量的长度。你可以使用 ~ 来随机化此值。示例:1.0~2.5。 | ❌ | 1.0 |
offset | 添加固定偏移。可用 ~ 随机化,例如 0~5,0~2,0~10。 | ❌ | 0,0,0 |
随机化
multiplier 和 offset 都支持使用波浪号(~)分隔符进行随机化:
- multiplier:使用
min~max,例如1.0~2.5。此例会抽取从 1.0 开始、到 2.5 为止(不包含 2.5)的值。 - 对于 offset:使用格式
x1~x2,y1~y2,z1~z2(例如0~5,0~2,0~10)。每个组件(X、Y、Z)都是独立随机化的。
每次计算向量时都会重新抽样。偏移的随机分量同样遵循从 min 到 max(不包含 max)的规则。
示例
eliteScript:
ShootChicken:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SUMMON_ENTITY
sValue: CHICKEN
Target:
targetType: SELF
RelativeVector:
SourceTarget:
targetType: SELF
DestinationTarget:
targetType: DIRECT_TARGET
normalize: true
multiplier: 2.0
从 Boss 向攻击它的玩家发射一只鸡。
eliteScript:
ShootArrow:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SUMMON_ENTITY
sValue: ARROW
Target:
targetType: SELF
RelativeVector:
SourceTarget:
targetType: SELF
DestinationTarget:
targetType: DIRECT_TARGET
normalize: true
multiplier: 2.0
向攻击玩家发射一支箭。对于投射物实体,若 Boss 仍存活,SUMMON_ENTITY 会使用 Boss 的投射物发射器。因此,即使动作的 Target 指定其他位置,投射物仍从 Boss 发出。
eliteScript:
SpawnReinforcement:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SUMMON_ENTITY
sValue: ZOMBIE
Target:
targetType: DIRECT_TARGET
relativeOffset:
SourceTarget:
targetType: SELF
DestinationTarget:
targetType: DIRECT_TARGET
normalize: true
multiplier: 2.0
沿 Boss 到玩家的连线,在越过玩家两格的位置生成普通僵尸。尽管脚本名如此,它并非 EliteMobs 增援。relativeOffset 应放在 Target 内部:它改变生成位置,不改变速度。方向采用完整的三维连线,而非玩家朝向,也不会搜索地面或检查碰撞。
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
Shape: SPHERE
target:
targetType: SELF_SPAWN
offset: 0,0,0
track: false
filter: PLAYER
radius: 6
Actions:
- action: SPAWN_PARTICLE
repeatEvery: 38
times: 5
Target:
targetType: ZONE_FULL
track: false
coverage: 0.9
particles:
- particle: FLAME
RelativeVector:
SourceTarget:
targetType: ACTION_TARGET
track: true
DestinationTarget:
targetType: SELF_SPAWN
offset: 0,-0.5,0
speed: 0.05
在生成位置周围的球体内,反复产生向内运动的火焰。区域本身不会缩小。
工作原理:
- 区域提供半径六格球体内的几何点。
filter: PLAYER影响实体选择,不影响此处使用的粒子位置。 coverage: 0.9让每个生成点有约 90% 的概率被选中。动作的track: false会缓存这次选择,供本轮重复执行使用。- 每个粒子的向量从生成位置(
ACTION_TARGET)指向 Boss 生成位置下方半格(SELF_SPAWN配合offset: 0,-0.5,0)。 - 向量在每个粒子生成时计算。
ACTION_TARGET直接使用动作提供的位置,其内部track设置不会引导已经飞出的粒子。 - 相对粒子向量替换
x、y、z,并将amount强制设为零以进行定向发射。speed仍传给 Bukkit,最终运动由粒子类型决定。 - 除非计划任务被取消,否则动作执行五次,间隔 38 tick。示例没有冷却,每次符合条件的攻击都会开始另一轮执行。
运算顺序
应用属性时的运算顺序如下:
向量计算 -> normalize -> multiplier -> offset
技术说明
向量归一化:对于非零向量,保留方向,并在应用乘数和偏移之前将长度设为 1.0。
负乘数:乘数可以为负数以反转向量的方向。例如,乘数为 -1.0 将指向相反的方向。
偏移坐标:偏移以世界坐标应用,而不是相对于向量方向。它在所有其他计算之后添加。
世界验证:源目标和目标目标必须在同一世界中。如果它们在不同的世界中,将返回零向量(0, 0, 0),这可能导致动作失败或行为异常。
缺失目标:解析得到的起点或终点集合为空时,会在应用乘数和偏移前返回零向量。事件没有直接目标时的 DIRECT_TARGET 端点也属于这种情况。缺少 SourceTarget 或 DestinationTarget 块仍会导致错误。
如果有效起点与终点重合,向量长度为零。normalize: true 会让它保持为零,因此只剩下相对向量自身的 offset。目标解析出多个位置时,相对向量只用第一个,不保证是最近位置。需要明确方向时,请使用 DIRECT_TARGET 等单一目标。
ACTION_TARGET:使用动作提供的位置,跳过嵌套目标的 offset、relativeOffset 和 track。对于粒子是粒子位置;对于实体和下落方块是请求的生成位置;对于增援速度是已生成增援的位置。对于 PUSH 和 SET_FACING 则是 Boss 位置,而非每个选中实体的位置。在目标的 relativeOffset 中,它是正在被偏移的位置,即已应用该目标普通 offset 之后的位置。
速度与位置上下文:在像 SUMMON_ENTITY 这样的动作上下文中,RelativeVector 设置实体的速度(移动)。在目标上下文中,relativeOffset 设置位置偏移(位置调整)。使用相同的底层系统,但解释因上下文而异。
将 relativeOffset 应用于 SELF、SELF_SPAWN、DIRECT_TARGET、LOCATION 或 LOCATIONS 等目标,也可用于定义区域起点或终点。对于 ZONE_FULL / ZONE_BORDER,它会平移每个采样到的区域位置。它对 LANDING_LOCATION 或 INHERIT_SCRIPT_TARGET 无效。请参阅目标偏移规则。
Elite 脚本相对偏移
用途
相对偏移的功能类似于相对向量,但目标是为偏移添加灵活性。它们允许你在脚本编写时动态调整位置,从而更容易根据上下文微调目标位置或效果。
相对偏移如何工作?
相对偏移是累加的,这意味着偏移解析为的任何值都将添加到基础值(如位置或向量)。
让我们分解一个示例:
你有一个 ray zone:
Target 1是SELF(Boss)。Target 2是DIRECT_TARGET,即事件提供的玩家。
假设玩家在八格之外,两位置属于同一世界,且无其他偏移。使用 SELF 作为相对偏移的 SourceTarget,使用 DIRECT_TARGET 作为 DestinationTarget,再把该 relativeOffset 放入 Target2。以下示例描述到终点的距离;实际绘制点还取决于射线设置。
现在让我们应用一个相对偏移:
情况 1:normalize = false,multiplier = 1
- 原始距离为 8。
- 偏移值变为
8 × 1 = 8。 - 最终射线长度:
8 + 8 = 16。
射线将穿过玩家并继续延伸 8 格。
情况 2:normalize = false,multiplier = 2
- 偏移值变为
8 × 2 = 16。 - 最终射线长度:
8 + 16 = 24。
情况 3:normalize = true,multiplier = 1
- 距离归一化为 1。
- 偏移值变为
1 × 1 = 1。 - 最终射线长度:
8 + 1 = 9。
情况 4:normalize = true,multiplier = 2
- 偏移值变为
1 × 2 = 2。 - 最终射线长度:
8 + 2 = 10。
总结
normalize = false使用目标之间的实际距离。normalize = true对有效非零向量从长度 1 开始。- 偏移始终添加到原始值。
- 零
multiplier仅在计算出的位移为有限值时才能消除它。相对向量自己的offset仍会随后相加,目标的普通offset也独立保留。要禁用相对偏移,请移除其配置块。
此系统允许你在构建 EliteMobs 脚本中更复杂的技能逻辑时轻松动态扩展或缩小距离。
属性
| 值 | 详情 | 必需? | 默认值 |
|---|---|---|---|
SourceTarget | 向量起始点的目标 | ✅ | none |
DestinationTarget | 向量终点的目标 | ✅ | none |
normalize | 设置是否应归一化向量 | ❌ | false |
multiplier | 乘以向量的长度。你可以使用 ~ 来随机化此值。示例:1.0~2.5。 | ❌ | 1.0 |
offset | 在 normalize 和 multiplier 后添加固定向量。可用 ~ 随机化,例如 0~5,0~2,0~10。 | ❌ | 0,0,0 |
relativeOffset 和 RelativeVector 由完全相同的代码解析,因此接受相同的五个键。
示例
eliteScript:
MakeStaticRay:
Events:
- EliteMobDamagedByPlayerEvent
Zone:
shape: STATIC_RAY
Target:
targetType: SELF
offset: 0,1,0
Target2:
targetType: DIRECT_TARGET
offset: 0,1,0
relativeOffset:
sourceTarget:
targetType: SELF
destinationTarget:
targetType: DIRECT_TARGET
multiplier: 5
normalize: true
Actions:
- action: SPAWN_PARTICLE
Target:
targetType: ZONE_FULL
particles:
- particle: ELECTRIC_SPARK
amount: 1
repeatEvery: 1
times: 400
此射线的终点沿 Boss 到玩家的连线,延伸到玩家之外五格。普通偏移将两端抬高到脚部上方一格,并非自动计算实体中心。STATIC_RAY 指形状,不代表固定目标快照:使用默认 track: true 时,动作会在重复执行时重新计算目标。要固定显示,请在动作中设置 Target.track: false,缓存生成的射线位置。示例请求以一 tick 为间隔执行 400 次,每次符合条件的攻击都可开始另一轮。
**注意:**即使此示例在区域上使用相对偏移,请记住相对偏移不仅限于区域,它们也可以应用于其他目标。