Salta ai contenuti

Panoramica

Logo di Moongate

CI su develop Audit di sicurezza delle dipendenze su main Ultima release Licenza: AGPL-3.0-or-later

Documentazione su moongate.sh Immagine container .NET 10 Scripting Lua 5.2 Offrimi un caffè

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.

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.

Terminal window
curl -fsSL https://moongate.sh/install.sh | sh

Installa 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.

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.

Terminal window
git clone https://codeberg.org/moongate/moongate.git
cd moongate
git switch develop
dotnet build Moongate.slnx -c Release

develop 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.

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.lua
log.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.

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

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.

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.

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.

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.

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

Offrimi un caffè