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

Luaスクリプティング:トラブルシューティング

webapp_banner.jpg

このページでは、Luaパワーの作成やデバッグ時に遭遇する一般的な問題と、EliteScriptから移行する作者向けのアドバイスを取り上げます。動作例については例とパターンを参照してください。はじめての方ははじめにを参照してください。


一般的な問題

1. パワーがまったく読み込まれない

サーバー起動時のコンソールのエラーを確認してください。最も一般的な原因はLua構文エラー(endの欠落、括弧の不一致など)です。ファイルが.luaで終わり、正しいpowersディレクトリに配置されていることも確認してください。

2. フックが発火しない

フック名がフックリストに記載されている通りに正確に綴られていることを確認してください。一般的な間違い:on_boss_hit(誤り)vs. on_boss_damaged_by_player(正しい)、またはon_tick(誤り)vs. on_game_tick(正しい)。

3. context.playerがnil

すべてのフックがプレイヤーを提供するわけではありません。on_spawnon_game_tickon_enter_combaton_exit_combatにはプレイヤーがありません。context.playerを使用する前に必ずnilガードを追加してください。

4. タイムアウト / 実行予算超過

フックまたはコールバックの実行に時間がかかりすぎると、ラグを防ぐためにパワーが自動的に無効になります。コンソールメッセージは次のようになります:

[Lua]   -> Your script took 73ms in 'on_tick' (limit: 50ms) — power disabled to prevent lag.

5. スケジューラコールバックが古いデータを使用している

おそらくコールバックパラメータではなく外側のcontextを使用しています。function() ... context.boss ... endfunction(tick_context) ... tick_context.boss ... endに変更してください。

6. ゾーンクエリがエンティティを返さない

ゾーン定義を再確認してください。ネイティブゾーンの場合、kindが小文字であることを確認してください("sphere""SPHERE"ではない)。スクリプトユーティリティの場合、shapeが大文字であることを確認してください("CONE""cone"ではない)。

7. パーティクルが表示されない

パーティクル名が有効なBukkit Particle enum値でUPPER_CASEであることを確認してください。一般的な間違い:"flame"(誤り)vs. "FLAME"(正しい)。

8. クールダウンが機能していないように見える

check_local(key, duration)(1回の呼び出しでチェックAND設定)を使用していることを確認してください。local_ready(key)の後に別のset_local(duration, key)を使用している場合ではありません。

9. ボスが死後もパワーを実行し続ける

on_exit_combatおよび/またはon_deathにクリーンアップロジックを追加して、スケジューラタスクをキャンセルしてください。


エラーメッセージの読み方

Luaパワーで何か問題が発生すると、コンソールは[Lua]プレフィックス付きのフレンドリーなエラーブロックを出力します。これらのメッセージは正確にどのファイル、どの行、どのフック、何が問題だったかを平易な言葉で教えてくれます。

[Lua] Error in 'push_zone.lua' at line 35 during 'on_boss_damaged_by_player':
[Lua] -> You tried to call a method or function that doesn't exist.
[Lua] -> Check the method name for typos, or make sure you're using ':' (colon) for method calls, not '.' (dot).
[Lua] -> Power has been disabled for this boss to prevent further errors.
生のLuaエラーコンソールが教えてくれること
attempt to call nil存在しないメソッドまたは関数を呼び出そうとしました。メソッド名のタイプミスを確認するか、.(ドット)ではなく:(コロン)をメソッド呼び出しに使用していることを確認してください。
index expected, got nilnilであるものフィールドにアクセスしようとしました。以前のコードで初期化されていることを確認してください。
attempt to indexnilまたは無効な値のプロパティにアクセスしようとしました。
bad argument具体的な引数の不一致の詳細を表示します(期待される型 vs. 実際の型)。
Timeoutスクリプトが'hook_name'でXmsかかりました(制限:50ms)-- ラグを防ぐためにパワーが無効になりました。
ヒント

コンソールで[Lua]エラーが表示されたら、コードに飛び込む前に完全なメッセージを読んでください -- 通常、修正方法を直接示してくれます。


文書化されていないエイリアスが存在すると仮定しないでください

Lua APIは特定のメソッド名セットを公開しています。手動またはAIの支援でパワーを書く場合、短縮名や代替名が存在すると仮定しないでください。以下の名前は存在せず、エラーの原因となります:

  • show_temporary_boss_bar() -- 代わりにplayer:show_boss_bar(title, color, style, duration)を使用。
  • run_command_as_player() -- 代わりにplayer:run_command(command)を使用。
  • em.location(...) -- emグローバルはありません。context.boss:get_location()context.player.current_location、またはcontext.worldメソッドを使用。
  • em.vector(...) -- emグローバルはありません。context.vectors.get_vector_between_locations(loc1, loc2)またはプレーンな{x=0, y=1, z=0}テーブルを使用。
  • em.zone.sphere(...) -- emグローバルはありません。{kind = "sphere", radius = 5, origin = location}のようなゾーン定義テーブルを使用。
  • entity:teleport_to(...) -- entity:teleport_to_location(location)を使用。
  • entity:set_velocity(...) -- entity:set_velocity_vector(vector)を使用。
  • entity:set_facing(...) -- entity:face_direction_or_location(direction_or_location)を使用。

疑問がある場合は、APIリファレンスページを確認してください(ボスとエンティティワールドと環境ゾーンとターゲティング)。文書化されていなければ、存在しません。


EliteScript作者向けの移行アドバイス

すでに良いEliteScriptsを書いている場合、Luaパワーを学ぶ最も簡単な方法は:

  1. イベント、ターゲット、ゾーン、相対ベクトル、パーティクルの観点で考え続けてください。 概念は同じです -- 構文だけが変わります。EliteScriptのイベントはon_spawnon_boss_damaged_by_playerのようなフック名になります。ターゲットとゾーンはEliteScriptゾーンEliteScriptターゲットページに文書化されている同じフィールド名を使用してテーブルとしてcontext.scriptに渡されます。

  2. 制御フローをLuaに移行してください。 ランダムロール、共有ヘルパー関数、ループ、永続ステート(context.state)、タスクスケジューリング(context.scheduler)は、Luaが追加する純粋なEliteScriptでは簡単にできないものです。まず1つの分岐または条件付きパワーをLuaに変換し、他はすべて同じに保つことから始めてください。

  3. ターゲティングとゾーンジオメトリにはcontext.scriptを使用してください。 スクリプトユーティリティはEliteScriptと同じフィールド名(targetTypeshapeTargetTarget2rangeoffsetcoverage)を受け入れるため、既存のEliteScriptドキュメントをそれらの仕様のリファレンスとして引き続き使用できます。これにより、ロジック層でLuaの柔軟性を得ながら、慣れ親しんだパターンを活用できます。


初心者の学習パス

  1. api_version = 1on_spawnだけのファイルを書く。
  2. ボスにメッセージを送信させるか、サウンドを再生させる。
  3. context.cooldownsでクールダウンを追加する。
  4. on_boss_damaged_by_playerのようなプレイヤートリガーのフックを追加する。
  5. context.scheduler:run_after(...)で遅延アクションを追加する。
  6. 単純なネイティブLuaゾーンクエリまたはcontext.script:target(...)を追加する。
  7. それからやっと回転攻撃、ステートマシン、マルチステップメカニクスに進む。

次のステップ

  • はじめに -- ファイル構造、フック、最初のパワーの解説、コピー&ペーストテンプレート
  • 例とパターン -- 学習・応用できる完全な動作パワー