- Projeto open source que reimplementa do zero um servidor de Ultima Online em .NET 10 e C#, com foco em alto desempenho e execução estável com base em AOT (compilação antecipada)
- Conta com arquitetura modular, processamento preciso do game loop e ferramentas para pacotes, além de oferecer suporte a interações no jogo e controle de IA por meio de scripts em Lua
- Fornece uma infraestrutura completa de servidor, incluindo sistema de persistência baseado em MessagePack-CSharp, rede TCP, endpoints de administração HTTP, Docker e stack de monitoramento
- Permite implementar gameplay customizável por meio de recursos de extensão por script, como comandos baseados em Lua, IA de NPCs, efeitos visuais e sistema de UI (Gump)
- Está disponível como open source e é avaliado como um framework moderno de servidor .NET útil para desenvolvimento de servidores MMO de alto desempenho e pesquisa de restauração de jogos legados
Visão geral do projeto
- O Moongate v2 é um projeto moderno de servidor para Ultima Online escrito em .NET 10, garantindo alto desempenho e facilidade de manutenção por meio de uma estrutura modular e compilação AOT
- Foi projetado com uma estrutura que inclui geração automática de definições de pacotes, game loop determinístico e cobertura de testes
- Em vez de copiar código de servidores existentes como ModernUO, RunUO e ServUO, foi construído do zero inspirado neles
Objetivos principais
- Construir uma base de servidor sustentável com foco em precisão e velocidade de iteração
- Clarificar os limites entre rede e game loop e garantir segurança de threads
- Aplicar modelagem de pacotes baseada em tipos e registro por geração de código-fonte
- Manter uma estrutura amigável a AOT sem abrir mão da eficiência no desenvolvimento local
Estado atual de desenvolvimento
- Recursos centrais como servidor TCP, parsing de pacotes, event bus, gerenciamento de sessões, interface administrativa HTTP e runtime Lua já foram implementados
- Inclui geração automática de metadados Lua, UI de console, game loop baseado em timer, pathfinding A*, controle de iluminação e clima e envio de e-mails
- Salva o estado do jogo em arquivos de snapshot e journal por meio de um módulo de persistência baseado em MessagePack
- Oferece imagens Docker e uma stack de monitoramento Prometheus/Grafana, facilitando a implantação em ambientes de operação
Sistema de scripts e comandos
- Traz embutido um motor de script Lua (baseado em MoonSharp), permitindo controlar IA de NPCs, comportamento de itens, efeitos visuais e UI (Gump)
- Suporta em paralelo um sistema de registro de comandos em C# e registro dinâmico de comandos em Lua
- Exemplos: comandos de GM como
.teleport, .add_item_backpack, .set_world_light
- Permite tratar eventos de clique com tabelas Lua por meio de despacho de ScriptId de itens
Desempenho e benchmarks
- Segundo medições com BenchmarkDotNet, tarefas importantes de parsing e serialização de pacotes são processadas em dezenas de nanossegundos
- Na comparação AOT vs JIT, algumas tarefas mostraram ganhos de até 5 a 6 vezes
- A eficiência de processamento de caminhos críticos do jogo, como SpatialWorldService e ItemService, foi medida em detalhe
Implantação e execução
Licença e contribuições
Resumo dos destaques técnicos
- Framework de servidor MMO baseado em C# + .NET 10 + NativeAOT
- Suporte a integração com scripts Lua, persistência com MessagePack e monitoramento com Prometheus/Grafana
- Inclui implantação com Docker e scripts de automação
- Estrutura adequada para desenvolvimento moderno de servidores com design de alto desempenho, modular e orientado a testes
1 comentários
Comentários do Hacker News
Nunca houve outro jogo que eu tenha jogado em que existissem tantos jogadores “comuns” quanto em UO (Ultima Online)
Mesmo quem não conseguia equipamentos poderosos ainda podia se divertir, e os jogadores do topo eram conhecidos quase como celebridades
Era completamente diferente do mundo dos jogos de hoje, em que todo mundo parece um super-herói
Era possível passar meses sendo pescador ou alfaiate e ainda assim ter uma experiência significativa, e um guerreiro poderoso e um comerciante comum podiam encontrar sua própria diversão no mesmo mundo
Os MMOs de hoje parecem todos parques temáticos em que todo mundo pega o mesmo brinquedo, mas UO era um mundo vivo em que os papéis surgiam das escolhas dos jogadores
O objetivo do jogo não era “vencer” o mundo, mas viver dentro dele
Não havia quests nem vilões, e havia o bem, o mal e tudo o que existia entre os dois
Espero que algum estúdio recrie essa filosofia. Acho que Minecraft também fez sucesso por causa dessa natureza sandbox
Eu também gostei de EverQuest e WoW, mas eles não tinham o mesmo sentimento de liberdade e crueza
Pessoalmente, eu também colocaria The Realm como candidato a melhor MMO
Trabalho realmente impressionante. Olhando o gráfico de contribuições, fiquei surpreso se isso foi mesmo tudo feito por uma pessoa
Me passou uma sensação parecida com um projeto de emulador de servidor de Infantry Online que começou 16 anos atrás
Também fui procurar os commits originais no SourceForge, e aquele foi um projeto mantido por mais de 10 desenvolvedores ao longo de mais de 15 anos
Fico imaginando como alguém conseguiu fazer tanta coisa sozinho
Eu já tinha implementado scripting em Lua em Lilly.Engine, e o Codex ajudou com testes e implementação de funcionalidades
Na importação de dados, usei como referência a lógica do ModernUO, e os itens vieram do POL por meio de scripts
Só foi possível porque, quando eu mergulho em algo, vou fundo num nível quase obsessivo
Projeto muito legal. No passado eu mantive o emulador de UO UOX3, baseado em C++
Eu não o desenvolvi diretamente, mas cuidava da comunidade e dos lançamentos, e também operava um servidor privado com um amigo canadense
Ainda bem que a Origin não criou problemas legais
Lembro que vendi essa conta no eBay por alguns milhares de dólares e um MTG Mox Pearl
Naquela época, foi através do UOX que aprendi C++ e senti pela primeira vez o poder da programação
Com um mod que eu mesmo fiz, consegui colocar moongates conectados infinitamente, e essa experiência me colocou no caminho da programação
Depois aprendi Python, e isso acabou levando à carreira que tenho hoje. Foi realmente uma experiência que mudou minha vida
(link sobre mim)
A estrutura do servidor e a abordagem de scripting eram interessantes, e isso influenciou o projeto atual
Projetos assim ocupam uma parte importante da história dos emuladores de UO
Isso realmente trouxe de volta a nostalgia. No passado, comprei uma casinha perto de Trinsic e administrava uma padaria
Eu contratava um vendedor NPC para vender as coisas enquanto eu não estava, e um amigo meu morava numa torre toda decorada
WoW levou 20 anos para introduzir um sistema de moradia, mas as casas em UO eram espaços vivos dentro do mundo
Li a análise da arquitetura do Moongate, e achei impressionante a forma como ele implementa DI com Source Generator e separa comportamentos em Lua sem precisar recompilar C#
Foi dito que ainda falta IA de NPC, mas e se em vez de uma FSM tradicional fosse conectado um microsserviço baseado em LLM ao Lua?
Isso daria aos NPCs conversas com contexto e memória, e permitiria acionar eventos reais de acordo com a entrada do jogador
Como a camada de pacotes e o ambiente Lua já estão bem feitos, a integração também parece que ficaria limpa. Eu adoraria ajudar a projetar a lógica de IA
Por exemplo, você pergunta sobre um rumor e esse rumor passa a surgir como um evento real dentro do jogo
Servidores de MMO tendem a ficar estruturalmente complexos com o tempo, então a abordagem de arquitetura limpa separando rede e lógica de jogo me chamou atenção
Fiquei especialmente curioso sobre como o delta sync baseado em setores evita uma enxurrada de pacotes ao entrar em áreas congestionadas
Também queria saber se o uso de NativeAOT foi mais por facilidade de distribuição ou por desempenho
Ao entrar em um setor, o sistema sincroniza itens e mobiles dos setores ao redor, mas exclui os setores que já estavam visíveis
Itens que saem do alcance de visão são descartados pelo cliente, então precisam ser reenviados
O envio de pacotes é processado por uma fila para que o game loop não fique bloqueado
No futuro, pretendo adicionar envio por prioridade e distribuição por ticks
O NativeAOT também ajuda a simplificar a distribuição, mas o principal é o desempenho previsível. Não há atraso de JIT, e isso permite manter timings de tick consistentes
Em um projeto parecido, eu também estava experimentando spawning baseado em frustum para reduzir bursts de rede, então isso me interessou bastante
O código é fácil de ler, então serviu muito como referência
Por coincidência, o engine Lua MoonSharp usado pelo Moongate voltou a ficar ativo recentemente
Depois de 10 anos, saiu um beta release v3.0.0
Eu não sou o criador original, mas participo como mantenedor no GitHub, e Tabletop Simulator também usa esse engine
Eu realmente queria abrir um servidor. Há 15 anos eu era administrador de SphereServer, mas perdi todos os scripts e dados do mundo
Mesmo assim, quero voltar a curtir o UO clássico com outras pessoas do jeito antigo
Eu também fazia muitos scripts personalizados no passado, mas perdi tudo
O SphereServer foi o que me levou a aprender scripting pela primeira vez
Gostei muito do logo. Fiquei curioso para saber se há algum vídeo no YouTube mostrando o progresso
Ainda não há vídeo, mas login, criação de personagem, movimentação pelo mundo, scripting de itens em Lua e a UI de administração em React já estão funcionando
Em breve vou adicionar um vídeo curto de demonstração ao README
Recentemente, fiquei impressionado ao ver no YouTube a série de vídeos do Majuular sobre Ultima
Por causa disso, comprei Underworld e VII no GOG. Dá a sensação de ter perdido obras-primas dos anos 90
Meu irmão jogou muito UO, e um amigo meu, com o nome SirDarkSpell, era um griefer infame
Acho que os dois ficariam muito felizes ao ver este projeto. Neste fim de semana, pretendo mergulhar em Stygian Abyss