跳至主要內容

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_BLOCKSUMMON_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_FULLtargetType: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

這個腳本做了很多事,但它被清楚地拆分為兩個腳本:VisualCylinderDamageCylinder

VisualCylinder 會先執行,並具有 RUN_SCRIPT 動作,它會在 VisualCylinder 執行的同時立刻也執行 DamageCylinder

然而,DamageCylinder 中的每一個動作都被設定為等待 60 刻,也就是 3 秒。

這代表首領會有一個 3 秒的警告階段,接著進入傷害階段;而即使區域被設定為不追蹤,警告區域與傷害區域仍會位於同一個位置。

區域特定的目標屬性

區域具有以下特定屬性:

coverage

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

Values詳細說明預設值
coverage設定區域被覆蓋的百分比。你可以使用 ~ 來隨機化這個值,例如:1.0~0.31.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% 的區域會被粒子覆蓋。

繼承目標

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

使用範例

  1. 更佳的腳本執行器

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

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

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

篩選條件可以套用在某個動作的目標上。透過將這些目標傳遞給另一個使用不同篩選條件的腳本,便可以將條件層層堆疊,並依據愈來愈具體的標準對同一群目標套用不同的效果。

舉例來說,你可以建立一個尋找玩家的區域,並製作一個動作來檢查區域內所有玩家是否擁有特定標籤。接著可將有效的目標傳遞給另一個腳本,在那裡另一個動作可以執行隨機檢查條件,並依該機率套用效果。然後目標還能繼續傳遞給另一個腳本,在那裡另一個條件可以檢查這些目標是否仍存活,若已死亡則執行某些特殊行為。

當然,這些只是範例。它是一個高度彈性的系統。

  1. 複雜的區域

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

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

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

INHERIT_SCRIPT_TARGET

使用 INHERIT_SCRIPT_TARGET 時,來自 父腳本 的目標會被往下傳遞給繼承腳本。這有幾項注意事項:

  • 傳遞 實體目標 時,可以執行需要位置的動作(例如生成粒子),因為會使用這些實體的位置。當然,也可以使用需要實體的動作。

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

繼承區域

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

此外,區域可以選擇性地被追蹤。這同樣會隨著區域一起傳遞。

  • 未追蹤的 區域永遠會在 繼承腳本 所定義的地方建立一個區域。這代表 繼承腳本 中的動作會使用區域設定,在每次動作執行時建立全新的區域,而這些區域的位置將由動作來決定。

  • 如果 父腳本 被設定為以 ZONE_FULLZONE_BORDER 為目標,已追蹤的 區域便可以將完全相同的區域位置傳遞給所有 繼承腳本。這代表每個腳本都會作用在相同的位置上。