Résolu Récupérer et afficher le nom d'un joueur
-
Sinon, il y a quelque chose qui s’appelle un constructeur :°
-
pas d’instance de l’item stack (et donc du tag nbt) dans le constructeur.
-
A la limite pour le drop ce n’est pas gênant, on peut se servir d’un event pour attribuer les tags à l’itemstack droppé. Ensuite si l’item ne s’obtient que par le mode créatif ou si il se génère ans des coffres sur la map, on peut attribuer les tags lorsque le joueur passera sa souris dessus, avec la méthode addInformation. Je pense qu’ainsi on peut résoudre le problème.
-
Bon ça fait plusieurs jours que j’essaye beaucoup de choses, je suis perdu avec les NBT Tag donc je m’en remet à vous. Je suis parvenu à ce code :
public class ItemTest extends Item { private static final String TAG_LIST = "tag_list"; private static final String TAG_STRING = "tag_string"; String[] list = new String[]{"Alpha", "Bravo", "Charlie"}; private List <string>stringList = new ArrayList<string>(); public void onCreated(ItemStack stack, World world, EntityPlayer player, NBTTagCompound comp) { setNBTData(stack, player, comp); String[] randMessages = new String[]{"Alpha", "Bravo", "Charlie"}; String randMessage = randMessages[player.getRNG().nextInt(randMessages.length)]; } private void setNBTData(ItemStack stack, EntityPlayer player, NBTTagCompound comp) { NBTTagList tagList = new NBTTagList(); for(int i = 0; i < stringList.size(); i++) { String s = stringList.get(i); if(s != null) { NBTTagCompound tag = new NBTTagCompound(); tag.setString("String" + i, s); tagList.appendTag(tag); } } comp.setTag("StringList", tagList); } private static String getNBTTag(ItemStack stack, String tag, NBTTagCompound comp) { NBTTagList tagList = comp.getTagList("StringList", Constants.NBT.TAG_COMPOUND); for(int i = 0; i < tagList.tagCount(); i++) { NBTTagCompound tag = tagList.getCompoundTagAt(i); String s = tag.getString("String" + i); stringList.add(i, s); } } public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean par4) { list.add(getNBTTag(stack, TAG_STRING)); } }
Code qui est erroné vu que j’ai des erreurs sur :
- tag de la fonction getNBTTag
- stringList de la fonction getNBTTag
- getNBTTag de la fonction addInformation</string></string>
-
Je pence que l’on peut faire très simple : dans “addInformation”, tu regarde si l’item à le tag “description” ( stack.getTagCompound().hasKey(“description”), n’oublis pas de faire un null check de stack.getTagCompound()). Si il l’a alors tu ajoute son contenu à la list des descriptions sinon, tu le créé de manière random et le rajoute aux tags.
-
@‘LeBossMax2’:
Je pence que l’on peut faire très simple : dans “addInformation”, tu regarde si l’item à le tag “description” ( stack.getTagCompound().hasKey(“description”), n’oublis pas de faire un null check de stack.getTagCompound()). Si il l’a alors tu ajoute son contenu à la list des descriptions sinon, tu le créé de manière random et le rajoute aux tags.
Comme ceci?
public class ItemTest extends Item { public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean par4) { if(stack.getTagCompound() != null) { stack.getTagCompound().hasKey("description"); list.add(EnumChatFormatting.ITALIC + "description"); } else { String[] randMessages = new String[]{"Alpha", "Bravo", "Charlie"}; String randMessage = randMessages[player.getRNG().nextInt(randMessages.length)]; list.add(EnumChatFormatting.RED + randMessage); } } }
Si c’est comme ça le problème est toujours le même ça oscille entre tous les messages
-
@‘Laserflip33’:
@‘LeBossMax2’:
Je pence que l’on peut faire très simple : dans “addInformation”, tu regarde si l’item à le tag “description” ( stack.getTagCompound().hasKey(“description”), n’oublis pas de faire un null check de stack.getTagCompound()). Si il l’a alors tu ajoute son contenu à la list des descriptions sinon, tu le créé de manière random et le rajoute aux tags.
Comme ceci?
public class ItemTest extends Item { public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean par4) { if(stack.getTagCompound() != null) { stack.getTagCompound().hasKey("description"); list.add(EnumChatFormatting.ITALIC + "description"); } else { String[] randMessages = new String[]{"Alpha", "Bravo", "Charlie"}; String randMessage = randMessages[player.getRNG().nextInt(randMessages.length)]; list.add(EnumChatFormatting.RED + randMessage); } } }
Si c’est comme ça le problème est toujours le même ça oscille entre tous les messages
Je crois qu’il vouait dire ça (pas sur):
public class ItemTest extends Item { public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean par4) { if(stack.getTagCompound() != null && !(stack.getTagCompound().hasKey("description"))) { String[] randMessages = new String[]{"Alpha", "Bravo", "Charlie"}; String randMessage = randMessages[player.getRNG().nextInt(randMessages.length)]; list.add(EnumChatFormatting.RED + randMessage); stack.getTagCompound().setString("description", randMessage); } }
et grâce à ça, si tu veux récupérer le message random d’un des items tu peux faire ça:
if(stack.hasTagCompound()) { stack.getTagCompound().getString("description"); }
-
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean par4) { if(stack.hasTagCompound() && stack.getTagCompound().hasKey("description", Constants.NBT.TAG_STRING)) { list.add(EnumChatFormatting.ITALIC + stack.getTagCompound().getString("description")); } else { String[] randMessages = new String[] {"Alpha", "Bravo", "Charlie"}; String randMessage = randMessages[player.getRNG().nextInt(randMessages.length)]; if(!stack.hasTagCompound()) { stack.setTagCompound(new NBTTagCompound()); } stack.getTagCompound().setString("description", randMessage); } }
-
@‘robin4002’:
Constants.NBT.TAG_STRING
Pourquoi?
@‘robin4002’:
list.add(EnumChatFormatting.ITALIC + stack.getTagCompound().getString("description"));
Ca ne va pas en mettre à l’infini?
-
@‘Minantcraft’:
@‘robin4002’:
Constants.NBT.TAG_STRING
Pourquoi?
@‘robin4002’:
list.add(EnumChatFormatting.ITALIC + stack.getTagCompound().getString("description"));
Ca ne va pas en mettre à l’infini?
“Constants.NBT.TAG_STRING” permet d’être certain que le tag qui a pour nom “description” est de type String donc pour qur “getString(“description”)” fonctionne bien (exemple : si un autre mod ajoute un tag qui porte le même nom mais qui est d’un autre type)
Et le list est réinitialisé à chaque tick (il me semble) dans il faut ajouter la description à chaque tick. -
@‘LeBossMax2’:
“Constants.NBT.TAG_STRING” permet d’être certain que le tag qui a pour nom “description” est de type String donc pour qur “getString(“description”)” fonctionne bien (exemple : si un autre mod ajoute un tag qui porte le même nom mais qui est d’un autre type)
Et le list est réinitialisé à chaque tick (il me semble) dans il faut ajouter la description à chaque tick.Ok merci
-
Ça marche parfaitement! Un seul petit problème persiste : dès que j’actualise l’item (right click avec ou le dropper puis le reprendre par exemple), la valeur affichée change à chaque fois, et ce pendant 2 minutes. C’est à dire que passé ces 2 minutes la valeur se fixe et ne bouge plus, même si on right click, même si on déco/reco, même si on le drop, même si on le met dans un coffre etc…
-
@‘Laserflip33’:
Ça marche parfaitement! Un seul petit problème persiste : dès que j’actualise l’item (right click avec ou le dropper puis le reprendre par exemple), la valeur affichée change à chaque fois, et ce pendant 2 minutes. C’est à dire que passé ces 2 minutes la valeur se fixe et ne bouge plus, même si on right click, même si on déco/reco, même si on le drop, même si on le met dans un coffre etc…
Je n’avais pas pensé à ça, c’est surement un problème de synchro client-serveur, il faut passé par quelque chose qui s’exécute coté serveur, comme onUpdate, onCreated ou des events comme
ItemTooltipEvent (lui, je ne sait pas de quel coté il est appelé) -
Le problème avec cette méthode c’est qu’en effet tout ce passe côté client.
Donc à la déco reco c’est perdu.
Ou si le serveur renvoie la valeur du tag nbt du serveur (null par défaut) au client, c’est aussi perdu.C’est pour ça que j’avais proposé de le faire via la méthode onCreated.
Après avec onUpdate ça peut aussi être une bonne idée en utilisant le même principe.
-
Dans ce cas il faut obligatoirement passer par des NBT Tag donc?
-
C’est déjà le cas avec le code que je t’ai donné.
-
Alors ça fait maintenant plus d’une semaine que je gamberge avec la méthode qu’à donné robin :
@‘robin4002’:
Il faut faire le random exécuté seulement une fois lors de la création (il me semble qu’il existe une fonction onCreate) puis enregistrer les valeurs dans un tag nbt et l’afficher ensuite dans addInformation.
J’ai essayé vraiment énormément de choses mais rien de tout ça ne c’est avéré concluant, alors je m’en remet à vous parce que je suis clairement au point mort.
-
Où est-ce que tu bloques ?
-
Bon du coup désolé pour la loongue absence de plus d’un mois … J’ai enfin décidé de terminer cet item une fois pour toute!
@‘SCAREX’:
Où est-ce que tu bloques ?
En fait je n’arrive pas à enregistrer les valeurs dans un NBT Tag après avoir exécuté le random lors de la création. J’avais un code mais là il faut tout refaire de 0 parce qu’apparemment ce n’est pas la bonne technique
-
@‘Laserflip33’:
Bon du coup désolé pour la loongue absence de plus d’un mois … J’ai enfin décidé de terminer cet item une fois pour toute!
@‘SCAREX’:
Où est-ce que tu bloques ?
En fait je n’arrive pas à enregistrer les valeurs dans un NBT Tag après avoir exécuté le random lors de la création. J’avais un code mais là il faut tout refaire de 0 parce qu’apparemment ce n’est pas la bonne technique
Le code de robin4002 est bon, il faut juste le séparer en deux :
tu garde le “if …. { … }” dans la fonction ‘addInformation’ mais tu met le reste dans l’un des events que l’on t’a proposés. (Il me semble qu’en 1.7, la fonction ‘onCreated’ fonctionne bien mais en 1.8, c’est sûr qu’elle est buggé. Si c’est le cas, je pence que tu est obligé de passer par ‘onUpdate’)