PalForge
ガイド

コンソールコマンド

pf_* アクション一覧、それぞれが画面上に必要とするもの、そして実行する 3 つの経路

このページでできるようになること

  • 空いているキーを探し回らずに PalForge の計測を実行する
  • どのコマンドがワールド、パル、タイトル画面を必要とするかを押す前に把握する
  • UE4SS のコンソールを有効にし、「存在しない窓に登録された」状態を見分ける
  • コンソールもキーもないときに、同じコマンドをテキストファイルから実行する

コマンドの出どころ

すべてのコマンドは palforge.testACTIONS テーブルのエントリです。installCommands が エントリごとにコンソールコマンドを 1 つ登録し、そのあと起動のたびに一覧をソートして出力します。 つまりこのログ行は、それが説明しているテーブルから生成されているので、内容がずれようがありません。

console commands: pf_hook  pf_hook_audio_custom_file_loader  pf_hook_audio_setvolume_audible ...

ここから 3 つのことが従います。

  • このページの名前は、執筆時点でテーブルが持っていたものです。権威はログ行のほうです。 UE4SS.logconsole commands: で検索してください。
  • コマンドとキーは同じ関数への 2 つの入口です。pf_reflect と F5 は同じプローブを走らせます。
  • env.dev が true でなければ何も存在しません。palforge.test モジュール全体が dev ゲートの下で しか require されず、さらに tools/deploy.sh --release は配置先のツリーから palforge/test/ を 丸ごと削除します。したがってリリースのコピーには pf_* コマンドも F1 もプローブキーも無く、 カーネルの唯一の requireabsent を返します。

コマンドの本体は ExecuteInGameThread でゲームスレッドにキューされます。触れる対象がすべてライブ の UObject だからです。さらに pcall で包まれています。例外を投げるコマンドは、そうしないと UE4SS のコンソールハンドラごと道連れにします。

コンソールを有効にする

UE4SS はコンソールを無効にした状態で出荷されており、コマンドを登録できることと、コマンドを打てる ことは別です。ハンドラは存在しない窓に対しても問題なく登録され、置き場所がないのにログは console commands: ... と表示します。

ue4ss/UE4SS-settings.ini
ConsoleEnabled = 1
GuiConsoleEnabled = 1
GuiConsoleVisible = 1

編集後はゲームを再起動してください。PalForge からこのファイルは読めないので、これは検査ではなく 注記です。

一覧

43 のアクションを 4 グループに分けて示します。常時ある 18 個に加えて、env.debug が on のとき 宣言済みフック 1 つにつき 1 個、計 25 個が増えます。

コマンド内容
pf_testsこのモジュールが持つ全スイートを実行し、サマリーを画面に告知する
pf_keysPalworld のライブなキー設定全体と、バインド可能な名前ごとの free/game/palforge 状態を出力する
pf_native各ネイティブカタログから名前でハンドルを取り、ゲームにアイコンを尋ねる
pf_spawnパルを隣にスポーンさせ、10 秒後に実際に近くにいるものを報告する
pf_teach最も近いパルにパッシブスキルを与える
pf_meshカタログのアセットパスを全部解決し、同梱の木箱を目の前に 30 秒吊るす
pf_uidecl宣言したパネルをゲーム自身の UI ルートにマウントし、クリックを数える
pf_uiroutePalworld 自身が UI・入力モード・Esc をどう扱うかを読み取り、実際の挙動を監視する
pf_uizパネル 3 枚同時: z 順、キールーティング、マウス側、レイヤー経路
pf_reflect pf_pal pf_watch pf_title pf_uislot pf_uievents6 つの調査プローブ、キー 1 つずつ
pf_hooks pf_hook <id> pf_hooks_allゲームが必要なテストフック(後述)
pf_hook_<id>宣言済みフック 1 つにつき 1 つ生成される名前、全 25 件

どこかに貼ることを前提とした出力はブラケットで囲まれ、ログからそのまま抜き出せます。

#### BEGIN keymap
... プローブが出力した全行 ...
#### END keymap

各コマンドが画面上に必要とするもの

必要なものが見つからないコマンドは、そう言って停止します。半分だけ黙って実行することはありません。

コマンド必要なもの
pf_testsなし。ただし全緑にするには 2 回必要(セーブ内で 1 回、タイトル画面で 1 回)
pf_keysロード済みのワールド。キー設定はワールドサブシステム上にあります
pf_nativeロード済みのワールド(アイコン DataTable の読み出しのため)
pf_spawnロード済みのワールド。パルの到着は 4〜8 秒後です
pf_teach近くに立っているパル。先に pf_spawn を走らせて待ってください
pf_meshプレイヤーのポーン。自前のコンポーネントを付け、30 秒後に破棄します
pf_uidecl pf_uizロード済みのワールドと、ボタンをクリックする人
pf_uirouteロード済みのワールド。そのあとインベントリを開き、Esc を 2 回押す
pf_reflect pf_uislotロード済みのセーブ
pf_pal近くに立っているパル
pf_watchロード済みのセーブ。そのあとクラフト、ドロップ、スポーンのいずれかを行う
pf_titleタイトル画面
pf_uieventsロード済みのセーブ。そのあとタイトルへ戻り、もう一度ロードする

pf_uiroutepf_uievents はネイティブフックを armし、UE4SS はフックを解除できません。以後 セッションが終わるまで残ります。arm されるハンドラはいずれもカウンタと保護付きの文字列読み取り 1 回だけで、サンプル数も数十件で打ち止めになります。

このうちいくつかはコマンドが戻ったあとも core/poll で監視を続けます。pf_mesh は 30 秒、 pf_uidecl は 75 秒、pf_uiz は 110 秒です。その間は F9 のリロードが拒否され、待っている ポーラーの名前が出ます。これは非同期ガードが仕事をしている状態です。詳細は リロード・ポール・autorun を参照してください。

ゲームが必要なテストフック

25 の計測はゲームを起動しないと取れません。それぞれが test/hooks/ 配下の宣言済みフックで、画面上 に何が必要か、セーブに書き込むか、どの未解決項目を閉じるかを自分で名乗ります。ロードされるのは env.debug が true のときだけです。

Scripts/palforge_dev.lua
local env = require("palforge.env")
env.dev   = true
env.debug = true                              -- test/hooks をロードし、アクションを生成する
env.debugHooks["mesh-color-change"] = true    -- これは書き込むので、専用スイッチが要る

ゲートは 3 つあり、閉じているゲートは黙って飛ばされずに出力されます。

  1. env.debug — これがないとフックファイルは 1 つもロードされません。
  2. needs = { world, player, pal, title } — 動作中のゲームで成立している必要がある条件。
  3. writes = true — 加えて env.debugHooks[<id>] = true が必要です。セーブを書き換えるものに 対して、セッション全体のスイッチは粒度が合いません。

まず pf_hooks を走らせてください。全フックと、そのゲートが開いているか、閉じている場合それを 開ける正確な一文が並びます。必要なのはロード済みのワールドだけです。

コンソールなしで実行する

実機では 3 つの入力経路が順に失敗しており、そのたびに作業自体は正しく、入口だけが欠けていました。 Palworld 自身の音量キー(F7)に置いたプローブはバインドに成功してキーが届かず、次のキーはすでに 使われており、コンソールは無効で出荷されていました。

Scripts/palforge/autorun.txt はそのどちらも要らない経路です。world.ready で、ワールドのロード ごとに 1 回実行されます。

Scripts/palforge/autorun.txt
# コメントと空行は無視される
pf_native            # ワールドが準備でき次第すぐ実行
8 pf_keys            # ワールド準備の 8 秒後に実行
40 pf_hook_pal_skills_equip

1 行は [delay] name であり、引数を運びません。だから pf_hook <id> はコンソール専用の綴りで あり、代わりに宣言済みフックごとに pf_hook_<id> という名前が生成されます。ディスク上のテキスト ファイルがゲームに言えることを 1 つ減らすためです。

遅延は見た目以上に重要です。パルの到着には 4〜8 秒かかるので、近くにパルが必要なアクションを、その パルを作るスポーンと同時に走らせることはできません。

このファイルが持つのは名前だけで、コードではありませんcore/autorun.luatest/ 配下の 名前を 1 つも書きません。テーブルは test/init.luainstall()autorun.setActions(M.ACTIONS)渡すものです。各行はそのテーブルを引くだけで、存在しない 名前は報告のうえスキップされます。

-- core/autorun.lua が、渡されたテーブルに対してすること
local run = M._actions[name]        -- test/init.lua の install() が一度だけ設定する
if not run then log.warn(name .. ": no action of that name") end

テストツリーが無いリリースビルドではテーブルそのものが存在しないので、このキューはワールドロード のたびに require を失敗させるのではなく、何のコストもない no-op になります。したがって、迷い込んだ ファイルがキー操作でできない何かを実行することはありませんし、書き込むフックにはその上でさらに 専用ゲートがあります。

まとめ

  • すべての計測は palforge.testACTIONS のエントリで、起動時のログ行が正式な一覧です。
  • env.dev なしでは何も存在せず、ゲームが必要な 25 のフックにはさらに env.debug が要ります。
  • UE4SS のコンソールは既定で無効です。設定 3 つと再起動が必要です。
  • 各コマンドは画面上に必要なものを述べ、半端に実行するのではなく停止します。
  • フックの前にまず pf_hooks。全ゲートと、閉じたゲートを開ける一文が出ます。
  • autorun.txt は同じ名前をキーもコンソールもなしで実行します。1 行 1 つの [delay] name です。

On this page