- Ultima Online sunucusunu .NET 10 ve C# ile tamamen baştan uygulayan açık kaynak proje; AOT (ön derleme) temelli olarak yüksek performans ve kararlı çalışmayı hedefliyor
- Modüler mimari, doğru oyun döngüsü işleme ve paket araçları sunuyor; Lua betikleme ile oyun içi etkileşimleri ve yapay zeka kontrolünü destekliyor
- MessagePack-CSharp tabanlı kalıcılık sistemi, TCP ağ iletişimi, HTTP yönetim uç noktaları, Docker ve izleme yığını dahil tam bir sunucu altyapısı sağlıyor
- Lua tabanlı komutlar, NPC yapay zekası, görsel efektler, UI (Gump) sistemi gibi betik genişletme özellikleriyle özelleştirilebilir oynanış oluşturulabiliyor
- Açık kaynak olarak yayımlanmış durumda ve yüksek performanslı MMO sunucu geliştirme ile eski oyunları yeniden canlandırma araştırmaları için yararlı modern bir .NET sunucu çerçevesi olarak değerlendiriliyor
Proje özeti
- Moongate v2, .NET 10 ile yazılmış modern bir Ultima Online sunucu projesi olup modüler yapı ve AOT derleme sayesinde yüksek performans ve bakım kolaylığı sağlıyor
- Paket tanımı otomatik üretimi, deterministik oyun döngüsü ve test kapsamı içeren bir yapı ile tasarlanmış
- ModernUO, RunUO, ServUO gibi mevcut sunucuların kodunu kopyalamadan, onlardan ilham alarak sıfırdan inşa edilmiş
Temel hedefler
- Doğruluk ve yineleme hızı odağında sürdürülebilir bir sunucu temeli kurmak
- Ağ iletişimi ile oyun döngüsü sınırlarını netleştirmek ve iş parçacığı güvenliğini sağlamak
- Tür tabanlı paket modelleme ve source generation kayıt yaklaşımı uygulamak
- AOT dostu yapıyı korurken yerel geliştirme verimliliğini de güvence altına almak
Mevcut geliştirme durumu
- TCP sunucusu, paket ayrıştırma, olay veri yolu, oturum yönetimi, HTTP yönetim arayüzü, Lua runtime gibi çekirdek özellikler tamamlanmış durumda
- Lua metadata otomatik üretimi, konsol arayüzü, zamanlayıcı tabanlı oyun döngüsü, A yol bulma*, ışık ve hava durumu kontrolü, e-posta gönderme işlevi içeriyor
- MessagePack tabanlı kalıcılık modülü ile oyun durumu snapshot ve journal dosyalarına kaydediliyor
- Docker imajları ve Prometheus/Grafana izleme yığını sunarak üretim ortamına dağıtımı kolaylaştırıyor
Betikleme ve komut sistemi
- Lua betik motoru (MoonSharp tabanlı) gömülü olarak geliyor; NPC yapay zekası, eşya davranışları, görsel efektler ve UI (Gump) kontrol edilebiliyor
- C# komut kayıt sistemi ile Lua dinamik komut kaydı birlikte destekleniyor
- Örnek:
.teleport, .add_item_backpack, .set_world_light gibi GM komutları sunuluyor
- Eşya ScriptId dispatch üzerinden Lua tablo tabanlı tıklama olayları işlenebiliyor
Performans ve benchmark
- BenchmarkDotNet ile yapılan ölçümlerde, temel paket ayrıştırma ve serileştirme işlemleri onlarca nanosaniye düzeyinde tamamlanıyor
- AOT ve JIT karşılaştırmasında bazı işlemler en fazla 5-6 kat hız artışı gösteriyor
- SpatialWorldService ve ItemService gibi oyunun kritik yollarındaki işlem verimliliği ayrıntılı biçimde ölçülmüş
Dağıtım ve çalıştırma
Lisans ve katkı
Teknik özelliklerin özeti
- C# + .NET 10 + NativeAOT tabanlı MMO sunucu çerçevesi
- Lua betik entegrasyonu, MessagePack kalıcılığı, Prometheus/Grafana izleme desteği
- Docker dağıtımı ve otomasyon betikleri içeriyor
- Yüksek performanslı, modüler, test odaklı tasarım ile modern sunucu geliştirmeye uygun bir yapı
1 yorum
Hacker News yorumları
Oynadığım oyunlar arasında UO(Ultima Online) kadar “sıradan” oyuncunun var olabildiği başka bir oyun olmadı
Güçlü ekipman elde edemeyenler bile keyifle oynayabiliyordu ve en üst düzey oyuncular adeta ünlü gibi tanınıyordu
Herkesin süper kahraman gibi göründüğü bugünün oyun dünyasından tamamen farklıydı
Aylarca balıkçı ya da terzi olarak zaman geçirmek bile anlamlı bir deneyim sunuyordu; güçlü savaşçılarla sıradan tüccarlar aynı dünyada kendi eğlencelerini bulabiliyordu
Günümüz MMO'ları herkesin aynı lunapark trenine bindiği tema parkları gibi, ama UO oyuncu seçimleriyle rollerin şekillendiği canlı bir dünyaydı
Oyunun amacı dünyayı “yenmek” değil, onun içinde yaşamaktı
Ne görevler vardı ne de kötü adamlar; iyilik, kötülük ve ikisinin arasındaki her şey vardı
Umarım bir gün bu felsefeyi yeniden hayata geçiren bir stüdyo çıkar. Minecraft'ın başarısının sebebinin de bu sandbox yapısı olduğunu düşünüyorum
EverQuest ve WoW'u da seviyordum ama aynı düzeyde özgür ve ham bir his vermiyorlardı
Kişisel olarak The Realm'i de en iyi MMO adaylarından biri sayarım
Gerçekten müthiş bir çalışma. Katkı grafiğine bakınca bunu gerçekten tek başına yapmış olmasına şaşırdım
16 yıl önce başlamış Infantry Online sunucu emülatörü projesine benzer bir his veriyor
SourceForge'daki orijinal commit'leri de buldum; o proje 10'dan fazla geliştiricinin 15 yılı aşkın süre boyunca sürdürdüğü bir çalışmaydı
Bunu tek başına nasıl bu kadar ileri götürebildiğini merak ediyorum
Lua scripting'i Lilly.Engine içinde daha önce uygulamıştım, Codex de testlerde ve özellik geliştirmede yardımcı oldu
Veri içe aktarmada ModernUO'nun mantığını referans aldım, item'ları da POL'den script ile aldım
Bir şeye odaklandığımda takıntı seviyesinde derine inen bir yapım olduğu için mümkün oldu
Gerçekten harika bir proje. Zamanında C++ tabanlı UO emülatörü UOX3'ün bakımını yapmıştım
Doğrudan geliştirmemiş olsam da topluluk yönetimi ve release işlerinden sorumluydum; Kanadalı bir arkadaşımla özel bir sunucu da işletiyorduk
Neyse ki Origin bunu hukuki bir mesele haline getirmedi
O hesabı eBay'de birkaç bin dolar ve bir MTG Mox Pearl karşılığında sattığımı hatırlıyorum
O dönemde UOX sayesinde C++ öğrenirken ilk kez programlamanın gücünü hissettim
Kendi yaptığım mod ile sonsuza kadar birbirine bağlanan moongate'ler yerleştirebiliyordum ve bu deneyim beni programlama yoluna soktu
Sonrasında Python öğrendim ve bugünkü kariyerime kadar uzandı. Gerçekten hayatımı değiştiren bir deneyimdi
(hakkımda sayfası)
Sunucu yapısı ve scripting yaklaşımı ilgimi çekmişti; bugünkü projeyi de etkiledi
Bu tür projeler UO emülatör tarihinin büyük bir parçasını oluşturuyor
Gerçekten nostalji seli yaşattı. Eskiden Trinsic yakınlarında küçük bir ev alıp fırın işletiyordum
Ben yokken de satış yapabilsin diye NPC tüccar tutabiliyordum, arkadaşım ise bir kuleyi dekore edip orada yaşıyordu
WoW'un konut sistemini getirmesi 20 yıl sürdü ama UO'daki evler dünyanın içinde yaşayan mekanlardı
Moongate mimarisini analiz eden yazıyı okudum; DI'nin Source Generator ile uygulanması ve davranışların C# yeniden derlemesine gerek kalmadan Lua ile ayrıştırılması çok etkileyiciydi
NPC AI'nin henüz eksik olduğu söylenmiş; geleneksel FSM yerine Lua'ya bağlı LLM tabanlı bir mikroservis nasıl olur diye düşündüm
Bu sayede NPC'ler bağlamı olan konuşmalar ve hafıza kazanabilir, oyuncu girdisine göre gerçek event'leri tetikleyebilir
Paket katmanı ve Lua ortamı zaten iyi kurulmuş görünüyor, bu yüzden entegrasyon da temiz olabilir. Birlikte yapay zeka mantığı tasarımı üzerinde çalışmak isterim
Mesela bir söylenti sorulduğunda o söylenti gerçekten oyun içi bir olaya dönüşebilir
MMO sunucularında zamanla yapı çok kolay karmaşıklaşabiliyor; ağ ile oyun mantığını ayıran clean architecture yaklaşımı etkileyici
Özellikle sector tabanlı delta sync tarafında, kalabalık bölgelere girildiğinde paket patlamasını nasıl önlediğini merak ediyorum
NativeAOT kullanma sebebinin sadece dağıtım kolaylığı mı yoksa performans mı olduğunu da öğrenmek isterim
Bir sector'e girildiğinde çevredeki sector'lerdeki item ve mobile'lar senkronize ediliyor ama zaten görünmekte olan sector'ler hariç tutuluyor
Görüş alanının dışına çıkan item'ları istemci attığı için yeniden gönderilmeleri gerekiyor
Paket gönderimi kuyruk üzerinden işlendiğinden oyun döngüsü tıkanmıyor
İleride önceliklendirilmiş gönderim ve tick dağıtımı eklemeyi planlıyorum
NativeAOT yalnızca dağıtımı kolaylaştırmak için değil; asıl mesele öngörülebilir performans. JIT gecikmesi olmuyor ve tutarlı tick zamanlaması korunabiliyor
Ben de benzer bir projede ağ patlamalarını azaltmak için frustum tabanlı spawning denemeleri yapıyorum, o yüzden ilgimi çekti
Kodun okunması kolay, bu açıdan çok faydalı bir referans oluyor
Tesadüf bu ya, Moongate'in kullandığı Lua motoru MoonSharp yakın zamanda yeniden aktif hale geldi
10 yıl aradan sonra v3.0.0 beta sürümünü yayımladılar
Ben orijinal geliştirici değilim ama GitHub bakımcıları arasında yer alıyorum; Tabletop Simulator da bu motoru kullanıyor
Kesinlikle bir sunucu açmayı denemek istiyorum. 15 yıl önce bir SphereServer yöneticisiydim ama tüm script'leri ve dünya verilerini kaybettim
Yine de insanlarla eski usul klasik UO keyfini yeniden yaşamak istiyorum
Ben de zamanında bir sürü özel script yazmıştım ama hepsi kayboldu
SphereServer, scripting öğrenmeye başlamamın vesilesi olmuştu
Logoyu gerçekten çok beğendim. Acaba ilerlemeyi gösteren bir YouTube videosu var mı diye merak ediyorum
Henüz video yok ama şu anda login, karakter oluşturma, dünya içinde hareket, Lua item scripting'i ve React tabanlı yönetim arayüzü çalışıyor
Yakında README'ye kısa bir demo videosu eklemeyi planlıyorum
Yakın zamanda YouTube'da Majuular'ın Ultima serisi videolarını izleyip çok etkilendim
Onların etkisiyle GOG'dan Underworld ve VII'yi satın aldım. 90'ların bu başyapıtlarını kaçırmışım gibi hissediyorum
Ağabeyim UO'yu çok oynardı, bir arkadaşım da SirDarkSpell adıyla ünlü bir grief oyuncusuydu
İkisi de bu projeyi görünce çok sevinecektir diye düşünüyorum. Bu hafta sonu Stygian Abyss'e dalmayı planlıyorum