Lua 腳本:區域與目標選擇
EliteMobs 的 Lua 功能提供了兩種互補的方法來定義空間區域和解析目標:
- 原生區域 (
context.zones) -- 簡單直接。將區域定義構建為普通的 Lua 表,然後查詢實體或位置。最適合簡單的「這個區域內有東西嗎?」檢查。 - 腳本工具 (
context.script) -- 更豐富的目標選擇,帶有 watch/contains/entities 方法的區域控制碼,粒子生成、傷害和推動動作。使用與 EliteScript 區域和 EliteScript 目標相同的欄位名稱以便於熟悉。
兩種方法都是原生 Lua API。選擇適合你能力複雜度的方法。
原生區域:context.zones
原生區域接受一般 Lua 表。每次查詢都會建立新形狀,觀察器則保留同一個形狀。因此,反覆查詢動畫射線會重新啟動動畫,不會讀取觀察器目前的形狀。多個操作需要共用同一個動畫形狀時,請使用腳本區域控制碼。
方法
| 方法 | 說明 |
|---|---|
zones:get_entities_in_zone(zoneDef[, options]) | 傳回區域內實體包裝器的陣列 |
zones:get_locations_in_zone(zoneDef[, options]) | 傳回區域內位置表的陣列 |
zones:zone_contains(zoneDef, location[, "full"|"border"]) | 如果位置在區域內則傳回 true |
zones:watch_zone(zoneDef, callbacks[, options]) | 註冊每 tick 檢查的持久區域觀察器 |
區域定義欄位
| 欄位 | 類型 | 預設值 | 說明 |
|---|---|---|---|
kind(或 type) | string | — | "sphere", "dome", "cylinder", "cuboid", "cone", "static_ray", "rotating_ray", "translating_ray" |
radius | number | 0 | 區域半徑(sphere、dome、cylinder、cone) |
height | number | 0 | 圓柱體高度 |
origin | location | Boss 位置 | 形狀原點:圓柱底面、錐體頂點或射線起點 |
destination | location | Boss 位置 | 射線和錐體的終點 |
x, y, z | number | 0 | 長方體尺寸;參閱點與實體的幾何判定限制 |
thickness / point_radius / pointRadius | number | 0.5 | 射線取樣半徑與間距;必須為正數 |
border_radius / borderRadius | number | 1 | 從外部形狀排除的內半徑 |
x_border, y_border, z_border | number | 1 | 內部長方體尺寸 |
animation_duration | int | 0 | 動畫射線的動畫長度(tick 為單位) |
pitch_pre_rotation, yaw_pre_rotation | number | 0 | 預旋轉角度(旋轉射線) |
pitch_rotation, yaw_rotation | number | 0 | 動畫全程的旋轉角度;目前動畫器只套用正增量 |
origin_end, destination_end | location | Boss 位置 | 平移射線的結束位置 |
ignores_solid_blocks | boolean | true | 射線是否穿過實體方塊 |
length | number | 0 | 建構器會儲存,但省略的 destination 在使用此備用值前已變成 Boss 位置;請明確指定終點 |
帶底線的數值與布林欄位也接受 camelCase(borderRadius、xBorder、animationDuration、pitchPreRotation、ignoresSolidBlocks)。位置欄位 origin_end 與 destination_end 必須使用底線名稱。EliteScript 的 Target 表不能替代原生位置欄位。
kind 區分大小寫kind 精確比對,必須小寫。"SPHERE" 或 "Sphere" 無法符合任何形狀,查詢會傳回空清單且不輸出主控台警告。
省略 origin 或 destination 都會使用 Boss 的目前位置。目前的位置解析器使 length 無法替代省略的終點。請提供不同的端點:
local explicit_ray = { kind = "static_ray", origin = context.boss:get_eye_location(),
destination = context.player:get_eye_location() }
若要讓平移射線產生動畫,請提供 origin_end、destination_end 與正數 animation_duration。省略的最終端點會留在起始位置。零時長會建立靜態的初始射線;負數時長會被拒絕。最後一個動畫畫格會精確結束於所要求的端點。
所有端點與查詢位置都應位於 Boss 目前的世界:原生實體查詢搜尋的是該世界。位置表中省略的座標為 0;省略世界會使用 Boss 的世界,但明確指定的世界名稱必須已載入。尺寸必須是有限正數。點判定、粒子取樣與實體判定不能互換;共用的形狀限制包括完整圓頂使用球形實體判定、圓柱要求容納實體全高,以及長方體的不同判定範圍。
查詢選項
| 鍵 | 說明 |
|---|---|
filter | "player" / "players", "elite" / "elites", "mob" / "mobs", "living"(預設) |
mode | "full"(預設)或 "border" |
coverage | 0.0 到 1.0 -- 取樣位置的比例(預設 1.0) |
filter 不區分大小寫,未知值使用 living。mobs 指非玩家的活體實體,包括精英。Boss 自身被排除,但不會依遊戲模式篩選玩家。mode 不區分大小寫地辨識 border,其他值使用 full。Coverage 隨機取樣位置,不取樣實體,也不限制觀察器成員。射線請使用 full:邊界位置尚未支援,可能導致位置查詢失敗。
監視回呼
| 鍵 | 說明 |
|---|---|
on_enter | function(entity) -- 當實體進入區域時呼叫 |
on_leave | function(entity) -- 當實體離開區域時呼叫 |
範例:基本球體查詢
範例
return {
api_version = 1,
on_spawn = function(context)
-- Store a zone definition for reuse
context.state.danger_zone = {
kind = "sphere",
origin = context.boss:get_location(),
radius = 10
}
end,
on_boss_damaged_by_player = function(context)
-- Update the origin to the boss's current position
context.state.danger_zone.origin = context.boss:get_location()
local players = context.zones:get_entities_in_zone(
context.state.danger_zone,
{ filter = "players" }
)
for _, player in ipairs(players) do
player:send_message("&cYou are in the danger zone!")
end
end
}
範例:帶進入/離開的區域監視
範例
return {
api_version = 1,
on_spawn = function(context)
context.zones:watch_zone(
{
kind = "sphere",
origin = context.boss:get_location(),
radius = 8
},
{
on_enter = function(entity)
entity:apply_potion_effect("SLOWNESS", 40, 1)
entity:send_message("&7You feel sluggish near the boss...")
end,
on_leave = function(entity)
entity:send_message("&aYou escape the slowing aura.")
end
},
{ filter = "players", mode = "full" }
)
end
}
觀察器注意事項:
- 觀察器回呼直接接收單個實體包裝器,而不是透過
context.event - 觀察器呼叫自己的
on_enter/on_leave,不會呼叫能力頂層的on_zone_enter/on_zone_leave鉤子 - 當 Boss 被移除時,觀察器會自動清理
- 原生觀察器只建立一次形狀。中心不跟隨 Boss,修改原始表也不會移動現有觀察器。移動區域應使用新查詢,或使用帶追蹤目標的腳本區域。
- 每個觀察器每 tick 執行一次,因此保持回呼邏輯輕量
- Boss 實體本身被排除在區域查詢之外
第一次檢查在一個 tick 後發生;已在區域內的實體也會觸發 on_enter。取消或清理不會向剩餘成員傳送 on_leave。本例的球體停留在生成位置。緩速效果從進入時持續 40 ticks;留在區域內不會刷新,離開也不會提前移除。
腳本工具:context.script
腳本工具提供目標解析、區域控制碼、相對向量、粒子生成和戰鬥動作。
context.script 執行的就是 EliteScript 引擎規格表會轉換為 Java map,傳給 YAML EliteScript 使用的目標、區域、相對向量與粒子類別。
這在實務上代表:
- 規格表使用 EliteScript 目標、EliteScript 區域與 EliteScript 相對向量的解析器,包括現有限制。欄位被接受,不代表 Lua 控制碼具備所需的動作生命週期或繼承情境。
- 列舉值是精確的 UPPER_SNAKE_CASE(
"NEARBY_PLAYERS"、"SPHERE"、"ZONE_FULL"),與 YAML 相同。 - 使用這裡列出的標準 YAML 欄位名稱:
Target、Target2、targetType、borderRadius。內部讀取器不區分大小寫。 - 無效值可能產生警告、備用值,或留下稍後造成失敗的缺失欄位。接受表不等於驗證了整個操作。
context.zones 使用獨立的表讀取器及小寫 kind,但共用幾何類別。請提供含命名欄位的非空規格表:空 Lua {} 會轉換成 Java 清單,所以連 script:target({}) 也會失敗。請改用 script:target({targetType = "SELF"})。
方法
| 方法 | 說明 |
|---|---|
script:target(spec) | 從目標規格表建立目標控制碼 |
script:zone(spec) | 從區域規格表建立區域控制碼 |
script:relative_vector(spec[, actionLocation][, zoneHandle]) | 建立相對向量控制碼 |
script:damage(targetHandle, amount[, multiplier]) | 對已解析的目標造成傷害 |
script:push(targetHandle, vectorOrHandle[, additive]) | 推動已解析的目標 |
script:set_facing(targetHandle, vectorOrHandle) | 設定目標的朝向方向 |
script:spawn_particles(targetHandle, particleSpec) | 在已解析的目標位置生成粒子 |
damage、push、set_facing 與 spawn_particles 需要目標控制碼,不接受實體陣列,也沒有傳回結果。它們不套用 YAML 動作的條件、等待或篩選器。damage 以 Boss 為攻擊者向 Bukkit 提交傷害值;選用倍率只用於玩家戰鬥路徑,最終生命損失由戰鬥處理決定。push 立即解析目標及一個向量,在下一個 tick 將同一向量用於所有目標。預設取代速度;additive = true 則加到該 tick 的速度上。set_facing 立即為所有目標設定同一方向。請確認方向不為零且各分量有限。
目標控制碼方法
| 方法 | 說明 |
|---|---|
handle:entities() | 傳回實體包裝器陣列 |
handle:locations() | 傳回位置表陣列 |
handle:first_entity() | 傳回第一個實體或 nil |
handle:first_location() | 傳回第一個位置或 nil |
每個方法都會重新解析;first_* 不讀取共用快照,也不保證傳回最近的結果。DIRECT_TARGET 是事件擷取的目標,而非 Boss 目前的戰鬥目標;事件沒有提供目標時,它不會選取任何東西。
目標規格鍵
| 鍵 | 預設值 | 說明 |
|---|---|---|
targetType | "SELF" | 任何 EliteScript 目標類型 |
range | 20 | 附近搜尋框各軸的半寬;結果不依距離排序 |
coverage | 1.0 | 0.0 到 1.0;僅用於區域目標。其他類型上小於 1.0 的值會重設為 1.0 並警告 |
offset | 0,0,0 | 逗號分隔的 "x,y,z" 字串;此 EliteScript 欄位不接受 Lua 向量表 |
relativeOffset | 無 | 相對向量規格;來源與目的地目標決定方向 |
location | 無 | "LOCATION" 的序列化字串 "world,x,y,z,yaw,pitch" |
locations | 無 | "LOCATIONS" 的序列化位置字串陣列 |
track | true | 是否重新解析移動的目標 |
Lua 控制碼路徑不執行 YAML 動作的目標快取步驟。因此,靜態 Lua 目標或區域上的 track = false 不會固定位置。靜態區域每次查詢都重新解析原點;動畫區域在建立時快取形狀。固定範圍應使用帶明確座標的 LOCATION,或帶已擷取 origin 的原生區域。offset 與 relativeOffset 會移動控制碼解析出的每個位置,包括 LOCATION、LOCATIONS、SELF_SPAWN、以實體為基礎的目標,以及取樣的區域位置;它們不會移動 entities() 傳回的實體,而 LANDING_LOCATION 與 INHERIT_SCRIPT_TARGET 會忽略它們。區域控制碼的 full_target() 與 border_target() 不接受偏移,因此請將偏移放在區域的 Target 與 Target2 規格中。請參閱共用屬性。
解析器接受全部 17 個名稱:SELF、SELF_SPAWN、DIRECT_TARGET、NEARBY_PLAYERS、NEARBY_MOBS、NEARBY_ELITES、WORLD_PLAYERS、ALL_PLAYERS、LOCATION、LOCATIONS、ZONE_FULL、ZONE_BORDER、LANDING_LOCATION、ACTION_TARGET、INHERIT_SCRIPT_TARGET、INHERIT_SCRIPT_ZONE_FULL、INHERIT_SCRIPT_ZONE_BORDER。獨立 Lua 控制碼沒有繼承動作資料或落地位置。避免使用 INHERIT_* 與 LANDING_LOCATION,它們可能在解析時失敗。ACTION_TARGET 只在相容的相對向量或動作情境中有意義。參閱繼承區域的限制。
ZONE_FULL 與 ZONE_BORDER 應從區域控制碼取得目標;獨立的 script:target(...) 沒有區域。Lua 粒子輔助方法保留預設 coverage 1.0,不會採用 YAML SPAWN_PARTICLE 動作的預設值 0.3。
範例:建立和使用目標
範例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("roar", 200) then return end
-- Find all players within 20 blocks along each axis
local nearby = context.script:target({
targetType = "NEARBY_PLAYERS",
range = 20
})
for _, player in ipairs(nearby:entities()) do
player:send_message("&eThe boss roars in fury!")
end
-- First resolved entity; this does not promise the nearest player.
local first = nearby:first_entity()
if first then
first:show_title("&cRUN!", "&7The boss is targeting you")
end
end
}
區域控制碼方法
| 方法 | 說明 |
|---|---|
handle:full_target([coverage]) | 傳回整個區域體積的目標控制碼 |
handle:border_target([coverage]) | 傳回區域邊界的目標控制碼 |
handle:full_locations([coverage]) | 傳回整個區域體積中的位置 |
handle:border_locations([coverage]) | 傳回區域邊界上的位置 |
handle:full_entities() | 傳回整個區域體積中的實體 |
handle:border_entities() | 傳回區域邊界上的實體 |
handle:contains(location[, "full"|"border"]) | 如果位置在區域內則傳回 true |
handle:watch(callbacks[, mode]) | 監視區域的進入/離開事件,傳回任務 ID |
區域規格鍵
| 鍵 | 預設值 | 說明 |
|---|---|---|
shape | "CYLINDER" | "SPHERE", "DOME", "CYLINDER", "CUBOID", "CONE", "STATIC_RAY", "ROTATING_RAY", "TRANSLATING_RAY" |
radius | 5 | 球體、圓頂、圓柱體、錐體 |
height | 1 | 僅圓柱;實體查詢時必須容納實體全高 |
x, y, z | 0 | 長方體尺寸;參閱點與實體的幾何判定限制 |
xBorder, yBorder, zBorder | 0 | 內部長方體尺寸 |
borderRadius | 1 | 球體、圓頂、圓柱、錐體的內半徑 |
pointRadius | 0.5 | 射線的正數取樣半徑與間距 |
animationDuration | 0 | 動畫射線的動畫長度(tick 為單位) |
Target | {targetType = "SELF"} | 中心目標規格(表) -- 使用相同的目標規格格式 |
Target2 | 無 | 第二個點。錐體與所有射線形狀必填 |
FinalTarget, FinalTarget2 | 無 | 終點位置,僅平移射線適用 |
filter | "PLAYER" | "PLAYER"、"ELITE"、"LIVING" -- 注意這裡是大寫,與 context.zones 不同 |
ignoresSolidBlocks | true | 僅射線適用 |
pitchPreRotation, yawPreRotation | 0 | 僅旋轉射線適用 |
pitchRotation, yawRotation | 0 | 僅旋轉射線適用 |
不適用於所選 shape 的鍵會被讀取但不會有任何抱怨,然後被忽略 —— 在球體上設定 height 不會有任何作用。
contains 檢查點,不檢查實體邊界框。watch 的回呼格式與首次檢查行為和原生觀察器相同。透過 context.scheduler:cancel_task(id) 取消傳回的 ID;取消不會觸發離開回呼。靜態腳本區域可以每 tick 重新解析 SELF 來跟隨 Boss;動畫控制碼保留形狀。borderRadius 是內半徑,不是邊界厚度。射線應使用完整目標。
範例:帶傷害和粒子的區域
範例
return {
api_version = 1,
on_enter_combat = function(context)
-- Create a sphere zone centered on the boss
if context.state.zone_task_id ~= nil then return end
local zone = context.script:zone({
shape = "SPHERE",
radius = 6,
Target = { targetType = "SELF" }
})
-- Spawn warning particles on the zone border
context.script:spawn_particles(
zone:border_target(0.3),
{ particle = "FLAME", amount = 1, speed = 0.02 }
)
-- Damage all players inside the zone
local targets = zone:full_target()
context.script:damage(targets, 5.0)
-- First repeat after 20 ticks, then every 20 ticks.
context.state.zone_task_id = context.scheduler:run_repeating(20, 20, function(ctx)
local z = ctx.script:zone({
shape = "SPHERE",
radius = 6,
Target = { targetType = "SELF" }
})
ctx.script:spawn_particles(
z:border_target(0.3),
{ particle = "FLAME", amount = 1, speed = 0.02 }
)
ctx.script:damage(z:full_target(), 5.0)
end)
end,
on_exit_combat = function(context)
if context.state.zone_task_id ~= nil then
context.scheduler:cancel_task(context.state.zone_task_id)
context.state.zone_task_id = nil
end
end
}
本例在顯示粒子的同時立即傷害玩家,沒有預警延遲。重複操作從 20 ticks 後開始,退出戰鬥時停止。預設內半徑 1 使半徑 6 內的邊界成為厚殼,而非薄環。
相對向量規格鍵
| 鍵 | 說明 |
|---|---|
SourceTarget | 來源目標規格(表) |
DestinationTarget | 目的地目標規格(表) |
normalize | 布林值,預設 false;是否正規化向量 |
multiplier | 正規化後乘的係數,預設 1 |
offset | 逗號分隔的 "x,y,z" 字串,預設 "0,0,0";不是 Lua 向量表 |
相對向量控制碼方法
| 方法 | 說明 |
|---|---|
handle:resolve() | 傳回計算後的向量表 |
請提供兩個目標規格。解析取各自的第一個位置,依序執行目的地減來源位置、選用的正規化、乘法、世界座標軸偏移。空結果或不同世界會在套用偏移前傳回零;重合點正規化可能得到非有限向量。ACTION_TARGET 使用指定的 actionLocation,預設為建立控制碼時擷取的 Boss 位置,不會為每個被推動的實體單獨替換。若向量目標需要區域,請以第三個參數傳入區域控制碼。
範例:使用相對向量推動目標
範例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("knockback", 100) then return end
-- Build a vector from the boss toward the attacker
local vec = context.script:relative_vector({
SourceTarget = { targetType = "SELF" },
DestinationTarget = { targetType = "DIRECT_TARGET" },
normalize = true,
multiplier = 2.5
})
-- Push the attacker away
local target = context.script:target({
targetType = "DIRECT_TARGET"
})
context.script:push(target, vec)
end
}
粒子規格格式
粒子規格可以是字串、單個表或表的陣列。由於這條路徑執行的是 EliteScript 粒子引擎,這些鍵就是記載於 SPAWN_PARTICLE 底下的 EliteScript 鍵:
| 鍵 | 預設值 | 說明 |
|---|---|---|
particle | "FLAME" | 粒子名稱(如 "FLAME"、"DUST"、"SMOKE") |
amount | 1 | 粒子數量;為 0 時方向行為取決於粒子類型 |
x, y, z | 0.01 | 偏移/擴散值,當 amount 為 0 時則為速度 |
speed | 0.01 | 粒子速度 |
red, green, blue | 255 | DUST、DUST_COLOR_TRANSITION 及要求 Color 資料的粒子顏色(0–255);WITCH 不使用這些值 |
toRed, toGreen, toBlue | 255 | DUST_COLOR_TRANSITION 的過渡目標顏色 |
material | "STONE" | 帶有方塊/物品資料的粒子(BLOCK、ITEM、FALLING_DUST ⋯⋯)所顯示的方塊或物品 |
relativeVector | 無 | 一個相對向量規格。設定它會強制把 amount 設為 0,並以解析出的方向覆寫 x/y/z |
粉塵大小固定為 1。moveToTarget 會被解析,但不會移動粒子。不支援的資料類型會被略過並輸出警告。輔助方法將區域及 LOCATION / LOCATIONS 的粒子位置沿 X、Z 軸偏移 +0.5;控制碼傳回的位置不含此偏移。
這些 EliteScript 鍵與 context.world:spawn_particle_at_location(loc, spec) 所接受的鍵並不相同。world 表有它自己較小的讀取器,預設值也不同(amount 為 1,x/y/z/speed 為 0),沒有 material 也沒有 relativeVector,而且它額外接受 snake_case 的 to_red / to_green / to_blue。請參閱世界與環境。
有關完整的粒子名稱列表,請參閱列舉參考。
重要注意事項
- 腳本工具控制碼繫結到建立它們的事件上下文。不要將它們儲存在
context.state中以供後續鉤子呼叫使用。 context.script:zone(...):watch(...)傳回可由context.scheduler:cancel_task()取消的任務 ID。context.zones:watch_zone(...)不傳回任何值,會隨能力自動清理。- Coverage 值僅適用於基於位置的解析,不適用於實體查詢。
- 目標、形狀與篩選器列舉使用與 EliteScript YAML 相同的 UPPER_SNAKE_CASE 名稱(如
"SELF"、"NEARBY_PLAYERS"、"SPHERE")。watch/contains 模式仍為"full"或"border"。
em 輔助命名空間
em 命名空間在所有 Lua 能力檔案中全域可用。它提供了位置、向量和區域定義的便捷建構函式。
位置和向量建構函式
| 函式 | 說明 |
|---|---|
em.create_location(x, y, z[, world][, yaw][, pitch]) | 傳回帶有 add(dx, dy, dz) 方法的位置表 |
em.create_vector(x, y, z) | 傳回向量表 |
區域建構器輔助函式
em.zone 子表提供建構器函式,傳回與 context.zones 相容的區域定義表。每個建構器傳回帶有可鏈式呼叫的修改器方法的表。
| 函式 | 參數 | 修改器 |
|---|---|---|
em.zone.create_sphere_zone(radius) | radius | :set_center(location) |
em.zone.create_dome_zone(radius) | radius | :set_center(location) |
em.zone.create_cylinder_zone(radius, height) | radius, height | :set_center(location) |
em.zone.create_cuboid_zone(x, y, z) | x, y, z(長方體尺寸) | :set_center(location) |
em.zone.create_cone_zone(length, radius) | length, radius | :set_origin(location), :set_destination(location) |
em.zone.create_static_ray_zone(length, thickness) | length, thickness | :set_origin(location), :set_destination(location) |
em.zone.create_rotating_ray_zone(length, point_radius, animation_duration) | length, point_radius, animation_duration | :set_origin(location), :set_destination(location) |
em.zone.create_translating_ray_zone(length, point_radius, animation_duration) | length, point_radius, animation_duration | :set_origin(location), :set_destination(location) |
錐體與射線建構器儲存 length,但目前原生位置解析器會以 Boss 位置取代省略的終點。請串接 :set_origin(...) 與 :set_destination(...),不要依賴 length 設定方向。平移射線還需在傳回表中設定 origin_end、destination_end 與正數 animation_duration。
範例
範例
return {
api_version = 1,
on_spawn = function(context)
-- Create a location offset from the boss
local boss_loc = context.boss:get_location()
local above = em.create_location(boss_loc.x, boss_loc.y + 5, boss_loc.z, boss_loc.world)
-- Create a sphere zone using the builder
local zone = em.zone.create_sphere_zone(10):set_center(boss_loc)
-- Use with native zone queries
local players = context.zones:get_entities_in_zone(zone, { filter = "players" })
for _, p in ipairs(players) do
p:send_message("&cYou are within the boss's aura!")
end
-- Create a directional vector
local push_vec = em.create_vector(0, 1.5, 0)
context.boss:set_velocity_vector(push_vec)
end
}
每個腳本實例都有獨立的 Lua 環境與 em 命名空間。建構函式傳回新表;位置的 add(...) 方法及區域 setter 會修改呼叫它們的表。
原生區域 vs. 腳本工具
兩個系統使用相同的底層區域幾何。以下是每種方法的使用時機:
| 使用場景 | 建議方法 |
|---|---|
| 簡單的「這個區域內有東西嗎?」檢查 | 原生區域(context.zones) |
| 使用形狀快速查詢實體 | 原生區域 |
帶 coverage 的 NEARBY_PLAYERS、ZONE_FULL | 腳本工具(context.script) |
| 動畫區域(旋轉/平移射線) | 反覆讀取時使用腳本區域控制碼;原生觀察器也能保留動畫形狀 |
帶 watch/contains/entities 方法的區域控制碼 | 腳本工具 |
| 在區域位置生成粒子 | 腳本工具(spawn_particles) |
| 與目標選擇繫結的傷害和推動動作 | 腳本工具(damage、push) |
| 方向性效果的相對向量 | 腳本工具(relative_vector) |
| 將 Lua 控制流與豐富的目標選擇結合 | 腳本工具 |
同一能力可以使用兩種 API。請依所需目標及生命週期選擇:原生查詢預設選取 Boss 以外的活體實體,腳本區域預設選取玩家。
