# Moongate – .NET 10 기반 Ultima Online 서버 에뮬레이터

> Clean Markdown view of GeekNews topic #27292. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=27292](https://news.hada.io/topic?id=27292)
- GeekNews Markdown: [https://news.hada.io/topic/27292.md](https://news.hada.io/topic/27292.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2026-03-08T05:33:12+09:00
- Updated: 2026-03-08T05:33:12+09:00
- Original source: [github.com/moongate-community](https://github.com/moongate-community/moongatev2)
- Points: 2
- Comments: 1

## Topic Body

- **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** 필요  
- 기본 실행 절차:  
  ```bash
  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/](https://moongate-community.github.io/moongatev2/)  

### 기술적 특징 요약
- **C# + .NET 10 + NativeAOT** 기반 MMO 서버 프레임워크  
- **Lua 스크립트 통합**, **MessagePack 영속성**, **Prometheus/Grafana 모니터링** 지원  
- **Docker 배포 및 자동화 스크립트** 포함  
- **고성능, 모듈형, 테스트 중심 설계**로 현대적 서버 개발에 적합한 구조

## Comments



### Comment 52575

- Author: neo
- Created: 2026-03-08T05:33:12+09:00
- Points: 1

###### [Hacker News 의견들](https://news.ycombinator.com/item?id=47275236) 
- 내가 플레이했던 게임 중 **UO(Ultima Online)** 만큼 ‘평민’ 플레이어가 존재했던 게임은 없었음  
  강력한 장비를 얻지 못한 사람도 즐겁게 플레이할 수 있었고, 최상위 플레이어들은 마치 **유명인**처럼 알려져 있었음  
  요즘 게임처럼 모두가 슈퍼히어로처럼 보이는 세상과는 완전히 달랐음
  - 정말 공감됨. UO에는 진짜 **경제와 사회 계층**이 존재했음  
    낚시꾼이나 재봉사로 몇 달을 보내도 의미 있는 경험이 가능했고, 강력한 전사와 평범한 상인이 같은 세상에서 각자의 재미를 느꼈음  
    요즘 MMO는 모두 같은 놀이기구를 타는 테마파크 같지만, UO는 플레이어의 선택으로 역할이 만들어지는 **살아있는 세계**였음
  - 전설적인 대장장이가 되는 게 목표였음. 제작이 곧 엔드게임이었고, 모든 장비와 가구는 누군가의 손에서 나왔음  
    게임의 목적은 세상을 ‘이기는 것’이 아니라 그 안에서 **살아가는 것**이었음  
    퀘스트도, 악당도 없었고, 선과 악, 그 사이의 모든 것이 존재했음  
    이런 철학을 다시 구현하는 스튜디오가 나오길 바람. Minecraft가 성공한 이유도 이런 **샌드박스성** 때문이라 생각함
  - UO는 내가 경험한 최고의 온라인 게임이었음. 다른 게임들은 그 그림자에 서 있음  
    EverQuest나 WoW도 좋아했지만, 그만큼 **자유롭고 날것 같은 감각**은 없었음  
    개인적으로는 The Realm도 최고의 MMO 후보로 꼽고 싶음
  - 오히려 지금보다 더 **현대적인 감성**이 있었던 것 같음. Stardew Valley나 Animal Crossing을 좋아하는 이유도 비슷함
  - UO를 플레이하던 그 **순수한 즐거움**을 평생 쫓게 될 것 같음. 지금이라도 직장을 그만두고 하루 종일 하고 싶음

- 정말 대단한 작업임. [기여 그래프](https://github.com/moongate-community/moongatev2/graphs/contributors)를 보니 혼자서 다 한 게 맞는지 놀라움  
  16년 전 시작된 **Infantry Online 서버 에뮬레이터** 프로젝트와 비슷한 느낌임  
  [SourceForge 원본 커밋](https://sourceforge.net/p/infserver/code/1/)도 찾아봤는데, 그건 10명 넘는 개발자가 15년 넘게 유지한 프로젝트였음  
  어떻게 혼자서 이렇게 많은 걸 해냈는지 궁금함
  - 첫 시도였던 [Moongate](https://github.com/moongate-community/moongate)와 [Prima](https://github.com/tgiachi/Prima)에서 인프라를 가져와 빠르게 기반을 만들었음  
    Lua 스크립팅은 [Lilly.Engine](https://github.com/tgiachi/Lilly.Engine)에서 이미 구현해봤고, Codex가 테스트와 기능 구현을 도와줬음  
    데이터 임포트는 ModernUO의 로직을 참고했고, 아이템은 POL에서 스크립트로 가져왔음  
    한 번 몰입하면 **집착 수준으로 파고드는 성격**이라 가능했음
  - 웹 프론트엔드는 전부 Codex가 React로 개발했음. 나는 **프론트엔드 개발을 싫어함**

- 정말 멋진 프로젝트임. 예전에 C++ 기반의 **UO 에뮬레이터 UOX3**를 유지보수했었음  
  직접 개발한 건 아니지만 커뮤니티 관리와 릴리스 담당을 했고, 캐나다 친구와 함께 개인 서버도 운영했음  
  Origin이 법적으로 문제 삼지 않아 다행이었음
  - 고등학생 때 UO를 하다가 중독이라 느껴서 계정을 팔고 끊었음  
    그 계정을 eBay에서 몇 천 달러와 **MTG Mox Pearl**에 팔았던 기억이 있음  
    그때 UOX를 통해 C++을 배우며 처음으로 **프로그래밍의 힘**을 느꼈음  
    직접 만든 모드로 무한히 연결된 문게이트를 배치할 수 있었고, 그 경험이 나를 프로그래밍의 길로 이끌었음  
    이후 Python을 배우며 지금의 커리어로 이어졌음. 정말 인생을 바꾼 경험이었음  
    ([내 소개 링크](https://amontalenti.com/about))
  - 듣기 좋음! 사실 **UOX3가 Moongate의 영감** 중 하나였음  
    서버 구조와 스크립팅 접근 방식이 흥미로워서 지금 프로젝트에도 영향을 줬음  
    이런 프로젝트들이 UO 에뮬레이터 역사에서 큰 부분을 차지함

- 정말 **추억이 되살아남**. 예전에 Trinsic 근처에 작은 집을 사서 제빵소를 운영했음  
  NPC 상인을 고용해 내가 없을 때도 물건을 팔 수 있었고, 친구는 탑을 꾸며 살았음  
  WoW가 주택 시스템을 도입하기까지 20년이 걸렸지만, UO의 주택은 **세상 속에 살아있는 공간**이었음

- Moongate 아키텍처 분석 글을 읽었는데, **Source Generator로 DI를 구현**하고 Lua로 C# 재컴파일 없이 동작을 분리한 구조가 인상적이었음  
  NPC AI가 빠져 있다고 했는데, 전통적인 FSM 대신 **LLM 기반 마이크로서비스**를 Lua에 연결하면 어떨까 함  
  NPC가 맥락 있는 대화와 기억을 가지게 하고, 플레이어의 입력에 따라 실제 이벤트를 트리거할 수 있음  
  이미 패킷 레이어와 Lua 환경이 잘 되어 있으니 통합도 깔끔할 것 같음. 함께 **AI 로직 설계**를 해보고 싶음
  - 정말 흥미로운 아이디어임. NPC 대화가 **세계 자체를 변화시키는 시스템**으로 발전할 수도 있을 듯  
    예를 들어 루머를 물으면 그 루머가 실제로 게임 내 사건으로 생겨나는 식임
  - 관심 있음. GitHub에서 연락 부탁함

- MMO 서버는 시간이 지나면 구조가 복잡해지기 쉬운데, 네트워크와 게임 로직을 분리한 **클린 아키텍처** 접근이 인상적임  
  특히 **sector 기반 delta sync**에서 혼잡 지역 진입 시 패킷 폭주를 어떻게 막는지 궁금함  
  NativeAOT 사용 이유도 단순 배포 때문인지, 성능 때문인지 알고 싶음
  - 주요 동기는 바로 그거였음. 오래된 UO 코드베이스는 네트워크·저장·로직이 얽혀 있어서, **.NET 기반의 새 접근**을 시도했음  
    sector 진입 시 주변 섹터의 아이템과 모바일을 동기화하지만, 이미 보던 섹터는 제외함  
    시야 범위를 벗어난 아이템은 클라이언트가 버리기 때문에 재전송이 필요함  
    패킷 전송은 큐에서 처리되어 게임 루프가 막히지 않음  
    향후에는 **우선순위 전송과 틱 분산**을 추가할 예정임  
    NativeAOT는 배포 단순화도 있지만, **예측 가능한 성능**이 핵심임. JIT 지연이 없고, 일관된 틱 타이밍을 유지할 수 있음
  - 패킷 폭주 방지는 근본적으로 proximity 로딩에 의존하는 듯함  
    나도 비슷한 프로젝트에서 **frustum 기반 스포닝**으로 네트워크 버스트를 줄이는 실험을 하고 있어서 흥미로웠음  
    코드가 읽기 쉬워서 참고가 많이 됨

- 우연히도 Moongate가 사용하는 Lua 엔진 **MoonSharp**이 최근 다시 활발해졌음  
  10년 만에 [v3.0.0 베타 릴리스](https://github.com/moonsharp-devs/moonsharp/releases)를 냈음  
  나는 원 제작자는 아니지만 GitHub 유지보수자로 참여 중이며, **Tabletop Simulator**에서도 이 엔진을 사용함

- 꼭 서버를 하나 열어보고 싶음. 15년 전 **SphereServer 관리자**였는데, 스크립트와 월드 데이터를 다 잃어버렸음  
  그래도 다시 예전 방식으로 사람들과 **고전 UO를 즐기고 싶음**
  - SphereServer 언급을 여기서 보게 될 줄이야!  
    나도 예전에 커스텀 스크립트를 많이 만들었는데 다 잃어버렸음  
    SphereServer 덕분에 처음으로 **스크립팅을 배운 계기**가 되었음

- 로고가 정말 마음에 듦. 혹시 진행 상황을 보여주는 **YouTube 영상**이 있는지 궁금함
  - 고마움! 로고는 우연히 만들어졌는데, 원작의 **Moongate 느낌**을 담고 싶었음  
    영상은 아직 없지만 현재 로그인, 캐릭터 생성, 월드 이동, Lua 아이템 스크립팅, React 기반 관리 UI 등이 동작 중임  
    조만간 README에 짧은 **데모 영상**을 추가할 예정임

- 최근 YouTube에서 **Majuular의 Ultima 시리즈 영상**을 보고 감명받았음  
  그 덕분에 GOG에서 Underworld와 VII을 구매했음. 90년대의 명작을 놓친 기분임  
  형은 UO를 많이 했고, 친구는 SirDarkSpell이라는 이름으로 **악명 높은 그리퍼**였음  
  둘 다 이 프로젝트를 보면 정말 반가워할 것 같음. 이번 주말엔 Stygian Abyss에 빠져볼 예정임
  - **Ultima Underworld는 환상적인 게임**임
