Live data from Hacker News

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

github.com

51–60 of 168 posts

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

#52
post #34

Earlier quoted context omitted.

If starting from scratch, what would an MMO need to replicate that? I've experienced it first hand, but I can't grasp why it worked well like it did.

It’s largely impossible now, it’s not a technical problem, it’s cultural. UO forced many different types of players to coexist in the same world that simply do not mix anymore. You had peaceful dungeon crawlers and craftsmen coexisting alongside killers, rapists, thieves (wild that stealing items from other players inventory was actually a thing, probably unheard of in today’s MMOs). The friction between these differ…

>The truth is though there was no “bad experience”, it was all just an experience.

I mean there absolutely were bad experiences. Griefing drove lots of players away, which is why they implemented Trammel.

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

#53

Very cool project. MMO server codebases tend to accumulate a lot of architectural complexity over time, so starting fresh with a cleaner separation between networking and game logic makes a lot of sense. Curious about the sector-based delta sync — how do you avoid packet bursts when a player enters a busy area with lots of items and mobiles? Also interesting to see NativeAOT used here. Was that mainly for deployment…

>Curious about the sector-based delta sync — how do you avoid packet bursts when a player enters a busy area with lots of items and mobiles?

doesn't look like there is much going on to protect packet bursts there aside from smart-ish proximity sector loading. the work is done at boundry.

dove into it because i have been recently working on frustrum spawning to reduce net burst in a similar project, was kind of curious if something similar was used as a method to pre-warm the upcoming sector but I didn't catch anything.

fun and easy to read. thanks op and parent for getting me to look through it.

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

#54
post #34

Earlier quoted context omitted.

If starting from scratch, what would an MMO need to replicate that? I've experienced it first hand, but I can't grasp why it worked well like it did.

You’d need to start with the premise that combat shouldn’t necessarily be the focus of the game. Work on making other aspects (farming, hunting, taming animals, etc) to be equally compelling mechanics.

They're by no means equally compelling. But they are viable ways to generate currency, you progress in them over time as a specialist, they feed back into the player economy performing tasks that other people want performed, and they are, importantly, in the same world, on the same shard. I know not to go near Orc Camp because there's a group of player killers down there, despite the fact that there's a rich Agapite vein running through the mountains near the entrance that I would love to mine and make armor out of. Back to the relative safety of Minoc for me, however crowded. In some timeline two weeks in the future, I band together with a bunch of other players (most of whom just want to farm orcs) to kick them out. Territorial control, even without any formal mechanics of territorial control, is closely correlated with narrative and socialization; I wouldn't have met any of those players if we were all on our own separate instance.

Eve Online accomplished something a little more combat-focused, but similarly diverse in playstyle, mostly by dint of having a single large persistent world-shard with minimal functional instancing.

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

#55

Earlier quoted context omitted.

It’s largely impossible now, it’s not a technical problem, it’s cultural. UO forced many different types of players to coexist in the same world that simply do not mix anymore. You had peaceful dungeon crawlers and craftsmen coexisting alongside killers, rapists, thieves (wild that stealing items from other players inventory was actually a thing, probably unheard of in today’s MMOs). The friction between these differ…

>The truth is though there was no “bad experience”, it was all just an experience. I mean there absolutely were bad experiences. Griefing drove lots of players away, which is why they implemented Trammel.

Grief is a natural consequence of player freedom, but it’s not worth giving up that freedom for some safety.

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

#56

[flagged]

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.

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

#59

Very cool project. MMO server codebases tend to accumulate a lot of architectural complexity over time, so starting fresh with a cleaner separation between networking and game logic makes a lot of sense. Curious about the sector-based delta sync — how do you avoid packet bursts when a player enters a busy area with lots of items and mobiles? Also interesting to see NativeAOT used here. Was that mainly for deployment…

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.).

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

#60

Earlier quoted context omitted.

It’s largely impossible now, it’s not a technical problem, it’s cultural. UO forced many different types of players to coexist in the same world that simply do not mix anymore. You had peaceful dungeon crawlers and craftsmen coexisting alongside killers, rapists, thieves (wild that stealing items from other players inventory was actually a thing, probably unheard of in today’s MMOs). The friction between these differ…

>The truth is though there was no “bad experience”, it was all just an experience. I mean there absolutely were bad experiences. Griefing drove lots of players away, which is why they implemented Trammel.

You approach that from a game design perspective to reduce the reward and set bounds on how much fun a player is allowed to destroy maliciously and what kind of counterplay is available, but if you completely eliminate it the world loses a lot of its drama. Conflict drives narrative.
Post reply on HN