跳到主要内容

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 次,每次符合条件的攻击都可开始另一轮。

**注意:**即使此示例在区域上使用相对偏移,请记住相对偏移不仅限于区域,它们也可以应用于其他目标。