エリートスクリプト条件
条件(Conditions)を使うと、スクリプターは特定の条件に基づいてスクリプトやアクションを実行しないようにできます。
Conditions の先頭は大文字にしてくださいスクリプト直下では、このキーは大文字と小文字を区別して読み取られます。そこに小文字で書いた conditions: は無視されるため、スクリプトは条件なしで実行され、何もログに出力されません。アクション内では大文字・小文字を問わず読み取られますが、1 つのアクションに 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 で結合され、すべて満たす必要があります。ブロック判定では、選択されたすべてのエンティティと位置が条件を満たす必要があります。空の選択だけでは失敗しないため、少なくとも1体必要なら targetCountGreaterThan: 0 を使います。条件ターゲットが ACTION_TARGET ではなく具体的な選択の場合、その別の選択を検査し、元のアクションターゲットをすべて残すか、すべて除外します。
フィルタリングはアクションの要求に従います。エンティティを使うアクションでは、有効性、タグ、オフセットなしの足元位置を確認します。位置を使うアクションでは位置条件だけを確認します。タグと isAlive は位置集合を絞り込めません。ただし、上記の SELF に対する特別なブロック判定は例外です。
スクリプト条件はアクションを開始する前に評価されます。アクションのブロック判定は wait の後と各繰り返し時に行われ、失敗するとそのアクションの残りの繰り返しを中止します。フィルタリングですべてのターゲットを除外しても、それだけでは今後の繰り返しは中止されません。スクリプト条件の失敗はクールダウンの開始を防ぎますが、アクション条件の失敗はスクリプトのクールダウンを取り消しません。
条件ブロックの配置
条件ブロックは次の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"
SET_WEATHER を実行するには、ボスの足元と3ブロック上の両方が空気である必要があります。ブロック条件はエンティティの位置を確認してからオフセット後の位置を確認します。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 キーは存在しません -- 各条件にはそれぞれ固有の正確な名前があり、そのうち3つは見た目どおりのパターンに従いません。認識されないキーは静かに無視されるのではなく、起動時に Failed to read key ... for script ... としてログに出力されます。
| 条件 | 対になるキー | 備考 |
|---|---|---|
isAlive | runIfAliveIs | ⚠️ runIfIsAliveIs ではありません |
hasTags | runIfHasTagIs | ⚠️ 単数形の Tag |
doesNotHaveTags | runIfDoesNotHaveTagIs | ⚠️ 単数形の Tag |
locationIsAir | runIfLocationIsAirIs | |
isOnFloor | runIfIsOnFloorIs | |
isStandingOnMaterial | runIfIsStandingOnMaterialIs | |
randomChance | runIfRandomChanceIs | |
targetCountLowerThan | runIfTargetCountLowerThanIs | |
targetCountGreaterThan | runIfTargetCountGreaterThanIs |
条件のキー名は大文字小文字を区別しないため、runifaliveis でも機能します。
runIfConditionTypeIs に効果はありませんrunIfConditionTypeIs はパーサーに警告なしで受け付けられますが、これを読み取るものは何もありません。BLOCKING と FILTERING の選択には conditionType を使ってください。これを反転する方法はありません。
例えば 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
その位置のブロックが固体でなく、1単位下のブロックが固体であるかを調べます。これは材質の判定であり、エンティティが実際に接地しているかや衝突形状を調べるものではありません。
| キー | 説明 | 値 |
|---|---|---|
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
天候アクションは、ボスの足元が非固体で、1単位下が固体の場合だけ実行されます。失敗するとこのアクションを停止します。
isStandingOnMaterial
対象位置から1単位下のブロックのマテリアルを厳密に比較します。
| キー | 説明 | 値 |
|---|---|---|
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
天候アクションはボスの足元から1単位下に 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
指定されたタグがすべて揃っていない場合に成功します。1つでも欠けていれば十分で、すべてが存在しない必要はありません。
| キー | 説明 | 値 |
|---|---|---|
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 を使います。