Factorio のヘッドレスサーバを 再起動せず・mod も追加せず、サーバ内の 「ゲーム(ワールド)のブループリントライブラリ」を全件まとめて取り出すレシピです。
層は 3 段:
- Lua API — Factorio プロセス内で動くスクリプト用 API。
game.blueprints等。外から直接は触れない。 - コンソールコマンド —
/silent-command,/c,/sc。Lua VM への唯一の入口。 - RCON — TCP/IP で外から繋げる唯一の口。
/silent-command rcon.print(...)を送ると、Lua の結果が応答として返る。
つまり「外から Lua を叩く」=「RCON で /silent-command を送る」です。
それ以前は「ブループリントライブラリの中身は Lua から触れない」が定説でしたが、
2.0.67 で LuaRecord:export_record() が公開され、ライブラリ内の各レコードを
ブループリント文字列としてエクスポートできるようになりました。
- ゲーム(ワールド)ライブラリ:
game.blueprints→LuaRecord[] - 個人ライブラリ:
player.blueprints→LuaRecord[]
この Gist の対象はゲームライブラリです。
- Factorio headless server 2.0.67 以上 で稼働中
server-settings.jsonなどで RCON が有効になっていて、パスワードがある- RCON ポートに届けるツール(ここでは
rcon.py系の Python 1 ファイルラッパーを想定)
サーバプロセスの作業ディレクトリ配下の
script-output/blueprints/ に書き出されます。中身はゲーム内で
「ブループリント文字列としてインポート」にそのまま貼れる base64 文字列です。
game_NNN_blueprint.txtまたはgame_NNN_blueprint-book.txtMANIFEST.tsv— index / type / バイト数 / ファイル名
/silent-commandは実行時に「実績無効化」フラグを立てますが、 マルチプレイサーバなら元々関係ないので無害。- 1 レコードあたり数百 KB 超になる場合があり、RCON のレスポンス
上限に当たるので
rcon.printで文字列を返さず、Lua のhelpers.write_fileでサーバ側ファイルに書くのがコツ。 - 復元時は、もとのライブラリに「貼り戻す」操作はゲームクライアント 側でやる必要がある(mod なしでサーバから push する API は無い)。
./extract-game-blueprints.sh 127.0.0.1 27015 /path/to/rconpw実体は /silent-command を 1 発投げるだけ。サーバの
script-output/blueprints/ を覗いてください。