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

Luaスクリプティング:ゾーンとターゲティング

webapp_banner.jpg

EliteMobsのLua機能は、空間領域の定義とターゲット解決のために2つの補完的なアプローチを提供します:

  • ネイティブゾーン (context.zones) -- シンプルで直接的。ゾーン定義を通常のLuaテーブルとして構築し、エンティティや位置を問い合わせます。単純な「このエリアに何かいるか?」チェックに最適です。
  • スクリプトユーティリティ (context.script) -- より豊富なターゲティング、watch/contains/entitiesメソッドを持つゾーンハンドル、パーティクル生成、ダメージ、プッシュアクション。EliteScriptゾーンやEliteScriptターゲットと同じフィールド名を使用し、馴染みやすくしています。

両方のアプローチはネイティブLua APIです。パワーの複雑さに合ったものを選択してください。


ネイティブゾーン:context.zones​

ネイティブゾーンは通常のLuaテーブルを受け取ります。クエリごとに新しい形状を作成し、ウォッチャーは1つの形状を保持します。そのため、アニメーションレイを繰り返し問い合わせると、ウォッチャーの現在の形状を読むのではなくアニメーションが再開します。複数の操作で同じアニメーション形状を使う場合は、スクリプトゾーンハンドルを使用してください。

メソッド​

メソッド備考
zones:get_entities_in_zone(zoneDef[, options])ゾーン内のエンティティラッパーの配列を返す
zones:get_locations_in_zone(zoneDef[, options])ゾーン内の位置テーブルの配列を返す
zones:zone_contains(zoneDef, location[, "full"|"border"])位置がゾーン内にある場合にtrueを返す
zones:watch_zone(zoneDef, callbacks[, options])毎ティック確認する永続的なゾーンウォッチャーを登録する

ゾーン定義フィールド​

フィールド型デフォルト備考
kind(または type)string—"sphere", "dome", "cylinder", "cuboid", "cone", "static_ray", "rotating_ray", "translating_ray"
radiusnumber0ゾーン半径(sphere、dome、cylinder、cone)
heightnumber0シリンダーの高さ
originlocationボスの位置形状の原点:円柱の底面、円錐の頂点、レイの始点
destinationlocationボスの位置レイとコーンの終点
x, y, znumber0直方体の寸法。点とエンティティの形状判定の違いを参照
thickness / point_radius / pointRadiusnumber0.5レイのサンプル半径と間隔。正の値を指定
border_radius / borderRadiusnumber1外側の形状から除く内半径
x_border, y_border, z_bordernumber1内側の直方体の寸法
animation_durationint0アニメーションレイのアニメーション長(ティック単位)
pitch_pre_rotation, yaw_pre_rotationnumber0事前回転角度(回転レイ)
pitch_rotation, yaw_rotationnumber0アニメーション全体の回転角度。現在は正の増分だけを適用
origin_end, destination_endlocationボスの位置移動レイの終了位置
ignores_solid_blocksbooleantrueレイが固体ブロックを通過するかどうか
lengthnumber0ビルダーが保存する値。ただし省略した destination はこの値の利用前にボス位置になるため、終点を明示すること

アンダースコア付きの数値・真偽値フィールドはcamelCaseも受け付けます(borderRadius、xBorder、animationDuration、pitchPreRotation、ignoresSolidBlocks)。位置フィールド origin_end と destination_end はアンダースコア付きの名前が必要です。EliteScriptの Target テーブルでネイティブ位置フィールドを置き換えることはできません。

kind は大文字と小文字を区別

kind は完全一致で照合され、小文字が必要です。"SPHERE" や "Sphere" は一致せず、クエリはコンソール警告なしで空のリストを返します。

円錐とレイの端点を明示する

origin または destination を省略するとボスの現在位置になります。現在の位置リゾルバーでは、length を省略した終点の代わりに使えません。異なる端点を指定してください。

local explicit_ray = { kind = "static_ray", origin = context.boss:get_eye_location(),
destination = context.player:get_eye_location() }

移動レイをアニメーションさせるには、origin_end、destination_end、正の animation_duration を指定してください。省略した最終端点は開始位置に留まります。時間をゼロにすると静止した初期レイが作成され、負の時間は拒否されます。アニメーションの最終フレームは、指定した端点でちょうど終わります。

端点と判定する位置はすべてボスの現在のワールド内に置いてください。ネイティブのエンティティクエリはそのワールドを検索します。位置テーブルの省略座標は 0、省略ワールドはボスのワールドになりますが、明示するワールド名はロード済みでなければなりません。寸法には有限の正数を使ってください。点判定、パーティクルのサンプル、エンティティ判定は同じではありません。共通の形状の制限には、ドーム全体のエンティティ判定が球状になること、円柱ではエンティティの全高を確認すること、直方体の判定範囲が異なることが含まれます。

クエリオプション​

キー備考
filter"player" / "players", "elite" / "elites", "mob" / "mobs", "living"(デフォルト)
mode"full"(デフォルト)または"border"
coverage0.0から1.0 -- サンプリングする位置の割合(デフォルト1.0)

filter は大文字・小文字を区別せず、不明な値は living になります。mobs はプレイヤー以外の生きたエンティティで、エリートも含みます。ボス自身は除外しますが、プレイヤーをゲームモードで除外しません。mode は大文字・小文字を区別せず border を認識し、その他は full になります。Coverageは位置を無作為抽出する値であり、エンティティやウォッチャーのメンバー数を制限しません。レイは full を使ってください。境界位置は未対応で、位置クエリが失敗する場合があります。

ウォッチコールバック​

キー備考
on_enterfunction(entity) -- エンティティがゾーンに入った時に呼び出される
on_leavefunction(entity) -- エンティティがゾーンから出た時に呼び出される

例:基本的な球体クエリ​

例
return {
api_version = 1,
on_spawn = function(context)
-- Store a zone definition for reuse
context.state.danger_zone = {
kind = "sphere",
origin = context.boss:get_location(),
radius = 10
}
end,

on_boss_damaged_by_player = function(context)
-- Update the origin to the boss's current position
context.state.danger_zone.origin = context.boss:get_location()

local players = context.zones:get_entities_in_zone(
context.state.danger_zone,
{ filter = "players" }
)

for _, player in ipairs(players) do
player:send_message("&cYou are in the danger zone!")
end
end
}

例:入退場によるゾーン監視​

例
return {
api_version = 1,
on_spawn = function(context)
context.zones:watch_zone(
{
kind = "sphere",
origin = context.boss:get_location(),
radius = 8
},
{
on_enter = function(entity)
entity:apply_potion_effect("SLOWNESS", 40, 1)
entity:send_message("&7You feel sluggish near the boss...")
end,
on_leave = function(entity)
entity:send_message("&aYou escape the slowing aura.")
end
},
{ filter = "players", mode = "full" }
)
end
}

ウォッチャーに関する注意:

  • ウォッチャーコールバックはcontext.event経由ではなく、単一のエンティティラッパーを直接受け取る
  • ウォッチャーは自身の on_enter / on_leave を呼び出し、パワーのトップレベルの on_zone_enter / on_zone_leave は呼び出さない
  • ウォッチャーはボスが削除されると自動的にクリーンアップされる
  • ネイティブウォッチャーは形状を一度だけ作成する。中心はボスを追跡せず、元のテーブルを編集しても既存のウォッチャーは移動しない。動く範囲には新しいクエリ、または追跡ターゲットを持つスクリプトゾーンを使う
  • 各ウォッチャーは毎ティック実行されるため、コールバックロジックは軽量に保つこと
  • ボスエンティティ自体はゾーンクエリから除外される

最初の確認は1ティック後で、すでに内部にいるエンティティも on_enter を発生させます。キャンセルや後処理では残ったメンバーに on_leave を送りません。この例の球体はスポーン位置に固定されます。移動速度低下は入場から40ティックで、滞在しても更新されず、退場しても早期解除されません。


スクリプトユーティリティ:context.script​

スクリプトユーティリティは、ターゲット解決、ゾーンハンドル、相対ベクトル、パーティクル生成、戦闘アクションを提供します。

context.script はEliteScriptエンジンを使用する

仕様テーブルをJavaのマップに変換し、YAML EliteScriptが使うターゲット、ゾーン、相対ベクトル、パーティクルのクラスへ渡します。

実務上の意味は次のとおりです:

  • テーブルはEliteScriptターゲット、EliteScriptゾーン、EliteScript相対ベクトルのパーサーとその制限を引き継ぎます。フィールドが受理されても、Luaハンドルに必要なアクションのライフサイクルや継承コンテキストがあるとは限りません。
  • enum値はYAMLと同じく、正確な大文字の UPPER_SNAKE_CASE("NEARBY_PLAYERS"、"SPHERE"、"ZONE_FULL")です。
  • ここに示す正式なYAML名 Target、Target2、targetType、borderRadius を使ってください。内部の読み取り処理は大文字・小文字を区別しません。
  • 無効な値は警告、代替値、または後で失敗する欠落フィールドになる場合があります。テーブルの受理は操作全体の検証ではありません。

context.zones は小文字の kind を使う別の読み取り処理を持ちますが、形状クラスは共通です。名前付きフィールドを持つ空でないテーブルを指定してください。空のLua {} はJavaのリストに変換されるため、script:target({}) も失敗します。script:target({targetType = "SELF"}) を使ってください。

メソッド​

メソッド備考
script:target(spec)ターゲット仕様テーブルからターゲットハンドルを作成する
script:zone(spec)ゾーン仕様テーブルからゾーンハンドルを作成する
script:relative_vector(spec[, actionLocation][, zoneHandle])相対ベクトルハンドルを作成する
script:damage(targetHandle, amount[, multiplier])解決されたターゲットにダメージを与える
script:push(targetHandle, vectorOrHandle[, additive])解決されたターゲットを押す
script:set_facing(targetHandle, vectorOrHandle)ターゲットの向きを設定する
script:spawn_particles(targetHandle, particleSpec)解決されたターゲット位置にパーティクルを生成する

damage、push、set_facing、spawn_particles はエンティティ配列ではなくターゲットハンドルを受け取り、戻り値はありません。YAMLアクションの条件、待機、フィルターは適用しません。damage はボスを攻撃者としてBukkitへダメージ量を渡します。省略可能な倍率は対プレイヤーの戦闘経路に適用され、最終的な体力減少は戦闘処理に依存します。push はターゲットと1つのベクトルをその場で解決し、次のティックで全対象に同じベクトルを適用します。通常は速度を置き換え、additive = true ならそのティックの速度に加算します。set_facing は全対象に同じ向きを即時適用します。ゼロや非有限の方向を渡さないよう確認してください。

ターゲットハンドルメソッド​

メソッド備考
handle:entities()エンティティラッパーの配列を返す
handle:locations()位置テーブルの配列を返す
handle:first_entity()最初のエンティティまたはnilを返す
handle:first_location()最初の位置またはnilを返す

各メソッドは毎回解決します。first_* は共有スナップショットを読むものではなく、最寄りの結果も保証しません。DIRECT_TARGET はイベントが保持する対象で、ボスの現在の戦闘対象ではありません。イベントに対象がなければ何も選択しません。

ターゲット仕様キー​

キーデフォルト備考
targetType"SELF"任意のEliteScriptターゲットタイプ
range20近傍検索ボックスの各軸の半幅。結果は距離順ではない
coverage1.00.0~1.0。ゾーン型だけに適用。他の型で 1.0 未満を指定すると警告付きで 1.0 に戻る
offset0,0,0カンマ区切りの "x,y,z" 文字列。このEliteScriptフィールドはLuaベクトルテーブル非対応
relativeOffsetなし相対ベクトル仕様。始点・終点ターゲットが方向を決める
locationなし"LOCATION" 用のシリアライズされた "world,x,y,z,yaw,pitch" 文字列
locationsなし"LOCATIONS" 用のシリアライズされた位置文字列の配列
tracktrue移動するターゲットを再解決するかどうか

Luaハンドル経路はYAMLアクションのターゲットキャッシュ処理を実行しません。したがって、静的なLuaターゲットやゾーンで track = false を指定しても位置は固定されません。静的ゾーンは問い合わせるたびに原点を解決し、アニメーションゾーンは作成時に形状を保持します。固定範囲には座標を明示した LOCATION、または取得済みの origin を持つネイティブゾーンを使ってください。offset と relativeOffset は、LOCATION、LOCATIONS、SELF_SPAWN、エンティティ由来のターゲット、サンプリングされたゾーン位置を含め、ハンドルが解決するすべての位置を移動します。entities() が返すエンティティは移動せず、LANDING_LOCATION と INHERIT_SCRIPT_TARGET はこれらを無視します。ゾーンハンドルの full_target() と border_target() はオフセットを受け取らないため、オフセットはゾーンの Target と Target2 の仕様に指定してください。共通属性を参照してください。

パーサーは17種類の名前を受け付けます:SELF、SELF_SPAWN、DIRECT_TARGET、NEARBY_PLAYERS、NEARBY_MOBS、NEARBY_ELITES、WORLD_PLAYERS、ALL_PLAYERS、LOCATION、LOCATIONS、ZONE_FULL、ZONE_BORDER、LANDING_LOCATION、ACTION_TARGET、INHERIT_SCRIPT_TARGET、INHERIT_SCRIPT_ZONE_FULL、INHERIT_SCRIPT_ZONE_BORDER。単独のLuaハンドルには継承アクションデータや着地位置がありません。INHERIT_* と LANDING_LOCATION は解決時に失敗する場合があるため避けてください。ACTION_TARGET には対応する相対ベクトル・アクションコンテキストが必要です。継承ゾーンの制限を参照してください。

ZONE_FULL と ZONE_BORDER のターゲットはゾーンハンドルから取得してください。単独の script:target(...) にはゾーンがありません。Luaのパーティクルヘルパーの既定coverageは 1.0 です。YAMLの SPAWN_PARTICLE アクションの既定値 0.3 は適用しません。

例:ターゲットの作成と使用​

例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("roar", 200) then return end
-- Find all players within 20 blocks along each axis
local nearby = context.script:target({
targetType = "NEARBY_PLAYERS",
range = 20
})

for _, player in ipairs(nearby:entities()) do
player:send_message("&eThe boss roars in fury!")
end

-- First resolved entity; this does not promise the nearest player.
local first = nearby:first_entity()
if first then
first:show_title("&cRUN!", "&7The boss is targeting you")
end
end
}

ゾーンハンドルメソッド​

メソッド備考
handle:full_target([coverage])ゾーンボリューム全体のターゲットハンドルを返す
handle:border_target([coverage])ゾーンボーダーのターゲットハンドルを返す
handle:full_locations([coverage])ゾーンボリューム全体の位置を返す
handle:border_locations([coverage])ゾーンボーダーの位置を返す
handle:full_entities()ゾーンボリューム全体のエンティティを返す
handle:border_entities()ゾーンボーダーのエンティティを返す
handle:contains(location[, "full"|"border"])位置がゾーン内にある場合にtrueを返す
handle:watch(callbacks[, mode])入退場イベントのためにゾーンを監視し、タスクIDを返す

ゾーン仕様キー​

キーデフォルト備考
shape"CYLINDER""SPHERE", "DOME", "CYLINDER", "CUBOID", "CONE", "STATIC_RAY", "ROTATING_RAY", "TRANSLATING_RAY"
radius5球、ドーム、円柱、円錐
height1円柱のみ。エンティティクエリでは対象の全高が収まる必要がある
x, y, z0直方体の寸法。点とエンティティの形状判定の違いを参照
xBorder, yBorder, zBorder0内側の直方体の寸法
borderRadius1球・ドーム・円柱・円錐の内半径
pointRadius0.5レイの正のサンプル半径と間隔
animationDuration0アニメーションレイのアニメーション長(ティック単位)
Target{targetType = "SELF"}中心ターゲット仕様(テーブル) -- 同じターゲット仕様フォーマットを使用
Target2なし第2ポイント。コーンとすべてのレイ形状では必須です
FinalTarget, FinalTarget2なし終了位置。移動レイのみ
filter"PLAYER""PLAYER"、"ELITE"、"LIVING" -- context.zones とは異なり、ここでは大文字である点に注意
ignoresSolidBlockstrueレイのみ
pitchPreRotation, yawPreRotation0回転レイのみ
pitchRotation, yawRotation0回転レイのみ

選択した shape に該当しないキーは、文句を言われることなく読み取られたうえで無視されます -- sphere に height を指定しても何も起きません。

contains は点を判定し、エンティティの境界ボックスを判定しません。watch のコールバック形式と初回確認はネイティブウォッチャーと同じです。返されたIDを context.scheduler:cancel_task(id) で取り消せますが、退場コールバックは発生しません。静的スクリプトゾーンは毎ティック SELF を解決して追跡でき、アニメーションハンドルは形状を保持します。borderRadius は境界の厚さではなく内半径です。レイには全体ターゲットを使ってください。

例:ダメージとパーティクル付きゾーン​

例
return {
api_version = 1,
on_enter_combat = function(context)
-- Create a sphere zone centered on the boss
if context.state.zone_task_id ~= nil then return end
local zone = context.script:zone({
shape = "SPHERE",
radius = 6,
Target = { targetType = "SELF" }
})

-- Spawn warning particles on the zone border
context.script:spawn_particles(
zone:border_target(0.3),
{ particle = "FLAME", amount = 1, speed = 0.02 }
)

-- Damage all players inside the zone
local targets = zone:full_target()
context.script:damage(targets, 5.0)

-- First repeat after 20 ticks, then every 20 ticks.
context.state.zone_task_id = context.scheduler:run_repeating(20, 20, function(ctx)
local z = ctx.script:zone({
shape = "SPHERE",
radius = 6,
Target = { targetType = "SELF" }
})

ctx.script:spawn_particles(
z:border_target(0.3),
{ particle = "FLAME", amount = 1, speed = 0.02 }
)

ctx.script:damage(z:full_target(), 5.0)
end)
end,
on_exit_combat = function(context)
if context.state.zone_task_id ~= nil then
context.scheduler:cancel_task(context.state.zone_task_id)
context.state.zone_task_id = nil
end
end
}

この例はパーティクル表示と同時にダメージを与え、予告の待機時間はありません。繰り返しは20ティック後から始まり、戦闘終了時に停止します。既定の内半径 1 により、半径 6 内の境界は薄い輪ではなく厚い殻になります。

相対ベクトル仕様キー​

キー備考
SourceTargetソースターゲット仕様(テーブル)
DestinationTargetデスティネーションターゲット仕様(テーブル)
normalize真偽値、既定 false。ベクトルを正規化するか
multiplier正規化後に掛ける係数、既定 1
offsetカンマ区切りの "x,y,z" 文字列、既定 "0,0,0"。Luaベクトルテーブルではない

相対ベクトルハンドルメソッド​

メソッド備考
handle:resolve()計算されたベクトルテーブルを返す

両方のターゲット仕様を指定してください。それぞれの最初の位置を使い、終点から始点を引き、任意の正規化、乗算、ワールド軸のオフセットを順に適用します。空の結果や異なるワールドではオフセット適用前にゼロを返します。同じ位置を正規化すると非有限のベクトルになる場合があります。ACTION_TARGET は指定した actionLocation を使い、省略時はハンドル作成時のボス位置です。押す対象ごとに置き換わるわけではありません。ベクトルのターゲットがゾーンを必要とする場合は、第3引数にゾーンハンドルを渡してください。

例:相対ベクトルでターゲットを押す​

例
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("knockback", 100) then return end

-- Build a vector from the boss toward the attacker
local vec = context.script:relative_vector({
SourceTarget = { targetType = "SELF" },
DestinationTarget = { targetType = "DIRECT_TARGET" },
normalize = true,
multiplier = 2.5
})

-- Push the attacker away
local target = context.script:target({
targetType = "DIRECT_TARGET"
})

context.script:push(target, vec)
end
}

パーティクル仕様フォーマット​

パーティクル仕様は文字列、単一のテーブル、またはテーブルの配列で指定できます。この経路はEliteScriptのパーティクルエンジンを実行するため、キーはSPAWN_PARTICLEで文書化されているEliteScriptのものになります:

キーデフォルト備考
particle"FLAME"パーティクル名(例:"FLAME"、"DUST"、"SMOKE")
amount1パーティクル数。0 の場合の方向動作はパーティクルの種類による
x, y, z0.01オフセット/拡散値、または amount が 0 のときは速度
speed0.01パーティクル速度
red, green, blue255DUST、DUST_COLOR_TRANSITION、Color データを要求するパーティクルの色(0–255)。WITCH は使わない
toRed, toGreen, toBlue255DUST_COLOR_TRANSITIONのトランジション先の色
material"STONE"ブロック/アイテムデータを持つパーティクル(BLOCK、ITEM、FALLING_DUST など)が表示するブロックまたはアイテム
relativeVectorなし相対ベクトルの spec。設定すると amount が 0 に強制され、x/y/z が解決された方向で上書きされます

ダストのサイズは 1 固定です。moveToTarget は読み取られますがパーティクルを移動させません。未対応のデータ型は警告付きでスキップします。ヘルパーはゾーンおよび LOCATION / LOCATIONS のパーティクル位置をX・Z方向へ +0.5 ずらしますが、ハンドルが返す位置はずらしません。

パーティクルのキーは2系統ある

これらのEliteScriptのキーは、context.world:spawn_particle_at_location(loc, spec) が受け付けるものとは別物です。world テーブルには独自のより小さなリーダーがあり、デフォルト値も異なり(amount は 1、x/y/z/speed は 0)、material も relativeVector もありません。さらに snake_case の to_red / to_green / to_blue を受け付けます。ワールドと環境を参照してください。

パーティクル名の完全なリストはEnumリファレンスを参照してください。

重要な注意事項​

  • スクリプトユーティリティのハンドルは、作成されたイベントコンテキストに紐づけられています。後のフック呼び出しで使用するためにcontext.stateに保存しないでください。
  • context.script:zone(...):watch(...) は context.scheduler:cancel_task() で取り消せるIDを返します。context.zones:watch_zone(...) は何も返さず、パワーとともに自動的に後処理されます。
  • カバレッジ値は位置ベースの解決にのみ適用され、エンティティクエリには適用されません。
  • ターゲット・形状・フィルターのenum値はEliteScript YAMLと同じUPPER_SNAKE_CASEです(例:"SELF"、"NEARBY_PLAYERS"、"SPHERE")。watch/containsのモードは "full" または "border" です。

emヘルパー名前空間​

em名前空間はすべてのLuaパワーファイルでグローバルに利用可能です。位置、ベクトル、ゾーン定義の便利なコンストラクタを提供します。

位置とベクトルのコンストラクタ​

関数備考
em.create_location(x, y, z[, world][, yaw][, pitch])add(dx, dy, dz)メソッドを持つ位置テーブルを返す
em.create_vector(x, y, z)ベクトルテーブルを返す

ゾーンビルダーヘルパー​

em.zoneサブテーブルは、context.zonesと互換性のあるゾーン定義テーブルを返すビルダー関数を提供します。各ビルダーはチェーン可能なミューテーターメソッドを持つテーブルを返します。

関数パラメータミューテーター
em.zone.create_sphere_zone(radius)radius:set_center(location)
em.zone.create_dome_zone(radius)radius:set_center(location)
em.zone.create_cylinder_zone(radius, height)radius, height:set_center(location)
em.zone.create_cuboid_zone(x, y, z)x, y, z(直方体の寸法):set_center(location)
em.zone.create_cone_zone(length, radius)length, radius:set_origin(location), :set_destination(location)
em.zone.create_static_ray_zone(length, thickness)length, thickness:set_origin(location), :set_destination(location)
em.zone.create_rotating_ray_zone(length, point_radius, animation_duration)length, point_radius, animation_duration:set_origin(location), :set_destination(location)
em.zone.create_translating_ray_zone(length, point_radius, animation_duration)length, point_radius, animation_duration:set_origin(location), :set_destination(location)
両方の端点を設定する

円錐・レイのビルダーは length を保存しますが、ネイティブ位置リゾルバーは省略した終点にボス位置を使います。:set_origin(...) と :set_destination(...) をつなぎ、length に方向指定を任せないでください。移動レイでは返されたテーブルに origin_end、destination_end、正の animation_duration も必要です。

例​

例
return {
api_version = 1,
on_spawn = function(context)
-- Create a location offset from the boss
local boss_loc = context.boss:get_location()
local above = em.create_location(boss_loc.x, boss_loc.y + 5, boss_loc.z, boss_loc.world)

-- Create a sphere zone using the builder
local zone = em.zone.create_sphere_zone(10):set_center(boss_loc)

-- Use with native zone queries
local players = context.zones:get_entities_in_zone(zone, { filter = "players" })
for _, p in ipairs(players) do
p:send_message("&cYou are within the boss's aura!")
end

-- Create a directional vector
local push_vec = em.create_vector(0, 1.5, 0)
context.boss:set_velocity_vector(push_vec)
end
}
備考

各スクリプトインスタンスに独自のLua環境と em 名前空間があります。コンストラクタは新しいテーブルを返します。位置の add(...) とゾーンのsetterは、呼び出し先のテーブルを変更します。


ネイティブゾーン vs. スクリプトユーティリティ​

両方のシステムは同じ基盤となるゾーンジオメトリで動作します。それぞれの使い分けは以下の通りです:

ユースケース推奨アプローチ
単純な「このエリアに何かいるか?」チェックネイティブゾーン(context.zones)
形状を使った素早いエンティティクエリネイティブゾーン
カバレッジ付きのNEARBY_PLAYERS、ZONE_FULLスクリプトユーティリティ(context.script)
アニメーションゾーン(回転/移動レイ)繰り返し読む場合はスクリプトゾーンハンドル。ネイティブウォッチャーもアニメーション形状を保持できる
watch/contains/entitiesメソッド付きゾーンハンドルスクリプトユーティリティ
ゾーン位置でのパーティクル生成スクリプトユーティリティ(spawn_particles)
ターゲティングに連動したダメージとプッシュアクションスクリプトユーティリティ(damage、push)
方向性エフェクト用の相対ベクトルスクリプトユーティリティ(relative_vector)
Lua制御フローと豊富なターゲティングの組み合わせスクリプトユーティリティ

1つのパワーで両APIを併用できます。必要なターゲットとライフサイクルに合わせて選んでください。ネイティブクエリの既定対象はボス以外の生きたエンティティ、スクリプトゾーンの既定対象はプレイヤーです。


次のステップ​