Problème avec le NBTTagList.



  • Problème avec le NBTTagList.

    Bonjour, cela fait maintenant quelques heures que j'essaye de régler mon problème mais je n'y arrive pas alors je fais appel à vous!

    Je vous expliques, j'ai fais un système de "blockrespawn" en gros quand un joueur casse un bloc, il est stocké dans une map et respawn au bout d'un certain temps t (cela fonctionne) mais je voudrai sauvegarder cette map car si le serveur crash la map ne serra pas save et je perdrai tout les blocs qui ont était casser.
    Pour save mes blocs je passes donc par un WorldSavedData, et c'est dans cette classe que le problème apparait, j'ai fais du debug et j'ai trouver que le soucis venait du NBTTagList, il prend que les coordonées du dernier bloc casser et pas la totalité des blocs.
    Je ne sais pas si vous avez tout saisie, je vous mets des screens des logs et ma classe WorldSavedData.

    J'explique très mal je sais désolé.

    Merci d'avance !

    Classe WorldSavedData:

    package fr.altismine.mainmod.common.altis.save;
    
    import java.util.Iterator;
    import java.util.Map.Entry;
    import java.util.UUID;
    
    import fr.altismine.mainmod.proxy.CommonProxy;
    import net.minecraft.nbt.NBTBase;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.nbt.NBTTagList;
    import net.minecraft.util.math.BlockPos;
    import net.minecraft.world.World;
    import net.minecraft.world.storage.MapStorage;
    import net.minecraft.world.storage.WorldSavedData;
    import net.minecraftforge.common.DimensionManager;
    
    public class WorldSaved extends WorldSavedData {
    
    
    	public static WorldSaved load(World w) {
    		if (DimensionManager.getWorlds().length < 1)
    			return null;
    		MapStorage storage = DimensionManager.getWorlds()[0].getMapStorage(); 
    																				
    		final String KEY = "KEYS"; 
    												
    												
    		WorldSaved result = (WorldSaved) storage.getOrLoadData(WorldSaved.class, KEY);
    		if (result == null) { 
    			result = new WorldSaved(KEY);
    			storage.setData(KEY, result);
    		}
    
    		return result; 
    	}
    
    	public WorldSaved(String key) {
    		super(key);
    
    	}
    
    	@Override
    	public void readFromNBT(NBTTagCompound compound) {
    		System.out.println("test read");
    		NBTTagList keyList = (NBTTagList) compound.getTag("keyList");
    		for(int i=0;i<keyList.tagCount();i++)
    		{
    			NBTTagCompound keyTag = keyList.getCompoundTagAt(i);
    			System.out.println(keyTag);
    			for(int i1=0;i1<(keyTag.getInteger("i")+1);i1++)
    			{
    				CommonProxy.respawntime.put(new BlockPos(keyTag.getInteger("x"), keyTag.getInteger("y"), keyTag.getInteger("z")), keyTag.getInteger("timer"));
    				if(CommonProxy.blockpos.isEmpty())
    				{
    					CommonProxy.blockpos.add(0, new BlockPos(keyTag.getInteger("x"), keyTag.getInteger("y"), keyTag.getInteger("z")));
    				}
    				else
    				{
    					CommonProxy.blockpos.add(i1, new BlockPos(keyTag.getInteger("x"), keyTag.getInteger("y"), keyTag.getInteger("z")));
    				}
    				System.out.println(i1 + " size: "  +(keyTag.getInteger("i")+1));
    			}
    		}
    	}
    
    	@Override
    	public NBTTagCompound writeToNBT(NBTTagCompound compound) {
    		NBTTagList keyList = new NBTTagList();
    		NBTTagCompound keyTag = new NBTTagCompound();
    		Iterator<BlockPos> iterator = CommonProxy.blockpos.iterator();
    		Iterator<Entry<BlockPos, Integer>> iterator2 = CommonProxy.respawntime.entrySet().iterator();
    		while(iterator2.hasNext())
    		{
    			Entry<BlockPos, Integer> s = iterator2.next();
    			keyTag.setInteger("x", s.getKey().getX());
    			keyTag.setInteger("y", s.getKey().getY());
    			keyTag.setInteger("z", s.getKey().getZ());
    			keyTag.setInteger("timer", s.getValue());
    			for(int i1=0;i1<CommonProxy.respawntime.size();i1++)
    			{
    				if(CommonProxy.respawntime.isEmpty())
    				{
    					keyTag.setInteger("i", 0);
    				}
    				else
    				{
    					keyTag.setInteger("i", i1);
    				}
    			}
    			keyList.appendTag(keyTag);
    			System.out.println(keyList);
    		}
    		compound.setTag("keyList", keyList);
    		System.out.println(compound.getTag("keyList"));
    		return compound;
    	}
    
    }
    

    Write:

    text alternatif

    Read:

    text alternatif



  • Bonjour, quelqu'un peut-il m'aider ?



  • Up!



  • Salut, dans writeToNBT, il faut déplacer la ligne NBTTagCompound keyTag = new NBTTagCompound(); dans le while pour que ça crée un Compound à chaque tour de boucle plutôt que de changer les valeur enregistrés avant.



  • Aussi, je ne vois pas pourquoi tu utilise un Iterator. C'est plus simple de faire un foreach



  • Salut, super merci beaucoup ça fonctionne!
    Pour le foreach je ne connaissait pas, c'est super simple et pratique merci beaucoup de ton aide!
    Je met en résolu.


Log in to reply