Elite Script 目標
目標(Targets)是 Elite Scripts 的核心部分,是動作(Actions)與區域(Zones)正常運作所必需的。
目標類型
目標類型設定腳本會以哪些實體或位置為目標。
| Target Type | 詳細說明 | 特殊事項 |
|---|---|---|
NEARBY_PLAYERS | 範圍內的玩家 | 需要 range |
NEARBY_MOBS | 範圍內的怪物 | 需要 range |
NEARBY_ELITES | 範圍內的精英 | 需要 range |
WORLD_PLAYERS | 世界中的玩家 | ❌ |
ALL_PLAYERS | 伺服器中的玩家 | ❌ |
DIRECT_TARGET | 事件中的玩家 | 需要相容的事件 |
SELF | 使用技能的精英 | ❌ |
SELF_SPAWN | 以首領的生成位置為目標 | ❌ |
LOCATION | 特定位置 | 需要 location |
LOCATIONS | 數個特定位置 | 需要 locations |
ZONE_FULL | 以區域內部為目標 | 需要 Zone |
ZONE_BORDER | 以區域邊界為目標 | 需要 Zone |
ACTION_TARGET | 繼承某個動作的目標。 | 只能用於動作的條件與相對向量!! |
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,它會將該訊息發送給所有在線玩家。
共享屬性
以下設定可以套用於所有目標。
| Values | 詳細說明 | 特殊事項 |
|---|---|---|
offset | 設定目標位置的偏移量。 | 無法以實體為目標! |
relativeOffset | 為目標位置設定一個相對偏移量。接受一個相對向量藍圖,讓偏移量能依首領的面向方向來計算。 | 無法以實體為目標! |
範例
eliteScript:
Example:
Events:
- EliteMobDeathEvent
Actions:
- action: STRIKE_LIGHTNING
Target:
targetType: SELF
offset: "0,2,0"
這會在首領上方 2 格處降下閃電。請注意,STRIKE_LIGHTNING 使用的是位置,並不會影響實體,因此可以套用偏移量。
你無法為發送訊息設定偏移量,因為訊息是發送給玩家的。不過,你可以為一個區域設定偏移量,而該區域之後便能以實體為目標。
range
設定在 NEARBY_PLAYERS 目標類型中掃描附近玩家的範圍。
| Values | 詳細說明 | 預設值 |
|---|---|---|
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 目標類型設定位置。
| Values | 詳細說明 | 預設值 |
|---|---|---|
location | 設定將被指定為目標的世界位置。 | none |
位置使用 location: worldname,x,y,z,pitch,yaw 的格式。
請注意,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 目標類型設定多個位置。
| Values | 詳細說明 | 預設值 |
|---|---|---|
locations | 設定將被指定為目標的世界位置清單。 | none |
位置使用 worldname,x,y,z,pitch,yaw 的格式。
請注意,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 的位置降下另一道閃電。
以區域為目標
區域擁有多個目標,了解它們的運作方式對於發揮 Elite Scripting 的最大潛力非常重要。
區域的運作分為兩個部分:
第 1 部分 - 設定區域的位置
區域需要知道自己應該位於何處,為此你會使用目標系統,方式與任何其他基於位置的效果(例如閃電)完全相同。
範例
eliteScript:
VisualCylinder:
Events:
- EliteMobDamagedEvent
Zone:
radius: 10.0
shape: CYLINDER
height: 1
filter: PLAYER
borderRadius: 5.0
Target:
targetType: SELF
這會在首領周圍生成一個圓柱形區域。請注意,此範例中尚未設定任何動作,那部分會在下方說明。
某些區域,例如 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
沿用第一部分的相同區域,我們現在加入動作。此動作的目標是 ZONE_FULL,這代表它會在整個區域內部生成粒子。
請注意,並非每個區域都能使用 ZONE_BORDER。關於這點,請參閱腳本區域頁面。
區域追蹤
設定區域是否會隨目標移動,例如當 targetType: SELF 時區域是否會在首領移動時跟著移動。
| Values | 詳細說明 | 預設值 |
|---|---|---|
track | 設定區域是否會隨目標四處移動。 | true |
請注意,可動畫化的區域無法追蹤。詳情請見此處。
範例
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 呼叫的腳本。
以下是一個取自冰霜宮殿聖殿(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 秒的警告階段,接著進入傷害階段;而即使區域被設定為不追蹤,警告區域與傷害區域仍會位於同一個位置。
區域特定的目標屬性
區域具有以下特定屬性:
coverage
設定該動作實際會使用到的區域百分比。僅對位置目標有效(以玩家或其他實體為目標時不會生效)。
| Values | 詳細說明 | 預設值 |
|---|---|---|
coverage | 設定區域被覆蓋的百分比。你可以使用 ~ 來隨機化這個值,例如:1.0~0.3。 | 1.0 |
範例
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% 的區域會被粒子覆蓋。
繼承目標
當一個腳本執行另一個腳本(或「呼叫」該腳本)時,可以將區域與目標資訊從第一個腳本傳遞給第二個腳本。
使用範例
- 更佳的腳本執行器
腳本執行器是指其唯一功能就是執行許多其他腳本的腳本。它們用來讓腳本管理更輕鬆,尤其是在處理數個需要精確時序的腳本時。
透過目標繼承,數個腳本可以使用同一個區域或目標,潛在地省去數百行重複的腳本撰寫。
- 俄羅斯娃娃式目標篩選
篩選條件可以套用在某個動作的目標上。透過將這些目標傳遞給另一個使用不同篩選條件的腳本,便可以將條件層層堆疊,並依據愈來愈具體的標準對同一群目標套用不同的效果。
舉例來說,你可以建立一個尋找玩家的區域,並製作一個動作來檢查區域內所有玩家是否擁有特定標籤。接著可將有效的目標傳遞給另一個腳本,在那裡另一個動作可以執行隨機檢查條件,並依該機率套用效果。然後目標還能繼續傳遞給另一個腳本,在那裡另一個條件可以檢查這些目標是否仍存活,若已死亡則執行某些特殊行為。
當然,這些只是範例。它是一個高度彈性的系統。
- 複雜的區域
最後,你可以將目標層層堆疊以建立複雜的區域,必要時可選擇搭配條件使用;甚至可以利用腳本條件,以及從腳本動作中只執行所列腳本之一的能力,來建立半隨機化的區域。
注意: 在本節中,「父腳本」 指的是執行 「繼承腳本」 的腳本,而繼承腳本則是會使用所繼承之目標的腳本。
使用目標繼承時,務必仔細檢視 父腳本,以確保正確的資料有被往下傳遞。
INHERIT_SCRIPT_TARGET
使用 INHERIT_SCRIPT_TARGET 時,來自 父腳本 的目標會被往下傳遞給繼承腳本。這有幾項注意事項:
-
傳遞 實體目標 時,可以執行需要位置的動作(例如生成粒子),因為會使用這些實體的位置。當然,也可以使用需要實體的動作。
-
傳遞 位置目標 時,便只能使用位置。從位置取得實體的唯一方式,就是在該位置建立一個區域並尋找實體。 所以,傳遞位置之後再取得實體並非不可能,只是會需要一點額外的工夫。
繼承區域
使用 INHERIT_SCRIPT_ZONE_FULL 或 INHERIT_SCRIPT_ZONE_BORDER 時,父腳本 必須定義一個區域,否則 繼承腳本 將無法正確執行。
此外,區域可以選擇性地被追蹤。這同樣會隨著區域一起傳遞。
-
未追蹤的 區域永遠會在 繼承腳本 所定義的地方建立一個區域。這代表 繼承腳本 中的動作會使用區域設定,在每次動作執行時建立全新的區域,而這些區域的位置將由動作來決定。
-
如果 父腳本 被設定為以
ZONE_FULL或ZONE_BORDER為目標,已追蹤的 區域便可以將完全相同的區域位置傳遞給所有 繼承腳本。這代表每個腳本都會作用在相同的位置上。