Show HN: Moongate – .NET 10でのLuaスクリプトを使用した「Ultima Online」サーバーエミュレーター
45日前原文(github.com)
概要
Moongate v2は、.NET 10で構築された最新のUltima Onlineサーバープロジェクト
クリーンでモジュール化されたアーキテクチャと強力なパケットツールを実現
テストカバレッジや決定論的なゲームループ処理を重視
コラボレーターやコードレビュー協力者を積極的に募集
GitHubやDiscord、Matrixでの参加を歓迎
Moongate v2 概要と特徴
- Moongate v2は、.NET 10ベースの最新Ultima Onlineサーバーエミュレーター
- クリーンかつモジュール化されたアーキテクチャ設計
- パケットツーリング強化、ゲームループの決定論的処理
- 実用的なテストカバレッジ確保を目指す
- NativeAOT対応による単一ネイティブバイナリ化
- Luaスクリプティングによる柔軟なゲームロジック拡張
- React製管理UIと埋め込みHTTP管理APIを提供
- 自動ドア生成(ModernUO/RunUO同等アルゴリズム)
コラボレーター募集
- GitHub Issue/Discussionで参加表明・相談が可能
- DiscordやMatrix Roomでディスカッション参加歓迎
- コードレビューや設計議論への協力を特に希望
- Issues: https://github.com/moongate-community/moongatev2/issues
- Discussions: https://github.com/moongate-community/moongatev2/discussions
- Matrix: https://matrix.to/#/#moongate:matrix.org
既存サーバープロジェクトとの関係
- ModernUO, RunUO, ServUO等のクローンではなく、独自路線
- これらのプロジェクトから多大なインスピレーションと技術的知見を得ている
- POLServer, ModernUOの貢献者・チームへの特別な感謝
- 一部データセット(デコレーション、ロケーション、サイン)はModernUOからインポート・適用
プロジェクト目標
- 保守性・正確性・開発速度を重視したUOサーバー基盤の構築
- ネットワーク層とゲームループの明確な境界とスレッドセーフ実装
- 型安全なパケット定義とソース生成による自動登録
- **AOT(Ahead-Of-Time)**対応を意識しつつ、ローカル開発の快適さも両立
主な実装済み機能
- TCPサーバー起動・接続ライフサイクル管理
- パケットフレーミング/パース(固定・可変長両対応)
- 属性ベースパケットマッピングとソース生成
- ネットワーク→ゲームループ間のメッセージバス設計
- ドメインイベントバスによるイベント駆動設計
- セッション分離(トランスポートとプロトコル/ゲームプレイ)
- コア挙動・パケット基盤のユニットテスト
- Luaランタイム(コマンド、関数バインディング、.luarc生成)
- 埋め込みHTTPホストによる管理エンドポイント・OpenAPIドキュメント
- スナップショット+ジャーナル型永続化(MessagePackソース生成)
- SpectreベースのカラーログUIとインタラクティブコンソール
- タイマー・ゲームループスケジューリングとメトリクス
- リージョン・セクター管理(ModernUO基準、JSON多態ロード対応)
- メール送信機能(Scribanテンプレート+SMTP)
- A*パスファインディング(Lua移動プリミティブで利用)
- ライトサイクル管理とLuaコマンド連携
- Luaコマンドスクリプト(moongate_data/scripts/commands/gm 配下)
最近の開発トピック
- 永続化シリアライズをMemoryPack→MessagePack-CSharpに移行(AOT安定化)
- アウトバウンドパケット送信の専用ネットワークスレッド分離
- 空間・ゲームループの高速化(割当最適化)
- ライトサイクルロジックの独立サービス化
- 新GMコマンドスクリプト追加(.eclipse, .set_world_light, .teleports等)
空間チャンク戦略
- セクター/チャンクベースのワールドストリーミングアプローチ
- 16x16セクター単位でデータをインデックスし、遅延ロード
- プレイヤーログインやセクター移動時にスナップショット送信
- 未使用エリアはアンロードしメモリ効率向上
- 予測可能なメモリ増加・CPU負荷低減・スケーラビリティ向上
- Minecraft的チャンクストリーミングに近い実装哲学
ワールド生成パイプライン
- IWorldGeneratorベースのパイプライン設計
- DoorGeneratorBuilderによるドア自動生成(ModernUO方式)
- Lua+DoorServiceでドアの開閉をライブ制御
- .spawn_doorsコマンドで手動ドア生成も可能
UOプロトコル対応状況
- 現状対応済み
- ログイン/認証、キャラクター、移動、アイテム操作、チャット/スピーチ、ターゲティング、ステータス、Ping、ツールチップ等
- サブコマンド対応
- パーティ、ステータスロック、ターゲットアイテム/スキル/スペル
- アウトバウンドパケット
- セッション管理、ワールド同期、移動・時間、環境効果、UI/スピーチ等
- 部分実装
- プロトコルモデルのカバレッジは広いが、実際のゲームプレイフローへの接続は一部のみ
- アイテム関連は基本動作のみ、トレードや経済は拡張中
- Lua統合済みだが、ゲームシステムのスクリプト化は今後強化
- 未実装(主要領域)
- 戦闘ループ、スキルシステム、NPC AI、ベンダー、経済、ハウジング、ボート、天候、完全なUOプロトコルカバレッジ等
永続化
- スナップショット+ジャーナル型ファイル永続化
- world.snapshot.bin(完全チェックポイント)
- world.journal.bin(増分操作記録)
- MessagePack-CSharpによる高速・コンパクトなバイナリシリアライズ
- ファイルロック・スレッドセーフリポジトリ
- 起動時にスナップショット+ジャーナル再生
- AOT安定化のため永続化基盤を刷新
- クエリAPI(ZLinqによるスナップショット投影・フィルタリング)
メール送信(SMTP)
- IEmailServiceによる一元オーケストレーション
- Scribanテンプレート+SMTP実装
- NoOpEmailSenderでメール無効化時も安全
- テンプレート・変数管理と外部連携
なぜModernUO/RunUOを使わないのか
- 既存プロジェクトは成熟かつ実績十分
- 独自設計思想(ネットワーク/ドメイン厳密分離、イベント駆動ゲームループ、継承中心アイテム階層の排除、Luaによる高速反復開発)を追求したかったため
参加・貢献方法
- GitHubでソースコード・ドキュメント公開
- https://github.com/moongate-community/moongatev2
- Issue/Discussion/Discord/Matrixでの参加歓迎
- コードレビュー・設計議論・実装協力を重視
このプロジェクトはまだ初期段階ですが、堅牢な基盤と将来の拡張性を重視しています。UOサーバー開発やアーキテクチャ設計に興味のある方は、ぜひご参加ください。