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.
- Savoir utiliser les NBTTags
| public class MaClasseASauvegarder extends WorldSavedData { |
| |
| |
| |
| |
| public MaClasseASauvegarder(String key) { |
| super(key); |
| } |
| |
| @Override |
| public void readFromNBT(NBTTagCompound p_76184_1_) { |
| |
| |
| } |
| |
| @Override |
| public void writeToNBT(NBTTagCompound p_76187_1_) { |
| |
| |
| } |
| } |
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.
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; |
| final String KEY = getDataStorageKey(); |
| MaClasseASauvegarder result = (MaClasseASauvegarder)storage.loadData(MaClasseASauvegarder.class, KEY); |
| if (result == null) { |
| result = new MaClasseASauvegarder(KEY); |
| storage.setData(KEY, result); |
| } |
| |
| return result; |
| } |
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.
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().
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).
Rédaction :
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
Retour vers le sommaire des tutoriels