メインコンテンツまでスキップ

パワーの作成

webapp_banner.jpg

パワーを書く 2 つの方法​

ファイルで定義するパワーは、サブフォルダーを含む plugins/EliteMobs/powers に配置します。形式は 2 つあります。

形式ファイル用途
Lua*.luaボスフック、ループ、状態を使ったスクリプト動作。同梱パワーの大半がこの形式です。
EliteScript*.ymlこのページの残りで説明する宣言的なイベント/アクション形式。引き続き完全にサポートされています。

同梱パワー 71 個のうち、68 個が Lua を使います。YAML ベースの Java パワーは bonus_coins.yml、custom_summon.yml、elite_script.yml の 3 つです。新しい動作を作る場合は、Lua はじめにとボスのフックとライフサイクルから始めてください。

どちらの形式も、powers リストを通じてボスから同じ方法で参照されます。

サブフォルダー間でもファイル名が重複しないようにしてください。登録にはフォルダー付きのパスではなくファイル名を使うため、サブフォルダーで同名ファイルを分離できません。2 つのファイルが同じ名前を持つ場合、EliteMobs はフルパスの並び順が先のファイルを読み込み、もう一方については Duplicate content filename をログに出力します(2 つのファイルの内容が同一の場合を除く)。編集後は /em reload を実行し、読み込み警告を確認してください。

同名の .yml パワーより .lua パワーが優先されます

ボスが attack_fire.yml を要求すると、EliteMobs は正常に読み込まれた attack_fire.lua を先に探します。.yaml の指定にも同じ検索が適用されます。Lua 版の読み込みに成功すれば、古い参照を維持できます。新しい設定では .lua ファイルを直接指定し、登録されたファイル名の大文字小文字に合わせてください。

同梱 .lua ファイルは一度だけ書き出され、編集したファイルは上書きされません

同梱 Lua パワーは、powers 以下に対応するファイルが見つからない場合にだけ書き出されます。アップデートで同梱パワーが修正されると、EliteMobs は過去に同梱したバージョンのチェックサムを一覧に持ちます。いずれかと一致する未編集のコピーは plugins/MagmaCore/outdated files/EliteMobs/ に移動され、同じ起動時に現在のバージョンが書き出されます。編集したファイルは一致しないため、そのまま保持され、公式の修正は反映されません。変更したコピーには別のファイル名を付け、保持された同梱ファイルと使用したいバージョンを比較してください。

Lua ゾーンは on_zone_enter / on_zone_leave を発火させません

両方のフック名は受け付けられますが、Lua ゾーンを作成しても発火しません。組み込みの発生元は EliteScript のゾーンリスナーです。同じボスの YAML スクリプトが Events: に ZoneEnterEvent または ZoneLeaveEvent を指定し、使用可能なゾーンを定義すると開始されます。イベントはそのボスの該当する全パワーに届き、発生元の YAML ゾーンは識別できません。Lua のみのボスでフックを宣言するだけでは実行されません。

そうした YAML のゾーンスクリプトと意図的に組み合わせるのでない限り、この 2 つのフックを軸に Lua パワーを組み立てないでください。代わりに context.zones:watch_zone(...)(渡した on_enter / on_leave コールバックが直接呼ばれます)、EliteScript の Zone ブロック、または on_game_tick からのポーリングを使用してください。フックとライフサイクルとスクリプトイベントを参照してください。

EliteMobsスクリプティングシステム​

このページの残りでは、Elite Scriptの作成方法について説明します!

これは上級機能であり、EliteMobsについての深い知識が必要です。

注意:Elite Scriptはパワーファイルとして、またはカスタムボスファイルに追加できます! パワーファイルとして使用する場合、通常どおりカスタムボスのpowers設定を使用して、ボスに通常のパワーとして追加できます。

EliteScriptの追加​

ボスにEliteScriptを追加するには、ボスファイルに以下のエントリを追加します:

eliteScript:

注意:以下は大文字小文字とスペースに非常に敏感です!スペース、改行、全体的なフォーマットが例と一致していることを確認してください!

スクリプトの開始を宣言したら、特定のスクリプトを追加できます。この例では、Exampleというスクリプトを作成します:

eliteScript:
Example:

EliteScript のセクションは Events、Conditions、Zone、Actions、Cooldowns の 5 つです。動作させるには空でない Actions リストを指定してください。他のスクリプトや着地コールバックから呼ばれるスクリプトでは Events を省略できますが、呼び出し元がなければ自動実行されません。Conditions と Cooldowns はリストではなくマッピングです。

簡単な例を見てみましょう:

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

条件を満たすプレイヤーの攻撃を受けると、エリートを上に押し上げ、ローカル 60 ティック、グローバル 20 ティックのクールダウンを開始します。20 TPS ではそれぞれ 3 秒と 1 秒です。グローバルクールダウンはそれを確認するパワーにのみ影響し、すべてのフックやアクションを止めるわけではありません。イベントで起動する YAML スクリプトは、ローカルまたはグローバルの値が正の場合にクールダウンを確認します。呼び出されたスクリプトの動作は、下記のクールダウンガイドを参照してください。

スクリプトの構造の一般的なフォーマットがわかったところで、各セクションで何ができるか学びましょう!


イベント

イベント

上のリンクをクリックして、イベントの使い方を学びましょう!

ターゲット

ターゲット

上のリンクをクリックして、ターゲットの使い方を学びましょう!

アクション

アクション

上のリンクをクリックして、アクションの使い方を学びましょう!

ゾーン

ゾーン

上のリンクをクリックして、ゾーンの使い方を学びましょう!

条件

条件

上のリンクをクリックして、条件の使い方を学びましょう!

クールダウン

クールダウン

上のリンクをクリックして、クールダウンの使い方を学びましょう!


複数のEliteScriptの追加​

1つのイベントに複数のアクションを設定できますが、同じボスに複数のスクリプトが必要な場合はどうすればよいでしょうか?新しいスクリプトエントリを作成するだけです!前の例を拡張して、別のスクリプトを追加しましょう:

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
duration: 20
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 200
global: 60

Example2 は DIRECT_TARGET を使い、ダメージを受けたプレイヤーに 20 ティック間火をつけます。ローカル 200 ティックのクールダウンにより、20 TPS では 10 秒間、このスクリプトのイベントによる再実行を防ぎます。グローバル 60 ティックのクールダウンは、ボスのクールダウンを確認するパワーと共有されます。他のスクリプトは独立して火をつけられます。

スタンドアロンパワーの作成​

独立した YAML パワーは plugins/EliteMobs/powers に配置します。eliteScript ブロックが動作を定義し、以下の任意のメタデータ項目が読み込み、分類、表示、クールダウンのメタデータを制御します。例:

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

isEnabled​

設定されたパワーを有効にするかを制御し、既定値は true です。カスタム Lua では、付随するメタデータファイルを無効にすると、その Lua ファイルは検出対象になりません。同梱 Lua パワーは、付随ファイルが無効でも読み込まれますが、後述のとおり無効としてマークされます。

powerType​

パワータイプは、既定の抽選リストと周回リングの分類に使うカテゴリーメタデータです。値は次のとおりです:

  • UNIQUE:明示的な割り当て用です。自動生成される共有リストからは除外されますが、自然発生用のリストに手動で追加することはできます。
  • DEFENSIVE / MISCELLANEOUS / OFFENSIVE:対応する共有リストがない場合、その初期生成に使われます。実際の割り当て可否は設定済みリスト、有効状態、モブのレベルによります。
  • MAJOR_ZOMBIE、MAJOR_SKELETON、MAJOR_BLAZE、MAJOR_ENDERMAN、MAJOR_GHAST:この 5 つはメジャーパワーで、それ以外はマイナーパワーです。自然発生時の割り当てはエンティティの majorPowers リストを使い、タイプ名の末尾とエンティティが一致するかを実行時に確認するわけではありません。

powerType が自然発生エリートに届く仕組み:EliteMobPowers.yml​

自然発生エリートは powerType だけでなく、plugins/EliteMobs/EliteMobPowers.yml のリストから抽選します。次の項目があります。

キー意味
defensivePowers自然発生エリートがランダムに引ける防御系パワー
offensivePowers自然発生エリートがランダムに引ける攻撃系パワー
miscellaneousPowers自然発生エリートがランダムに引けるその他のパワー
majorPowers.<ENTITY_TYPE>そのエンティティタイプがランダムに引けるメジャーパワー
disabledPowers.<ENTITY_TYPE>共有リストの適用後に、そのエンティティタイプから取り除かれるパワー

防御、攻撃、その他の共有リストがない場合、対応するタイプの読み込み済みパワーから生成します。メジャーパワーの既定値はエンティティタイプごとに明示的に選ばれています。既存リストは保持されるため、後から追加したパワーは自動では入りません。該当リストを編集してください。一方、「その他」のリストがない状態で生成すると、その時点で存在するカスタム Lua パワーが既定リストに入る場合があります。

これらのリストでは .lua のファイル名とレガシーの .yml 名の両方が受け付けられます。生成されるデフォルトは .yml のエイリアスで書き出されます。どのパワーにも解決されない名前は、ファイル名とキーを示すコンソール警告とともにスキップされます。

自然発生パワーの枠は、防御、攻撃、その他、メジャーの順にレベル 10、20、30、40 で解放されます。各カテゴリーの 2 枠目は 50、60、70、80 で解放されます。リストが空、または無効な場合、得られるパワーは少なくなることがあります。リストの編集でメジャー/マイナーの分類は変わりません。

effect​

パワーの周回リングに表示するアイテムのマテリアルを設定します。MAJOR_* はメジャーリング、それ以外はマイナーリングを使います。値はアイテムのマテリアルか、追加データを必要としないパーティクル名である必要があります。パーティクル名の場合は、アイテムの代わりにパーティクルとして周回します。それ以外の値を指定するとエフェクトは無効になり、Disabled invalid power trail がログに出力されます。

effect が未設定または空の場合、そのパワーはリングにアイテムを追加しません。任意の YAML メタデータファイルで effect を指定していないカスタム Lua パワーの既定動作です。

現在、独立した YAML EliteScript はこのメタデータを実行時のトレイルにコピーしません。そのため、そのような YAML パワーに effect を設定してもリングのアイテムは追加されません。カスタム Lua パワーは付随ファイルの effect をコピーします。

キー値デフォルト
effectマテリアルなし

powerCooldown​

パワーのメタデータ上のクールダウンをティック単位で設定します。YAML EliteScript は自身の Cooldowns.local と Cooldowns.global を使い、初期化時にこのメタデータを置き換えます。Lua パワーは、文書化されたクールダウン API で確認と設定を行う必要があります。

キー値デフォルト
powerCooldownInteger0

globalCooldown​

グローバルクールダウンのメタデータをティック単位で設定します。これは確認するパワーのみを止めるもので、すべてのフックやアクションを無条件に止めません。YAML スクリプトでは、そのスクリプトの Cooldowns セクションを設定してください。

キー値デフォルト
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
}

同じディレクトリに同じベース名の .yml メタデータファイルがない場合、カスタム Lua パワーの既定値は次のとおりです。

  • powerType は MISCELLANEOUS です。
  • effect は未設定です。

カスタム my_power.lua の隣に my_power.yml を置き、isEnabled、powerType、effect、powerCooldown、globalCooldown を指定できます。たとえば powerType: UNIQUE は既定の「その他」リストへの追加を防ぎます。メタデータファイルを無効にすると、そのカスタム Lua ファイルは読み込まれません。

同梱の Lua パワーの隣に置いた同じベース名の .yml または .yaml も、そのパワーに適用されます。その isEnabled、effect、powerCooldown、globalCooldown の値は組み込みの値を置き換えます。省略したキーもデフォルト値で置き換わるため、effect を省略するとそのパワーの周回リングのアイテムはなくなります。powerType は設定した場合にのみ組み込みのタイプを置き換えます。ファイルを無効にしても、同梱パワーの読み込みは止まりません。

自然発生エリートは EliteMobPowers.yml の明示的なリストを使います。カスタムパワーを追加するときはそれらを確認してください。ボスに直接割り当てるには、powers: リストに .lua ファイル名を追加します。

ボスの Lua パワーで使えるフック​

フック発火するタイミング
on_spawnボスがスポーンしたとき
on_game_tick実行環境が有効で、一時停止や抑制されていない間の各サーバーティック
on_boss_damagedボスが何らかの原因でダメージを受けたとき
on_boss_damaged_by_playerボスがプレイヤーからダメージを受けたとき
on_reinforcement_damaged_by_player増援がプレイヤーからダメージを受けたとき。フックは召喚元で実行されます
on_boss_damaged_by_eliteボスが別のエリートからダメージを受けたとき
on_player_damaged_by_bossボスがプレイヤーにダメージを与えたとき
on_enter_combatボスが戦闘に入ったとき
on_exit_combatボスが戦闘から離脱したとき
on_healボスが回復したとき
on_boss_target_changed初回取得を含むプレイヤー対象イベント。すべての対象変更や対象喪失ではありません
on_deathボスが死亡したとき
on_phase_switchボスがフェーズを切り替えたとき
on_mind_actionネイティブ Mind が割り当て済みパワーにアクションを要求したとき

on_zone_enter と on_zone_leave も受け付けられます。組み込みディスパッチャーは同じボスの EliteScript ゾーンリスナーからこれらを受け取り、Lua ゾーン監視からは受け取りません。冒頭の警告を参照してください。

割り当てた各 Lua パワーは、ボスごとに専用の実行環境と状態を持ちます。上記の例は意図的にクールダウンを設けず、該当する攻撃が通知されるたびに実行します。必要ならクールダウンの確認と設定を明示的に追加してください。メタデータだけでは Lua フックの実行は制限されません。ダメージは汎用フックと専用フックの両方を発火させる場合があり、両方を定義すると 2 つのハンドラーが動作することがあります。キャンセル、削除、失敗時の動作はライフサイクルガイドを参照してください。

これらのフックの中で実際に何を呼べるかについては、Lua はじめに、ボスのフックとライフサイクル、ボスとエンティティを参照してください。