Luaスクリプティング:ボスとエンティティ
このページでは、EliteMobsのLuaパワーにおけるボスおよびエンティティのラッパー(context.boss、context.player、context.players、context.entities)と、それらが返すエンティティラッパーテーブルについてすべて解説します。Luaパワーが初めての方は、まずはじめにから始めてください。
エンティティラッパー
このページで扱うネイティブのボス、プレイヤー、エンティティAPIは、生のBukkitオブジェクトではなくラッパーテーブルを返します。フィールドは作成時点の値で、メソッドは呼び出すたびにサーバーの状態を読み取ったり変更したりします。context.world:get_entity(...) などが返す共有MagmaCoreラッパーは別のAPIで、遅延評価されるフィールドもあります。共有APIリファレンスを参照してください。
覚えておくべき2つのルール:
- フィールド(
health、current_location、maximum_healthなど)はスナップショットです。ラッパーが作成された瞬間の状態を反映し、自動更新されません。 - メソッド(
get_location()、get_health()、is_alive()など)は呼び出すたびにライブチェックを実行します。
ネイティブメソッドはドット記法とコロン記法の両方に対応します。ドット記法で明示的な self を渡す必要はありません。ラッパーのフィールドへ代入してもLuaテーブルが変わるだけです。多くの変更メソッドは nil を返すため、戻り値を成功フラグとして扱わないでください。
共通のエンティティフィールド
すべてのリビングエンティティラッパーには以下のフィールドが含まれます。
| フィールド | 型 | 備考 |
|---|---|---|
entity.name | string | 表示名 |
entity.uuid | string | テキスト形式のUUID |
entity.entity_type | string | BukkitのEntityType名(例:"ZOMBIE"、"PLAYER") |
entity.is_player | boolean | プレイヤーの場合true |
entity.is_elite | boolean | EliteMobsがエリートとして追跡している場合true |
entity.is_mount | boolean | このラッパーがボスのマウントを表す場合true |
entity.is_monster | boolean | モンスタータイプのエンティティの場合true |
entity.health | number | 現在の体力(スナップショット) |
entity.maximum_health | number | 最大体力(スナップショット) |
entity.current_location | locationテーブル | ラッパー作成時の位置 |
entity.is_valid | boolean | ラッパー作成時のBukkitエンティティの有効性。単なる存在チェックではなく、スナップショットです |
is_valid はメソッドではなくフィールドですリビングエンティティのラッパー(context.player と context.boss を含む)では、is_valid はラッパー構築時に取得された単なるブール値です。entity:is_valid() を呼び出すと attempt to call a boolean value が発生し、そのパワーが無効化されます。
- スナップショットはドット記法
entity.is_validで読み取ってください。 - ライブのチェックが必要な場合は、代わりに
entity:is_alive()を呼び出してください。こちらは毎回サーバーに問い合わせます。
is_valid() が実際のメソッドであるのは、summon_projectile や spawn_falling_block_at_location などが返す軽量な非リビングエンティティの参照ラッパーの場合です。ティックをまたいで保持する可能性が最も高いのはそれらのラッパーであり、ライブチェックが意味を持つのもそこです。
ボスレベルなどのエリート固有のデータを読み取るには、下記のcontext.bossセクションで説明するcontext.bossのフィールドとメソッドを使用してください。スクリプトからエリートをデスポーンさせるには、entity:remove_elite()メソッドを呼び出してください。
例
return {
api_version = 1,
on_enter_combat = function(context)
context.log:info("Boss level: " .. context.boss.level)
end
}
例
return {
api_version = 1,
on_enter_combat = function(context)
local target = context.players:current_target()
if target ~= nil then
context.log:info("Target: " .. target.name .. " HP: " .. target.health)
end
end
}
共通のエンティティメソッド
以下のメソッドはサーバーに対して直接呼び出しを行います。移動、体力、装備、エフェクトのメソッドはリビングエンティティラッパーに属します。チャット、アクションバー、タイトル、ボスバー、プレイヤーコマンドにはプレイヤーラッパーが必要です。context.boss:send_message(...) は近くのプレイヤーへ配信する別のボスメソッドです。戻り値が記載されていない限り、変更系のメソッドは操作の成否を示すフラグではなく nil を返します。
AI、認識、無敵、スケールの変更は、それを行ったパワーに属します。各変更は置き換えた値を記録します。正の持続時間を指定すると指定ティック後にその値を復元し、スクリプトを閉じるとまだ有効な変更をすべて復元します。複数のパワーが同じプロパティを変更している場合、1つの変更が終わると残っている最新の変更が復元され、残りがなければ元の値に戻ります。その間に他のプラグインやコマンドがプロパティを変更した場合は、その値が維持されます。スクリプトを一時停止しても、これらの変更は元に戻りません。タグの持続時間、遅延プッシュ、プレイヤー用ボスバーは独立したGameClockタスクを使い、スクリプトを閉じた後も動作し続けます。その他のエンティティの変更は元に戻りません。
entity:is_alive()
エンティティがまだ有効で死亡していない場合にtrueを返します。
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if context.player:is_alive() then
context.player:send_message("&aYou're still standing!")
end
end
}
entity:get_location()
現在のライブ位置をlocationテーブルとして返します。
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local loc = context.player:get_location()
context.world:play_sound_at_location(loc, "entity.experience_orb.pickup")
end
}
entity:get_eye_location()
目線の高さの位置をlocationテーブルとして返します。
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local eye = context.player:get_eye_location()
context.world:spawn_particle_at_location(eye, "FLAME")
end
}
entity:get_health() / entity:get_maximum_health()
ライブの現在体力または最大体力を返します。
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local pct = context.player:get_health() / context.player:get_maximum_health()
if pct < 0.25 then
context.player:send_message("&cYou're running low!")
end
end
}
entity:get_velocity()
エンティティの現在の速度をvectorテーブルとして返します。
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local vel = context.player:get_velocity()
context.log:info("Player speed Y: " .. vel.y)
end
}
entity:send_message(text)
プレイヤーにチャットメッセージを送信します。EliteMobsのカラーフォーマットに対応します。一般のリビングエンティティ用メソッドではありません。
| パラメータ | 型 | 備考 |
|---|---|---|
text | string | カラーコード付きのメッセージ |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:send_message("&6[Boss] &fPrepare yourself!")
end
}
entity:show_action_bar(message)
プレイヤーのアクションバーコンポーザーの LUA チャンネルへメッセージを送ります。プレイヤー専用であり、このスクリプトが表示を占有するわけではありません。
| パラメータ | 型 | 備考 |
|---|---|---|
message | string | カラーコード付きのアクションバーテキスト |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:show_action_bar("&c&lDANGER ZONE")
end
}
entity:show_title(title[, subtitle][, fadeIn][, stay][, fadeOut])
プレイヤーにタイトルと省略可能なサブタイトルを送信します。テキストはカラー書式に対応し、表示時間は整数のティック数です。プレイヤー専用です。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
title | string | タイトルテキスト | |
subtitle | string | "" | サブタイトルテキスト |
fadeIn | number | 10 | フェードインのティック数 |
stay | number | 40 | 表示維持のティック数 |
fadeOut | number | 10 | フェードアウトのティック数 |
例
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(20)
for _, p in ipairs(nearby) do
p:show_title("&4PHASE 2", "&7The boss is enraged!", 10, 40, 10)
end
end
}
entity:show_boss_bar(title[, color][, style][, duration])
呼び出すたびにプレイヤーへ新しいボスバーを表示します。名前付きキーや削除用ハンドルは返しません。色とスタイルは大文字と小文字を区別せず、不明な値は WHITE と SOLID になります。正の持続時間では独立したタイマーで削除されますが、0 以下では削除タイマーが設定されません。正の値を指定してください。共有APIのキー付きボスバーとは別の仕組みです。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
title | string | バーのタイトルテキスト | |
color | string | "WHITE" | BarColorの値 |
style | string | "SOLID" | BarStyleの値 |
duration | number | 40 | ティック単位の持続時間 |
例
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(20)
for _, p in ipairs(nearby) do
p:show_boss_bar("&cIncoming Attack!", "RED", "SOLID", 100)
end
end
}
entity:teleport_to_location(location)
Bukkitへテレポートを要求し、成功値ではなく nil を返します。位置テーブルの省略された座標は 0、省略されたワールドはラッパー対象ではなく術者のワールドになります。yaw と pitch は省略可能です。存在しないワールド名では位置を解決できません。current_location を含むテーブルも使えます。nil やテーブル以外の値はボスの位置に解決されます。保護領域のチェックは自動では行いません。
| パラメータ | 型 | 備考 |
|---|---|---|
location | locationテーブル | 目的地 |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("teleport_pull", 200) then return end
context.player:teleport_to_location(context.boss:get_location())
context.player:send_message("&cThe boss pulls you in!")
end
}
entity:set_velocity_vector(vector)
エンティティの速度を即座に設定します。
| パラメータ | 型 | 備考 |
|---|---|---|
vector | vectorテーブル | { x, y, z }または{ x = 0, y = 1, z = 0 } |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("launch", 100) then return end
context.player:set_velocity_vector({ x = 0, y = 1.5, z = 0 })
context.player:send_message("&cYou are launched into the air!")
end
}
entity:apply_push_vector(vector[, additive][, delay])
指定したベクトルを保持し、短い遅延後に有効なエンティティへ適用します。既定の遅延は1ティックです。加算モードでは実行時の速度に加えます。独立したタイマーなので、Luaの一時停止や終了では取り消されません。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
vector | vectorテーブル | 方向と強さ | |
additive | boolean | false | 置き換える代わりに既存の速度に加算する |
delay | number | 1 | 適用するまでのティック単位の遅延 |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("push_up", 100) then return end
context.player:apply_push_vector({ x = 0, y = 2.0, z = 0 })
context.player:send_message("&cUpward blast!")
end
}
entity:face_direction_or_location(directionOrLocation)
回転を変えるテレポートでエンティティの向きを設定します。文字列の world または current_location を含むテーブルは目的地として、それ以外の {x, y, z} は方向ベクトルとして扱います。目的地は同じワールドにあり、方向はゼロでない必要があります。
| パラメータ | 型 | 備考 |
|---|---|---|
directionOrLocation | vectorまたはlocationテーブル | 向く対象 |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:face_direction_or_location(context.boss:get_location())
context.player:send_message("&cThe boss forces you to look at it!")
end
}
entity:set_fire_ticks(ticks)
有効な対象の燃焼ティック数を設定します。InstanceEffectPolicyにより、プレイヤーはオンラインで生存中、効果元と同じワールドにいる必要があります。インスタンス内では一致する有効なマッチの参加者でなければなりません。プレイヤー以外は有効なリビングエンティティである必要があります。燃焼ダメージの発生を保証する操作ではありません。
| パラメータ | 型 | 備考 |
|---|---|---|
ticks | number | ティック単位の燃焼時間(20ティック = 1秒) |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("ignite", 100) then return end
context.player:set_fire_ticks(60)
context.player:send_message("&cYou catch fire!")
end
}
entity:add_visual_freeze_ticks([ticks])
同じInstanceEffectPolicyの対象制限に従い、実際のBukkit凍結ティック数を追加します。パケットだけの画面効果ではなく、AIや移動を直接停止する操作でもありません。通常のMinecraftの凍結動作が適用される場合があります。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
ticks | number | 1 | 凍結ティック量 |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("freeze", 200) then return end
context.player:add_visual_freeze_ticks(100)
context.player:send_message("&bYou feel a chilling frost!")
end
}
entity:apply_potion_effect(effect, duration[, amplifier])
同じInstanceEffectPolicyの対象制限に従い、ポーション効果を適用します。効果名は大文字と小文字を区別せず、不明な名前は警告を出して無視します。既存効果との置き換えはBukkitの規則に従い、常に上書きされるとは限りません。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
effect | string | PotionEffectType名 | |
duration | number | ティック単位の持続時間 | |
amplifier | number | 0 | 効果のレベル(0 = レベルI) |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("slow", 200) then return end
context.player:apply_potion_effect("SLOWNESS", 60, 1)
context.player:send_message("&7You feel sluggish...")
end
}
remove_potion_effect(effect) はこのネイティブラッパーでは利用できません。共有MagmaCoreラッパーには存在します。持続時間 0 の apply_potion_effect は確実な削除方法ではありません。既存効果との置き換えもBukkitの規則に従うためです。
entity:deal_damage(amount) / entity:deal_custom_damage(amount) / entity:deal_damage_from_boss(amount)
ダメージを要求します。3種類とも実際に失われた体力ではなく nil を返します。イベント、無敵状態、戦闘処理などで結果は変わります。
| メソッド | 備考 |
|---|---|
deal_damage(amount) | 明示的な攻撃者を指定しない通常のダメージ要求 |
deal_custom_damage(amount) | BossCustomAttackDamage を使用。術者自身、死亡・無敵の対象、Survival/Adventure以外のプレイヤーは対象外です。カスタム攻撃の送信後にネイティブのダメージクールダウンを解除します |
deal_damage_from_boss(amount) | ボスを攻撃者として通常の戦闘処理へ送信します |
例
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(10)
for _, p in ipairs(nearby) do
p:deal_custom_damage(10)
p:send_message("&cThe boss unleashes a shockwave!")
end
end
}
entity:restore_health(amount)
非負の量を指定してください。入力を自動で制限するダメージAPIではありません。追跡中のエリートではキャンセル可能な EliteMobHealEvent を発生させます。追跡されていないエンティティでは最大体力属性の基本値まで回復し、get_maximum_health() が返す修飾子を含む実効最大値は使いません。戻り値は nil です。
| パラメータ | 型 | 備考 |
|---|---|---|
amount | number | 回復量 |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
-- Heal the player slightly when they hit the boss
context.player:restore_health(5)
context.player:send_message("&aYou drain life from the boss!")
end
}
entity:set_invulnerable(enabled[, duration])
エンティティの無敵状態を設定し、置き換えた値を記録します。正の持続時間では指定ティック後にその値を復元します。それ以外の場合、変更はこのパワーが終了するまで続き、終了時にも復元されます。同じパワーから再度呼び出すと、そのパワーの以前の変更を置き換えます。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
enabled | boolean | 無敵を有効にする場合true | |
duration | number | 0 | このティック数の後に置き換えた値を復元する。0 ではパワーの終了まで変更を維持する |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("shield", 200) then return end
context.player:set_invulnerable(true, 40)
context.player:send_message("&6A brief shield protects you!")
end
}
entity:set_ai_enabled(enabled[, duration])
エンティティのAIを設定し、置き換えた値を記録します。正の持続時間では指定ティック後にその値を復元します。それ以外の場合、変更はこのパワーが終了するまで続き、終了時にも復元されます。このパワーがAIの変更を保持している間に set_ai_enabled(true) を呼び出すと、新しい変更を適用する代わりにその変更を終了し、置き換えた値を復元します。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
enabled | boolean | AIを有効にする場合true | |
duration | number | 0 | このティック数の後に置き換えた値を復元する。0 ではパワーの終了まで変更を維持する |
例
return {
api_version = 1,
on_enter_combat = function(context)
-- Disable boss AI for 3 seconds at combat start
context.boss:set_ai_enabled(false, 60)
context.boss:send_message("&7The boss is stunned!")
end
}
entity:add_tag(tag[, duration]) / entity:remove_tag(tag) / entity:has_tag(tag)
追跡中のエリートと、EliteMobsのプレイヤーインベントリがロード済みのプレイヤーのタグを管理します。通常の未追跡MobやBukkitのスコアボードタグには作用しません。大文字と小文字を区別します。期限タイマーは独立しており、同じタグを再追加しても古いタイマーで削除される場合があります。
| メソッド | パラメータ | 備考 |
|---|---|---|
add_tag(tag[, duration]) | string、オプションのnumber | タグを追加し、オプションでティック後に自動削除します |
remove_tag(tag) | string | タグを削除します |
has_tag(tag) | string | タグが存在する場合trueを返します |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.player:has_tag("marked") then
context.player:add_tag("marked", 200)
context.player:send_message("&cYou have been marked!")
end
end
}
entity:run_command(command)
プレイヤー自身の権限で直ちにコマンドを実行し、nil を返します。プレイヤー専用で、プレースホルダーは展開しません。先頭の / は付けないでください。
| パラメータ | 型 | 備考 |
|---|---|---|
command | string | 先頭の/なしのコマンドテキスト |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("curse_cmd", 200) then return end
context.player:run_command("say I have been cursed!")
end
}
entity:set_scale(scale[, duration])
利用可能な場合、スケール属性の基本値を設定し、置き換えた値を記録します。正の持続時間では指定ティック後にその値を復元します。それ以外の場合、変更はこのパワーが終了するまで続き、終了時にも復元されます。属性の修飾子によって実際の大きさは変わる場合があります。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
scale | number | スケール属性の基本値 | |
duration | number | 0 | このティック数の後に置き換えたスケールを復元する。0 ではパワーの終了まで変更を維持する |
例
return {
api_version = 1,
on_enter_combat = function(context)
-- Boss grows to double size for 5 seconds
context.boss:set_scale(2.0, 100)
context.boss:send_message("&4The boss grows in size!")
end
}
entity:set_gravity(enabled)
エンティティの重力を設定します。自動復元はありません。下の復元コールバックもLuaインスタンスが終了すると実行されない場合があります。
| パラメータ | 型 | 備考 |
|---|---|---|
enabled | boolean | 通常の重力の場合true |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("levitate", 200) then return end
-- Change the boss's gravity; the callback runs only while this script stays active.
context.boss:set_gravity(false)
context.scheduler:run_after(60, function(tick_context)
if tick_context.boss.exists then
tick_context.boss:set_gravity(true)
end
end)
end
}
entity:play_sound_at_entity(sound[, volume][, pitch])
エンティティの位置でサウンドを再生します。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
sound | string | Minecraftのサウンドキー(例:"entity.ender_dragon.growl")または Spigot の Sound enum 名。リソースパックのキーも使用できます。 | |
volume | number | 1.0 | 音量 |
pitch | number | 1.0 | ピッチ |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:play_sound_at_entity("entity.ender_dragon.growl", 1.0, 0.5)
end
}
entity:play_sound_at_self(sound[, volume][, pitch])
play_sound_at_entityのエイリアスです。エンティティの位置でサウンドを再生します。
entity:spawn_particle_at_self(particleOrSpec[, count])
エンティティの位置にパーティクルを生成します。ワールドAPIと同じパーティクル仕様テーブルを使います。テーブル内の amount は位置引数の count より優先されます。名前は大文字に変換され、非対応のデータ型は警告してスキップします。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
particleOrSpec | stringまたはtable | パーティクル名または仕様テーブル | |
count | number | 1 | パーティクルの数 |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:spawn_particle_at_self("HEART", 5)
end
}
entity:spawn_particles_at_location(location, particle[, count])
特定の位置にパーティクルを生成します。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
location | locationテーブル | 対象位置 | |
particle | string | パーティクルタイプ名 | |
count | number | 1 | パーティクルの数 |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local loc = context.player:get_location()
context.player:spawn_particles_at_location(loc, "FLAME", 10)
end
}
entity:play_model_animation(name)
追跡中のCustomBossにカスタムモデルがある場合、アニメーションを要求します。一般のFMMモデル付きエンティティすべてに使えるわけではありません。nil を返し、再生完了を待たず、アニメーションの存在や再生成功も保証しません。
| パラメータ | 型 | 備考 |
|---|---|---|
name | string | アニメーション名 |
例
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("attack_swing")
end
}
乗り物および搭乗者メソッド
リビングエンティティラッパーはBukkitの乗り物と搭乗者の操作も提供します。引数はBukkit UUIDで解決できるラッパーであり、UUID文字列ではありません。自身への搭乗や無効な参照は拒否します。搭乗変更中はマウント悪用防止を一時的に回避し、Bukkitの成否を返します。移動経路や終了時の自動解除を用意する機能ではありません。
| メソッド | 戻り値 | 備考 |
|---|---|---|
entity:is_inside_vehicle() | boolean | エンティティが別のエンティティに乗っている場合true。 |
entity:has_vehicle() | boolean | エンティティが現在乗り物を持っている場合true。 |
entity:get_vehicle() | エンティティラッパーまたはnil | 現在の乗り物ラッパーを返します。 |
entity:set_vehicle(vehicle) | boolean | このエンティティをvehicleに乗せます。 |
entity:leave_vehicle() | boolean | このエンティティを現在の乗り物から降ろします。 |
entity:has_passengers() | boolean | このエンティティに搭乗者がいる場合true。 |
entity:get_passenger_count() | number | 搭乗者の数。 |
entity:get_passengers() | table | 搭乗者ラッパーの配列。 |
entity:add_passenger(passenger) | boolean | このエンティティに搭乗者を追加します。 |
entity:remove_passenger(passenger) | boolean | このエンティティから搭乗者を削除します。 |
entity:eject_passengers() | boolean | すべての搭乗者を排出します。 |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if context.player:has_vehicle() then
context.player:leave_vehicle()
end
end
}
entity:push_relative_to(source[, strength][, xOffset][, yOffset][, zOffset])
対象からソースを引いた方向を正規化して strength を掛け、ワールド軸のオフセットを加えた速度で直ちに置き換えます。同じ位置の場合もオフセットは使われます。ラッパーを渡すとスナップショット位置を使うので、現在位置には get_location() を使ってください。ワールド一致は検査しません。同じワールドの位置を渡してください。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
source | locationまたはラッパー | 押し出しの起点 | |
strength | number | 1.0 | 押し出しの強さ倍率 |
xOffset | number | 0 | 追加のXオフセット |
yOffset | number | 0 | 追加のYオフセット |
zOffset | number | 0 | 追加のZオフセット |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("knockback", 60) then return end
context.player:push_relative_to(context.boss:get_location(), 2.0, 0, 0.5, 0)
context.player:send_message("&cThe boss knocks you back!")
end
}
entity:set_custom_name(name) / entity:reset_custom_name()
カラー書式を変換して表示名を設定します。リセットは追跡中のエリートでは設定された名前を使い、それ以外では現在のBukkit getName() を使います。元の名前を保存して復元する操作ではありません。プレイヤーのアカウント名やラッパーのスナップショットは変わりません。
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("mark", 200) then return end
context.boss:set_custom_name("&c&lEnraged Boss")
context.boss:send_message("&cThe boss is enraged!")
-- Reset after 5 seconds
context.scheduler:run_after(100, function(tick_context)
if tick_context.boss:is_alive() then
tick_context.boss:reset_custom_name()
end
end)
end
}
entity:place_temporary_block(material[, duration][, requireAir])
エンティティの現在位置に一時ブロックを設置し、nil を返します(requireAir で設置できなかった場合も同様です)。正の持続時間では、タイマー終了時、チャンクやワールドのアンロード時、またはプラグインの終了時に、保存したBlockData(コンテナの中身は含まない)を復元します。ただし、ブロックがまだ一時ブロックのままである場合に限ります。同じ一時ブロックに再度設置すると、タイマーが再開されます。チェストなどのブロックエンティティを持つブロックと、別の一時ブロック所有者が保持しているブロックはスキップされます。ブロックを壊しても何もドロップしません。0 以下の持続時間では、追跡せずに恒久的に設置します。ブロックとして使えるマテリアルを指定し、保護は自分で確認してください。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
material | string | ブロックのマテリアル名 | |
duration | number | 0 | 復元までのティック数(正の値)。0 以下ではブロックを恒久的に設置する |
requireAir | boolean | false | ブロックが現在空気の場合のみ設置する |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("ice_trap", 200) then return end
context.player:place_temporary_block("ICE", 60, true)
context.player:send_message("&bIce forms at your feet!")
end
}
entity:get_height()
エンティティの高さをブロック単位で返します。
entity:is_on_ground()
Bukkitの接地フラグを返します。足元のブロックの固さを新たに調べる操作ではありません。
entity.is_valid
リビングエンティティのラッパーでは、これはメソッドではなくブール値のフィールドです。作成時点のBukkitエンティティの有効性を記録しており、単なる存在チェックではありません。ドット記法 entity.is_valid で読み取ってください。コロンで呼び出すとエラーになります。
これはスナップショットであるため古くなります。したがってライブチェックの代わりにはなりません。現在の状態が必要な場合は entity:is_alive() を使用し、ティックをまたいで保持した非リビングエンティティの参照ラッパーでは is_valid()(メソッド)を使用してください。
entity:is_frozen()
エンティティ(カスタムボスとして追跡されている場合)に凍結フラグが設定されている場合にtrueを返します。
entity:set_awareness_enabled(aware[, duration])
Mobの認識状態を設定し、置き換えた値を記録します。Mobタイプのエンティティにのみ影響します。正の持続時間では指定ティック後にその値を復元します。それ以外の場合、変更はこのパワーが終了するまで続き、終了時にも復元されます。このパワーが認識の変更を保持している間に true で呼び出すと、新しい変更を適用する代わりにその変更を終了します。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
aware | boolean | 認識を有効にする場合true | |
duration | number | 0 | このティック数の後に置き換えた値を復元する。0 ではパワーの終了まで変更を維持する |
entity:is_healing() / entity:set_healing(enabled)
追跡中のエリートの回復フラグを読み書きします。体力を回復したり回復タイマーを開始したりする操作ではありません。set_healing(true) は、まだ回復中でないエリートを回復中としてマークします。set_healing(false) は、このパワーが設定した回復状態だけを解除します。パワーが終了すると、まだ所有している回復フラグを解除します。未追跡のエンティティでは読み取りが false、書き込みは何もしません。
entity:overlaps_box_at_location(center[, halfX][, halfY][, halfZ])
バウンディングボックスと指定した軸並行ボックスの数値的な重なりを調べます。ワールド一致は検査しないため、同じワールドの中心を渡してください。参照を解決できなければ false を返します。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
center | locationテーブル | テストボックスの中心 | |
halfX | number | 0.5 | X軸の半幅 |
halfY | number | halfXと同じ | Y軸の半分の高さ |
halfZ | number | halfXと同じ | Z軸の半幅 |
entity:remove_elite()
エリートエンティティをEliteMobsの追跡から削除します。エンティティがエリートの場合、これによりEliteMobsを通じて適切にデスポーンします。
entity:remove()
スクリプトがスポーンさせたアーマースタンドなどの通常の生物エンティティを削除します。削除できた場合は true を返します。プレイヤーとエリートは拒否されて false が返ります。エリートをデスポーンさせるには remove_elite() を使ってください。
entity:set_invisible(enabled) および entity:set_silent(enabled)
set_invisible はエンティティの本体を非表示にします。身につけているアイテムや手に持っているアイテムは表示されたままです。set_silent はエンティティ自身の音を消します。
entity:set_marker(enabled)
アーマースタンド専用です。以下の4つのメソッドはアーマースタンドのラッパーにのみ存在し、ほかのすべてのエンティティには存在しません。
| メソッド | 効果 |
|---|---|
set_marker(enabled) | マーカースタンドには当たり判定がなく、攻撃も衝突もできません |
set_small(enabled) | 半分のサイズのスタンドにします |
set_base_plate(enabled) | 石の土台の表示と非表示を切り替えます |
set_arms(enabled) | 腕の表示と非表示を切り替えます |
見た目だけの浮遊するアイテムやブロックには、これらを必要としない world:spawn_display_at_location を使うことをおすすめします。
entity:set_custom_name_visible(visible)
エンティティのカスタム名を常に表示するか、見たときのみ表示するかを設定します。
| パラメータ | 型 | 備考 |
|---|---|---|
visible | boolean | 常に表示する場合true |
entity:set_equipment(slot, material[, options])
指定スロットを新しいマテリアルアイテムで置き換えます。カスタムアイテムのファイルや以前のメタデータは使いません。スロット、マテリアル、エンチャント名は大文字と小文字を区別しません。不明なスロットやマテリアルでは何もせず、不明なエンチャントだけをスキップします。エンチャントは通常のレベル制限を適用せず追加します。戻り値は nil です。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
slot | string | 装備スロット:"HEAD"、"CHEST"、"LEGS"、"FEET"、"HAND"、"OFF_HAND" | |
material | string | マテリアル名(例:"DIAMOND_SWORD"、"IRON_HELMET") | |
options | table | {} | オプション設定(下記参照) |
Optionsテーブル:
| キー | 型 | デフォルト | 備考 |
|---|---|---|---|
enchantments | テーブルの配列 | nil | 各エントリ:{ type = "SHARPNESS", level = 2 } |
unbreakable | boolean | false | アイテムが壊れないかどうか |
例
return {
api_version = 1,
on_enter_combat = function(context)
-- Give the boss a glowing diamond sword
context.boss:set_equipment("HAND", "DIAMOND_SWORD", {
unbreakable = true,
enchantments = {
{ type = "SHARPNESS", level = 5 }
}
})
end
}
entity:damage_equipment(slot, amount)
HAND、OFF_HAND、HEAD、CHEST、LEGS、FEET の装備に耐久ダメージを与え、実際に適用した量を返します。要求量は 1~64 です。空スロット、耐久値のないアイテム、破壊不能アイテムでは 0 を返します。プレイヤーでは PlayerItemDamageEvent が要求をキャンセルしたり、64 を超える値に変更したりできます。最終値は残り耐久値までに制限されます。
カスタム最大耐久値を扱い、破壊時にはスタック全体を削除してプレイヤー用の PlayerItemBreakEvent を発生させます。不正なスロットや要求量はLua引数エラーになります。耐久力エンチャントによる軽減は行いません。
entity:is_ai_enabled()
現在のAI状態を返します。追跡中のエリートでは、ネイティブ行動の管理を含むEliteMobsの論理的なAI状態を使います。BukkitのAIフラグだけを見る操作ではありません。
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.boss:is_ai_enabled() then
context.log:info("Boss AI is active")
else
context.log:info("Boss AI is disabled (stunned?)")
end
end
}
非リビングエンティティの参照ラッパー
スポーンしたエンティティがLivingEntityでない場合 -- 例えば落下ブロック、発射物、火の玉など -- より軽量な参照ラッパーを受け取ります。これらはcontext.world:spawn_falling_block_at_location()やcontext.boss:summon_projectile()などのメソッドによって返されます。
フィールド: name、uuid、entity_type、is_player(常に false)、is_elite(常に false)、is_mount(通常は false。boss:get_mount() が返す場合は true)、current_location
メソッド:
| メソッド | 備考 |
|---|---|
is_valid() | ライブの有効性チェック。リビングエンティティのラッパーとは異なり、ここでは本当にメソッドです |
get_location() | 現在のライブ位置 |
get_velocity() | 現在の速度ベクトル |
is_on_ground() | 地面の上にいるかどうか |
teleport_to_location(location) | エンティティをテレポートします |
set_velocity_vector(vector) | 速度を設定します |
set_direction_vector(vector) | 方向を設定します(火の玉のみ) |
set_yield(value) | 爆発の威力を設定します(火の玉のみ) |
set_gravity(enabled) | 重力を切り替えます |
detonate() | 花火の起爆を要求します。他のエンティティには作用しません |
remove() | ワールドからエンティティを削除します |
unregister([reason]) | トラッカーが認識するエンティティを削除します。未追跡なら何もしません。理由は大文字と小文字を区別せず、既定値は OTHER です |
これらのラッパーも、is_inside_vehicle()、get_vehicle()、set_vehicle(v)、add_passenger(p)、eject_passengers() など、すべての乗り物と搭乗者のメソッドを提供します。これにより、ボスを非リビングエンティティに乗せることができます。
unregister は成否の問い合わせではありません。メソッドは基盤エンティティへの参照を保持するので、保存した参照は使用前に有効性を確認してください。下の削除コールバックはLuaインスタンスに属するため、実行前にスクリプトが終了すると取り消されます。スクリプト終了後も削除が必要なら、適切なネイティブの持続時間や所有者による追跡を使ってください。
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("fireball", 100) then return end
local fb = context.boss:summon_projectile("FIREBALL",
context.boss:get_eye_location(),
context.player:get_location(),
1.5
)
if fb == nil then return end
-- fb is a non-living reference wrapper; remove it after 5 seconds if still alive
context.scheduler:run_after(100, function()
if fb:is_valid() then
fb:remove()
end
end)
end
}
context.player
プレイヤーが関与するイベントフックで利用できます。直接の対象がプレイヤーならそのプレイヤーを優先し、それ以外ではイベントの行為者を使います。共通のリビングエンティティ操作と以下のプレイヤー専用操作を提供しますが、エリート専用の操作は通常のプレイヤーには作用しません。
context.playerは、on_spawn、スケジュールされたコールバック、タイマーフックなど、関連するプレイヤーがいないフックではnilになります。使用する前に必ずnilガードを行ってください。
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:send_message("&cHello!")
end
}
プレイヤー専用フィールド
| フィールド | 型 | 備考 |
|---|---|---|
game_mode | string | 作成時のゲームモード名のスナップショット。例:"SURVIVAL"。大文字です |
プレイヤー専用メソッド
| メソッド | 備考 |
|---|---|
send_message(message) | EliteMobsのカラーフォーマット付きチャットメッセージ |
show_action_bar(message) | アクションバーテキスト |
show_title(title[, subtitle][, fadeIn][, stay][, fadeOut]) | タイトル画面オーバーレイ |
show_boss_bar(title[, color][, style][, duration]) | 一時的なボスバー |
run_command(command) | プレイヤーとしてコマンドを実行します(先頭の/なし) |
例
return {
api_version = 1,
on_player_damaged_by_boss = function(context)
if context.player == nil then return end
local hp_pct = context.player:get_health() / context.player:get_maximum_health()
if hp_pct < 0.3 then
context.player:show_title("&4LOW HEALTH", "&7Find cover!", 5, 30, 10)
context.player:show_boss_bar("&cBoss Enrage Incoming", "RED", "SEGMENTED_6", 80)
end
end
}
context.boss
このLuaパワーを所有するエリートMobのラッパーです。基盤となるエンティティがない場合、完全なリビングエンティティ用フィールドとメソッドは存在しません。
基盤エンティティが存在する間、ボスは共通のリビングエンティティ操作を継承します。プレイヤー専用の画面表示やコマンド操作は含みません。このセクションのメソッドはボス固有のもの、またはEliteEntityを通じて異なる動作をするものです。
ボスフィールド
| フィールド | 型 | 備考 |
|---|---|---|
boss.name | string | 表示名 |
boss.uuid | string | ボスエリートのUUID |
boss.entity_type | string | BukkitのEntityType名 |
boss.is_monster | boolean | 基盤となるエンティティがMonsterの場合true |
boss.level | number | エリートレベル |
boss.health | number | 現在の体力(スナップショット) |
boss.maximum_health | number | 最大体力(スナップショット) |
boss.damager_count | number | ダメージを与えた者の数(スナップショット) |
boss.is_in_combat | boolean | 戦闘状態のスナップショット |
boss.exists | boolean | エリートが存在するかどうかのスナップショット |
boss.current_location | locationテーブル | ラッパー作成時の位置(スナップショット) |
例
return {
api_version = 1,
on_spawn = function(context)
context.log:info(context.boss.name .. " level " .. context.boss.level)
end
}
ボスメソッド
巡回移動メソッド
巡回が設定されたボスでは、patrol_pause()、patrol_resume()、walk_to(x, y, z)、hold(x, y, z)、teleport(x, y, z) を使用できます。座標はスポーン地点からのオフセットで、各メソッドは要求が受理されたかを返します。walk_to は到着後にルートを再開し、hold は patrol_resume() まで待機し、長距離移動は自動ソルバーを使います。
boss:is_alive()
ボスエンティティが有効で、死亡しておらず、エリートがまだ存在する場合にtrueを返します。ライブチェックにはexistsフィールドの代わりにこれを使用してください。
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.boss:is_alive() then return end
context.boss:send_message("&cI still live!")
end
}
boss:get_location()
ボスの現在のライブ位置をlocationテーブルとして返します。
例
return {
api_version = 1,
on_enter_combat = function(context)
local loc = context.boss:get_location()
context.world:spawn_particle_at_location(loc, "FLAME")
end
}
boss:get_eye_location()
ボスの目線の高さの位置を返します。
例
return {
api_version = 1,
on_enter_combat = function(context)
local eye = context.boss:get_eye_location()
context.world:spawn_particle_at_location(eye, "SMOKE")
end
}
boss:set_ai_enabled(enabled[, duration])
entity:set_ai_enabled と同じ所有変更のルールでボスのAIを設定します。正の持続時間では置き換えた値を復元し、パワーを閉じるとまだ有効な変更をすべて復元します。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
enabled | boolean | AIを有効にする場合true | |
duration | number | 0 | このティック数の後に置き換えた値を復元する。0 ではパワーの終了まで変更を維持する |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("stun", 200) then return end
context.boss:set_ai_enabled(false, 60)
context.boss:send_message("&7The boss is stunned for 3 seconds!")
end
}
boss:teleport_to_location(location)
ボスのテレポートを要求します。設定されたスポーン地点や巡回ルートは変更しません。nil を返すため、成功値として扱わないでください。
| パラメータ | 型 | 備考 |
|---|---|---|
location | locationテーブル | 目的地 |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("retreat", 300) then return end
local spawn = context.entities:get_boss_spawn_location()
context.boss:teleport_to_location(spawn)
context.boss:send_message("&7The boss retreats to its lair!")
end
}
boss:set_velocity_vector(vector)
ボスの速度を即座に設定します。
| パラメータ | 型 | 備考 |
|---|---|---|
vector | vectorテーブル | { x, y, z }または{ x = 0, y = 1, z = 0 } |
例
return {
api_version = 1,
on_enter_combat = function(context)
-- Boss leaps into the air at combat start
context.boss:set_velocity_vector({ x = 0, y = 2.0, z = 0 })
context.boss:send_message("&cThe boss leaps!")
end
}
boss:restore_health(amount)
非負の量を回復させます。上限はEliteMobsの最大体力と最大体力属性の基本値の小さい方です。EliteMobHealEvent によりキャンセルでき、戻り値は nil です。
| パラメータ | 型 | 備考 |
|---|---|---|
amount | number | 回復量 |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("heal", 200) then return end
context.boss:restore_health(20)
context.boss:send_message("&aThe boss regenerates!")
context.boss:spawn_particle_at_self("HEART")
end
}
boss:play_sound_at_self(sound[, volume][, pitch])
ボスの位置でサウンドを再生します。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
sound | string | Minecraftのサウンドキー(例:"entity.wither.spawn")または Spigot の Sound enum 名。リソースパックのキーも使用できます。 | |
volume | number | 1.0 | 音量 |
pitch | number | 1.0 | ピッチ |
例
return {
api_version = 1,
on_spawn = function(context)
context.boss:play_sound_at_self("entity.wither.spawn", 1.0, 0.8)
end
}
boss:spawn_particle_at_self(particleOrSpec[, count])
ボスの位置にパーティクルを生成します。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
particleOrSpec | stringまたはtable | パーティクル名または仕様テーブル | |
count | number | 1 | パーティクルの数 |
例
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:spawn_particle_at_self("SMOKE", 20)
context.boss:send_message("&8Smoke billows from the boss!")
end
}
boss:play_model_animation(name)
利用可能な場合、ボスでカスタムモデルアニメーションを再生します。
| パラメータ | 型 | 備考 |
|---|---|---|
name | string | アニメーション名 |
例
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("slam")
end
}
boss:has_mount() / boss:get_mount()
このボスが現在乗っているエンティティをチェックまたは返します。boss:get_mount()は、ボスがマウントを持っていない場合にnilを返します。マウントが返された場合、そのラッパーにはis_mount = trueが設定されています。
例
return {
api_version = 1,
on_enter_combat = function(context)
local mount = context.boss:get_mount()
if mount ~= nil then
context.log:info("Boss is mounted on " .. mount.entity_type)
end
end
}
boss:set_mount(entity) / boss:clear_mount() / boss:dismount()
ボスを乗せるか降ろします。boss:set_mount(entity)は、ボスを指定したエンティティラッパーに乗せ、Bukkitが搭乗者の変更を受け入れた場合にtrueを返します。boss:clear_mount()とboss:dismount()はどちらも、ボスを現在の乗り物から降ろします。
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("mount_check", 100) then return end
if context.boss:has_mount() then
context.boss:dismount()
end
end
}
boss:face_direction_or_location(vectorOrLocation)
ボスを方向または位置の方を向かせます。
| パラメータ | 型 | 備考 |
|---|---|---|
vectorOrLocation | vectorまたはlocationテーブル | 向く方向 |
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.boss:face_direction_or_location(context.player:get_location())
end
}
boss:navigate_to_location(location[, speed][, forceTeleport][, timeout])
経路探索を使用して、ボスを指定位置まで歩かせます。カスタムボスのみで動作します。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
location | locationテーブル | 目的地 | |
speed | number | 1.0 | 移動速度倍率 |
forceTeleport | boolean | false | 到着前に timeout を過ぎた場合、目的地へテレポートする |
timeout | number | 0 | 移動を断念するまでの tick 数。0 は既定の 100 tick(5秒)を使用する |
目的地まで1ブロック未満になった場合、ボスが存在しなくなった場合、または目的地のワールドを離れた場合も移動は終了します。新しい移動要求は、そのボスで実行中の移動を取り消します。独立したBukkitタスクなので、Luaの一時停止や終了では停止しません。目的地は呼び出し時に保持され、到着結果ではなく nil を返します。
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("charge", 200) then return end
context.boss:navigate_to_location(context.player:get_location(), 1.5)
context.boss:send_message("&cThe boss charges at you!")
end
}
boss:add_tag(tag[, duration]) / boss:remove_tag(tag) / boss:has_tag(tag)
ボスのタグを管理します。
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
local pct = context.boss:get_health() / context.boss:get_maximum_health()
if pct < 0.5 and not context.boss:has_tag("phase2") then
context.boss:add_tag("phase2")
context.boss:send_message("&4Entering Phase 2!")
end
end
}
boss:send_message(message[, range])
ボスと同じワールドの球状3D範囲内にいる全プレイヤーへ、書式付きチャットメッセージを送ります。ゲームモード、視線、戦闘参加、インスタンス参加では絞り込みません。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
message | string | カラーコード付きのメッセージテキスト | |
range | number | 20 | ブロック単位の半径 |
例
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:send_message("&4You dare challenge me?!")
end
}
boss:summon_projectile(entityType, origin, destination[, speed][, options])
エンティティを生成してネイティブラッパーを返します。位置を解決できない場合や不明なエンティティタイプでは nil を返します。既知のタイプでもスポーン不能なら失敗する場合があります。通常のBukkit投射物は spawn_at_origin = true でなければボスから発射されますが、方向は指定した起点と目的地で決まります。ワールド一致を検査しないため、両方を同じワールドにしてください。投射物以外は指定起点に生成し、対応するリビングまたは非リビングラッパーを返します。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
entityType | string | エンティティタイプ(例:"FIREBALL"、"ARROW") | |
origin | locationテーブル | 発射位置 | |
destination | locationテーブル | 目標位置 | |
speed | number | 1.0 | 発射物の速度 |
options | table | {} | 下記のオプションを参照 |
Optionsテーブル:
| キー | 型 | 備考 |
|---|---|---|
duration | number | 正の値では独立したタイマーでこのティック数の後に削除。0 以下ではタイマーなし |
max_ticks | number | 着地監視の上限。既定値は 6000 |
custom_damage | number | 投射物の戦闘処理用カスタムダメージメタデータ。実際の体力減少量は保証しない |
detonation_power | string | 爆発投射物のメタデータに使うパワーファイル名。数値の爆発威力ではない |
yield | number | 爆発の威力(火の玉) |
persistent | boolean | 指定時にBukkitの永続性を設定。持続時間、衝突、所有者による削除を無効にしない |
effect | string | スポーン時に再生するEntityEffect名 |
incendiary | boolean | 爆発が焼夷性かどうか |
gravity | boolean | 発射物に重力があるかどうか |
glowing | boolean | 発光エフェクト |
invulnerable | boolean | 発射物が無敵かどうか |
track | boolean | デフォルトは true。投射物を EliteMobs に登録します。ターゲットへの追尾は行いません。 |
spawn_at_origin | boolean | デフォルトは false。通常の投射物はボスから発射されます。指定した起点に生成するには true を指定します。 |
direction_only | boolean | 明示起点に生成した火の玉で、方向設定後の追加の速度設定を省く |
on_land | function | 接地、無効化、max_ticks 超過時の (landing_location, spawned_entity)。着弾だけを通知するものではない |
direction_only は指定起点に生成する火の玉の追加速度設定を省きます。方向は引き続き目的地で決まります。Bukkit投射物の射手はボスです。track = true では投射物をEliteMobsに登録し、ボスの増援と同じライフサイクルで管理します。投射物以外にはこの追跡を適用しません。track = false にする場合は別の削除方法を用意してください。
on_land の監視はLuaインスタンスに属し、終了すると停止します。接地、無効化、カウンター上限超過のいずれかで一度呼び出し、監視自体はエンティティを削除しません。正の duration による削除タイマーは独立しており、Luaの終了後も残ります。コールバックが呼ばれても、何かに命中した証拠にはなりません。
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("fireball", 100) then return end
context.boss:summon_projectile(
"FIREBALL",
context.boss:get_eye_location(),
context.player:get_location(),
1.5,
{
custom_damage = 10,
on_land = function(loc, entity)
context.world:spawn_particle_at_location(loc, "EXPLOSION")
end
}
)
end
}
boss:summon_reinforcement(filename[, zoneOrLocation][, duration])
カスタムボスファイルからサイレントに増援を召喚し、召喚者を記録します。召喚者のカスタムボスが正規化戦闘を使う場合はそれを継承します。レベルは増援自身の設定と動的レベル規則で決まります。ゾーンではサンプル位置をランダムに選び、位置がなければ中心を使います。解決できなければボスの位置を使います。生存する増援のリビングエンティティラッパーを返し、生成できなければ nil です。
| パラメータ | 型 | 備考 |
|---|---|---|
filename | string | ボス設定ファイル名 |
zoneOrLocation | locationテーブルまたはゾーン | オプションのスポーン位置またはゾーン定義。デフォルトはボスの位置。 |
duration | number | 正の値で指定する逃走までのティック数。既定値 0 ではこのヘルパーによるタイマーなし。レベルの上書きではない |
例
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:summon_reinforcement("my_minion.yml", context.boss:get_location(), 0)
context.boss:send_message("&cMinions, come to my aid!")
end
}
boss:despawn()
理由 OTHER でEliteMobsを通じてボスを削除します。boss:remove() も同じライフサイクルの別名です。ダメージ攻撃や通常の死亡報酬を要求する操作ではありません。
例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
local pct = context.boss:get_health() / context.boss:get_maximum_health()
if pct < 0.1 then
context.boss:send_message("&7The boss vanishes into thin air!")
context.boss:despawn()
end
end
}
boss:get_nearby_players(range)
ボスと同じワールドの球状3D範囲内にいるプレイヤーのラッパー配列を返します。ゲームモード、視線、インスタンス参加では絞り込まず、距離順にも並べません。
| パラメータ | 型 | 備考 |
|---|---|---|
range | number | ブロック単位の半径 |
例
return {
api_version = 1,
on_enter_combat = function(context)
local players = context.boss:get_nearby_players(30)
for _, p in ipairs(players) do
p:show_action_bar("&cThe boss sees you!")
end
end
}
boss:get_damager_count()
記録されている攻撃者マップの現在の要素数を返します。damager_count フィールドと異なりライブ読み取りですが、近くにいる、または現在オンラインの戦闘参加者数ではありません。
boss:get_nearby_elites(radius)
同じワールドの生存する追跡中エリートを最大32体返し、ボス自身は除外します。半径は有限で 0 より大きく、最大 64 ブロックです。リビングエンティティラッパーを距離順で返し、同距離ではエリートUUID順になります。この検索だけでは、すべての結果に効果を適用できると保証しません。
boss:get_target_player()
ボスの現在のMobターゲットをプレイヤーラッパーとして返します。ターゲットがプレイヤーでない場合や未設定の場合はnilを返します。
ゾーンおよびパーティクルメソッド
これらのメソッドはゾーンとパーティクルエフェクトを組み合わせます。入力としてゾーンテーブルが必要です。
boss:get_nearby_players_in_zone(zone)
ボスのワールドでネイティブゾーン形状に合致するプレイヤーを返します。ゲームモードやインスタンス参加では絞り込みません。呼び出し時の検索であり、継続監視ではありません。
| パラメータ | 型 | 備考 |
|---|---|---|
zone | zoneテーブル | ゾーン形状の定義 |
boss:spawn_particles_in_zone(zone, particle[, amount][, x][, y][, z][, speed][, coverage])
ゾーンの内部をパーティクルで満たします。引数は順番に渡します。このメソッドは仕様テーブルを受け付けません。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
zone | zoneテーブル | kind を使うネイティブゾーン形状。ゾーンとターゲットを参照 | |
particle | string | パーティクルタイプ名 | |
amount | number | 1 | 取った各サンプル位置でのパーティクル数 |
x, y, z | number | 0 | 拡散幅。amount が 0 の場合は方向 |
speed | number | 0 | パーティクル速度 |
coverage | number | 1.0 | 位置ごとの独立したサンプリング確率。0.01~1.0 に制限され、位置集合が空でなければ最低1か所を使う |
boss:spawn_particles_in_zone_border(zone, particle[, amount][, x][, y][, z][, speed][, coverage])
上のメソッドと同じですが、内部ではなくゾーンの境界から位置をサンプリングします。
boss:get_particles_from_self_toward_zone(zone, particle[, speed])
サンプルしたゾーン位置にあり、ボスから離れる方向を向くパーティクル仕様の配列を返します。ボスの位置に生成したり、そこからの移動をアニメーション化したりするものではありません。結果を boss:spawn_particles_with_vector(...) に渡してください。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
zone | zoneテーブル | 対象ゾーン | |
particle | string | パーティクルタイプ名 | |
speed | number | 0.1 | パーティクルの移動速度 |
各要素は { location = ..., particle = ..., amount = 0, x/y/z = <unit direction>, speed = ... } の形式です。各位置を20%の確率で選び、空でない集合からは最低1か所選びます。その後、ボスと一致する位置は除外します。実際の方向動作はパーティクルの種類によって異なります。
boss:get_particles_toward_self(zone, particle, speed)
ゾーンからボスに向くパーティクル仕様の配列を返します。生成は行わないため、結果を boss:spawn_particles_with_vector(...) に渡してください。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
zone | zoneテーブル | ソースゾーン | |
particle | string | パーティクルタイプ名 | |
speed | number | 0.1 などを明示してください。省略するとパーティクル名を数値として読み取ろうとして失敗します。 |
boss:spawn_particles_with_vector(particles)
それぞれが独自の位置と速度ベクトルを持つ指向性パーティクルの配列を生成します。
| パラメータ | 型 | 備考 |
|---|---|---|
particles | テーブルの配列 | 各エントリが位置と方向を持つパーティクルを定義します |
エンダードラゴンメソッド
これらのメソッドは、ボスエンティティがエンダードラゴンの場合にのみ適用されます。
boss:get_ender_dragon_phase()
現在のEnderDragon.Phase名を文字列として返します。ボスがエンダードラゴンでない場合はnilを返します。
boss:set_ender_dragon_phase(phase)
エンダードラゴンのフェーズを設定します。
| パラメータ | 型 | 備考 |
|---|---|---|
phase | string | EnderDragon.Phase名(例:"CIRCLING"、"CHARGE_PLAYER") |
特殊パワーサポートメソッド
これらのメソッドは、Luaスクリプトから組み込みのEliteMobsパワーメカニクスをサポートします。
boss:start_tracking_fireball_system(speed?)
モンスターボス上で、このパワー用のコントローラーを1つ開始します。モンスターにターゲットがある間、最初の実行時(次のティック)と以後8秒ごとに、各軸20ブロック以内のSurvival/Adventureプレイヤーへ追尾する火の玉を発射します。ターゲットがない状態で実行されるとコントローラーは停止し(最初の実行も含む)、再呼び出しで再開できます。稼働中の再呼び出しでは速度を変更しません。コントローラーはパワーのスクリプトに属します。スクリプトを一時停止するとコントローラーも一時停止し、スクリプトを閉じると停止します。呼び出しでコントローラーを開始する場合、速度は有限の正の値である必要があり、そうでなければエラーになります。
火の玉は爆発威力 3 で着火します。各火の玉の追尾タスクはスクリプトとは独立しています。約3分後または無効な状態で停止しますが、停止だけでは火の玉を削除しません。追跡中の火の玉へのキャンセルされていない攻撃で、追尾対象がプレイヤーと術者の間で切り替わります。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
speed | number | 0.5 | 火の玉の速度。有限の正の値である必要がある |
boss:handle_spirit_walk_damage(cause)
ダメージ原因をSpirit Walkヘルパーへ渡します。炎、燃焼ティック、毒、ウィザー、棘の鎧、範囲攻撃はカウンターを進めません。溺水と窒息では直ちに脱出を開始し、それ以外の対象となる原因では9回目ごとに開始します。近くの有効な目的地を探し、一時的な無敵状態でそこへ移動するアニメーションを行います。渡されたダメージイベントをキャンセルせず、攻撃者の背後へ移動する保証もありません。
| パラメータ | 型 | 備考 |
|---|---|---|
cause | string | BukkitのDamageCause名(例:"ENTITY_ATTACK"、"PROJECTILE") |
boss:shield_wall_is_active()
シールドコントローラーの稼働フラグを返します。特定方向のシールド耐久値が残っている保証ではありません。
boss:initialize_shield_wall(openingDirection?)
シールドが未稼働なら、方向別の耐久値と表示を初期化します。保護する各方向の初期耐久値はボスのレベルです。引数は保護しない開口方向で、攻撃回数ではありません。nil を返し、ダメージイベントハンドラーを自動登録しません。
| パラメータ | 型 | デフォルト | 備考 |
|---|---|---|---|
openingDirection | number | 1 | 1 = 北、2 = 東、3 = 南、4 = 西。それ以外の整数は4方向すべてを保護 |
boss:shield_wall_absorb_damage(player, damage)
ボスに対する攻撃者の位置から方向を判定し、その方向の耐久値から指定ダメージを引きます。減算前の値が正なら、残量を超える攻撃でも true を返します。プレイヤーや状態がない場合、別ワールド、耐久値切れ、開口方向では false です。ダメージイベントはキャンセルしません。 true のときに攻撃を防ぐには、ダメージフック側で context.event.cancel_event() を呼んでください。ダメージ量は非負にしてください。
| パラメータ | 型 | 備考 |
|---|---|---|
player | プレイヤーラッパー | 攻撃しているプレイヤー |
damage | number | 吸収するダメージ量 |
boss:deactivate_shield_wall()
独立した表示タスクを停止し、状態とシールド用アーマースタンドを削除します。Luaインスタンスを終了するだけでは呼ばれません。この仕組みを終えるときに明示的に呼んでください。
boss:start_zombie_necronomicon(target, chant)
リビングエンティティの対象とスクロールする詠唱文でNecronomiconを開始します。第2引数は表示テキストで、ボスファイル名ではありません。固定ファイル necronomicon_zombie.yml を80%、necronomicon_skeleton.yml を20%の確率で、術者のレベルで60ティックごとに1体召喚します。新規起動は追跡中増援が9体以下で、稼働中コントローラーがない場合だけ受理します。稼働中は11体まで召喚し、上限中はAIを有効にし、数が減ると詠唱を再開します。
詠唱中はボスのAIを無効にして表示名を変更し、警告表示は警告エフェクト設定に従います。対象は有効で、同じワールドの30ブロック以内にいる必要があります。無効な状態や所有者削除でコントローラーを停止し、表示を戻して増援を除去します。独立したBukkitタスクなので、Luaの終了だけでは停止しません。戻り値は nil です。
| パラメータ | 型 | 備考 |
|---|---|---|
target | エンティティラッパー | ネクロノミコンの対象エンティティ |
chant | string | スクロール表示する文。空白ならボス名を使い、短い文には余白を足す |
context.players
ボスを中心としたプレイヤークエリヘルパーです。イベントから特定のプレイヤーを必要とせずにプレイヤーを見つけるために使用します。
ゲームモード、視線、生存状態、戦闘参加、インスタンス参加で絞り込まず、距離順にも並べません。current_target() はイベントの行為者を優先するため、直接の対象を優先する context.player と異なる場合があります。スケジュールされた新しいコンテキストにはイベントの行為者がなく、現在のMobターゲットを使います。
| メソッド | 戻り値 | 備考 |
|---|---|---|
players:current_target() | プレイヤーラッパーまたはnil | イベントプレイヤー、またはボスのMobターゲットがプレイヤーの場合はそれ |
players:nearby_players(radius) | プレイヤーラッパーの配列 | ボスの半径内のすべてのプレイヤー |
players:all_players_in_world() | プレイヤーラッパーの配列 | ボスのワールド内のすべてのプレイヤー |
例
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(20)
for _, player in ipairs(nearby) do
player:send_message("&cThe boss is enraged!")
player:apply_potion_effect("GLOWING", 60, 0)
end
end
}
例
return {
api_version = 1,
on_spawn = function(context)
-- Warn everyone in the world
local everyone = context.players:all_players_in_world()
for _, p in ipairs(everyone) do
p:show_title("&4WARNING", "&7A world boss has spawned!", 10, 60, 20)
end
end
}
context.entities
ボスを中心とした汎用のエンティティクエリヘルパーです。
| メソッド | 戻り値 | 備考 |
|---|---|---|
entities:get_nearby_entities(radius[, filter]) | エンティティラッパーの配列 | ボスの周囲の近くのエンティティ |
entities:get_entities_in_box(center, halfX, halfY, halfZ[, filter]) | エンティティラッパーの配列 | 中心のワールドで足元が境界を含むボックス内にあるリビングエンティティ。バウンディングボックスの重なり検査ではない |
entities:get_all_entities([filter]) | エンティティラッパーの配列 | ボスのワールド内のすべての一致するエンティティ |
entities:get_direct_target_entity() | エンティティラッパーまたはnil | 現在のイベントのダイレクトターゲット |
entities:get_boss_spawn_location() | locationテーブル | ボスの元のスポーン位置 |
有効なフィルター: living(デフォルト)、player / players、elite / elites、mob / mobs、all / entities
all / entities は get_nearby_entities でのみ有効です。ドロップアイテムや投射物などの非リビングエンティティを軽量な参照ラッパーとして含み、リビングエンティティには完全なリビングラッパーを使います。このフィルターは各軸に指定半径を取る軸並行ボックスを検索し、リビング用フィルターは球状距離を使います。他の検索メソッドでは all / entities は living として扱います。ボス自身はすべての結果から除外します。
フィルターは大文字と小文字を区別せず、不明な値も living になります。mob は敵対モンスターだけでなく、プレイヤー以外の全リビングエンティティです。インスタンス参加者による自動絞り込み、結果数上限、距離順ソートはありません。広いリビング検索はワールドのロード済みリビングエンティティを走査するため、半径を制限して不要な繰り返しを避けてください。get_direct_target_entity() はイベントの直接対象を使い、nil の場合があります。Mobの現在の戦闘ターゲットにはフォールバックしません。
例
return {
api_version = 1,
on_enter_combat = function(context)
-- Damage all nearby elites
local elites = context.entities:get_nearby_entities(10, "elites")
for _, elite in ipairs(elites) do
elite:deal_damage(5)
end
end
}
例
return {
api_version = 1,
on_enter_combat = function(context)
-- Find players in a box area
local center = context.boss:get_location()
local players = context.entities:get_entities_in_box(center, 10, 5, 10, "players")
for _, p in ipairs(players) do
p:send_message("&eYou are in the danger zone!")
end
end
}
次のステップ
- はじめに | フックとライフサイクル | ワールドと環境 | ゾーンとターゲティング | 例 | 列挙型 | トラブルシューティング
- APIリファレンス | スクリプティングエンジン
