Sommaire
Introduction
Ce tutoriel va vous présenter tout ce qu’il y a à savoir sur la persistance de vos données via la classe WorldSavedData.
WorldSavedData est une classe abstraite qu’il vous faudra étendre afin de sauvegarder vos données via le système de sauvegarde Minecraft.
Prérequis
- Savoir utiliser les NBTTags
Classe de base
public class MaClasseASauvegarder extends WorldSavedData {
/**
/* Ce constructeur est obligatoire
*/
public MaClasseASauvegarder(String key) {
super(key);
}
@Override
public void readFromNBT(NBTTagCompound p_76184_1_) {
// Vous remplissez les attributs de votre objet via le NBTTagCompound
}
@Override
public void writeToNBT(NBTTagCompound p_76187_1_) {
// Vous écrivez le contenu de votre objet dans le NBTTagCompound
}
}
La key
Votre objet sera stocké dans la MapStorage de votre monde ou de votre dimension, il va donc vous falloir une clé pour sauvegarder et retrouver votre objet. Si votre objet est de type singleton, ce qui sera vrai dans la plupart des cas, la clé devra être invariable. Pour les néophytes en conception, un singleton est une classe qui ne peut avoir qu’une seule instance. La classe de base de votre mod en est un.
Ainsi je vous recommande de créer soit un attribut static final String, soit une fonction static String qui représentera votre clé.
Pour éviter les conflits avec d’autre mods, je vous conseil de faire préfixer votre clé par le modid de votre mod.
Charger vos données
Voici une fonction que vous pouvez ajouter à votre code si vos données sont propres à chacune de vos dimensions, nous allons la commenter.
public static MaClasseASauvegarder load(World w) {
MapStorage storage = w.perWorldStorage; //On récupère la mapStorage de la dimension
final String KEY = getDataStorageKey(); // Si vous avez choisis de faire une fonction static String. Quoiqu'il en soit, la variable KEY que nous utiliserons ici représente votre clé. Si vous utilisez un attribut static, utilisez le directement.
MaClasseASauvegarder result = (MaClasseASauvegarder)storage.loadData(MaClasseASauvegarder.class, KEY);//On charge nos données
if (result == null) { //Si nos données n'existe pas, …
result = new MaClasseASauvegarder(KEY);// Alors on les crée …
storage.setData(KEY, result);// Et on les ajoutes à la mapStorage.
}
return result; //On retourne notre objet qui représente les données a sauvegarder
}
Après avoir appelé cette fonction, dès que la dimension sera sauvegardée, votre objet sera pris en compte dans le processus vu qu’il est enregistré dans la mapStorage. Vous pouvez appeler cette fonction quand vous voulez dès lors que vous avez une référence vers une dimension chargée et que vous avez besoin d’une référence vers votre objet. Lorsque vos données sont liée a une dimension particulière, il est conseillé de charger vos données via l’event : WorldEvent.Load mais rien ne vous y oblige.
Il existe une variante de tout ce que je viens de dire jusqu’à présent. Si vos données ne sont pas liées à vos dimensions mais a votre monde.
Dans ce cas, vous pouvez reprendre la fonction load() et supprimer le paramètre World.
Vous chargerez la mapStorage via :
if(DimensionManager.getWorlds().length < 1) return null;
MapStorage storage = DimensionManager.getWorlds()[0].mapStorage;
Et vous devrez charger vos données lorsqu’au moins une dimension est chargée. Je vous conseil d’utiliser l’event FMLServerStartedEvent à utiliser avec un @EventHandler dans votre classe principale.
Sauvegarder vos données
Lors de la sauvegarde de votre monde, le système vérifie si vos données doivent être sauvegardées via la méthode isDirty().
Pour que vos données soit sauvegardées, vous devez auparavant appeler la méthode markDirty() pour que isDirty() retourne true.
Une fois la sauvegarde effectuée, isDirty() retourne false.
Par conséquent, après chaque changement de vos données, vous devez appeler la méthode markDirty().
Informations utiles
Si vos données sont propre à une dimension et ont besoin de celle-ci, votre objet devra avoir un attribut World.
Ne le sauvegardez pas ! Inutile de faire quelque chose qui ne sert à rien.
Initialisez plutôt votre attribut juste avant de le retourner dans la fonction load(World w).
Crédits
Rédaction :
- Blackout
Correction :
Ce tutoriel de Blackout publié sur Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International