跳至主要內容

Elite Script 條件

條件(Conditions)讓腳本編寫者能夠根據特定條件,使腳本與/或動作不執行。

腳本層級的 Conditions 必須以大寫字母開頭

在腳本層級,此鍵的讀取區分大小寫。寫在該處的小寫 conditions: 會被忽略,腳本會在完全沒有條件的情況下執行,且不記錄任何訊息。在動作內部,此鍵不分大小寫皆可讀取,但若一個動作同時包含 Conditions: 與 conditions:,EliteMobs 會略過整個腳本。請使用 YAML 映射,而不是清單。內部鍵(isAlive、conditionType、Target 等)不區分大小寫,但 BLOCKING 和 FILTERING 等列舉值必須大寫。

範例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Conditions:
isAlive: true
conditionType: BLOCKING
Target:
targetType: SELF
Actions:
- action: PLACE_BLOCK
Target:
targetType: SELF
offset: 0,3,0
duration: 20
material: DIRT
Conditions:
locationIsAir: true
conditionType: FILTERING
Target:
targetType: ACTION_TARGET
Cooldowns:
local: 60
global: 20

Example 要求首領實體有效。動作檢查其位置上方 3 格的方塊,僅在該處為空氣時放置泥土,持續 20 tick。每個動作都可以有自己的條件。

Target​

條件使用 Targets 系統。條件的 Target 獨立於動作的 Target,省略時預設為 SELF。在動作的 FILTERING 條件中使用 ACTION_TARGET,可逐一檢查動作解析出的目標。

腳本條件和動作的 BLOCKING 條件會解析自己的 Target。SELF 或 NEARBY_PLAYERS 等實體目標會為每項檢查提供實體。LOCATION 與 LOCATIONS 不提供實體:只有位置檢查會套用到它們的位置,且目標數量為 0。ACTION_TARGET 在此流程中不會解析出任何東西,因此只有 randomChance 與目標數量會套用。LANDING_LOCATION 在腳本層級條件中會失敗,因為這些條件在落地位置產生之前就會執行。


條件類型​

鍵說明值
conditionType設定條件的類型BLOCKING / FILTERING

BLOCKING 阻止條件所在的整個腳本或單一動作執行。阻止一個動作不會阻止其他動作。FILTERING 搭配 ACTION_TARGET 會移除未通過適用檢查的目標。

動作之外的條件永遠是 BLOCKING。動作之內的條件則可以是 BLOCKING 或 FILTERING。

注意:如果目標是 SELF(首領)且條件檢查為 isAlive,該檢查永遠是 BLOCKING! 即使把它放在 FILTERING 條件裡,這個特定部分仍會以 BLOCKING 的方式運作。

動作之內的條件預設為 FILTERING。

使用 ACTION_TARGET 搭配 FILTERING 檢查每個已解析的動作目標。BLOCKING 需要 SELF 或 NEARBY_PLAYERS 等具體條件目標;其實體計數流程不會解析 ACTION_TARGET。

randomChance、targetCountLowerThan 和 targetCountGreaterThan 只在腳本層級或動作的 BLOCKING 條件中檢查。逐目標的 FILTERING 流程不會評估它們。

適用檢查以 AND(且)組合,必須全部通過。阻擋檢查要求選取的所有實體和位置都通過。空集合本身不會導致失敗;如需至少一個實體,請使用 targetCountGreaterThan: 0。當條件目標是具體選取而非 ACTION_TARGET 時,篩選會檢查這個獨立集合,然後保留動作的全部原始目標,或將它們全部移除。

篩選取決於動作要求的目標類型:實體動作檢查實體有效性、標籤和未經偏移的腳部位置;位置動作只檢查位置條件。標籤和 isAlive 無法篩選位置集合,但上述針對 SELF 的特殊阻擋有效性檢查除外。

腳本條件在啟動動作前檢查。動作的阻擋條件在 wait 之後及每次重複時檢查;失敗會取消該動作剩餘的重複。篩除所有目標本身不會取消後續重複。腳本條件失敗會阻止其冷卻開始;動作條件失敗不會撤銷腳本的冷卻。


條件區塊放置​

你可以用兩種方式放置或巢狀條件區塊:

  1. 置於個別動作之下 – 條件只會套用在某個特定動作上。若符合條件,動作便執行;否則就不執行。

  2. 置於整個腳本之下 – 條件會套用到腳本內的所有動作。若不符合條件,則所有動作都不會執行。

以下範例示範如何為個別動作與整個腳本巢狀放置條件區塊。

置於個別動作之下:

範例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: MESSAGE
Target:
targetType: NEARBY_PLAYERS
range: 10
sValue: "&2Hello World!"
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
locationIsAir: true
Target:
targetType: SELF
offset: "0,3,0"

首領腳部所在方塊和上方 3 格的方塊都必須是空氣,SET_WEATHER 才會執行。阻擋條件先檢查實體位置,再檢查偏移後的位置。MESSAGE 沒有條件,因此仍會執行。

置於整個腳本之下:

範例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: MESSAGE
Target:
targetType: NEARBY_PLAYERS
range: 10
sValue: "&2Hello World!"
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
locationIsAir: true
Target:
targetType: SELF
offset: "0,3,0"

首領腳部所在方塊和上方 3 格的方塊都必須是空氣,才會在受擊時允許這兩個動作執行。否則整個腳本被阻擋,包括 SET_WEATHER 和 MESSAGE。


以 runIf...Is 反轉條件​

每個條件都有一個對應的 runIf...Is 鍵可以把它反轉。它們全都是布林值,且全都預設為 true(意思是「條件為真時執行」)。把其中之一設為 false 就會反轉該條件。

並沒有通用的 runIfConditionIs 鍵 —— 每個條件都有自己確切的名稱,而其中三個不遵循直覺的命名模式。無法辨識的鍵不會被靜默忽略;它會在啟動時記錄 Failed to read key ... for script ...。

條件對應鍵備註
isAliverunIfAliveIs⚠️ 不是 runIfIsAliveIs
hasTagsrunIfHasTagIs⚠️ 單數的 Tag
doesNotHaveTagsrunIfDoesNotHaveTagIs⚠️ 單數的 Tag
locationIsAirrunIfLocationIsAirIs
isOnFloorrunIfIsOnFloorIs
isStandingOnMaterialrunIfIsStandingOnMaterialIs
randomChancerunIfRandomChanceIs
targetCountLowerThanrunIfTargetCountLowerThanIs
targetCountGreaterThanrunIfTargetCountGreaterThanIs

條件鍵名不區分大小寫,因此 runifaliveis 同樣可用。

runIfConditionTypeIs 不起作用

runIfConditionTypeIs 會被解析器接受且不會發出警告,但沒有任何程式碼會讀取它。請使用 conditionType 來選擇 BLOCKING 或 FILTERING;沒有辦法反轉它。

例如,locationIsAir: true 要求空氣。加入 runIfLocationIsAirIs: false 會反轉比較,要求非空氣方塊。反轉針對設定的比較結果,因此將布林條件及其對應鍵同時設為 false,會再次反轉比較。

範例:

eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
locationIsAir: true
runIfLocationIsAirIs: false
Target:
targetType: SELF

此動作僅在首領腳部所在方塊不是空氣時設定雷暴,例如首領在水中時。反轉 isAlive 檢查的是 Bukkit 有效性,不會建立死亡觸發器;實體不存在時,即使反轉也會失敗。


基於位置的條件​

locationIsAir​

檢查目標方塊是否為空氣,包括洞穴空氣和虛空空氣。設為 false 可要求非空氣方塊。

鍵說明值
locationIsAir設定用來檢查該位置是否為空氣方塊(或相反)。Boolean
範例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
locationIsAir: true
Target:
targetType: SELF
offset: "0,3,0"

天氣動作要求首領腳部所在方塊和上方 3 格都為空氣。如果位置動作只應檢查實際目標位置,請像第一個範例一樣使用 FILTERING 和 ACTION_TARGET。


isOnFloor​

檢查目前位置的方塊不是固體,且下方一個單位處的方塊是固體。這是材質檢查,不檢查實體的實際接地狀態或碰撞形狀。

鍵說明值
isOnFloor設定用來檢查該位置是否為地面位置(或相反)。Boolean
範例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
isOnFloor: true
Target:
targetType: SELF

天氣動作要求首領腳部所在方塊非固體,且下方一個單位處的方塊為固體。失敗只會阻止此動作。


isStandingOnMaterial​

精確比較目標位置下方一個單位處方塊的材質。

鍵說明值
isStandingOnMaterial設定要檢查的材質類型。Material
範例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
isStandingOnMaterial: BIRCH_WOOD
Target:
targetType: SELF

天氣動作要求首領腳部下方一個單位處為 BIRCH_WOOD。BIRCH_LOG 和 BIRCH_PLANKS 不符合。失敗只會阻止此動作。

基於實體的條件​

isAlive​

檢查目標實體的 Bukkit isValid() 狀態。這是有效性檢查,不直接比較生命值;實體不存在時檢查失敗。

鍵說明值
isAlive預期的 Bukkit 實體有效性。布林值
範例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
isAlive: true
Target:
targetType: SELF

天氣動作只在首領的 Bukkit 實體有效時執行。失敗只會阻止此動作。


hasTags​

要求受管理的精英怪或玩家的 EliteMobs 標籤儲存中包含列出的全部標籤。標籤是區分大小寫的字串,可透過 TAG 和 UNTAG 等動作設定。不會讀取原版計分板標籤,一般怪物也沒有這種儲存。沒有此儲存時,反轉前的 hasTags 失敗,而 doesNotHaveTags 通過。

鍵說明值
hasTags設定用來檢查該實體是否擁有一組標籤。String List
範例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
hasTags:
- isCool
- hasANiceBeard
Target:
targetType: SELF

天氣動作要求首領同時擁有 isCool 和 hasANiceBeard。失敗只會阻止此動作。


doesNotHaveTags​

當目標沒有集齊全部指定標籤時通過。缺少任意一個就足夠,並不要求所有標籤都不存在。

鍵說明值
doesNotHaveTags設定用來檢查該實體是否沒有一組標籤。String List
範例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
doesNotHaveTags:
- isStinky
- isSus
Target:
targetType: SELF

除非首領同時擁有 isStinky 和 isSus,否則動作會執行。只有其中一個標籤時仍可通過。

其他條件​

randomChance​

每次阻擋檢查進行到此條件時都會重新產生亂數。請使用 0.0(從不)到 1.0(總是)的單一數值,不支援 ~ 範圍。runIfRandomChanceIs: false 會反轉結果。對於重複動作,一次失敗就會取消其剩餘重複。

鍵說明值
randomChance條件成立的機率。介於 0.0 與 1.0 之間的數字
範例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
randomChance: 0.1
Target: # Not required
targetType: SELF # Not required

天氣動作在每次檢查時有 10% 的機率執行。失敗只會阻止此動作。

條件的明確 Target 可省略,因為它預設為 SELF。省略並不會停用同一區塊中的其他條件。

使用標籤篩選 NEARBY​

若要根據特定標籤篩選 NEARBY_MOBS 或 NEARBY_PLAYERS,請使用 ACTION_TARGET 作為條件的目標(前提是該條件套用在動作上,而非腳本本身)。這能確保腳本準確地只篩選出帶有指定標籤的怪物/玩家。

範例
eliteScript:
Example:
Actions:
- action: SET_MOB_AI
Target:
targetType: NEARBY_MOBS
range: 40
bValue: false
Conditions:
conditionType: FILTERING
hasTags:
- TurnOff
Target:
targetType: ACTION_TARGET

此腳本關閉各軸向外延伸 40 格的搜尋盒內、帶有 TurnOff 標籤的受管理精英怪的 AI,首領自身除外。一般怪物沒有這種標籤儲存。範例沒有 Events,需從其他腳本呼叫,或加入觸發事件。

targetCountLowerThan 與 targetCountGreaterThan​

在檢查標籤及其他逐實體條件前,比較條件目標的實體數量。它不統計動作篩選後的目標。比較是嚴格的,相等時不會通過。

鍵說明值
targetCountLowerThan要求條件目標的實體數量嚴格小於門檻值。整數
鍵說明值
targetCountGreaterThan要求條件目標的實體數量嚴格大於門檻值。整數
範例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
targetCountGreaterThan: 2
Target:
targetType: NEARBY_MOBS
range: 15

各軸向外延伸 15 格的搜尋盒內,除首領外的非玩家生物實體超過 2 個時,天氣動作才會執行。

請明確設定條件的 Target 以統計所需群體。省略時會統計預設的 SELF 選取。使用 targetCountGreaterThan: 0 可要求非空集合。