Moongate – .NET 10 기반 Ultima Online 서버 에뮬레이터
(github.com/moongate-community)- Ultima Online 서버를 .NET 10과 C#으로 완전 새로 구현한 오픈소스 프로젝트, AOT(사전 컴파일) 기반으로 높은 성능과 안정적 실행을 목표로 함
- 모듈형 아키텍처와 정확한 게임 루프 처리, 패킷 툴링을 갖추고 있으며, Lua 스크립팅을 통해 게임 내 상호작용과 AI 제어를 지원
- MessagePack-CSharp 기반 영속성 시스템, TCP 네트워킹, HTTP 관리 엔드포인트, Docker 및 모니터링 스택을 포함한 완전한 서버 인프라 제공
- Lua 기반 명령어, NPC AI, 시각 효과, UI(Gump) 시스템 등 스크립트 확장 기능을 통해 커스터마이징 가능한 게임플레이 구현 가능
- 오픈소스로 공개되어 있으며, 고성능 MMO 서버 개발과 레거시 게임 복원 연구에 유용한 현대적 .NET 서버 프레임워크로 평가됨
프로젝트 개요
- Moongate v2는 .NET 10으로 작성된 현대적 Ultima Online 서버 프로젝트로, 모듈형 구조와 AOT 컴파일을 통해 높은 성능과 유지보수성을 확보
- 패킷 정의 자동 생성, 결정적 게임 루프, 테스트 커버리지를 갖춘 구조로 설계됨
- ModernUO, RunUO, ServUO 등 기존 서버의 코드를 복제하지 않고, 이들로부터 영감을 받아 새롭게 구축됨
주요 목표
- 정확성과 반복 속도에 중점을 둔 유지보수 가능한 서버 기반 구축
- 네트워킹과 게임 루프 경계의 명확화 및 스레드 안전성 확보
- 타입 기반 패킷 모델링과 소스 생성 등록 방식 적용
- AOT 친화적 구조를 유지하면서도 로컬 개발 효율성 보장
현재 개발 상태
- TCP 서버, 패킷 파싱, 이벤트 버스, 세션 관리, HTTP 관리 인터페이스, Lua 런타임 등 핵심 기능 구현 완료
- Lua 메타데이터 자동 생성, 콘솔 UI, 타이머 기반 게임 루프, A 경로 탐색*, 조명 및 날씨 제어, 이메일 발송 기능 포함
- MessagePack 기반 영속성 모듈을 통해 스냅샷 및 저널 파일로 게임 상태를 저장
- Docker 이미지와 Prometheus/Grafana 모니터링 스택을 제공하여 운영 환경 배포 용이
스크립팅 및 명령 시스템
- Lua 스크립팅 엔진(MoonSharp 기반) 을 내장하여 NPC AI, 아이템 동작, 시각 효과, UI(Gump) 등을 제어 가능
- C# 명령어 등록 시스템과 Lua 동적 명령어 등록을 병행 지원
- 예시:
.teleport,.add_item_backpack,.set_world_light등 GM 명령어 제공 - 아이템 ScriptId 디스패치를 통해 Lua 테이블 기반 클릭 이벤트 처리 가능
성능 및 벤치마크
- BenchmarkDotNet을 이용한 성능 측정 결과, 주요 패킷 파싱 및 직렬화 작업이 수십 나노초 단위로 처리됨
- AOT vs JIT 비교에서 일부 작업은 최대 5~6배 속도 향상을 보임
- SpatialWorldService와 ItemService 등 게임 핵심 경로의 처리 효율이 상세히 측정되어 있음
배포 및 실행
- .NET SDK 10.0.x 필요
- 기본 실행 절차:
dotnet restore dotnet build dotnet run --project src/Moongate.Server - 환경 변수 기반 설정(MOONGATE_*) 을 통해 HTTP 포트, 게임 루프, 이메일, 스크립팅 등 세부 설정 제어 가능
-
Docker Compose 예시 제공, 기본 포트는
2593(게임)과8088(HTTP)
라이선스 및 기여
- GPL-3.0 라이선스로 공개
- 코드 컨벤션과 테스트 포함한 Pull Request 기여를 환영
- 공식 문서: https://moongate-community.github.io/moongatev2/
기술적 특징 요약
- C# + .NET 10 + NativeAOT 기반 MMO 서버 프레임워크
- Lua 스크립트 통합, MessagePack 영속성, Prometheus/Grafana 모니터링 지원
- Docker 배포 및 자동화 스크립트 포함
- 고성능, 모듈형, 테스트 중심 설계로 현대적 서버 개발에 적합한 구조
Hacker News 의견들
-
내가 플레이했던 게임 중 UO(Ultima Online) 만큼 ‘평민’ 플레이어가 존재했던 게임은 없었음
강력한 장비를 얻지 못한 사람도 즐겁게 플레이할 수 있었고, 최상위 플레이어들은 마치 유명인처럼 알려져 있었음
요즘 게임처럼 모두가 슈퍼히어로처럼 보이는 세상과는 완전히 달랐음- 정말 공감됨. UO에는 진짜 경제와 사회 계층이 존재했음
낚시꾼이나 재봉사로 몇 달을 보내도 의미 있는 경험이 가능했고, 강력한 전사와 평범한 상인이 같은 세상에서 각자의 재미를 느꼈음
요즘 MMO는 모두 같은 놀이기구를 타는 테마파크 같지만, UO는 플레이어의 선택으로 역할이 만들어지는 살아있는 세계였음 - 전설적인 대장장이가 되는 게 목표였음. 제작이 곧 엔드게임이었고, 모든 장비와 가구는 누군가의 손에서 나왔음
게임의 목적은 세상을 ‘이기는 것’이 아니라 그 안에서 살아가는 것이었음
퀘스트도, 악당도 없었고, 선과 악, 그 사이의 모든 것이 존재했음
이런 철학을 다시 구현하는 스튜디오가 나오길 바람. Minecraft가 성공한 이유도 이런 샌드박스성 때문이라 생각함 - UO는 내가 경험한 최고의 온라인 게임이었음. 다른 게임들은 그 그림자에 서 있음
EverQuest나 WoW도 좋아했지만, 그만큼 자유롭고 날것 같은 감각은 없었음
개인적으로는 The Realm도 최고의 MMO 후보로 꼽고 싶음 - 오히려 지금보다 더 현대적인 감성이 있었던 것 같음. Stardew Valley나 Animal Crossing을 좋아하는 이유도 비슷함
- UO를 플레이하던 그 순수한 즐거움을 평생 쫓게 될 것 같음. 지금이라도 직장을 그만두고 하루 종일 하고 싶음
- 정말 공감됨. UO에는 진짜 경제와 사회 계층이 존재했음
-
정말 대단한 작업임. 기여 그래프를 보니 혼자서 다 한 게 맞는지 놀라움
16년 전 시작된 Infantry Online 서버 에뮬레이터 프로젝트와 비슷한 느낌임
SourceForge 원본 커밋도 찾아봤는데, 그건 10명 넘는 개발자가 15년 넘게 유지한 프로젝트였음
어떻게 혼자서 이렇게 많은 걸 해냈는지 궁금함- 첫 시도였던 Moongate와 Prima에서 인프라를 가져와 빠르게 기반을 만들었음
Lua 스크립팅은 Lilly.Engine에서 이미 구현해봤고, Codex가 테스트와 기능 구현을 도와줬음
데이터 임포트는 ModernUO의 로직을 참고했고, 아이템은 POL에서 스크립트로 가져왔음
한 번 몰입하면 집착 수준으로 파고드는 성격이라 가능했음 - 웹 프론트엔드는 전부 Codex가 React로 개발했음. 나는 프론트엔드 개발을 싫어함
- 첫 시도였던 Moongate와 Prima에서 인프라를 가져와 빠르게 기반을 만들었음
-
정말 멋진 프로젝트임. 예전에 C++ 기반의 UO 에뮬레이터 UOX3를 유지보수했었음
직접 개발한 건 아니지만 커뮤니티 관리와 릴리스 담당을 했고, 캐나다 친구와 함께 개인 서버도 운영했음
Origin이 법적으로 문제 삼지 않아 다행이었음- 고등학생 때 UO를 하다가 중독이라 느껴서 계정을 팔고 끊었음
그 계정을 eBay에서 몇 천 달러와 MTG Mox Pearl에 팔았던 기억이 있음
그때 UOX를 통해 C++을 배우며 처음으로 프로그래밍의 힘을 느꼈음
직접 만든 모드로 무한히 연결된 문게이트를 배치할 수 있었고, 그 경험이 나를 프로그래밍의 길로 이끌었음
이후 Python을 배우며 지금의 커리어로 이어졌음. 정말 인생을 바꾼 경험이었음
(내 소개 링크) - 듣기 좋음! 사실 UOX3가 Moongate의 영감 중 하나였음
서버 구조와 스크립팅 접근 방식이 흥미로워서 지금 프로젝트에도 영향을 줬음
이런 프로젝트들이 UO 에뮬레이터 역사에서 큰 부분을 차지함
- 고등학생 때 UO를 하다가 중독이라 느껴서 계정을 팔고 끊었음
-
정말 추억이 되살아남. 예전에 Trinsic 근처에 작은 집을 사서 제빵소를 운영했음
NPC 상인을 고용해 내가 없을 때도 물건을 팔 수 있었고, 친구는 탑을 꾸며 살았음
WoW가 주택 시스템을 도입하기까지 20년이 걸렸지만, UO의 주택은 세상 속에 살아있는 공간이었음 -
Moongate 아키텍처 분석 글을 읽었는데, Source Generator로 DI를 구현하고 Lua로 C# 재컴파일 없이 동작을 분리한 구조가 인상적이었음
NPC AI가 빠져 있다고 했는데, 전통적인 FSM 대신 LLM 기반 마이크로서비스를 Lua에 연결하면 어떨까 함
NPC가 맥락 있는 대화와 기억을 가지게 하고, 플레이어의 입력에 따라 실제 이벤트를 트리거할 수 있음
이미 패킷 레이어와 Lua 환경이 잘 되어 있으니 통합도 깔끔할 것 같음. 함께 AI 로직 설계를 해보고 싶음- 정말 흥미로운 아이디어임. NPC 대화가 세계 자체를 변화시키는 시스템으로 발전할 수도 있을 듯
예를 들어 루머를 물으면 그 루머가 실제로 게임 내 사건으로 생겨나는 식임 - 관심 있음. GitHub에서 연락 부탁함
- 정말 흥미로운 아이디어임. NPC 대화가 세계 자체를 변화시키는 시스템으로 발전할 수도 있을 듯
-
MMO 서버는 시간이 지나면 구조가 복잡해지기 쉬운데, 네트워크와 게임 로직을 분리한 클린 아키텍처 접근이 인상적임
특히 sector 기반 delta sync에서 혼잡 지역 진입 시 패킷 폭주를 어떻게 막는지 궁금함
NativeAOT 사용 이유도 단순 배포 때문인지, 성능 때문인지 알고 싶음- 주요 동기는 바로 그거였음. 오래된 UO 코드베이스는 네트워크·저장·로직이 얽혀 있어서, .NET 기반의 새 접근을 시도했음
sector 진입 시 주변 섹터의 아이템과 모바일을 동기화하지만, 이미 보던 섹터는 제외함
시야 범위를 벗어난 아이템은 클라이언트가 버리기 때문에 재전송이 필요함
패킷 전송은 큐에서 처리되어 게임 루프가 막히지 않음
향후에는 우선순위 전송과 틱 분산을 추가할 예정임
NativeAOT는 배포 단순화도 있지만, 예측 가능한 성능이 핵심임. JIT 지연이 없고, 일관된 틱 타이밍을 유지할 수 있음 - 패킷 폭주 방지는 근본적으로 proximity 로딩에 의존하는 듯함
나도 비슷한 프로젝트에서 frustum 기반 스포닝으로 네트워크 버스트를 줄이는 실험을 하고 있어서 흥미로웠음
코드가 읽기 쉬워서 참고가 많이 됨
- 주요 동기는 바로 그거였음. 오래된 UO 코드베이스는 네트워크·저장·로직이 얽혀 있어서, .NET 기반의 새 접근을 시도했음
-
우연히도 Moongate가 사용하는 Lua 엔진 MoonSharp이 최근 다시 활발해졌음
10년 만에 v3.0.0 베타 릴리스를 냈음
나는 원 제작자는 아니지만 GitHub 유지보수자로 참여 중이며, Tabletop Simulator에서도 이 엔진을 사용함 -
꼭 서버를 하나 열어보고 싶음. 15년 전 SphereServer 관리자였는데, 스크립트와 월드 데이터를 다 잃어버렸음
그래도 다시 예전 방식으로 사람들과 고전 UO를 즐기고 싶음- SphereServer 언급을 여기서 보게 될 줄이야!
나도 예전에 커스텀 스크립트를 많이 만들었는데 다 잃어버렸음
SphereServer 덕분에 처음으로 스크립팅을 배운 계기가 되었음
- SphereServer 언급을 여기서 보게 될 줄이야!
-
로고가 정말 마음에 듦. 혹시 진행 상황을 보여주는 YouTube 영상이 있는지 궁금함
- 고마움! 로고는 우연히 만들어졌는데, 원작의 Moongate 느낌을 담고 싶었음
영상은 아직 없지만 현재 로그인, 캐릭터 생성, 월드 이동, Lua 아이템 스크립팅, React 기반 관리 UI 등이 동작 중임
조만간 README에 짧은 데모 영상을 추가할 예정임
- 고마움! 로고는 우연히 만들어졌는데, 원작의 Moongate 느낌을 담고 싶었음
-
최근 YouTube에서 Majuular의 Ultima 시리즈 영상을 보고 감명받았음
그 덕분에 GOG에서 Underworld와 VII을 구매했음. 90년대의 명작을 놓친 기분임
형은 UO를 많이 했고, 친구는 SirDarkSpell이라는 이름으로 악명 높은 그리퍼였음
둘 다 이 프로젝트를 보면 정말 반가워할 것 같음. 이번 주말엔 Stygian Abyss에 빠져볼 예정임- Ultima Underworld는 환상적인 게임임