跳至主要內容

建立能力

webapp_banner.jpg

撰寫能力的兩種方式

每個能力都存放於 ~/plugins/EliteMobs/powers(子資料夾也會被掃描),共有兩種格式:

格式檔案適用情境
Lua*.lua任何新內容。完整的腳本語言、所有 Boss 鉤子、迴圈與狀態。隨附的能力都使用這種格式。
EliteScript*.yml本頁其餘部分所記載的宣告式事件/動作格式。仍完整支援。

EliteMobs 隨附的 68 個能力中,幾乎全部都已改為 Lua。 只有 bonus_coins.ymlcustom_summon.ymlelite_script.yml 仍是以 YAML 為基礎的 Java 能力。如果你要從零開始撰寫新能力,Lua 才是背後能力最完整的路線——請從 Lua 入門指南Boss 鉤子與生命週期開始。

兩種格式從 Boss 引用的方式完全相同,都是透過 powers 清單。

A .lua power supersedes a same-named .yml power

當某個 Boss 要求 attack_fire.yml 時,EliteMobs 會先尋找 attack_fire.lua,若存在就使用它。這正是為什麼依照 Lua 之前的能力名稱寫成的舊 Boss 設定仍能原封不動地運作——你不需要重寫你的 powers: 清單。新的設定應直接指名 .lua 檔案。

Premade .lua files are written once, never overwritten

每個隨附的 Lua 能力,只有在 powers 資料夾中該檔案尚不存在時才會被寫入。一旦你編輯過其中之一,EliteMobs 在更新時就不會覆寫你的版本——但你也不會再收到上游對它的修正。如果你想要一份修改版,建議另外取一個新檔名。

on_zone_enter / on_zone_leave are not fired by Lua zones

這兩個鉤子名稱都會被 Boss 腳本提供者接受,也不會造成載入錯誤,但 Lua 能力中沒有任何東西能讓它們觸發。它們只會由 EliteScript 的區域監聽器派發,而該監聽器是在同一個 Boss 上的 YAML eliteScript: 於其 Events: 中列出 ZoneEnterEventZoneLeaveEvent 時才會啟動。只有 Lua 能力的 Boss 會載入含有這些鉤子的檔案,然後永遠不會呼叫它們。

除非你是刻意要把它與這類 YAML 區域腳本搭配使用,否則請不要圍繞這兩個鉤子建構 Lua 能力。請改用 context.zones:watch_zone(...)(它自己的 on_enter / on_leave 回呼會被直接呼叫)、EliteScript 的 Zone 區塊,或從 on_game_tick 輪詢。請參閱鉤子與生命週期腳本事件

EliteMobs 腳本系統

本頁其餘部分介紹了如何建立 Elite 腳本!

這是一項進階功能,需要對 EliteMobs 有深入的了解。

注意:Elite 腳本可以作為能力檔案添加,也可以添加到自訂 Boss 檔案中! 如果用作能力檔案,你可以像往常一樣使用自訂 Boss 的 powers 設定,將它們作為一般能力添加到 Boss 中。

添加 EliteScript

要開始向 Boss 添加 EliteScript,請在 Boss 檔案中添加以下條目:

eliteScript:

注意:以下內容對大小寫和空格極其敏感!請確保你的空格、換行符和整體格式與範例一致!

現在你已經宣告了腳本的開始,可以添加你的特定腳本了。在此範例中,我們將建立一個名為 Example 的腳本:

eliteScript:
Example:

EliteScripts 有 5 個不同的部分:EventsConditionsZonesActionsCooldowns。只有 Actions 是必要的。

讓我們看一個簡單的範例:

eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,0.5,0
Cooldowns:
local: 60
global: 20

此腳本使菁英怪在被玩家擊中時向上彈起,並且在 3 秒內不會再次觸發(由於 Cooldowns 部分的設定,其他能力也會在 1 秒內被阻止觸發)。

現在你已經了解了腳本結構的一般格式,是時候學習每個部分可以做什麼了!


Events

Events

點擊上方的連結了解如何使用事件!

Targets

Targets

點擊上方的連結了解如何使用目標!

Actions

Actions

點擊上方的連結了解如何使用動作!

Zones

Zones

點擊上方的連結了解如何使用區域!

Conditions

Conditions

點擊上方的連結了解如何使用條件!

Cooldowns

Cooldowns

點擊上方的連結了解如何使用冷卻時間!


添加多個 EliteScripts

你可以在一個事件上擁有多個動作,但如果你想在同一個 Boss 上擁有多個腳本呢?只需建立一個新的腳本條目即可!讓我們擴展前面的範例並添加另一個腳本:

eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,0.5,0
Cooldowns:
local: 60
global: 20
Example2:
Events:
- PlayerDamagedByEliteMobEvent
Actions:
- action: SET_ON_FIRE
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 200
global: 60

在這個範例中,我們添加了第二個名為 Example2 的腳本。Example2 會點燃被 Boss 傷害的玩家,這是因為 targetType 設定為 DIRECT_TARGET
此腳本的冷卻時間設定為 200 tick,這意味著 Boss 每 10 秒才能點燃玩家一次。

建立獨立能力

獨立能力幾乎完全由 Elite 腳本組成。只有兩個可選欄位。不要忘記,獨立能力必須放置在 ~plugins/EliteMobs/powers 資料夾中才能運作。
獨立能力範例:

isEnabled: true
powerType: UNIQUE
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,.3,0
Cooldowns:
local: 60
global: 20

isEnabled

與外掛程式其他地方一樣,設定能力是否啟用。

powerType

能力類型設定能力的分配方式。值為:

  • UNIQUE:能力僅套用於在能力部分設定了該能力的自訂 Boss。
  • DEFENSIVE / MISCELLANEOUS / OFFENSIVE:任何菁英怪都可以獲得這些能力,它們將計入特定的能力子集。
  • MAJOR_ZOMBIEMAJOR_SKELETONMAJOR_BLAZEMAJOR_ENDERMANMAJOR_GHAST:只有相應實體類型的菁英怪才能自然生成這些能力,它們將計為主要能力。這五種是唯一算作主要能力的類型;其餘全部算作次要能力。

powerType 如何影響自然菁英怪:EliteMobPowers.yml

powerType 本身並不會把某個能力送到自然菁英怪面前。自然菁英怪實際抽取的來源是 ~/plugins/EliteMobs/EliteMobPowers.yml,它包含下列清單:

意義
defensivePowers自然菁英怪可隨機抽到的防禦型能力
offensivePowers自然菁英怪可隨機抽到的攻擊型能力
miscellaneousPowers自然菁英怪可隨機抽到的雜項能力
majorPowers.<ENTITY_TYPE>該實體類型可隨機抽到的主要能力
disabledPowers.<ENTITY_TYPE>套用共用清單之後,要從該實體類型移除的能力

該檔案首次產生時,每個清單都會以所有符合對應 powerType 的已載入能力作為種子。在那之後該檔案即為權威,且永遠不會重新播種,因此你之後新增的能力——包含你丟進 powers 資料夾的任何 .lua 檔案——在你自行把它加入相關清單之前,都不會開始出現在自然菁英怪身上。

這些清單同時接受 .lua 檔名與舊式的 .yml 名稱;產生的預設值是以 .yml 別名寫入的。無法解析到任何能力的名稱會被略過,並在主控台發出指出該檔案與該鍵的警告。

effect

設定能力使用的視覺效果或材質。這由一些硬編碼的能力用來定義其視覺粒子或材質效果。

預設值
effectStringnone

powerCooldown

設定單個能力的冷卻時間(以 tick 為單位)。這控制此特定能力觸發的頻率。

預設值
powerCooldownInteger0

globalCooldown

設定所有能力共用的全域冷卻時間(以 tick 為單位)。此能力觸發後,在全域冷卻時間到期之前,其他能力無法觸發。

預設值
globalCooldownInteger0

製作獨立的 Lua 能力

獨立的 Lua 能力就只是放在 ~/plugins/EliteMobs/powers 中的一個 .lua 檔案(含子資料夾——該資料夾會被遞迴掃描)。沒有 YAML 包裝,也沒有任何設定鍵:檔案本身就是能力。

return {
api_version = 1,
on_player_damaged_by_boss = function(context)
if context.player == nil then
return
end
context.player:apply_potion_effect("BLINDNESS", 60, 0)
end
}

由於沒有 YAML 標頭可供讀取,以這種方式被發現的 Lua 能力會取得固定的中繼資料:

  • powerTypeMISCELLANEOUS。你無法從檔案中把它設為 UNIQUE。(EliteMobs 隨附的 Lua 能力是在 Java 中攜帶其類型的,這也是它們可以是 UNIQUEOFFENSIVEMAJOR_* 等等的原因。)
  • effect 為未設定。

實務上這不會讓你的能力外洩到隨機菁英怪身上,因為自然菁英怪的抽取池來自 EliteMobPowers.yml,而該檔案一旦存在就不會重新播種——請參閱上文。把該能力加入某個 Boss 的 powers: 清單即可使用它。

Boss Lua 能力可用的鉤子

鉤子觸發時機
on_spawnBoss 生成時
on_game_tick每個伺服器 tick
on_boss_damagedBoss 受到任何來源的傷害
on_boss_damaged_by_playerBoss 受到玩家的傷害
on_boss_damaged_by_eliteBoss 受到其他菁英怪的傷害
on_player_damaged_by_bossBoss 對玩家造成傷害
on_enter_combatBoss 進入戰鬥
on_exit_combatBoss 離開戰鬥
on_healBoss 治療
on_boss_target_changedBoss 切換目標
on_deathBoss 死亡
on_phase_switchBoss 切換階段

on_zone_enteron_zone_leave 同樣會被解析器接受,但 Lua 能力中沒有任何東西能讓它們觸發——它們只會由同一個 Boss 上的 EliteScript 區域監聽器派發。請參閱本頁最上方的警告。

關於你在這些鉤子中實際能呼叫什麼,請參閱 Lua 入門指南Boss 鉤子與生命週期Boss 與實體