Salta ai contenuti

Panoramica

I file dei dati dello shard descrivono il mondo eseguito dal server di gioco: mappe, città iniziali, abilità, professioni, razze, contenitori, corpi, meteo, regioni, messaggi e titoli di reputazione. Sono file TOML sotto data/ nella radice del server. Il server li legge una volta all’avvio, nelle modalità game e standalone, tramite i loader IDataLoader<T> di Moongate.Server.Ultima. Un file obbligatorio mancante o non valido arresta il server all’avvio con un errore che indica il problema. Il MOTD è facoltativo: un file mancante registra un avviso e non invia alcun messaggio di benvenuto.

I file sono distribuiti accanto al binario mgserver, in data/; la copia nel repository è moongate_root/data/. mgctl (o mgserver --initialize-root) copia ogni file mancante in <root>/data senza mai sostituire quelli esistenti, così un file modificato sopravvive a un aggiornamento. Dopo un aggiornamento, esegui di nuovo mgctl init per aggiungere nuovi file e confronta i file modificati con quelli distribuiti per recepire le modifiche upstream. Vedi Cosa crea.

Il codice C# legge le voci caricate tramite IDataLoaderService:

var cities = dataLoaderService.GetEntities<StartingCityContent>();

GetEntities<T>() restituisce le voci di un file, o di una directory per regioni e messaggi. Genera InvalidOperationException quando nessun loader è registrato per T.

Scegli un file per aprire esempi, riferimento dei campi e regole di validazione all’avvio.

I loader vengono eseguiti nell’ordine della colonna “Ordine di caricamento”, il numero con cui ciascuno è registrato nel codice del server; un loader che controlla un altro file viene eseguito dopo di esso. I numeri hanno dei vuoti.

Ordine di caricamento File Tipo di contenuto Caricato dopo / dipende da Usato al runtime
0 maps.toml MapContent primo; il suo weather è controllato dal loader delle regioni Sì, IMapService apre i file client di ogni mappa
1 starting_cities.toml StartingCityContent mappe Sì, nell’elenco dei personaggi
2 skills.toml SkillContent città iniziali Sì, SkillService e SkillUseService: guadagni, ritardi e script delle abilità
3 professions.toml ProfessionContent abilità (ogni abilità iniziale deve esistere) Sì, creazione dei personaggi
4 races.toml RaceContent professioni Sì, creazione dei personaggi e aspetto dei mobile
5 banned_names.toml BannedNamesContent razze Sì, validazione del nome del personaggio
6 containers.toml ContainerContent nomi vietati Sì, posizionamento degli oggetti nello zaino
7 bodies.toml BodyContent contenitori Sì, per riconoscere il tipo di corpo di un mobile: combattimento, porte degli NPC e richieste d’uso
8 weather.toml WeatherContent corpi Sì, IWeatherService estrae il meteo di ogni profilo e lo invia ai giocatori
9 regions/<map>.toml RegionContent meteo (ogni profilo deve esistere), mappe Sì, IRegionService mantiene la regione di ogni giocatore per musica, meteo, stagione e luce; il flag delle guardie governa le guardie, i testi delle guardie e i venditori; le regole di abitazioni, disconnessione e viaggio non sono ancora lette
10 messages/<lang>.toml, messages/<lang>/*.toml MessageContent regioni Sì, tramite ILocalizationService
11 names.toml NameList messaggi Sì, tramite INameService
12 templates/items, templates/loots, templates/carves, templates/mobiles ItemTemplate, LootTemplate, CarveTemplate, MobileTemplate template oggetto per primi (12), carves (13), bottino (14), mobile (15) Sì, tutto ciò che crea un oggetto o un mobile; vedi Template. Le decorazioni della stessa pagina si caricano da sole, tramite IDecorationsLoader
16 motd.toml MotdLine dopo template mobile e registrazione delle variabili dei plugin Sì, a ogni ingresso del personaggio; file facoltativo
17 titles.toml FameKarmaTitle dopo MOTD Mostrato nel titolo del paperdoll
18 npc_lists, spawns NpcListTemplate, SpawnTemplate dopo i template mobile Sì, dagli spawn degli NPC
20 gumps GumpTemplate dopo gli spawn Sì, dal servizio dei gump
21 moongates.toml MoongateFacet mappe Sì, da .decorate e dallo script moongate
22 locations.toml NamedLocation facoltativo Sì, da .go e dal suo gump
23 jail.toml JailFile facoltativo Sì, da .jail e dal suo gump
24 templates/books/<name>.toml BookTemplate dopo i template oggetto Pergamene personalizzate e libri nativi; gump delle pergamene, copertine/pagine dei libri e libri scrivibili
25 starting_items.toml StartingItemSet dopo template oggetto e template dei libri (ogni id referenziato deve esistere) Sì, tramite IStartingItemsService
26 templates/shops/<name>.toml ShopDefinition dopo i template oggetto e mobile Sì, tramite IShopService: cosa vende ogni venditore nella sua finestra del negozio
27 harvest.toml HarvestResource facoltativo; dopo i negozi Sì, tramite IHarvestService: i pesci della pesca, per zona
28 schedule.toml ScheduleFile facoltativo Sì, dal servizio del calendario e da .event
29 data/crafts CraftResourceList, CraftDefinition dopo i template oggetto; le liste di risorse (29) prima dei craft (30) Sì, dal motore di crafting condiviso; vedi Falegnameria
31 taming.toml TamingCreature facoltativo; dopo i template mobile Sì, tramite ITamingService: le creature dell’addomesticamento
32 pet_food.toml PetFood facoltativo; dopo i template oggetto Sì, tramite IPetFoodService: cosa mangiano gli animali dell’addomesticamento
33 spells.toml SpellDefinition facoltativo; dopo i template oggetto Sì, tramite ISpellCatalogService: i 64 incantesimi di Magery
34 portraits.toml PortraitContent facoltativo Sì, tramite IPortraitService: l’immagine che un gump disegna per una creatura, in base al suo corpo
35 champions.toml ChampionSpawn dopo i template dei mobili; ogni onda e campione un template spedito Sì, tramite IChampionSpawnService: gli spawn dei campioni, i cui morti l’Esorcismo dei negromanti porta via
36 champions.toml (i suoi santuari) ShrineLocation con gli spawn I santuari dell’Esorcismo

Un file che nessun sistema di gioco legge ancora viene comunque caricato e validato: un errore al suo interno arresta comunque il server. Le pagine dei file indicano quali campi vengono letti.

I nomi dei campi sono snake_case. Alcuni campi usano tipi di valore con una propria forma TOML; Tipi di valore TOML elenca ogni forma accettata ed errore:

Tipo Forma Esempio
Point2D "(x, y)" tra virgolette size = "(7168, 4096)"
Point3D "(x, y, z)" tra virgolette location = "(1602, 1591, 20)"
Serial intero senza virgolette, decimale o esadecimale, oppure lo stesso tra virgolette cliloc = 1150168
Rectangle2D "(x1, y1)..(x2, y2)" tra virgolette bounds = "(44, 65)..(186, 159)"
HueSpec intero senza virgolette, oppure tonalità o intervallo "min-max" tra virgolette 0x00BF, "0x03EA-0x0422"
DiceSpec intero senza virgolette, oppure espressione di dadi tra virgolette karma = -2500, strength = "1d25+95"
Qualsiasi enum nome tra virgolette, maiuscole/minuscole e underscore ignorati; flag uniti da | map = "felucca", music = "mountn_a"

Rectangle2D scrive due angoli: il primo incluso e il secondo escluso. Il formato legacy "(x, y)+(width, height)" è ancora accettato in lettura.

Un valore che non corrisponde alla propria forma non viene interpretato e arresta il server.

Prima di riavviare un server, carica i file del repository con i loader reali:

Terminal window
scripts/test.sh fast --filter 'FullyQualifiedName~RepositoryDataFiles'

Il test carica ogni file di moongate_root/data, nell’ordine del server, e ogni lingua distribuita. Controlla anche alcuni valori noti, come il numero di abilità e regioni, quindi aggiornalo quando aggiungi o rimuovi voci.

Per i file della radice di un server in esecuzione, riavvia il server: i file vengono letti solo all’avvio. Un file errato interrompe l’avvio, e il log mostra l’errore.

Creato con ❤️ da Tom

Offrimi un caffè