跳至主要內容

Elite Script 目標

目標用來選取動作、條件與區域使用的實體或位置。Target 必須寫成 YAML 映射。targetType 預設為 SELF,range 為 20.0,track 為 true。目標欄位名稱不區分大小寫,但目標類型的列舉值必須大寫。

目標類型​

目標類型設定腳本會以哪些實體或位置為目標。

DIRECT_TARGET 是事件提供的實體:除了玩家,也可能是發動攻擊的精英或穿越區域的實體。只能搭配相容事件使用;沒有直接目標時,它不會選取任何東西。它不會自動選取首領目前的戰鬥目標。附近目標類型搜尋首領周圍與座標軸對齊的長方體,不依距離排序。

實體目標可以向位置動作提供實體目前腳部的位置。反向轉換不會自動發生:LOCATION、LOCATIONS 和 LANDING_LOCATION 無法選取位於那些位置的實體。請在該處建立區域以尋找實體。玩家選取器本身不會排除旁觀者或其他戰鬥中的玩家;個別動作可能另有資格檢查。

目標類型詳細說明特殊事項
NEARBY_PLAYERS範圍內的玩家range 為選填,預設 20.0
NEARBY_MOBS範圍內的非玩家活體實體,不含首領range 為選填,預設 20.0
NEARBY_ELITES範圍內受追蹤的精英,不含首領range 為選填,預設 20.0
WORLD_PLAYERS世界中的玩家❌
ALL_PLAYERS伺服器中的玩家❌
DIRECT_TARGET事件提供的實體需要相容的事件
SELF使用技能的精英❌
SELF_SPAWN向位置動作提供首領儲存的生成位置實體動作仍取得首領本身
LOCATION特定位置需要 location
LOCATIONS數個特定位置需要 locations
ZONE_FULL以區域內部為目標需要 Zone
ZONE_BORDER以區域邊界為目標需要 Zone
ACTION_TARGET使用所屬動作的目標脈絡僅用於 FILTERING 模式的動作條件及相對向量,不能獨立作為動作目標
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,它會將該訊息發送給所有在線玩家。


共享屬性​

以下設定用於解析目標位置,不會移動實體,也不會改變接收動作的實體。

設定項詳細說明特殊事項
offset設定目標位置的偏移量。無法以實體為目標!
relativeOffset使用相對向量藍圖偏移目標位置,方向由向量的起點與終點目標決定。無法以實體為目標!

偏移會套用於由 SELF、DIRECT_TARGET 等實體目標解析的位置、SELF_SPAWN、LOCATION 與 LOCATIONS,以及 ZONE_FULL、ZONE_BORDER 及其繼承變體從區域取樣的每個位置。若要移動整個區域,請改為在區域本身的 Target 上設定偏移,如下例所示。相同規則也適用於 Lua 腳本工具。

offset 使用世界 X/Y/Z 座標軸,不隨實體朝向旋轉。它先於 relativeOffset 套用。LANDING_LOCATION 與 INHERIT_SCRIPT_TARGET 的結果會略過這些附加偏移。相對向量中的 ACTION_TARGET 直接使用提供的動作位置,忽略自身的偏移設定。

範例
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: SELF
offset: "0,2,0"

這會在首領上方 2 格處降下閃電。STRIKE_LIGHTNING 選取位置,因此其目標支援偏移。這道閃電僅有視覺效果,不會傷害實體。

你無法為發送訊息設定偏移量,因為訊息是發送給玩家的。不過,你可以為一個區域設定偏移量,而該區域之後便能以實體為目標。


range​

設定 NEARBY_PLAYERS、NEARBY_MOBS 與 NEARBY_ELITES 搜尋長方體的半寬。相同的固定值用於 X、Y、Z 三軸,並非球形距離上限。生物與精英查詢會排除施法首領。

使用固定非負數可獲得一致的搜尋區域。~ 範圍可能在每個軸分別取樣,並使用下方覆蓋率一節所述的浮點取樣器;它無法保證只抽取一個半徑來產生立方體。

設定項詳細說明預設值
range附近玩家、生物與精英查詢的半寬,以方塊為單位。20.0
範例
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: MESSAGE
Target:
targetType: NEARBY_PLAYERS
range: 25.0
sValue: "&2Targeted players within 25 blocks!"

首領死亡時,這會向從首領位置沿各座標軸往兩側延伸 25 格的長方體內的玩家發送訊息。

location​

為 LOCATION 目標類型設定位置。

設定項詳細說明預設值
location設定將被指定為目標的世界位置。none

位置格式為 location: worldname,x,y,z,yaw,pitch。也接受 worldname,x,y,z(yaw 與 pitch 預設為 0),以及不含世界的 x,y,z,yaw,pitch;但後者會使位置沒有世界,通常不適用。只有三個值的 x,y,z 無效,主控台會顯示 Attempted to deserialize an invalid location!。

請使用已載入的世界或 same_as_boss。解析不會載入世界;格式錯誤或無法解析世界可能導致使用目標時失敗。座標一律是絕對座標,包括使用 same_as_boss 時;此佔位符只改變世界。

若設定的世界尚未載入,且首領位於名為 <configuredWorld>_<number> 的世界,目標會改用該副本世界。此備援規則不會取代已載入的設定世界。

請注意,same_as_boss 是世界名稱的有效佔位符;例如 same_as_boss,100,64,100,0,0 就是一個有效的位置,會以首領所在的同一個世界為目標。

範例
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,yaw,pitch 格式,也接受與 location 相同的其他格式。

請注意,same_as_boss 是世界名稱的有效佔位符;例如 same_as_boss,100,64,100,0,0 就是一個有效的位置,會以首領所在的同一個世界為目標。

範例
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 的位置降下一道閃電,並在首領所在的同一個世界中 x=-100、y=12、z=130 的位置降下另一道閃電。


以區域為目標​

區域將原點目標與使用其幾何形狀的動作分開。Zone.Target 提供原點;動作的 ZONE_FULL 或 ZONE_BORDER 目標從產生的形狀選取結果。多個原點可產生多個形狀。實體結果會去除重複項目,但重疊形狀仍可能提供重複的粒子位置。

區域的運作分為兩個部分:

第 1 部分 - 設定區域的位置​

區域需要知道自己應該位於何處,為此你會使用目標系統,方式與任何其他基於位置的效果(例如閃電)完全相同。

範例
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF

此片段展示半徑 10、高度 1、從首領腳部向上延伸的圓柱。它還沒有動作,只是一段設定;可執行的腳本需要下方的 Actions。filter: PLAYER 作用於實體查詢,不會篩選粒子使用的幾何位置。

某些區域,例如 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

這會在圓柱內的取樣位置生成粒子,而非玩家位置。動作執行 12 次,間隔 5 刻。區域粒子動作未明確設定 coverage 時,預設覆蓋率約為 30%。filter: PLAYER 不會將這些粒子限制在玩家身上。

請注意,並非每個區域都能使用 ZONE_BORDER。關於這點,請參閱腳本區域頁面。

區域追蹤​

請像下例一樣,在動作的 Target 上設定 track。為 true 時,通常會在請求區域形狀時重新解析移動中的原點。為 false 時,該動作在 wait 前快取區域形狀,固定原點;後續實體查詢仍會尋找當時位於快取形狀內的實體。它不會鎖定施法時在場的玩家。

設定項詳細說明預設值
track重新解析動作目標,而非快取區域原點與取樣位置。true

animationDuration 為正數時,無論 track 設定為何,動作都會在開始時快取動畫形狀。它快取的是形狀,而非其位置的靜態清單,因此動畫仍會繼續。詳情請見此處。

範例
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 部分的相同範例,現在區域被設定為不追蹤。這代表區域會生成在首領的位置,但即使首領持續移動離開,區域仍會停留在它最初生成的地方。

快取在動作啟動時、該動作等待之前建立。延遲 RUN_SCRIPT 也會延遲被呼叫腳本的啟動及其快取建立時間。

若要先警告、再在原位置造成傷害,請立即啟動兩個腳本,並在傷害動作設定 wait。若必須保證位置不受移動或先前動作影響,請為兩者指定相同的固定原點。

以下是一個取自冰霜宮殿聖殿(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 秒。

警告持續 3 秒,接著延遲的效果開始。兩個腳本立即啟動時會記錄相同的首領水平位置,但體積不同:視覺圓柱從腳部開始,高度為 1;傷害圓柱從低 1 格處開始,高度為 10。DAMAGE 以 10 刻間隔執行四次;SET_ON_FIRE 等待後執行一次,請求 80 刻的著火時間。動畫需要帶有 fire_zone 的相容自訂模型。

動作的每次執行都有自己的快取。同一腳本的重疊施法不會互相覆寫快取的位置,新的施法也永遠不會重複使用先前施法所快取的位置。

區域特定的目標屬性​

區域具有以下特定屬性:

coverage​

設定該動作實際會使用到的區域百分比。僅對位置目標有效(以玩家或其他實體為目標時不會生效)。

設定項詳細說明預設值
coverage保留區域位置的比例,例如 0.5 表示約一半。建議使用 0 到 1 的固定值。1.0

0.3~1.0 這類範圍會抽取 0.3 以上、未滿 1.0 的值,且可能為每個點分別抽取覆蓋率。請使用固定比例,讓覆蓋率可預測。明確設定 coverage: 1.0 會保留所有取樣位置;區域 SPAWN_PARTICLE 動作省略覆蓋率時預設為 0.3。覆蓋率不會減少實體查詢結果。靜態區域使用 track: false 時會快取並重複使用取樣的位置集合,而非每次重複執行都重新抽取。

範例
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% 機率被保留供粒子使用。最終數量約為一半,並非恰好一半。

繼承目標​

當一個腳本執行另一個腳本(或「呼叫」該腳本)時,可以將區域與目標資訊從第一個腳本傳遞給第二個腳本。

使用範例

  1. 更佳的腳本執行器

腳本執行器是指其唯一功能就是執行許多其他腳本的腳本。它們用來讓腳本管理更輕鬆,尤其是在處理數個需要精確時序的腳本時。

透過目標繼承,數個腳本可以使用同一個區域或目標,潛在地省去數百行重複的腳本撰寫。

  1. 俄羅斯娃娃式目標篩選

實際解析並篩選實體目標的父動作,可透過自己的 scripts 清單將快取結果傳給子腳本。父子目標類型必須相容。RUN_SCRIPT 本身不執行逐目標篩選路徑,因此為它加入 FILTERING 條件不會產生可繼承的篩選清單。

檢查標籤時,請在實體動作上搭配 ACTION_TARGET 與 FILTERING。隨機機率需要腳本層級條件或 BLOCKING 條件,不是逐實體的篩選擲骰。isAlive 檢查的是 Bukkit 有效性,因此反轉它並不能可靠地觸發玩家死亡後的行為。

  1. 複雜的區域

最後,你可以將目標層層堆疊以建立複雜的區域,必要時可選擇搭配條件使用;甚至可以利用腳本條件,以及從腳本動作中只執行所列腳本之一的能力,來建立半隨機化的區域。

注意: 在本節中,「父腳本」 指的是執行 「繼承腳本」 的腳本,而繼承腳本則是會使用所繼承之目標的腳本。

使用目標繼承時,務必仔細檢視 父腳本,以確保正確的資料有被往下傳遞。

INHERIT_SCRIPT_TARGET​

INHERIT_SCRIPT_TARGET 讀取呼叫子腳本的特定父動作之目標解析器或快取,而非父腳本所有目標的聯集。請將它用於子腳本的動作或區域原點,不要放在頂層 Conditions:頂層條件求值時尚無繼承的動作資料,繼承的目標在該處會因錯誤而失敗。

只有當父動作的 Target 設有 track: false 時,父動作才會傳遞其已解析、經條件篩選的目標。在預設的 track: true 下,子腳本會重新解析父動作的目標,且不套用父動作的篩選。RUN_SCRIPT 父動作從不解析自己的目標,因此其子腳本一律會重新解析實體。設有 track: false 時,子腳本確實會重複使用父動作在開始時快取的位置。還需注意:

  • 傳遞實體目標時,子腳本可將其用於實體動作或位置動作。位置動作會取得這些實體的位置。

  • 傳遞 位置目標 時,便只能使用位置。繼承位置的實體動作會因錯誤而失敗。從位置取得實體的唯一方式,就是在該位置建立一個區域並尋找實體。 所以,傳遞位置之後再取得實體並非不可能,只是會需要一點額外的工夫。

繼承區域​

使用 INHERIT_SCRIPT_ZONE_FULL 或 INHERIT_SCRIPT_ZONE_BORDER 時,父腳本 必須定義一個區域,否則 繼承腳本 將無法正確執行。

使用 track: false 的動作會在等待開始前快取區域形狀。追蹤中的動作通常不快取形狀,而會重新解析移動中的原點。傳遞父動作資料可重用快取形狀;設定 track: true 不會固定共用位置。

繼承的區域目標會使用父腳本自己的 Zone,以及呼叫動作所快取的形狀(若有快取)。INHERIT_SCRIPT_ZONE_FULL 的實體查詢與 ZONE_FULL 一樣使用完整體積檢查。若父腳本沒有有效的區域,或腳本不是由其他腳本呼叫,動作會因錯誤而失敗。

若要共用固定原點,請為呼叫動作的 Target 設定 track: false。子腳本便會重複使用父動作在開始時快取的形狀,即使子腳本自己的動作需要等待也是如此。