Panoramica
Moongate è un emulatore open source di server Ultima Online scritto in C# su .NET 10. Combina scripting Lua, persistenza PostgreSQL e trasferimento dal login al gioco basato su Redis, con librerie riutilizzabili per costruire strumenti e servizi server.
I salvataggi del mondo non fermano mai il gioco: il ciclo di gioco si sospende solo per copiare il mondo in memoria, circa un decimo di secondo per 173.000 entità, e il salvataggio scrive su PostgreSQL in background solo le entità cambiate dall’ultimo salvataggio. Vedi Un salvataggio non ferma il gioco.
Moongate supporta più shard: un server di login elenca un numero qualsiasi di server di gioco (fino a
128), ciascuno con il proprio mondo e database, e i giocatori ne scelgono uno dall’
elenco server del client. La modalità standalone esegue login e un singolo shard in
un processo. Vedi Login e realm con Docker.
In sviluppo attivo. Le fondamenta ci sono: rete e pipeline dei pacchetti, server di login e realm di gioco, runtime Lua, persistenza PostgreSQL, caricamento dei dati dello shard e lettori dei file client con interrogazioni di movimento e linea di vista. Sopra di esse, oggi un giocatore può:
- Creare un personaggio e camminare in un mondo decorato, con porte e chiavi, luci, teletrasporti e moongate pubblici; vedere gli altri giocatori e parlare con loro; giorni, meteo e stagioni passano per regione, e i dungeon sono bui.
- Combattere con i pugni, le armi e gli archi, parare con uno scudo, morire e lasciare un cadavere, e tornare come fantasma a un ankh o da un guaritore. Le città hanno guardie, criminali, conteggi di omicidi e una prigione.
- Usare le abilità, che crescono con l’uso: ogni mestiere classico ha il suo script, dal nascondersi e rubare alle abilità del bardo e al tracking; impararle dagli addestratori e unirsi alle gilde NPC.
- Lanciare tutti i 64 incantesimi di Magery da un libro degli incantesimi o da una pergamena, sedici dei diciassette di Necromancy e i primi quattro di Chivalry; bere pozioni. I mostri rispondono lanciando incantesimi.
- Raccogliere e fabbricare: pesca, estrazione mineraria, taglio del legno e i nove mestieri (fabbro, sarto, falegname, ingegnere, arcere, cuoco, cartografo, alchimista, scriba), con riparazione.
- Comprare e vendere dai mercanti, tenere oro e assegni in banca, domare animali, cavalcare cavalcature e mettere i pet in stalla, fondare una gilda di giocatori, leggere e scrivere libri e bacheche, tingere i vestiti.
- Incontrare NPC guidati da script Lua: mostri che inseguono, fuggono e combattono, animali, guardie, mercanti, guaritori e stallieri, e i sei classici champion spawn.
Gran parte di questo è recente e non è ancora stata provata con un client reale. Mancano ancora: case e barche, party, la finestra di chat e il profilo del personaggio, runebook, quest, mappe del tesoro, mercanti giocatori e il ruleset moderno con proprietà degli oggetti, resistenze e mosse speciali. Gli NPC non bloccano ancora il movimento e le guardie cittadine non puniscono i giocatori. Vedi lo Stato dell’implementazione per i comportamenti supportati e il lavoro rimanente, e la Roadmap per l’ordine in cui vengono realizzati i sistemi mancanti.
Primi passi
Section titled “Primi passi”Per eseguire Moongate, servono i tuoi file di dati del client Ultima Online, PostgreSQL e Redis 7+. I dati del client non sono inclusi. La Guida al primo avvio spiega come preparare la root del server, configurare queste dipendenze, applicare le migrazioni del database e avviare il server.
Scegli un metodo di installazione sotto. L’installer Linux e l’immagine container includono il runtime .NET; la compilazione dai sorgenti richiede l’SDK .NET 10.
Installare su Linux
Section titled “Installare su Linux”curl -fsSL https://moongate.sh/install.sh | shInstalla l’ultima release in /opt/moongate e rende moongate e mgctl
disponibili nel path. Supporta Linux x64 e ARM64 con glibc. Mantieni la root del server
fuori dalla directory di installazione per preservare configurazione e dati
durante gli aggiornamenti. Vedi Installare su Linux per opzioni, aggiornamenti e rimozione.
Docker
Section titled “Docker”Ogni release pubblica un’immagine linux/amd64 su
Docker Hub.
Vedi Eseguire con Docker per configurazione del primo avvio, archiviazione
persistente, Docker Compose, log e aggiornamenti.
Per eseguire su Kubernetes, usa il chart Helm.
Compilare dai sorgenti
Section titled “Compilare dai sorgenti”git clone https://codeberg.org/moongate/moongate.gitcd moongategit switch developdotnet build Moongate.slnx -c Releasedevelop contiene lavoro non ancora rilasciato. Usa un tag di release
per compilare una versione pubblicata. Continua con Primo avvio
per configurarla ed eseguirla, oppure con Contribuire per lavorare sul codice.
Scripting
Section titled “Scripting”Gli script vengono eseguiti sul thread del ciclo di gioco in un runtime Lua 5.2 isolato basato su
LuaCSharp. Inserisci lo script di avvio in
scripts/init.lua sotto la root del server:
-- scripts/init.lualog.info("booted {Engine} {Version}", engine.name, engine.version)
timer.every(30, function() log.info("tick") wait(2) -- suspends this coroutine without blocking the game loop log.info("two seconds later")end)Il runtime fornisce log, timer, eventi, script per NPC e oggetti, budget di istruzioni e definizioni generate per l’editor. Vedi Scrivere script Lua per API disponibili, comandi di ricaricamento e configurazione, e il README del package per binding C# e limiti dell’isolamento.
Guide del server
Section titled “Guide del server”| Area | Guide |
|---|---|
| Configurazione e gestione | Configurazione del server, comandi, diagnostica |
| Client | Enhanced Client |
| Archiviazione | Persistenza PostgreSQL e salvataggi del mondo |
| Protocollo ed esecuzione | Pacchetti e handler, ciclo di gioco e timer |
| Dati del client | File del client, interrogazioni di movimento e linea di vista |
| Validazione | Copertura dei test, audit di sicurezza delle dipendenze |
Estendere Moongate
Section titled “Estendere Moongate”| Obiettivo | Guide |
|---|---|
| Aggiungere comportamento al server | Plugin, moduli Lua in C# |
| Aggiungere diagnostica | Provider di metriche |
| Definire contenuti dello shard | File di dati dello shard, template TOML, spawn degli NPC |
| Programmare il gioco con script | Script Lua, gump, banca |
| Personalizzare i formati dei dati | Tipi di valore TOML |
| Tradurre i messaggi del server | Localizzazione |
Il plugin di esempio compilato mostra registrazione del plugin, binding Lua e un provider di metriche. La suite di test lo carica tramite il vero loader dei plugin.
Librerie
Section titled “Librerie”I dieci package di libreria hanno i propri README in inglese ed esempi eseguibili. Vedi Librerie NuGet e verifica dei package per elenco dei package, dipendenze e comando di verifica locale.
Documentazione
Section titled “Documentazione”Sfoglia le guide complete e la documentazione delle librerie su moongate.sh. Vedi il changelog per la cronologia delle release e Scrivere documentazione per anteprime locali e contributi alle pagine.
Contribuire
Section titled “Contribuire”Leggi CONTRIBUTING.md per configurazione dello sviluppo, convenzioni del codice,
comandi di validazione e flusso delle pull request. I contributi sono destinati a develop.
Moongate è anche un progetto personale costruito per il piacere di programmare. Come uso l’AI spiega l’approccio del manutentore a migrazione, test e progettazione assistiti dall’AI, e il codice che sceglie di scrivere a mano.
Licenza
Section titled “Licenza”Moongate è distribuito con licenza AGPL-3.0-or-later. Le attribuzioni di terze parti sono elencate in THIRD-PARTY-NOTICES.md.
Creato con ❤️ da Tom
