AIエージェントと人間が同等にプレイするMMORPGの起動方法
最近、OpenMMOリポジトリを見つけました。このプロジェクトの作者は、多くの人が理論的にしか議論してこなかったものを構築しています:AIエージェントがキャラクターになって現実の人々と一緒に世界中を走り回るサンドボックスです。サーバーは向こう側に誰がいるのか知りません。ボットと人間は同じWebSocketプロトコルで処理され、特別なハンドラや隠しエンドポイントはありません。
このプロジェクトは1人の開発者によって構築されています。ここでの技術スタックは、一般的な個人プロジェクトよりも興味深いです:Rustサーバー、WebGPUを使用した3DグラフィックスのためにSvelteとThree.jsで構築されたブラウザクライアント,加上MCPプロトコルサポートを持つAIエージェント用の別のRustクライアントです。
このプロジェクトについて
アイデアの中心は公平な対等性です。人間が隣接するタイルに移動したり、モブを攻撃したりするためにWebSocketパケットを送信する必要がある場合、AIエージェントも全く同じことを行います。サーバーはこれらのアクションを同一に処理し、自動化のための特別な配慮はありません。
世界は等角映写でクォータービューのパースペクティブを持っています。グラフィックは、ソースされたモデルとアルゴリズム的に生成されたアセットの混合で構成されています。約50トラックあるBGMは、SunoとGoogle Flow Musicツールで作成されました。
この世界の内部構造を詳しく見てみましょう。
手続き型地理と建築
ゲーム空間は32×32キロメートルのエリアをカバーしています。マップは手続き的に生成されます:バイオーム、海岸線、複雑な河川システム。

川は海に流れ込むときに三角江を形成し、支流に分岐します。道路ネットワークに沿って、道路が河道と交差する場所にサーバーが自動的に木製の橋を配置します。

ゲームには時間帯と季節の変化があります。昼と夜の長さは惑星の軌道上の位置によって異なります。天空には独立した位相と軌道を持つ2つの衛星が同時に存在します。

ライティングで雰囲気が強化されます。松明は現実的な光の減衰を伴う動的な影を落とします。

プレイヤーはモジュラー建築にアクセスできます。2〜4階建ての家を建てたり、ドア、窓、家具を置いたりできます。

アイテムの物理演算は床を考慮します。キャラクターが家の2階に剣を投げると、同じ階にいる人だけがそれを取り戻せます。サーバーは、世界からインベントリにアイテムを引き渡す前に3つの軸すべての座標を確認します。
D&Dの精神での戦闘システムとメカニクス
戦闘はNetHackやダンジョンズ&ドラゴンズのような古典的なロールプレイングゲームのルールに基づいています。キャラクター作成時に、プレイヤーは6つのコアアトリビュートを振ります:筋力、敏捷力、耐久力、知力、知恵、魅力。
生成は4d6ルールに従い、その後バランス調整されます。すべての数学的計算、ヒット判定、ダメージはサーバー側で処理されます。

インベントリには重量制限があります。キャラクターモデルには11個の装備スロットがあります:頭、両手、本体、腰、パンツ、靴、首、耳、リング2つです。重鎧や石の入ったインベントリは、何を携行し何をチェストに残すか選択することを強制します。
クライアントに直接組み込まれたエディタ
世界を編集するために、サーバーを再起動したり外部ユーティリティを開いたりする必要はありません。マップエディタがクライアントに組み込まれています。

地形の高さを変更したり、山を滑らかにしたり、道路を敷いたり、オブジェクトを配置するためのブラシが含まれています。長方形のゾーンを選択できます:例えば、モンスターのスポーンがない安全な都市エリアを宣言したり、特定のモブのスポーンエリアを設定したりできます。
マップの変更はREST API経由でサーバーに送信され、Google認証トークンを通じてアクセス権が検証されます。
アーキテクチャと技術スタック
プロジェクトはモノレポ内で3つの主要なブロックに分割されています。
クライアント側はSvelteとTypeScriptで書かれています。3DシーンのレンダリングはThrelteとThree.js経由で、WebGPUに重点を置いて行われます。
サーバー側はTokio非同期ランタイムを使用してRustで構築されています。新鮮なワールドステートの更新はブロードキャストチャネル経由で配布されます。クライアントサーバー通信はtokio-tungsteniteライブラリベースのWebSocket経由で行われ、マップ用のRESTエンドポイントはAxumフレームワークで提供されます。
エージェントクライアントは独自のRustプロジェクトとして分離されています。MCPサーバー(Model Context Protocol)をスピンアップでき、LLMモデルがゲームプレイに直接接続できます。
著者は共有ロジックに興味深いソリューションを適用しました。sharedフォルダからのコードはブラウザ用のWASMにコンパイルされ、サーバーでも直接使用されます。これにより、クライアントとサーバー間のメカニクス計算ルールの重複が排除されます。
プロジェクトをローカルにデプロイする方法
Rust、Cargo、Node.js、npmがインストールされている必要があります。
便利なデプロイのために、開発者はCargo Workspaceを使用しています。コード変更時に自動リビルドしながら、プロジェクトルートからサーバー部分を起動できます:
cargo install cargo-watch
cargo watch -w server -w shared -w data-src -x "run -p onlinerpg-server"
サーバーはポート10006でWebSocketをスピンアップし、ポート10007でREST APIを起動します。
クライアントを実行するには、環境ファイルをコピーしてVite開発サーバーを起動する必要があります:
cd client
cp .env.example .env.local
npm install
npm run dev -- --port 10004
sharedフォルダ内の共有ロジックを編集している場合は、2番目のターミナルでブラウザ用の自動WASMビルドを実行する価値があります:
cargo watch -w shared -s "npm run build:wasm --prefix client"
エージェントクライアントはagent-clientフォルダから起動されます:
cd agent-client
cargo watch -i "data/prompts/memory/" -x run
コードを学ぶべき理由
このプロジェクトは、Rustでネットワークサービスやゲームを書いている、または書く予定の人に最も役立つでしょう。ここでは、状態レースの構成、ブロードキャストチャネル経由のイベント配布、Tokioでの作業の実例を見つけることができます。
2番目の興味深い領域はWebグラフィックです。Svelte、Threlte、Three.jsの組み合わせはあまり一般的ではなく、実際のプロジェクトでWebGPUを実行することは現代Webのパフォーマンスを示しています。
最後に、OpenMMOはAIエージェント研究者にも役立ちます。MCPプロトコルとエージェントの通常プレイヤーとの平等な権利は、継続的な環境でLLM行動シナリオをテストするための готовый サンドボックスを提供します。
関連プロジェクト