跳至主要內容

Elite Script 相對向量

它們的用途​

相對向量是相對於特定但動態位置的向量。

例如,要將玩家拉向移動中的首領,可計算從玩家位置到首領位置的向量。固定向量無法跟隨雙方的位置變化。

相對向量可用於瞄準投射物、發射下落方塊與設定朝向。作為相對偏移時,可將增援放在玩家後方,或讓光線延伸到目標以外。

使用情境​

相對向量用於 動作情境 中,使用 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 都支援使用波浪號 (~) 分隔符進行隨機化:

  • 對於倍數: 使用格式 min~max(例如 1.0~2.5)。此例會抽取 1.0 以上、未滿 2.5 的值。
  • 對於偏移: 使用格式 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

從首領向攻擊它的玩家射出一隻雞。


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

向攻擊玩家射出一支箭。對於投射物實體,若首領仍存活,SUMMON_ENTITY 會使用首領的投射物發射器。因此,即使動作的 Target 指定其他位置,投射物仍從首領發出。


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

沿首領到玩家的連線,在越過玩家兩格的位置生成普通殭屍。儘管腳本名稱如此,它並非 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)指向首領生成位置下方半格(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 則是首領位置,而非每個選取實體的位置。在目標的 relativeOffset 中,它是正在被偏移的位置,並已先套用該目標的一般 offset。

速度與位置情境: 在像 SUMMON_ENTITY 這樣的動作情境中,RelativeVector 設定實體的速度(移動)。在目標情境中,relativeOffset 設定位置偏移(位置調整)。使用相同的底層系統,但解釋根據情境而有所不同。

將 relativeOffset 套用於 SELF、SELF_SPAWN、DIRECT_TARGET、LOCATION 或 LOCATIONS 等目標,也可用來定義區域起點或終點。用於 ZONE_FULL / ZONE_BORDER 時,會偏移每個取樣的區域位置。它對 LANDING_LOCATION 或 INHERIT_SCRIPT_TARGET 無效。請參閱目標偏移規則。

Elite Script 相對偏移

它們的用途是什麼?​

相對偏移的功能類似於相對向量,但目標是為偏移添加靈活性。它們允許您在腳本編寫時動態調整位置,使根據情境微調目標位置或效果變得更容易。

相對偏移如何運作?​

相對偏移是加法的,這意味著無論偏移解析為什麼,都將添加到基值(例如位置或向量)。

讓我們分解一個範例:

您有一個 ray zone:

  • Target 1 是 SELF(首領)。
  • 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

此光線的終點沿首領到玩家的連線,延伸到玩家之外五格。普通偏移將兩端抬高到腳部上方一格,並非自動計算實體中心。STATIC_RAY 指形狀,不代表固定目標快照:使用預設 track: true 時,動作會在重複執行時重新計算目標。要固定顯示,請在動作中設定 Target.track: false,快取產生的光線位置。範例要求以一 tick 為間隔執行 400 次,每次符合條件的攻擊都可開始另一輪。

注意: 儘管此範例在區域上使用相對偏移,但請記住相對偏移不僅限於區域,它們也可以應用於其他目標。