Show HN: Moongate – Ultima Online server emulator in .NET 10 with Lua scripting
51–60 of 168 posts
Re: Show HN: Moongate – Ultima Online server emulator in .NET 10 with Lua scripting
#52Earlier 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…
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
#53Very 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…
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
#54Earlier 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.
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
#55Earlier 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.
Re: Show HN: Moongate – Ultima Online server emulator in .NET 10 with Lua scripting
#56[flagged]
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
#57Re: Show HN: Moongate – Ultima Online server emulator in .NET 10 with Lua scripting
#58[flagged]
Re: Show HN: Moongate – Ultima Online server emulator in .NET 10 with Lua scripting
#59Very 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…
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
#60Earlier 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.