Résolu Système de rang
-
Il suffit juste que dans la méthode onMessage tu mette ceci :
public IMessage onMessage(PacketGuerrier message, MessageContext ctx) { if(ServerProxy.RANK.get(ctx.getServerHandler().playerEntity.getUniqueID() == null) { ServerProxy.RANK.put(ctx.getServerHandler().playerEntity.getUniqueID(), EnumRank.valueOf(message.name)); return null; } } }
-
Ok c’est bon j’ai trouvé merci
Et pour save comment je peux faire ? -
Il va falloir utiliser ceci : https://www.minecraftforgefrance.fr/showthread.php?tid=2444 pour sauvegarder le contenu de ta liste dans les tags nbt de ta map.
-
Ok par contre faut m’aider x)
public class RankSave extends WorldSavedData { /** /* Ce constructeur est obligatoire */ public static RankSave load(World w) { MapStorage storage = w.perWorldStorage; final String KEY = getDataStorageKey(); // il faut modifier ici mais par quoi ? ServerProxy.RANK.get(…) ? RankSave result = (RankSave)storage.loadData(RankSave.class, KEY); if (result == null) { result = new RankSave(KEY); storage.setData(KEY, result); } return result; } public RankSave(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 } }
-
Le KEY sera le nom de la sauvegarde donc tu peux mettre, par exemple, Ranks.
-
Ok mais le problème c’est que quand je met ServerProxy.Rank j’ai des érreurs:
public static RankSave load(World w) { MapStorage storage = w.perWorldStorage; //On récupère la mapStorage de la dimension final HashMap <uuid, enumrank="">KEY = ServerProxy.RANK; // 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. RankSave result = (RankSave)storage.loadData(RankSave.class, KEY);//On charge nos données//ici a loadData if (result == null) { //Si nos données n'existe pas, … result = new RankSave(KEY);// ici a new RankSave storage.setData(KEY, result);// et ici a setData } ```</uuid,>
-
As-tu créé une variable de type String qui s’appelle RANK dans ton ServerProxy :
public static final String SAVE_KEY = "Ranks";
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
Le problème est qu’il a utilisé une HashMap pour clé, il n’a pas suivi correctement le tutoriel
-
D’acc j’ai fais ça:
RankSave:
package net.legacymod.save; import java.util.HashMap; import java.util.UUID; import net.legacymod.properties.EnumRank; import net.legacymod.proxy.ServerProxy; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagString; import net.minecraft.world.World; import net.minecraft.world.WorldSavedData; import net.minecraft.world.storage.MapStorage; public class RankSave extends WorldSavedData { /** /* Ce constructeur est obligatoire */ public static RankSave load(World w) { MapStorage storage = w.perWorldStorage; //On récupère la mapStorage de la dimension final String KEY = ServerProxy.SAVE_KEY; // 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. RankSave result = (RankSave)storage.loadData(RankSave.class, KEY);//On charge nos données if (result == null) { //Si nos données n'existe pas, … result = new RankSave(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 } public RankSave(String key) { super(key); } public void readFromNBT(NBTTagCompound nbt) { // Vous remplissez les attributs de votre objet via le NBTTagCompound readFromNBT(nbt); NBTTagCompound nbtTagCompound = nbt.getCompoundTag(ServerProxy.SAVE_KEY); } @Override public void writeToNBT(NBTTagCompound nbt) { // Vous écrivez le contenu de votre objet dans le NBTTagCompound writeToNBT(nbt); NBTTagCompound nbtTagCompound = nbt.getCompoundTag(ServerProxy.SAVE_KEY); } }
ServerProxy:
package net.legacymod.proxy; import java.util.HashMap; import java.util.UUID; import net.legacymod.packets.PacketGuerrier; import net.legacymod.properties.EnumRank; public class ServerProxy { public static final HashMap <uuid, enumrank="">RANK = new HashMap<uuid, enumrank="">(); public static final String SAVE_KEY = "Ranks"; }
Dite moi si c’est bon sinon une fois que c’est fini je dois enregistrer la classe ?</uuid,></uuid,>
-
ça a l’air d’être bon, mis à part le fait que les fonctions readFromNBT et writeToNBT font chancune une boucle infinie…
Dans ta fonction write, il faut que tu mettes chaque élément de ta HashMap de rang dans le tag (en utilisant une NBTTagList()) et dans read, que tu lises ton tag et remplisses la liste avec ce qui a été lu. -
Je comprend pas tu me dis de que dans le write je met chaque élément de ma hashmap de rang c’est a dire -> EnumRank.Guerrier EnumRank.Archer etc… ? ou ServerProxy.Rank …
Et dans le read dont je lis le tag sa c’est bon et je le remplis avec la liste de se qui a été lu ? -> ? -
En gros
public static void writeToNBT(NBTTagCompound compound) { NBTTagList rankList = new NBTTagList(); Iterator<entry<uuid, enumrank="">> iterator = RANK.entrySet().iterator(); while(iterator.hasNext()) { NBTTagCompound rankTag = new NBTTagCompound(); Entry <uuid, enumrank="">entry = iterator.next(); rankTag.setString("uuid", entry.getKey().toString()); rankTag.setString("rank", entry.getValue().name()); rankList.appendTag(rankTag); } compound.setTag("rankList", rankList); }
Et :
public static void readFromNBT(NBTTagCompound compound) { NBTTagList rankList= (NBTTagList)compound.getTag("rankList"); for(int i = 0; i < rankList.tagCount(); i++) { NBTTagCompound rankTag = rankList.getCompoundTagAt(i); RANK.put(UUID.fromString(rankTag.getString("uuid")), EnumRank.valueOf(rankTag.getString("rank"))); } } ```</uuid,></entry<uuid,>
-
Merci c’est bon normalement!
Un dernier truc !
Je veux récupéré le rank exact du joueur si je fais:
if(ServerProxy.RANK.get(event.entityPlayer.getUniqueID()) != EnumRank.GUERRIER);
j’ai une érreur
Merci! -
Tu devrais pas, refait voir ton proxy
-
C’est bon laisse ça marche finalement j’ai du me tromper x)
Par contre quand je vais en solo je me met guerrier je save et quit je me re connecte en solo j’ai encore mon garde mais quand je save et que je quitte le jeu et que je le relance en me connectant en solo j’ai plus mon grade normal? -
Aucune raison que ton code ne marche pas :
if(ServerProxy.RANK.get(event.player.getUniqueID()) != EnumRank.GUERRIER) { //Code }
Il faut que tu garde le même pseudo, va dans : Run/Debug configurations … -> Arguments -> et tape --username tonPseudo
-
D’acc merci je close!
-
@‘BrokenSwing’:
Aucune raison que ton code ne marche pas :
if(ServerProxy.RANK.get(event.player.getUniqueID()) != EnumRank.GUERRIER) { //Code }
Il faut que tu garde le même pseudo, va dans : Run/Debug configurations … -> Arguments -> et tape --username tonPseudo
Même pas avoir fais –username <pseudo>quand je relance mon jeu je ne suis plus Guerrier !</pseudo>
-
Fais le –username, mets guerrier, quitte et relance.
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
C’est se que j’ai fais mais ça ne marche pas ^^