I primi sistemi che salvavano solo su disconnessione tendevano anche a salvare periodicamente mentre il giocatore era attivo. In quei sistemi, in genere MUD (Multi-User Dungeons), il personaggio veniva mantenuto in memoria fino a quando non veniva periodicamente scaricato in un file.
Ciò significa che se un utente si disconnetteva senza "campeggio", di solito si trovava a diverse stanze di distanza e mancava un mucchio di bottino, XP, ecc., Dall'ultima volta che hanno salvato. A tal proposito, si è comportato in modo molto simile a come giocano i giochi di ruolo della console oggi (devi salvare il gioco senza spegnere la console o perdere tutto dall'ultima volta che hai salvato).
Il sistema ha funzionato per lo scopo previsto, poiché i personaggi non potevano interagire tra loro, tranne forse tramite un sistema di "posta" in cui potevano scambiarsi messaggi ed elementi. La possibilità di perdere oggetti e progredire tendeva ad essere piuttosto significativa, ma nella maggior parte dei casi interessava solo un personaggio alla volta.
La funzione salva-mondo è nata perché i personaggi alla fine erano in grado di interagire direttamente tra loro, quindi tutti i personaggi che giocavano dovevano essere in uno stato coerente, altrimenti si potevano verificare duplicazioni ed eliminazioni degli oggetti. Questo non era un problema nello scenario MUD, perché era difficile abusare del sistema in un modo che causava la duplicazione di oggetti o valuta, ma era incredibilmente facile da fare nei primi MUD MMO. Il giocatore A dà al giocatore B un oggetto, il giocatore B salva e il giocatore A si disconnette senza salvare. Duplicazione istantanea.
Worldsave non è un vantaggio in termini di prestazioni, ma è progettato per prevenire gli imbrogli. Ricordo di aver giocato su sistemi in cui l'evento worldsave è stato letteralmente annunciato in anticipo e spesso ha sospeso l'intero sistema per un minuto mentre il server aggiornava tutti i suoi file. Mentre questo ha impedito i truffatori, non era molto conveniente per gli utenti di questi sistemi.
Questo ci conduce allo stato attuale delle cose. Oggi non utilizziamo le funzioni di tipo worldsave. Utilizziamo database. Questo ci consente di assicurarci che la duplicazione e la cancellazione siano minimizzate il più possibile. I personaggi esistono come record in un database e ogni transazione tra giocatori è una transazione di database letterale; o l'azione è completamente impegnata o verrà ripristinata.
Escludendo i bug insoliti nel sistema, si ottengono i vantaggi del salvataggio di singoli file dei personaggi (tempi di salvataggio rapidi) e i vantaggi di salvataggi del mondo (nessun imbroglio), senza gli svantaggi di nessuno dei due (perdita di progressi significativi e duplicazione degli oggetti).
Quando si progetta un MMO moderno, si desidera creare procedure memorizzate in un database e utilizzare tali procedure per eseguire le transazioni. Ad esempio, quando fai uno scambio tra due giocatori, potrebbe apparire così:
start transaction;
insert into inventory (playerid, itemid) values (111, 222);
delete from inventory where playerid=111 and itemid=444;
insert into inventory (playerid, itemid) values (333, 444);
delete from inventory where playerid=333 and itemid=222;
commit;
(Nota: questo SQL, non è scritto in modo pratico ed è pensato solo per essere un esempio).
In questo modo, se c'è un crash prima del commit, il sistema ritorna in uno stato in cui il giocatore 111 e il giocatore 333 hanno ancora gli oggetti originali, mentre dopo il commit, il commercio è completato. Non vi è alcuna possibilità di duplicazione, poiché i caratteri vengono salvati contemporaneamente, come garantito dal database.