Les premiers systèmes qui enregistraient uniquement lors de la déconnexion avaient également tendance à enregistrer régulièrement lorsque le joueur était actif. Dans ces systèmes, généralement des MUD (donjons multi-utilisateurs), le personnage était conservé en mémoire jusqu'à ce qu'il soit périodiquement transféré dans un fichier.
Cela signifiait que si un utilisateur se déconnectait sans "camper", il se retrouvait généralement à plusieurs chambres de distance et manquait un tas de butin, XP, etc., lors de la dernière sauvegarde. À cet égard, cela se comportait beaucoup comme la façon dont les RPG de console jouent aujourd'hui (vous devez sauvegarder votre jeu sans éteindre la console, ou vous perdez tout depuis la dernière fois que vous avez enregistré).
Le système fonctionnait conformément à sa destination, car les personnages ne pouvaient pas interagir les uns avec les autres, sauf éventuellement par le biais d'un système de "messagerie" où ils pouvaient s'envoyer des messages et des éléments. Les chances de perdre des objets et de progresser avaient tendance à être assez importantes, mais n'affectaient qu'un personnage à la fois dans la plupart des cas.
La fonctionnalité de sauvegarde du monde est née parce que les personnages ont finalement pu interagir directement les uns avec les autres, de sorte que tous les personnages jouant devaient être dans un état cohérent, sinon la duplication et la suppression d'éléments pourraient se produire. Ce n'était pas un problème dans le scénario MUD, car il était difficile d'abuser du système d'une manière qui entraînait une duplication des articles ou des devises, mais c'était incroyablement facile à faire dans les premiers MUD MMO. Le joueur A donne au joueur B un élément, le joueur B sauvegarde et le joueur A se déconnecte sans sauvegarder. Duplication instantanée.
Worldsave n'est pas un avantage de performance, mais conçu pour empêcher la tricherie. Je me souviens avoir joué sur des systèmes où l'événement worldsave a été littéralement annoncé à l'avance, et souvent suspendu le système entier pendant une minute pendant que le serveur mettait à jour tous ses fichiers. Bien que cela ait empêché la triche, ce n'était pas très pratique pour les utilisateurs de ces systèmes.
Cela nous amène à l'état actuel des choses. Aujourd'hui, nous n'utilisons pas les fonctions de type worldsave. Nous utilisons des bases de données. Cela nous permet de nous assurer que la duplication et la suppression sont réduites autant que possible. Les personnages existent sous forme d'enregistrements dans une base de données, et chaque transaction entre joueurs est une transaction de base de données littérale; soit l'action est entièrement validée, soit elle sera annulée.
À moins de bugs inhabituels dans le système, vous bénéficiez des avantages de l'enregistrement de fichiers de caractères individuels (temps de sauvegarde rapides) et des avantages de worldsaves (pas de tricherie), sans les inconvénients de l'un ou l'autre (perte de progression significative et duplication d'éléments).
Lors de la conception d'un MMO moderne, vous souhaitez créer des procédures stockées dans une base de données et utiliser ces procédures pour effectuer des transactions. Par exemple, lors d'un échange entre deux joueurs, cela pourrait ressembler à ceci:
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;
(Remarque: ce SQL n'est pas écrit de manière pratique et est uniquement destiné à être un exemple).
De cette façon, s'il y a un crash avant la validation, le système revient à un état où le joueur 111 et le joueur 333 ont toujours les objets d'origine, tandis qu'après la validation, le commerce est terminé. Il n'y a aucune possibilité de duplication, car les personnages sont enregistrés en même temps, comme le garantit la base de données.