- Proyecto open source que reimplementa por completo un servidor de Ultima Online con .NET 10 y C#, con enfoque en alto rendimiento y ejecución estable mediante AOT (compilación anticipada)
- Cuenta con arquitectura modular, procesamiento preciso del game loop y herramientas para paquetes, además de soporte para interacciones dentro del juego y control de IA mediante scripting en Lua
- Ofrece una infraestructura de servidor completa que incluye sistema de persistencia basado en MessagePack-CSharp, redes TCP, endpoints de administración HTTP, Docker y stack de monitoreo
- Permite implementar gameplay personalizable mediante funciones de extensión por script como comandos basados en Lua, IA de NPC, efectos visuales y sistema de UI (Gump)
- Está publicado como open source y se considera un framework moderno de servidores .NET útil para el desarrollo de servidores MMO de alto rendimiento y la investigación sobre restauración de juegos legados
Resumen del proyecto
- Moongate v2 es un proyecto moderno de servidor de Ultima Online escrito en .NET 10, con estructura modular y compilación AOT para asegurar alto rendimiento y mantenibilidad
- Está diseñado con una estructura que incluye generación automática de definiciones de paquetes, game loop determinista y cobertura de pruebas
- Fue construido desde cero inspirado en servidores previos como ModernUO, RunUO y ServUO, sin copiar código de ellos
Objetivos principales
- Construir una base de servidor mantenible con énfasis en precisión y velocidad de iteración
- Definir claramente los límites entre networking y game loop y asegurar seguridad de hilos
- Aplicar modelado de paquetes basado en tipos y registro mediante generación de código fuente
- Mantener una estructura amigable con AOT sin sacrificar la eficiencia del desarrollo local
Estado actual del desarrollo
- Ya están implementadas funciones clave como servidor TCP, parsing de paquetes, event bus, gestión de sesiones, interfaz de administración HTTP y runtime de Lua
- Incluye generación automática de metadatos para Lua, UI de consola, game loop basado en temporizadores, búsqueda de rutas A*, control de iluminación y clima y envío de correos electrónicos
- Guarda el estado del juego mediante módulo de persistencia basado en MessagePack usando archivos de snapshot y journal
- Proporciona imágenes Docker y un stack de monitoreo con Prometheus/Grafana, lo que facilita el despliegue en entornos operativos
Sistema de scripting y comandos
- Integra un motor de scripting Lua (basado en MoonSharp) para controlar IA de NPC, comportamiento de ítems, efectos visuales y UI (Gump)
- Soporta en paralelo un sistema de registro de comandos en C# y registro dinámico de comandos en Lua
- Ejemplos: comandos de GM como
.teleport, .add_item_backpack, .set_world_light
- Permite manejar eventos de clic basados en tablas de Lua mediante despacho de
ScriptId de ítems
Rendimiento y benchmarks
- Según mediciones con BenchmarkDotNet, tareas clave de parsing y serialización de paquetes se procesan en el orden de decenas de nanosegundos
- En la comparación AOT vs JIT, algunas tareas muestran mejoras de velocidad de hasta 5 a 6 veces
- La eficiencia de procesamiento en rutas críticas del juego, como SpatialWorldService e ItemService, está medida en detalle
Despliegue y ejecución
Licencia y contribuciones
Resumen de características técnicas
- Framework de servidor MMO basado en C# + .NET 10 + NativeAOT
- Soporte para integración con scripts Lua, persistencia con MessagePack y monitoreo con Prometheus/Grafana
- Incluye despliegue con Docker y scripts de automatización
- Su diseño de alto rendimiento, modular y centrado en pruebas lo hace adecuado para el desarrollo moderno de servidores
1 comentarios
Comentarios de Hacker News
Nunca jugué un juego que tuviera tantos jugadores “comunes” como UO (Ultima Online)
Incluso la gente que no conseguía equipo poderoso podía divertirse, y los jugadores top eran conocidos casi como celebridades
Era completamente distinto del mundo de los juegos actuales, donde todos parecen superhéroes
Podías pasarte meses siendo pescador o sastre y aun así tener una experiencia significativa, y tanto un guerrero poderoso como un comerciante común encontraban su propia diversión en el mismo mundo
Los MMO actuales son como parques temáticos donde todos se suben a la misma atracción, pero UO era un mundo vivo donde los roles surgían de las decisiones del jugador
El propósito del juego no era “vencer” al mundo, sino vivir dentro de él
No había quests ni villanos, y había bien, mal y todo lo que existía entre ambos
Ojalá aparezca un estudio que vuelva a implementar esta filosofía. Creo que Minecraft también tuvo éxito por ese componente de sandbox
También me gustaron EverQuest y WoW, pero no tenían esa misma sensación de libertad y crudeza
Personalmente, también pondría a The Realm como candidato a mejor MMO
Es un trabajo realmente impresionante. Viendo el gráfico de contribuciones, sorprende que de verdad lo haya hecho casi una sola persona
Me da vibras parecidas al proyecto de emulador de servidor de Infantry Online que empezó hace 16 años
También encontré los commits originales en SourceForge, y ese fue un proyecto mantenido por más de 10 desarrolladores durante más de 15 años
Me intriga cómo una sola persona logró hacer tanto
Ya había implementado el scripting en Lua en Lilly.Engine, y Codex me ayudó con tests e implementación de funcionalidades
Para la importación de datos tomé como referencia la lógica de ModernUO, y los ítems los importé por script desde POL
También ayudó que, cuando me obsesiono con algo, me hundo hasta un nivel casi enfermizo
Es un proyecto muy genial. Antes mantuve UOX3, un emulador de UO basado en C++
No lo desarrollé yo directamente, pero me encargaba de la comunidad y de los releases, y también administré un servidor privado con un amigo canadiense
Por suerte Origin no hizo problemas legales
Recuerdo haber vendido esa cuenta en eBay por varios miles de dólares y una MTG Mox Pearl
En ese tiempo sentí por primera vez el poder de la programación mientras aprendía C++ con UOX
Con un mod que hice yo mismo podía colocar moongates conectados infinitamente, y esa experiencia me llevó al camino de la programación
Después aprendí Python y eso terminó llevándome a mi carrera actual. De verdad fue una experiencia que me cambió la vida
(enlace a mi presentación)
La estructura del servidor y su enfoque de scripting me parecieron interesantes, y terminaron influyendo en este proyecto
Proyectos así ocupan una parte importante en la historia de los emuladores de UO
De verdad me devolvió muchos recuerdos. Hace tiempo compré una casita cerca de Trinsic y administraba una panadería
Podía contratar comerciantes NPC para vender mis cosas incluso cuando yo no estaba, y un amigo vivía decorando su torre
A WoW le tomó 20 años implementar un sistema de vivienda, pero en UO las casas eran espacios vivos dentro del mundo
Leí un análisis de la arquitectura de Moongate y me impresionó la estructura de implementar DI con Source Generator y separar comportamientos con Lua sin recompilar C#
Mencionabas que todavía faltaba la IA de los NPC, y me pregunto si en vez de una FSM tradicional no podrías conectar a Lua un microservicio basado en LLM
Así los NPC podrían tener conversaciones con contexto y memoria, y activar eventos reales según la entrada del jugador
Como ya tienes bien resuelta la capa de paquetes y el entorno Lua, la integración también se ve limpia. Me gustaría pensar contigo el diseño de la lógica de IA
Por ejemplo, si preguntas por un rumor, ese rumor podría generarse después como un evento real dentro del juego
Los servidores MMO tienden a volverse estructuralmente complejos con el tiempo, así que me impresionó el enfoque de arquitectura limpia al separar red y lógica del juego
Sobre todo, en la delta sync basada en sectores, me da curiosidad cómo evitas una avalancha de paquetes al entrar a zonas congestionadas
También quisiera saber si el uso de NativeAOT es solo por simplicidad de despliegue o también por rendimiento
Al entrar a un sector se sincronizan los ítems y móviles de los sectores cercanos, pero se excluyen los sectores que ya estabas viendo
Los ítems que salen del rango visual el cliente los descarta, así que hace falta reenviarlos
El envío de paquetes se procesa en una cola para que el game loop no se bloquee
Más adelante planeo agregar envío con prioridades y distribución por ticks
NativeAOT también simplifica el despliegue, pero lo clave es el rendimiento predecible. No hay latencia de JIT y se puede mantener un timing de ticks consistente
Yo también estuve experimentando en un proyecto parecido con spawning basado en frustum para reducir bursts de red, así que me pareció interesante
El código es fácil de leer y sirve mucho como referencia
Casualmente, MoonSharp, el motor Lua que usa Moongate, volvió a activarse recientemente
Sacó una beta v3.0.0 después de 10 años
Yo no soy el creador original, pero participo como mantenedor en GitHub, y Tabletop Simulator también usa este motor
Definitivamente quiero abrir un servidor. Hace 15 años fui administrador de SphereServer, pero perdí todos mis scripts y datos del mundo
Aun así, me gustaría volver a disfrutar UO clásico con otras personas como en esos tiempos
Yo también hice muchos scripts personalizados en su momento y lo perdí todo
SphereServer fue la razón por la que aprendí a hacer scripting por primera vez
Me gusta muchísimo el logo. ¿Tienes algún video en YouTube mostrando el progreso?
Todavía no hay video, pero ya funcionan el login, la creación de personajes, el movimiento por el mundo, el scripting de ítems en Lua y una UI de administración basada en React
Pronto voy a agregar un video corto de demo al README
Hace poco me impresionaron unos videos de la serie Ultima de Majuular en YouTube
Gracias a eso compré Underworld y VII en GOG. Siento que me perdí unas obras maestras de los 90
Mi hermano jugó mucho UO, y un amigo era un griefer infame llamado SirDarkSpell
Creo que a ambos les daría muchísimo gusto ver este proyecto. Este fin de semana pienso clavármela con Stygian Abyss