HN🔥 219
💬 125

【Show HN】最新の.NET 10とLuaでUltima Onlineサーバーを完全再構築!「Moongate」公開

squidleon
3か月前

ディスカッション (11件)

0
squidleonOP🔥 219
3か月前

Ultima Onlineのサーバーエミュレーターをゼロから現代的な設計で開発しています。まだ戦闘やスキルなどは実装中ですが、基盤が非常に堅牢に仕上がったため、早期公開することにしました。

現時点での主な機能:

  • クラシックUOクライアント向けのフルパケット層対応(ログイン、移動、アイテム、NPCなどの操作)
  • Luaスクリプティングによるアイテム動作の定義(ポーションの使用やドアの開閉など、C#を再コンパイルせずにLuaで制御可能)
  • セクターごとの空間分割とデルタ同期(境界を越えた際にのみパケットを送信する最適化)
  • MessagePackを使用したスナップショットベースの永続化
  • ソースジェネレーターを活用したDI配線、パケットハンドラー登録、Luaモジュール露出の自動化
  • NativeAOT対応(サーバーを単一のネイティブバイナリにコンパイル可能)
  • 組み込みHTTP管理APIとReact製の管理UI
  • マップスタティックデータからの自動ドア生成(ModernUO/RunUOと同等のアルゴリズムを採用)

使用技術:.NET 10, NativeAOT, NLua, MessagePack, DryIoc, Kestrel

今後の課題:戦闘システム、スキル、天候処理、NPC AIの実装。現在はアーキテクチャの構築に注力しており、後からシステムを追加してもコードの書き直しが発生しない設計にしています。

なぜModernUO/RunUOを使わないのか?:既存のプロジェクトは成熟しており実績も豊富ですが、今回はネットワークとドメインの完全分離、イベント駆動型のゲームループ、継承に頼りすぎないアイテム設計、そして再コンパイル不要なLuaでの高速なゲームロジック開発を実現したかったため、ゼロから書き直すことにしました。

GitHub: https://github.com/moongate-community/moongatev2

1
onlyrealcuzzo
3か月前

ロゴ最高だね。完成してるところの進捗が見れるYouTubeチャンネルとかある?

2
haolez
3か月前

UOは、俺が遊んだ中で唯一「一般庶民」のプレイヤーが存在したゲームだったな。多くのプレイヤーは強くなれなかったり、最高級の装備を手に入れられなかったりした。でも、非力なプレイヤーでも楽しめたからみんな遊び続けてたんだよね。本当に強いプレイヤーは有名人で、まるでセレブみたいだった。今のゲームとは全然違うよ。今のやつは、どのプレイヤーもマーベルのスーパーヒーローのファンタジー版みたいな見た目をしてるから。

3
nebezb
3か月前

うわ、これは並大抵のことじゃないな……。コントリビューショングラフ[0]の見方は合ってるかな、これ全部一人でやったの? この試みは、16年前にめちゃくちゃ有能な開発者("aaerox")が始めたInfantry Onlineのサーバーエミュレーターにすごく似てる。Sourceforge[1]で当時の初期svnコミットを見つけたんだけど、今はGitHubに移行して16年間続いてて、君がすでに作った機能の多くを備えてる。でも、それは15年以上かけて12人以上の開発者で作り上げたものなんだ。マジでリスペクト。どうやって一人でここまでやったのか教えてほしいよ。

4
swaminarayan
3か月前

めちゃくちゃカッコいいプロジェクトだね。MMOのサーバーコードベースって時間が経つにつれて設計が複雑になりがちだから、ネットワークとゲームロジックを綺麗に切り離してゼロから作り直すのは理にかなってる。セクターベースのデルタ同期について気になるんだけど、アイテムやMobが大量にいる混雑エリアにプレイヤーが入った時のパケットバーストはどうやって防いでるの? あとNativeAOTを使ってるのも面白い。デプロイの簡略化のため? それともパフォーマンス?

5
MisterTea
3か月前

今週ちょうどYouTubeでUltimaシリーズ(特にUltima UnderworldやVII、VIII)についてのMajuularの動画をたくさん見てたから、これは何かの予兆に違いない(あの動画、超おすすめ)。それで、90年代の素晴らしい体験を逃した気がして、昨日の夜GOGでUnderworldとVIIを買っちゃったところなんだ(System ShockとCrusader no remorseも手に入れなきゃな)。兄と俺は発売当時にIXを買ったんだけど、バグだらけの悪夢で諦めちゃって、まともにUltimaを体験したことがなかったんだよね。でも兄とその友達はUOにハマってやり込んでた。その友達は当時SirDarkSpellっていう名前で荒らしをやってて、結構有名だったらしい。2000年頃かな? 2人ともUOにいい思い出があるから、このプロジェクトのことを聞いたら喜ぶと思う。とりあえず、この週末はStygian Abyssにどっぷり浸かってみるよ。

6
elevaet
3か月前

いいね、素晴らしい! 俺もこの5年間、Go、Postgres、フロントエンドにReactを使ってUltima 3.5みたいなMORPGを副業的にコツコツ作ってるんだ。トップビューのタイルグラフィックに、昔ながらのキーボード操作。まだガタガタだけど、いつかShow HNに出せたらいいな。君のやり方を参考にして世界をセクターに分割する必要があるかも。今、PCやNPCが増えるにつれて計算量がn^2で増えちゃうスケーリングの問題にぶち当たってるんだよね。

7
jdwithit
3か月前

すごいね! めちゃくちゃ懐かしい気分になったよ。ずっと昔(UOが現役だった頃ねw)、UOX3っていうC++製のUOエミュレーターのメンテをしてたんだ。はっきり言っておくと、俺が開発者だったわけじゃないし、大きな機能や難しい機能を書いたわけでもない。ただコードベースを引き継いで、パッチを当てたりリリースを出したり、コミュニティを管理したりしてただけ。元の作者が辞めることになって、俺がコミュニティであまりに首を突っ込みすぎてたから、しばらく任せるって指名されたんだよね。あとは、お金とハードと帯域が余ってたカナダ人のためにUOXベースのプライベートサーバーを動かす手伝いもした。どっちも最高な経験だったし、多くを学べたよ。今振り返ると、Originがあんまり訴訟にうるさくなくて、ゲームを「ハック」したってことでFBIを送り込んでこなかったのは本当に幸運だったと思う。

8
godrae369
3か月前

お疲れ! Moongateのアーキテクチャ解説を読んだよ。DIにSource Generatorsを使って、振る舞いのデカップリングにLuaを使うことでC#を再コンパイルしなくて済むようにしてるのは、見事なセットアップだね。厳密なドメイン分離こそ正義だよ。「足りないもの」リストにNPCのAIが入ってるのを見た。俺はAIエージェントのワークフローを作ってるんだけど、NPCに従来通りのつまらない有限状態マシンを作る代わりに、LuaスクリプトにLLMのマイクロサービスを組み込んでみるのはどうかな? 主要なNPCに文脈に応じた記憶や動的な会話を持たせられる。プレイヤーが商人にタイピングして話しかけて、価格交渉したり噂話を聞いたりすると、NPCがUltimaの世界観に沿った返答を生成して、適切なLuaイベント(アイテムを渡したりドアを開けたり)を発火させる、みたいな。パケットレイヤーとLua環境がしっかりしてるから、統合はかなり綺麗にできるはず。もし興味があるなら、ぜひ協力してAIロジックの設計をさせてほしいな。

9
zorm
3か月前

これが見れて嬉しいよ! 俺も昔、UOのエミュレーターコミュニティにいたけど、メインはSphereServerだった。ここのコメント欄を見てると、UOがきっかけでプログラミングを始めた人がこんなにたくさんいるのが面白いね! 最近のLLMの進歩があれば、今のMMORPGでもNPCとのやり取りがすごく面白くなりそう。NPCとの複雑なやり取りを進行中のストーリーに組み込めるから、小規模なコミュニティサーバーでも長期的にやっていけるようになるかもね。

10
GardenLetter27
3か月前

Ultima VII: Revisitedとか、このUltima Onlineサーバーみたいな、今のUltimaルネサンスの流れ、最高だね。