Salta ai contenuti

Creare contenuti TOML

Scrivi i contenuti dello shard in file TOML sotto templates/ nella root del server. Il server legge questi file all’avvio; aggiungere contenuti a una cartella esistente richiede un riavvio. mgctl copia i template distribuiti in quella root. Puoi aggiungere i tuoi file accanto a quelli distribuiti con id univoci. Sono sufficienti le basi di TOML; Tipi di valore TOML spiega dadi, intervalli, tinte ed enum.

Usa uno shard game o standalone e un personaggio con accesso GameMaster o Administrator. Crea templates/items/tutorial_blue_stone.toml relativamente alla root del server:

[[item]]
id = "tutorial_blue_stone"
name = "blue greeting stone"
item_id = 0x0ED4
hue = 0x0055
movable = true
weight = 1.0
  1. Riavvia il server. Deve completare l’avvio senza errori di template.
  2. Nel client di gioco, pronuncia .add tutorial_blue_stone e seleziona una casella di terreno vicina. Il comando deve segnalare Added blue greeting stone con il seriale e la posizione.
  3. Fai un clic sulla pietra per vedere il nome, poi trascinala nello zaino. Non ha ancora un’azione personalizzata al doppio clic; Script degli oggetti aggiunge un’interazione con un tutorial completo separato.

add spiega permessi e selezione. Se segnala Unknown item template, verifica il percorso del file, [[item]], l’esatto id e gli errori di avvio. Modificare un template o eseguire script reload non sostituisce il riavvio. Per un NPC usa un file sotto templates/mobiles/ e il comando spawn. Il riferimento qui sotto elenca le chiavi TOML che puoi aggiungere.

Oggetti, mobile, tabelle del bottino e di smembramento, liste di NPC, regioni di spawn e decorazioni vengono caricati all’avvio game e standalone. File di dati dello shard descrive i file separati sotto data/. Migrare da UOX3 converte contenuti esistenti. Vedi Stato dell’implementazione per i limiti rimanenti.

Il server legge ogni *.toml sotto templates/items/, comprese le sottocartelle, quando il server di gioco si avvia e risolve base_id una volta sola:

  • un campo che può rimanere non impostato (name, layer, weight, amount, stackable, …) e non è impostato prende il valore del genitore, risalendo la catena;
  • item_id = 0 prende la grafica del genitore;
  • hue viene ereditato quando non impostato; senza un valore in tutta la catena, usa 0;
  • rarity ha sempre un valore, quindi viene mantenuto quello del template;
  • tags, quando impostato, sostituisce quello del genitore; non vengono uniti.

Il server si arresta quando un id è vuoto o usato due volte (il messaggio indica entrambi i file), un base_id non indica alcun template, base_id crea un ciclo (a → b → a), oppure un template risolto ha un campo non valido.

Per i servizi C# e il ciclo di vita delle factory, vedi Riferimento dei caricatori.

Il server legge ogni *.toml sotto templates/mobiles/, comprese le sottocartelle, dopo i template di oggetto e risolve base_id una volta sola, come fa GET di UOX3 (il figlio eredita tutto e sostituisce ciò che imposta):

  • un campo non impostato prende il valore del genitore, risalendo la catena;
  • skills, resistances e sounds vengono ereditati chiave per chiave: le voci del figlio sostituiscono quelle corrispondenti, le altre del genitore rimangono;
  • tags vengono uniti: le chiavi del figlio aggiungono e sostituiscono quelle del genitore;
  • equipment e loot, quando impostati, sostituiscono quelli del genitore; carve, quando non impostato, è quello del genitore, e carve = "" non ne ha nessuno;
  • tutto ciò che viene ereditato viene copiato, mai condiviso tra template.

Il server si arresta quando un id è vuoto o usato due volte, un base_id non indica alcun template o crea un ciclo, un template ha un campo non valido, un name_list non indica alcuna lista di data/names.toml ({gender} richiede le liste male e female), un oggetto di equipaggiamento non è un template di oggetto, un id loot non è una tabella del bottino oppure un id carve non è una tabella di smembramento.

Per i servizi C# e il ciclo di vita delle factory, vedi Riferimento dei caricatori.

Il server legge ogni *.toml sotto templates/loots/, comprese le sottocartelle, prima dei template di mobile. Il server si arresta quando un id è vuoto o usato due volte, una voce imposta sia item_id sia loot_template_id, un item_id non è un template di oggetto, un loot_template_id non indica alcuna tabella, un weight è inferiore a 1, un amount può produrre valori fuori dall’intervallo da 1 a 65535, le tabelle annidate creano cicli oppure il loot di un template di oggetto indica una tabella inesistente. Una tabella senza voci viene conservata, registrata come avviso e non produce nulla: due tabelle UOX3 distribuite (randomwands, random_useless_junk) sono vuote nei dati stessi di UOX3.

Per i servizi C# e il ciclo di vita delle factory, vedi Riferimento dei caricatori.

Il server legge ogni *.toml sotto templates/carves/, comprese le sottocartelle, dopo i template di oggetto e prima dei template di mobile, che indicano le tabelle con carve. Il server si arresta quando un id è vuoto o usato due volte, l’item di una voce non è un template di oggetto, un amount può produrre valori fuori da 1 a 65535, una chance è fuori da 1 a 100 o un message è sotto 0. Una tabella senza voci viene conservata e non dà nulla. Cosa significano le tabelle, e cosa accade a un cadavere, è in Smembrare i cadaveri.

Per i servizi C# e il ciclo di vita delle factory, vedi Riferimento dei caricatori.

Un oggetto è una voce [[item]] sotto templates/items/. La tabella usa le chiavi TOML:

Campo Scopo
id Il nome stabile con cui una tabella del bottino, uno spawn o add indica questo template
base_id L’id di un altro template da cui ereditare i campi non impostati; il caricatore risolve la catena
item_id La grafica base del client; le proprietà fisiche a runtime provengono da i tiledata del client salvo sostituzioni
name, comment Una sostituzione del nome visualizzato e una nota dell’autore che nessuno legge a runtime
rarity common, uncommon, rare, epic, legendary, random_of o random_of:rare,epic; ogni nuovo oggetto ne sceglie uno con la stessa probabilità, quindi un nome scritto due volte pesa il doppio (random_of:common,common,rare è comune due volte su tre). Le gemme lo usano. I venditori pagano di più un oggetto più raro, vedi Venditori
script_id La tabella Lua globale, definita da scripts/items/<script_id>.lua, le cui funzioni gestiscono ciò che accade all’oggetto (on_use, on_move_over, on_npc_move_over, on_speech, on_equip, on_unequip, on_pickup, on_drop, on_create, on_timer, on_darkness) e rispondono alle domande poste prima di un movimento (can_pick_up, can_drop, can_equip, can_insert); un identificatore Lua minuscolo, vuoto per nessuno. Vedi Script degli oggetti
movable Se non impostato usa i tiledata: spostabile salvo che il peso tiledata sia 255, il “non può essere sollevato” del client. I giocatori non possono raccogliere ciò che non è spostabile; i game master e gli amministratori possono
weight Stone con due decimali (weight = 0.02 per una moneta); se non impostato usa il peso in stone intere dei tiledata
amount Un intero o un intervallo inclusivo tra virgolette: la dimensione della pila di un nuovo oggetto, fissa oppure "10-20"; se non impostato è 1
stackable Se non impostato usa il flag tiledata Generic
layer Un nome LayerType come one_handed; se non impostato usa il layer dei tiledata
two_handed_weapon two_handed_weapon = true su un’arma impugnata con entrambe le mani (archi, armi in asta, bastoni), come TwoHanded di POL: indossata su two_handed, non lascia alcuna mano libera. Qualsiasi altra cosa su two_handed (scudi, torce) va nell’altra mano, con un’arma a una mano. I tiledata non possono distinguerli: contrassegnano gli scudi come armi e gli archi come a una mano
weapon_type, damage_min, damage_max, speed I campi delle armi del combattimento: weapon_type è sword, axe, pole_arm, mace, staff, fencing, bow, crossbow o thrown, come UOX3 classifica un’arma per grafica, e determina abilità, suoni e colpo; damage_min e damage_max (da 0 a 65535) sono il danno di un colpo prima dei bonus; speed (da 1 a 500) determina il ritardo tra i colpi 15000 / ((stamina + 100) * speed). Un oggetto indossato con damage_max superiore a 0 è un’arma. Ereditati tramite base_id
armor_rating, strength_required, max_hits armor_rating (da 0 a 500) è l’armatura di un pezzo di armatura (quella di uno scudo non conta ancora); max_hits (durabilità) dà a un pezzo indossato i punti da cui parte, vedi Durabilità; strength_required viene letto e conservato, ma non ancora usato. Ereditati tramite base_id
dyeable dyeable = true su ciò a cui una vasca di tintura può assegnare la propria tinta, come dyeable di UOX3: gli abiti convertiti lo ricevono da base_clothing e un template lo rimuove con dyeable = false (una veste da morto). Se non impostato non è tingibile. Vedi dyes.lua e dye_tub.lua
buy_price, sell_price Letti e validati (0 o più, ereditati tramite base_id), ma nessun servizio li usa ancora: i prezzi di un venditore vengono dal suo template di negozio, vedi venditori
decays, decay_minutes Se l’oggetto decade a terra e dopo quanti minuti; se non impostato decade quando spostabile, dopo 60 minuti, come in ModernUO. Un oggetto che non può essere raccolto decade solo quando il suo template ha sia decays = true sia decay_minutes, come le casse del tesoro. Un oggetto decade quando si trova a terra, è spostabile (oppure ha entrambi quei valori) e il suo template è visibile ai giocatori. Il conto alla rovescia (DecayAt, salvato con l’oggetto, quindi il tempo di fermo conta) inizia quando atterra a terra, di nuovo quando un oggetto sollevato viene respinto lì e si ferma quando viene raccolto, spostato in un contenitore o indossato; il resto di una pila divisa mantiene il tempo della pila. Un controllo ogni 5 secondi elimina gli oggetti scaduti, un contenitore con il suo contenuto, indipendentemente dalla presenza di un giocatore vicino
use_range Da quante caselle di distanza un giocatore può fare doppio clic sull’oggetto a terra per eseguirne l’on_use, da 1 a 24; non impostato vale 2, come la portata di un oggetto in ModernUO. Il bersaglio per tiro con l’arco ha 6, perché si tira da cinque o sei caselle. Quello di un template base è ereditato
watch_range Quante caselle attorno a sé l’oggetto controlla per i mobile, da 0 a 8: un giocatore o un NPC che entra in questa portata dall’oggetto fa scattare on_mobile_near del suo script, una volta per ogni ingresso. Non impostato e 0 non controllano nulla e non costano nulla; il server tiene un indice degli oggetti che controllano per settore e lo interroga solo quando un mobile si muove. Solo gli oggetti a terra controllano. Quello di un template base viene ereditato. La portata viene letta dal template quando l’oggetto viene posato a terra, il che comprende il suo caricamento all’avvio del server: i template vengono letti all’avvio, quindi una modifica si vede dopo un riavvio, e un oggetto già a terra conserva la portata che aveva finché non viene raccolto e posato di nuovo o il server si riavvia
loot, gold Ciò che un contenitore contiene quando una regione di spawn di oggetti lo crea: loot = ["reagents", "reagents"] tira ogni tabella del bottino una volta (elencane una due volte per tirarla due volte) e gold = "1d100+29" inserisce quella quantità di oro, in pile di al massimo 65.535. Se non impostato prende quello del template base, altrimenti nulla. Una regione di spawn e il comando .add riempiono il contenitore; item.create e item.give di Lua lo creano vuoto
loot_type regular, newbied, blessed o cursed: cosa accade quando il proprietario muore; se non impostato è regular
tags Valori liberi per gli script in una tabella [item.tags]; i tag espliciti di un figlio sostituiscono l’intera mappa base
visibility Il tipo minimo di account che vede l’oggetto: regular, game_master o administrator, come realm_directory.minimum_account_type. Non impostato per default, quindi un template lo eredita tramite base_id; un oggetto che non ne ha in tutta la catena è visibile a tutti.
hue HueSpec, 0 indica la colorazione nativa della grafica; un intervallo "min-max" tra virgolette ne sceglie una per spawn
max_items, max_weight Facoltativi; impostati solo su un template di contenitore. max_weight è il peso in stone che un giocatore può inserire nel contenitore, contando ciò che è nei contenitori al suo interno: 400 se non impostato, nessun limite con 0. Lo staff non è limitato, né una cassa bancaria; un oggetto già all’interno si sposta indipendentemente dal peso del contenitore. max_items è il numero di oggetti che un giocatore può inserire nel contenitore, contati con ciò che è dentro le sue borse e rispetto a ogni contenitore che lo racchiude; unirsi a una pila non ne aggiunge, lo staff è esente e non impostato significa nessun limite. Una cassa bancaria usa invece ultima.bank.max_items.

I campi presenti anche nel tiledata.mul del client (peso, impilabilità, layer, spostabilità) sono sostituzioni: non impostato significa tiledata, come in POL e ModernUO. La validazione del template rifiuta peso o prezzo negativi, un peso con più di due decimali, una quantità inferiore a 1, oro che può produrre valori sotto 0, un tempo di decadimento inferiore a un minuto, un use_range fuori da 1 al massimo, un watch_range fuori da 0 a 8, un damage_min o damage_max fuori dal proprio intervallo (o damage_min sopra damage_max), uno speed, armor_rating, strength_required o max_hits fuori dal proprio intervallo, una chiave tag vuota e uno script_id malformato.

Gli spawner, per esempio, sono solo per lo staff e i loro figli lo ereditano:

[[item]]
id = "base_spawner"
base_id = "base_item"
item_id = 7956
visibility = "game_master"
[[item]]
id = "orcspawn"
base_id = "base_spawner"
item_id = 7956
name = "Orc Spawner"

Un mobile, creatura o NPC umano, è una voce [[mobile]] sotto templates/mobiles/. Ogni campo tranne id può essere non impostato: viene ereditato tramite base_id e, se assente in tutta la catena, si applica il valore predefinito sotto. I numeri che variano per mobile sono dadi (DiceSpec): strength = "1d25+95" produce da 96 a 120; una costante è un intero senza virgolette.

Campo Scopo
id, base_id, comment Come per gli oggetti
name Un nome fisso come an orc; se non impostato ne estrae uno da name_list
name_list Un id di lista in data/names.toml; {gender} diventa male o female, il genere assegnato al mobile
title Mostrato dopo il nome, come the guard
body Il corpo disegnato dal client; se non impostato usa il corpo della race per il genere
gender male, female o random (50/50 per ogni mobile); se non impostato è male
race human, elf o gargoyle: pelle, capelli e barba provengono da races.toml salvo impostazione qui; non impostato per una creatura
skin_hue, hair_hue, beard_hue HueSpec; se non impostati usano le tinte della razza
hair, beard Id di oggetto, uno scelto; se non impostati usano gli stili della razza per il genere e le femmine non hanno barba
strength, dexterity, intelligence Dadi; se non impostati sono 10
hits, mana, stamina Dadi; se non impostati sono forza, intelligenza e destrezza
damage, armor Dadi per un colpo disarmato e l’armatura naturale; se non impostati sono 1d4 e 0
resistances [mobile.resistances] con physical, fire, cold, poison, energy, dadi in percentuale; se non impostate sono 0
skills [mobile.skills], nomi delle abilità come resisting_spells o tactics, dadi in punti interi da 0 a 120
notoriety innocent, ally, attackable, criminal, enemy, murderer o invulnerable, il colore del nome; se non impostata è innocent per un umano e attackable per qualsiasi altro corpo
karma, fame Dadi; il karma può essere negativo
equipment Voci [[mobile.equipment]]: items (id di template di oggetto, uno scelto), hue e gender per equipaggiare un solo genere
loot, gold Id di template del bottino e dadi dell’oro tirati nello zaino allo spawn; alla morte, il cadavere riceve il bottino; vedi Morte e bottino
carve L’id di una tabella di smembramento di templates/carves/: ciò che un coltello toglie dal cadavere di questo mobile; non impostato prende quella del template base, altrimenti nulla; una stringa vuota toglie la tabella del template base. Il cadavere di un animale domestico o di una creatura evocata non ne ha nessuna
sounds [mobile.sounds] con start_attack, idle, attack, hurt, death; uno script di mobile li riproduce per tipo con npc.play_sound(serial, "idle")
blood_hue Il colore del sangue che la creatura lascia quando è colpita: 0 per il rosso, -1 per una che non sanguina, come il blood_hue di ServUO e il BLOODCOLOR di Source-X; quello di un template base è ereditato. Non impostato: rosso. I non morti e i golem hanno -1. Vedi Combattimento
flee_at La percentuale dei suoi punti vita (da 0 a 100) sotto cui una creatura che combatte scappa dallo scontro, -1 per una che non scappa mai, come FLEEAT di UOX3; quella di un template base viene ereditata. Non impostato: quella dello script, 20 per un mostro e 10 per un animale. Vedi Script delle creature
spell_circles Il circolo più alto di Magery (da 1 a 8) da cui la creatura lancia, come SPATTACK di UOX3; non impostato o 0: non lancia nulla. Una creatura che lo ha, con un po’ di Magery, un po’ di mana e uno script che usa common/creature.lua (monster, animal, scared_animal) lancia contro ciò che combatte fino a 12 caselle di distanza, con il suo mana e senza reagenti; una creatura senza script, uno shopkeeper o un mana di 0 non lancia nulla; quello di un template base viene ereditato. Vedi Script delle creature
low_health_at La percentuale dei suoi punti vita (da 0 a 100) sotto cui lo script dell’NPC viene chiamato con on_health_low, 0 per uno che non lo è mai; quella di un template base viene ereditata. Non impostato: 25. Vedi Script dei mobile
control_slots Quanti seguaci la creatura conta una volta che un giocatore la possiede, da 1 a 10, come CONTROLSLOTS di UOX3. Solo le creature che gli incantesimi di Magery evocano (templates/mobiles/magicsummon.toml) lo impostano; una creatura addomesticabile prende i suoi slot da data/taming.toml. Quello di un template base viene ereditato. Non impostato: 1. Vedi Magery
npc_guild La gilda per cui questo maestro di gilda accetta membri: mages, warriors, thieves, rangers, healers, miners, merchants, tinkers, tailors, fishermen, bards o blacksmiths. Non impostato: il PNG non è un maestro di gilda. Vedi Maestri di gilda
script_id La tabella Lua globale, definita da scripts/mobiles/<script_id>.lua, i cui on_think, on_speech, on_spawn, on_mobile_in_range, on_death e on_drag_drop gestiscono l’NPC; un identificatore Lua minuscolo. Vedi Script dei mobile
visibility Come per gli oggetti
opens_doors Se apre le porte chiuse sul suo cammino quando va in un luogo. Non impostato: un corpo umano o di mostro lo fa, un animale o una creatura marina no
movement land, water (un delfino: viene generato e nuota solo in acqua) o both (un tricheco: cammina e nuota, e viene generato a terra altrimenti in acqua); se non impostato è land
tags Valori liberi per gli script; le chiavi del figlio aggiungono e sostituiscono quelle del genitore

resistances, sounds, skills e tags vengono ereditati chiave per chiave, quindi una base come base_orc imposta i cinque suoni una volta sola e ogni orco li conserva; ogni altro campo impostato da un figlio sostituisce quello della base. La validazione del template rifiuta dadi che possono produrre valori sotto 0 (tranne il karma), un’abilità sconosciuta, un’abilità sopra 120, una resistenza sopra 100, un suono negativo, una voce di equipaggiamento senza oggetto o con id di oggetto vuoto, una chiave tag vuota, un blood_hue fuori da -1 a 65535, un flee_at fuori da -1 a 100, un low_health_at fuori da 0 a 100, uno spell_circles fuori da 0 a 8, un control_slots fuori da 1 a 10 e uno script_id malformato.

[[mobile]]
id = "base_orc"
body = 0x11
name = "an orc"
notoriety = "murderer"
[mobile.sounds]
start_attack = 0x1B0
idle = 0x1B1
attack = 0x1B2
hurt = 0x1B3
death = 0x1B4
[[mobile]]
id = "orc"
base_id = "base_orc"
strength = "1d25+95"
karma = -2500
loot = ["randomgems"]
[mobile.skills]
tactics = "1d26+54"
[[mobile]]
id = "guard"
gender = "random"
race = "human"
name_list = "{gender}"
title = "the guard"
notoriety = "invulnerable"
script_id = "wander"
[[mobile.equipment]]
items = ["skirt", "short_pants"]
gender = "female"

Il templates/mobiles/ distribuito contiene gli NPC di UOX3, convertiti da moongate-convert uox. Vengono caricati all’avvio game e standalone .

Una tabella del bottino è una voce [[loot]] sotto templates/loots/; i suoi risultati sono voci [[loot.entries]]:

Campo Scopo
id Il nome stabile con cui un loot_template_id o il bottino alla morte di un NPC indica questa tabella
comment Una nota dell’autore che nessuno legge a runtime
entries I risultati ponderati della tabella
weight La quota di questa voce nella tabella, relativa a ogni altra voce; 1 per impostazione predefinita
item_id L’id da produrre; non impostato quando viene invece impostato loot_template_id
loot_template_id L’id di un’altra tabella da cui scegliere invece di un oggetto diretto
comment Cos’è item_id o loot_template_id, per una persona che legge il file
amount Un intero o un intervallo inclusivo tra virgolette, quanti item_id creare

Per produrre questi file da uno shard UOX3 esistente, vedi Migrare da UOX3.

templates/npc_lists/ contiene liste di template di mobile da cui uno spawn sceglie, convertite dai blocchi [NPCLIST name] di UOX3. Una voce indica un template di mobile o un’altra lista e viene scelta in proporzione al suo weight (1 per impostazione predefinita); una voce che indica una lista sceglie poi da quella lista:

[[npc_list]]
id = "jungle"
entries = [{ mobile_id = "gorilla", weight = 20 }, { npc_list_id = "all_trolls", weight = 7 }]

templates/spawns/<map>/ contiene le regioni di spawn, convertite dai blocchi [REGIONSPAWN n] di UOX3, più gli spawner di ModernUO (modernuo_*.toml e trammel/town_new_haven.toml); la cartella è la mappa e una chiave map in una regione viene ignorata. Uno spawn sceglie da un unico insieme, come UOX3: i suoi mobile_ids (peso 1 ciascuno) e le voci dei suoi npc_list_ids con i relativi pesi:

[[spawn]]
id = "felucca_0" # unique
name = "The Hammer And Anvil"
mobile_ids = ["weaponsmith"] # mobile templates, picked at random with the lists' entries
npc_list_ids = [] # npc lists
# item_ids = [] # item templates spawned on the ground instead of NPCs; see Spawns
max = 1 # NPCs alive at once
min_minutes = 480 # a new one every min_minutes to max_minutes
max_minutes = 600
call = 1 # NPCs that come at a time
areas = [{ x1 = 1422, y1 = 1547, x2 = 1426, y2 = 1550 }] # both corners included
exclude = [] # parts of the areas where nothing spawns
only_outside = false # true: never under a roof
# pref_z = 18 # how high above the ground a spot may be
# z = 36 # the highest a spot may be, instead of ground + pref_z

Entrambi vengono caricati all’avvio, dopo i template di mobile, e un errore al loro interno ferma il server. Il comportamento dello spawn delle regioni a runtime, compresi i mobile acquatici, è in Spawn degli NPC.

templates/decorations/ contiene le decorazioni del mondo assenti dai file di mappa del client: porte, insegne, luci, mobili, teletrasporti e simili, circa 32.800 posizionamenti nei 108 file caricati (115 file complessivi). È stato convertito una volta da Data/Decoration di ModernUO, più New Haven di ServUO (trammel/newhaven.toml, havenisland.toml, havenmine.toml, assenti in ModernUO), le insegne dei negozi e del mondo da signs.cfg di ModernUO (signs.toml, scritto da moongate-convert modernuo-signs) e i teletrasporti del mondo e dei dungeon dal suo teleporters.json (teleporters.toml, scritto da moongate-convert modernuo-teleporters), un file TOML per file sorgente, in una cartella per mappa: britannia/ (Trammel e Felucca), trammel/, felucca/, ilshenar/, malas/, tokuno/, termur/ e gli insiemi speciali _ruined_magincia_tram/, _ruined_magincia_fel/, _old_magincia/ e _bounty_boards/. Una cartella o un file il cui nome inizia con _ non viene caricato: rinominalo senza _ per collocare la sua decorazione. _old_magincia/ è l’arredamento di Magincia com’era prima della distruzione: la mappa di un client attuale contiene New Magincia, ricostruita senza quegli edifici, quindi l’insieme rimane escluso; con un vecchio client, sposta il suo file in britannia/.

La vecchia Haven di Trammel è accantonata allo stesso modo: trammel/_haven.toml, trammel/_haven_additions.toml e trammel/_signs.toml, 631 posizionamenti. Sulla mappa di un client attuale quella città è una rovina, con un terzo dei suoi edifici scomparso o danneggiato, quindi porte, casse e librerie starebbero senza muri attorno; Felucca conserva la città nello stesso luogo. Con un vecchio client, rinomina i tre file senza _. ModernUO nomina alcuni suoi file con un trattino basso iniziale (_covetous.cfg): qui sono covetous.toml, oppure despise_additions.toml dove esiste anche un semplice despise.toml, così il trattino basso significa sempre solo “non caricato”. Un mondo decorato in precedenza conserva gli oggetti che ha già: .decorate riconosce ciò che è collocato dal luogo in cui si trova, non dal file, quindi i file rinominati non collocano nulla due volte e gli oggetti della vecchia Haven rimangono finché non vengono rimossi oppure il mondo viene decorato nuovamente.

[[decoration]]
comment = "metal door"
type = "MetalDoor" # the kind, kept as ModernUO names it
item_id = 0x0675
props = { facing = "west_cw" } # the kind's settings; facing is a DoorFacingType
locations = [[1411, 1621, 30], [1411, 1622, 30]]

Un blocco senza item_id è un addon costruito da più grafiche. extras, presente in alcuni file distribuiti, non viene letto: le impostazioni di un blocco sono le sue props, le stesse per ogni posizione.

.decorate le colloca con i template di templates/items/decorations.toml: decoration, fisso e mai soggetto a decadimento, per la maggior parte dei tipi; decoration_door, lo stesso con script_id = "door", per i tipi il cui nome contiene Door o Gate; decoration_light, con script_id = "light", per i tipi di luce di ModernUO (candele, candelabri, lanterne, lampioni, applique, torce, bracieri); e decoration_teleporter, con script_id = "teleporter" e visibility = "game_master", per il tipo Teleporter. Ogni oggetto prende la grafica, hue e name del blocco; le altre impostazioni rimangono nelle proprietà dell’oggetto, con decoration_type = il tipo per una porta o una luce. Una luce riceve anche la propria forma light (quella del blocco o del tipo) e protected salvo che il blocco indichi unprotected; la grafica indica già se è accesa. Un blocco di porta con locked = true nelle proprietà colloca porte apribili solo dallo staff. Un oggetto con una proprietà label_number, come un LocalizedSign, mostra quel testo del client come nome, salvo che l’oggetto abbia un nome proprio. Il point_dest = [x, y, z] di un teletrasporto diventa le proprietà teleport.x, teleport.y e teleport.z, e il suo map_dest la proprietà teleport.map, un numero MapType. Un KeywordTeleporter prende il template decoration_keyword_teleporter, con script_id = "keyword_teleport" e visibility = "game_master", e conserva substring, keyword, range e delay come proprietà. Un BulletinBoard prende il template bulletin_board, con script_id = "bulletin_board", e si apre con un doppio clic: vedi Bacheche. Un Clock prende il template decoration_clock, con script_id = "clock", e comunica l’ora con un doppio clic; uno collocato come semplice decorazione da un’esecuzione precedente diventa un orologio dove si trova. Un Blocker è una semplice decorazione la cui grafica non disegna nulla e non può essere attraversata: i giocatori vengono fermati da esso senza vederlo e i game master e gli amministratori vedono al suo posto una lapide, come lo mostra ModernUO. Un tipo Fillable... (cassa, scatola, forziere, barile) o un LibraryBookcase prende il template decoration_fillable, con script_id = "fillable": un contenitore che si riempie quando viene aperto. Il suo content_type (Inn, ThiefGuild) viene conservato come nome della sua tabella (inn, thief_guild), una libreria è una library e uno collocato come semplice decorazione da un’esecuzione precedente diventa riempibile dove si trova. Un PublicMoongate prende il template decoration_public_moongate, con script_id = "public_moongate" e la luce circle300 nelle proprietà salvo che i dati ne indichino un’altra; .decorate ne colloca anche uno su ogni destinazione di moongates.toml. Un TrainingDummy e un ArcheryButte prendono i template decoration_training_dummy e decoration_archery_butte, con gli script che li fanno allenare un’arma. Spawner, contenitori di marcatura, addon e ogni altro tipo il cui nome termina in Teleporter, quelli che richiedono un’abilità, una quest o un doppio clic (SkillTeleporter, InteractionTeleporter, …), non vengono ancora collocati. Le porte delle città non sono in alcun file: .decorate le legge dai telai delle porte della mappa.

Per i dettagli di implementazione C#, vedi Il contratto del caricatore.

Per i dettagli di implementazione C#, vedi Registrare un caricatore.

Per i dettagli di implementazione C#, vedi Eseguire i caricatori.

Per i dettagli di implementazione C#, vedi Campi risolti casualmente.

Per i dettagli di implementazione C#, vedi Campi risolti in un nuovo numero.

Per i dettagli di implementazione C#, vedi Registrare un convertitore TOML.

Creato con ❤️ da Tom

Offrimi un caffè