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% 機率被保留供粒子使用。最終數量約為一半,並非恰好一半。
繼承目標
當一個腳本執行另一個腳本(或「呼叫」該腳本)時,可以將區域與目標資訊從第一個腳本傳遞給第二個腳本。
使用範例
- 更佳的腳本執行器
腳本執行器是指其唯一功能就是執行許多其他腳本的腳本。它們用來讓腳本管理更輕鬆,尤其是在處理數個需要精確時序的腳本時。
透過目標繼承,數個腳本可以使用同一個區域或目標,潛在地省去數百行重複的腳本撰寫。
- 俄羅斯娃娃式目標篩選
實際解析並篩選實體目標的父動作,可透過自己的 scripts 清單將快取結果傳給子腳本。父子目標類型必須相容。RUN_SCRIPT 本身不執行逐目標篩選路徑,因此為它加入 FILTERING 條件不會產生可繼承的篩選清單。
檢查標籤時,請在實體動作上搭配 ACTION_TARGET 與 FILTERING。隨機機率需要腳本層級條件或 BLOCKING 條件,不是逐實體的篩選擲骰。isAlive 檢查的是 Bukkit 有效性,因此反轉它並不能可靠地觸發玩家死亡後的行為。
- 複雜的區域
最後,你可以將目標層層堆疊以建立複雜的區域,必要時可選擇搭配條件使用;甚至可以利用腳本條件,以及從腳本動作中只執行所列腳本之一的能力,來建立半隨機化的區域。
注意: 在本節中,「父腳本」 指的是執行 「繼承腳本」 的腳本,而繼承腳本則是會使用所繼承之目標的腳本。
使用目標繼承時,務必仔細檢視 父腳本,以確保正確的資料有被往下傳遞。
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。子腳本便會重複使用父動作在開始時快取的形狀,即使子腳本自己的動作需要等待也是如此。