HackerTrans
TopNewTrendsCommentsPastAskShowJobs

squidleon

no profile record

Submissions

Show HN: Arrr!, Linux notification aggregator (RSS, Telegram, WhatsApp, email)

github.com
2 points·by squidleon·2 bulan yang lalu·0 comments

Show HN: Moongate – Ultima Online server emulator in .NET 10 with Lua scripting

github.com
287 points·by squidleon·4 bulan yang lalu·164 comments

comments

squidleon
·4 bulan yang lalu·discuss
moongate :) https://github.com/moongate-community/moongatev2 !
squidleon
·4 bulan yang lalu·discuss
the Hacker News post itself was written by me.

I do use ChatGPT sometimes as a tool while working on the project (similar to using documentation, Stack Overflow, or an IDE assistant), but the post and the project direction are my own. So what?
squidleon
·4 bulan yang lalu·discuss
I am interested please write me on GitHub!
squidleon
·4 bulan yang lalu·discuss
That’s awesome to hear! Actually UOX3 is one of the inspirations behind Moongate. The way it approached the server architecture and scripting was really interesting and it influenced some of the ideas I’m exploring in the project.

Projects like UOX3 are a big part of the history of the Ultima Online emulator scene, so it’s great to hear from someone who helped maintain it.
squidleon
·4 bulan yang lalu·discuss
I build first Web API then create a plan with codex. But I choose Web Api endopoins!
squidleon
·4 bulan yang lalu·discuss
Thank you! And yeah, as a fellow .NET developer I totally agree modern .NET is genuinely impressive. The jump from the old .NET Framework to what we have now with .NET 8/9/10 is massive. NativeAOT, source generators, the performance work the runtime team does every release — it's a great platform that doesn't always get the credit it deserves.

  And funny you mention Mangos — the WoW emulation scene was a huge inspiration for UO server development back in the day. Different game, same passion for reverse-engineering and rebuilding these worlds. The
  community-driven server scene is one of the best things about MMO gaming in general.

  Thanks for the kind words and good luck with your WoW adventures! :*!
squidleon
·4 bulan yang lalu·discuss
Thanks! Yeah, one of the main motivations was exactly that — after years working with legacy UO codebases where networking, persistence, and game logic were deeply intertwined, I wanted to see what a clean-slate approach would look like with modern .NET.

On sector sync bursts — this is something I'm actively tuning. Right now when a player enters a new sector, we sync all ground items and mobiles in the surrounding sectors (configurable radius). For busy areas that can mean a lot of packets at once. The current approach is:

  - Sector enter sync only sends the delta  sectors the player wasn't already seeing, so a simple move into an adjacent sector doesn't resync everything
  - Sectors close to the player (within 1 of center) are always resynced because the UO client silently drops items beyond its visual range (~18 tiles), so you need to re-send them when the player comes back
  - The outgoing packet queue handles the actual send, so the game loop isn't blocked waiting for network I/O

  That said, there's definitely room for prioritization (mobiles first, then nearby items, then distant items) and spreading the sync across multiple ticks instead of one burst. It's on the roadmap.

  On NativeAOT — honestly, both. The single-binary deployment is great for Docker (small image, instant startup), but the real win is predictable performance. No JIT warmup, no tiered compilation surprises
  mid-session. For a game server where you care about consistent tick timing, eliminating that variable is worth it. The tradeoff is you lose some runtime flexibility, but source generators fill most of that gap
  (packet registration, serialization, etc.).
squidleon
·4 bulan yang lalu·discuss
hank you! That separation was a very deliberate choice I've seen firsthand how quickly things degrade when packet handling leaks into game logic.

You're touching on a real pain point. Right now the Lua boundary does show measurable overhead under load, especially with per-tick callbacks across many entities (doors, spawners, etc.). MoonSharp's interop cost adds up when you're calling into Lua thousands of times per tick.

I'm actively looking at batching script invocations per tick and capping the budget so a heavy script wave can't blow up tail latency. The goal is to keep the game loop deterministic if Lua eats too much of the tick budget, defer the rest to the next tick rather than letting the whole loop stall.

It's one of those problems where the architecture gives you a clean place to solve it (the boundary is explicit, so you can meter it), but the solution still needs work. Appreciate you calling it out — good toknow others think about the same tradeoffs.
squidleon
·4 bulan yang lalu·discuss
I forgot to mention, the entire web part in React was done by Codex. I hate developing frontends!
squidleon
·4 bulan yang lalu·discuss
So: I took most of the infrastructure from the my first attempt at moongate (https://github.com/moongate-community/moongate, which failed miserably along with https://github.com/tgiachi/Prima). From there, I had a good starting point to quickly build the foundations. I had already done the Lua scripting part in another project (https://github.com/tgiachi/Lilly.Engine). Codex helped me with all the testing, implementing functionality and creating tests, so at least I have a good sparring pattern. For the data import part (which I called FileLoaders), I took the logic from ModernUO. For the items part, I created a script (scripts/dfn_*.sh) to import items from POL! Thanks for the compliments! The way I am, if I fixate on something, it becomes an obsession!
squidleon
·4 bulan yang lalu·discuss
Just update repo and README from server emulator -> server !
squidleon
·4 bulan yang lalu·discuss
I've never heard of Tibia, I'll check it out!
squidleon
·4 bulan yang lalu·discuss
You're right, I just checked , MaNGOS calls itself "a server" now. They probably had the same realization at some point. Maybe I should update my README too and just call it "a modern Ultima Online server" instead!. Less baggage.
squidleon
·4 bulan yang lalu·discuss
Thanks! I've been developing in .NET for 20 years and it's come a long way , from the Windows-only Framework days to what it is now. NativeAOT, cross-platform, incredible performance. And if you've never tried it on Apple Silicon the M4 chips are absolutely insane. The server compiles to a single native binary and runs like a dream on ARM.
squidleon
·4 bulan yang lalu·discuss
Too old for arc raiders :D :D :D !
squidleon
·4 bulan yang lalu·discuss
Outlands is impressive from a technical standpoint, they've put an insane amount of work into it and the player count speaks for itself. I played there for a while.

Personally though, I feel they've overengineered it a bit. So many custom systems layered on top that it starts to feel more like WoW with UO graphics than actual UO. The original charm was in the simplicity you, a sword, and a world that didn't care about your feelings. But that's just my taste, and clearly thousands of players disagree with me, so what do I know. And yes, the fact that official UO is still running in 2026 is both beautiful and insane
squidleon
·4 bulan yang lalu·discuss
This is such a good observation. UO had a real economy and social hierarchy because power wasn't handed to you. You could spend months as a fisherman or tailor and still have a meaningful experience. The gap between a grandmaster swordsman in full plate and a guy selling fish at the Britain bank was enormous, and both of them were having fun.

Modern MMOs are theme parks where everyone gets the same ride (with pay per win). UO was a living world where your role emerged from what you chose to do, not from a quest marker telling you where to go next.
squidleon
·4 bulan yang lalu·discuss
That's a great idea, UO is honestly perfect for playing with kids. The crafting, housing, exploring dungeons together. And who knows, maybe you become the dragon trainer this time around!
squidleon
·4 bulan yang lalu·discuss
Ha, you're absolutely right from a CS perspective! it's a protocol reimplementation, not emulation in the traditional sense. I've thought about this too. "Server emulator" stuck in the UO/MMO (other example Mangos is "Wow emualtor") community because RunUO and similar projects used the term 20 years ago and it just became the standard label. At this point fighting it feels like your Wikipedia edit war, technically correct but practically hopeless. !

  That said, I'll take the nitpick as a compliment :) means you actually read the project description. Thanks for the kind words!
squidleon
·4 bulan yang lalu·discuss
Thanks! There are still a few active shards out there, mostly us "old guys" in our 40s chasing the nostalgia of our teenage years. UO has a way of never really dying. Combat and skills are still a ways off, but the foundation is solid enough that I'm adding features every week (in spare times,) I'll keep pushing updates!