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

パワーの作成

webapp_banner.jpg

パワーを書く 2 つの方法

すべてのパワーは ~/plugins/EliteMobs/powers(サブフォルダーもスキャンされます)に置かれ、形式は 2 つあります。

形式ファイル用途
Lua*.lua新規に書くものすべて。完全なスクリプト言語で、すべてのボスフック、ループ、状態が使えます。同梱パワーが使っているのはこちらです。
EliteScript*.ymlこのページの残りで説明する宣言的なイベント/アクション形式。引き続き完全にサポートされています。

EliteMobs に同梱される 68 個のパワーのほぼすべてが、現在は Lua です。 YAML ベースの Java パワーとして残っているのは bonus_coins.ymlcustom_summon.ymlelite_script.yml の 3 つだけです。新しいパワーをゼロから書くなら、最も多くの機能が後ろに控えているのは Lua です — Lua はじめにボスのフックとライフサイクルから始めてください。

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

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

ボスが attack_fire.yml を要求すると、EliteMobs はまず attack_fire.lua を探し、存在すればそちらを使用します。Lua 以前のパワー名に対して書かれた古いボス設定がそのまま動作するのはこのためです — 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

どちらのフック名もボススクリプトプロバイダに受け付けられ、読み込みエラーにもなりませんが、Lua パワー内のいかなる処理もこれらを発火させることはできません。これらは EliteScript のゾーンリスナーからのみディスパッチされ、そのリスナーは同じボス上の YAML の eliteScript:Events:ZoneEnterEvent または ZoneLeaveEvent を列挙したときに開始されます。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には5つの異なるセクションがあります:EventsConditionsZonesActionsCooldownsActionsのみが必須です。

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

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

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


複数の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
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 200
global: 60

この例では、Example2という2番目のスクリプトを追加しました。Example2は、ボスによってダメージを受けたプレイヤーに火をつけます。これはtargetTypeがDIRECT_TARGETに設定されているためです。
このスクリプトのクールダウンは200ティックに設定されており、ボスは10秒ごとにしかプレイヤーに火をつけることができません。

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

スタンドアロンパワーは、ほぼ完全にElite Scriptで構成されています。オプションのフィールドは2つだけです。スタンドアロンパワーが機能するには、~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:パワーは、パワーセクションにパワーが設定されているカスタムボスにのみ適用されます。
  • DEFENSIVE / MISCELLANEOUS / OFFENSIVE:すべてのエリートがこれらのパワーを取得でき、特定のパワーのサブセットにカウントされます。
  • MAJOR_ZOMBIEMAJOR_SKELETONMAJOR_BLAZEMAJOR_ENDERMANMAJOR_GHAST:適切なエンティティタイプのエリートのみがこれらのパワーで自然にスポーンでき、メジャーパワーとしてカウントされます。メジャーパワーとして扱われるのはこの 5 種類だけで、それ以外はすべてマイナーパワーとしてカウントされます。

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

個別のパワーのクールダウンをティック単位で設定します。この特定のパワーがトリガーされる頻度を制御します。

キーデフォルト
powerCooldownInteger0

globalCooldown

すべてのパワーで共有されるグローバルクールダウンをティック単位で設定します。このパワーがトリガーされた後、グローバルクールダウンが終了するまで他のパワーはトリガーできません。

キーデフォルト
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 から取得され、そのファイルは一度存在すれば再シードされないためです — 上記を参照してください。使用するには、ボスの powers: リストにそのパワーを追加してください。

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

フック発火するタイミング
on_spawnボスがスポーンしたとき
on_game_tickサーバーティックごと
on_boss_damagedボスが何らかの原因でダメージを受けたとき
on_boss_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_zone_enteron_zone_leave もパーサーには受け付けられますが、Lua パワー内のいかなる処理もこれらを発火させることはできません — これらは同じボス上の EliteScript のゾーンリスナーからのみディスパッチされます。このページ冒頭の警告を参照してください。

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