rpfd について
rpfd は、GTA V などの RAGE ゲームで使われる RPF7 アーカイブを読み書きする Rust ツールチェーンです。CLI、JSON-RPC デーモン、VS Code 拡張を備え、複数の暗号化 RPF7 形式に対応します。
主な機能
- 01RPF7 アーカイブの読み書きと再構築
- 02アーカイブの展開、梱包、検証
- 03エントリーの XML 表示と編集
- 04JSON-RPC による編集管理
- 05VS Code ワークスペースでの編集
活用シーン
- 01GTA V アーカイブ内容の確認
- 02サーバー用ファイルの編集と再梱包
- 03VS Code でのネストしたアーカイブ編集
MCP 対応
README では、エディターやエージェントへの MCP サーバー登録に触れています。記載された MCP エンドポイントは発見用で、アーカイブ操作は行いません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
RPF7 アーカイブを読み取り、編集、再構築するための、依存関係を抑えた Rust ツールチェーンです。RAGE Multiplayer と FiveM のサーバーがクライアントに渡す dlc.rpf ファイルや、Grand Theft Auto V に含まれるアーカイブを扱います。実行時の前提条件がない単一のコマンドラインバイナリであり、同じコードを JSON-RPC デーモンと VS Code 拡張機能でも使用します。
エディター拡張機能はストアからインストールできるため、更新は自動で届きます。molchalih.rpfd は
VS Code Marketplace
および Open VSX からインストールできます。または、
code --install-extension molchalih.rpfd を実行してください。
これをインストールするよう依頼されましたか? エージェントは
INSTALL.md に記載された手順に従います。
まずバイナリを PATH に配置し、次にそのマシンにあるすべてのクライアントに rpf を登録します。
フォーマット
| バージョン | バリアント | 使用先 | サポート |
|---|---|---|---|
| RPF7 | OPEN、暗号化なし | RAGE MP および FiveM のサーバーパック | 読み取り、書き込み |
| RPF7 | AES-256、0x0FFFFFF9 | GTA V、des_* や script_* などのネストされたアーカイブ | 読み取り、書き込み — ゲームの実行ファイルからキーを取得 |
| RPF7 | AES-256、0x0FFFFFF7 | Rockstar Games Launcher | 読み取り、書き込み — Launcher.exe からキーを取得 |
| RPF7 | NG、0x0FEFFFFF | GTA V Legacy および Enhanced、すべての最上位アーカイブ | 読み取り、書き込み — 両方ともメモリーイメージが必要 |
| RPF8 | — | Red Dead Redemption 2 | 未対応 |
| RPF6 | — | Red Dead Redemption、2010 年および 2023 年 | 未対応 |
| RPF4 | — | Max Payne 3 | 未対応 |
| RPF3 | — | GTA IV のオーディオ、Midnight Club: LA | 未対応 |
| RPF2 | — | GTA IV、メインアーカイブ | 未対応 |
| RPF0 | — | Table Tennis | 未対応 |
RPF7 より前の形式に関する帰属情報は、ここで測定したものではなく、他の実装から読み取ったものです。相違点とともにフォーマットの注記に記録されています。RPF7 以外のすべてのバージョンはマジックワードで認識され、バージョン番号を示して拒否されます。
暗号化はアーカイブ単位だけでなく、エントリー単位でも適用されます。タグは目次と名前のデータを対象とし、各エントリーの行には、そのペイロードに変換処理が適用されているかどうかが記録されています。
インストール
この内容はINSTALL.mdに記載されています。そこでは、3つの別々の質問に答えています。VS Code MarketplaceまたはOpen VSXからエディター拡張機能をインストールする方法(代替手段として.vsixを使用できます)、エディターまたはエージェントにMCP サーバーを登録する方法、そしてバイナリだけが必要な場合にその配置先となる場所です。
最後に、1台のマシンですべてを行うためにエージェントが実行する手順を記載しています。
macOS、Windows、Linux向けのビルド済みバイナリは、各リリースに添付されています。
ソースからビルドする場合は、ツールチェーンがrust-toolchain.tomlで固定されています。
リポジトリをクローンし、クローンしたリポジトリのルートでビルドします。配置場所は問いません。
git clone https://github.com/molchalih/rpfd.git
cargo build --release # target/release/rpf
暗号化されたアーカイブにはキー素材が必要です。これは、ご自身のインストール環境から抽出してください。
rpf keys extract GTA5.exe # the AES key and the hash lookup table
rpf keys extract Launcher.exe # the second AES key, carried by no game executable
rpf keys extract <memory image> # the NG expanded keys and decrypt tables
ここにキー素材は同梱されておらず、今後も同梱されることはありません。各素材は、そのバイト列自体のハッシュを名前として、プラットフォーム固有の設定ディレクトリ内にあるrpfディレクトリのkeysにキャッシュされます。Linuxでは$XDG_CONFIG_HOMEまたは~/.config、macOSでは~/Library/Application Support、Windowsでは%APPDATA%です。すべてのコマンドはフラグなしでこのキャッシュを参照します。保存場所と内容の量を確認するにはrpf keys cacheを実行します。
$ rpf keys cache
cache /Users/you/Library/Application Support/rpf/keys
entries 2
--cache-dirで別のキャッシュを選択できます。これは複数のインストール環境を分ける唯一の方法です。rpf keys invalidateを実行すると、キャッシュを空にできます。キーが出力されるコマンドはありません。表示されるのはオフセット、長さ、件数、パスのみです。NG素材が平文の状態で存在するのは、実行中のゲームのメモリーイメージ内だけです。そのため、NGアーカイブを入手するにはそれしか方法がありません。入手方法については、ここでは扱いません。素材が見つからないアーカイブは推測せずにエラーになります。
使い方
アーカイブの中身を一覧表示し、内部のアーカイブも再帰的に表示します。
$ rpf ls -R dlc.rpf
binary xml 2199 content.xml
directory - 3 data
binary xml 1445 data/carvariations.meta
binary xml 191 data/dlctext.meta
binary xml 5100 data/vehicles.meta
binary xml 559 setup2.xml
directory - 2 x64
directory - 1 x64/vehiclemods
binary - 2544128 x64/vehiclemods/meringls63amg24_mods.rpf
resource - 262144 x64/vehiclemods/meringls63amg24_mods.rpf/meringls63amg24_brabus_diffuser_1.yft
... 20 more rows: the rest of the mods archive, and x64/vehicles.rpf
2列目はエントリーに格納されている内容を示します。pso、rbf、metaはXML表示に対応しています。
$ rpf cat --as xml des_hosp_ceil2.rpf des_hosp_ceil2.ytyp
<?xml version="1.0" encoding="UTF-8"?>
<hash_D98BB561 pso:struct="hash_D98BB561">
<hash_F17E7F28 pso:array="atarray"/>
<hash_018A3B1B pso:array="atarray">
<pso:item pso:struct="hash_82D6FC83">
<hash_BF74DFA7 pso:float="100.0"/>
<hash_67D26872 pso:uint="0"/>
<hash_6C1523E4 pso:uint="0"/>
<hash_D9EF8236 pso:float3="-2.80584, -2.95097, 0.0"/>
<hash_E78AA618 pso:float3="2.80584, 2.95097, 3.0961"/>
<hash_D61872FF pso:float3="0.0, 0.0, 1.54805"/>
<hash_82E8C5DE pso:float="4.356308"/>
<hash_AD5D5B4C pso:float="5.0"/>
<hash_E6E17F14 pso:string.counted="DES_Hosp_Ceil2"/>
<hash_75D215A1 pso:string.counted="DES_Hosp_Ceil2_txd"/>
<hash_19471791 pso:null="string.counted"/>
<hash_FC1FB6FB pso:null="string.counted"/>
<hash_D3C717FC pso:hashstring="hash_00000000"/>
<hash_F17E7F28 pso:array="atarray"/>
</pso:item>
</hash_018A3B1B>
<hash_E6E17F14 pso:hashstring="hash_334D5CB2"/>
<hash_3C6F8844 pso:array="atarray"/>
<hash_069ADF93 pso:array="atarray"/>
<hash_65E9D4EB pso:array="atarray"/>
</hash_D98BB561>
rpf put --as xmlを実行すると、編集したドキュメントがエントリー独自のエンコーディングで書き戻されます。書き込みにかかる容量を確認してから実行してください。バイト数は固定値ではなく、edited.metaのサイズです。実際に書き込む前に確認するには--dry-runを使用します。
$ rpf put dlc.rpf data/vehicles.meta edited.meta --dry-run
would patch 1632 bytes in place at 2048 (room for 2048)
$ rpf put dlc.rpf data/vehicles.meta edited.meta
patched 1632 bytes in place at 2048 (room for 2048)
put --create、rm、mv、mkdirはヘッダー以降のすべてのオフセットを移動させるため、必ず再構築し、その旨を先に通知します。再構築はアトミックに行われます。アーカイブと同じ場所に作成した一時ファイルで、元のファイルを一度に置き換えます。
アーカイブを展開し、再構築して、結果を確認します。
$ rpf extract dlc.rpf tree/
7 files and 3 directories into tree/
$ rpf pack tree/ rebuilt.rpf
11 entries, 65160704 bytes
$ rpf verify rebuilt.rpf --against tree/
27 entries read back; 7 of 7 recorded checksums checked against tree/
20 entries carry no recorded checksum: an entry inside a nested archive is covered by the checksum of the entry that holds it
すべてのレポート出力コマンドは--jsonに対応しています。その他のコマンドはrpf --helpを参照してください。
プログラムからツールを操作する方法はclients/agent/README.mdに記載されています。JSONの形式、失敗時のオブジェクト、そして誰も読む予定のないペイロード向けのcat --outについて説明しています。
デーモン
rpf serve --stdioはJSON-RPCを使用し、1行につき1つのオブジェクトを処理します。バイナリでできるすべての操作に応答し、commitまで編集を保持します。また、時間のかかる再構築の進捗を、キャンセル可能な通知として報告します。
$ echo '{"jsonrpc":"2.0","id":1,"method":"open","params":{"path":"/tmp/dlc.rpf"}}' | rpf serve --stdio
{"id":1,"jsonrpc":"2.0","result":{"entries":11,"handle":1,"len":144504832,"path":"/private/tmp/dlc.rpf"}}
エディター拡張機能
clients/vscodeはアーカイブをワークスペースフォルダーとしてマウントします。ファイルはほかのファイルと同じように開き、編集して保存できます。入れ子になったアーカイブは、フォルダー内のフォルダーとして表示されます。アーカイブへの書き込みは、パッチまたは再構築としてプレビューしたうえで、明示的な操作によって行われます。clients/vscode/README.mdを参照してください。
終了コード
安定した終了コードを使っているため、メッセージを読まずに呼び出し側で失敗を分類できます。0は成功を示し、ゼロ以外の各コードは1つの失敗クラスを示します。デーモンは同じ番号をJSON-RPCのerror.codeとして報告し、error.data.reasonにシンボル名を含めます。
終了コードの一覧は、それを管理するclients/agent/README.mdに記載されています。また、各コードが呼び出し側に次の対応として何を示すかも説明しています。
ビルドとテスト
cargo build --release
継続的インテグレーションでは、最初の3つをmacOS、Linux、Windowsで実行します。ローカルでテストを通過させておくと、継続的インテグレーションも成功する可能性が高くなります。
cargo fmt --all -- --check
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all
cargo test -p rpf-core --test oracle -- --nocapture
RUSTDOCFLAGS='-D warnings' cargo doc --no-deps --workspace
cargo deny check
./tools/docgate/docgate.sh
すべてのコミットメッセージも検査します。git config core.hooksPath .githooksを実行すると、ローカルでも同じ検査が行われます。
テストスイートの実行にゲームデータは不要です。ゲームデータが必要なテストはスキップされます。RPF_CORPUS、RPF_GAME_EXE、RPF_GAME_IMAGE、RPF_METADATAを使って、アーカイブ、ゲーム実行ファイル、実行中のゲームのメモリーイメージ、抽出済みメタデータのペイロードを指定します。対応するRPF_REQUIRE_*を設定すると、スキップが失敗になります。
ライセンス
MIT OR Apache-2.0を任意で選択できます。LICENSE-MITおよびLICENSE-APACHEをご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。