Résolu Problème armure effets
-
Bonjour depuis quelques jours j’essaye de mettre un effet à mon joueur uniquement si celui-ci porte tout l’armure, j’ai regarder le tutoriel de robin et les différentes aides à ce sujets poster sur le forum sans trouver une solution à mon problème
j’ai essayer de mettre**if**(!player.inventory.armorInventory.**get**(0).isEmpty%(#666600)[()) ```] dans l'idéal j'aimerais adapter ce code trouver sur le forum pour la version 1.11 %(#666600)[```java ] 1. **if**(player.inventory.armorInventory[0] != **null** && player.inventory.armorInventory[1] != **null** && player.inventory.armorInventory[2] != **null** && player.inventory.armorInventory[3] != **null**) // Si tout ces slots d'armure sont remplies 2. { 3. **if**(player.inventory.armorInventory[0].getItem().equals(ItemMod.obsidienne_helmet && player.inventory.armorInventory[1].getItem().equals(ItemMod.obsidienne_chestplate && player.inventory.armorInventory[2].getItem().equals(ItemMod.obsidienne_leggings && player.inventory.armorInventory[3].getItem().equals(ItemMod.obsidienne_boots)) // Si tout ces slots comprennent bien ta bonne armure d'obsidienne 4. { 5. player.addPotionEffect(**new** PotionEffect(Potion.nightVision.getId(), 60, 1)); // Alors on donne l'effet ![](https://www.minecraftforgefrance.fr/images/Minecraft_Forge_France/smilies/v3/smile.png) 6. } %(#666600)[ ```] pouvez-vous m'aider ?
-
Alors tout simplement en 1.11, “player.inventory.armorInventory*” devient “player.inventory.armorInventory.get(i)” et “player.inventory.armorInventory* != null” devient “!player.inventory.armorInventory.get(i).isEmpty()”.
Mais ce code tu vas le mettre dans la fonction “update” (ou semblable) de ton armure ? Si oui il y a moyen de l’optimiser.
-
Voici ma classe armure
package fr.priya.simpleores.items; import fr.priya.simpleores.ModSimpleores; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.init.SoundEvents; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; import net.minecraft.world.World; import net.minecraftforge.common.ISpecialArmor; import net.minecraftforge.common.util.EnumHelper; public class AmnethysteArmor extends ItemArmor implements ISpecialArmor { public static final ArmorMaterial material = EnumHelper.addArmorMaterial("armoramnethyste", ModSimpleores.MODID + ":armoramnethyste", 500, new int[] {6, 8, 9, 50}, 5, SoundEvents.ITEM_ARMOR_EQUIP_DIAMOND, 0.0F); public AmnethysteArmor(EntityEquipmentSlot equipmentSlotIn) { super(material, 0, equipmentSlotIn); } @Override public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, int slot) { switch(slot) { case 3: //Helmet return null; case 2: //Chestplate return null; case 1: //Leggings return null; case 0: //Boots return null; default: //Nothing, to disable eclipse warning return null; } } @Override public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) { // TODO Auto-generated method stub return 0; } @Override public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { // TODO Auto-generated method stub } @Override public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) { { player.addPotionEffect(new PotionEffect(MobEffects.SPEED, 100, 2)); } } }
je souhaite mettre mon effect dans la fonction armortick
et le premier code que tu m’as donner avec le is empty provoque des erreurs ça me met la croix rouge avec comme erreurs sur isempty “rename in the file” -
@Override public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) { if(stack.getItem().equals(ItemMod.obsidienne_helmet) && !player.inventory.armorInventory.get(1).isEmpty() && !player.inventory.armorInventory.get(2).isEmpty() && !player.inventory.armorInventory.get(3).isEmpty()) // Si tout ces slots d'armure sont remplies { if(player.inventory.armorInventory.get(1)getItem().equals(ItemMod.obsidienne_chestplate) && player.inventory.armorInventory.get(2).getItem().equals(ItemMod.obsidienne_leggings) && player.inventory.armorInventory.get(3).getItem().equals(ItemMod.obsidienne_boots)) // Si tout ces slots comprennent bien ta bonne armure d'obsidienne { player.addPotionEffect(new PotionEffect(Potion.nightVision.getId(), 60, 1)); // Alors on donne l'effet [Image: smile.png] }}
Voilà ça devrait marcher.
-
Je viens d’essayer ça ne fonctionne pas
si tu veux je peux faire un screen le isempty il aime pas trop eclipse
voici les erreurs de la ligne is emptyMultiple markers at this line - The method isEmpty() is undefined for the type ItemStack - The method isEmpty() is undefined for the type ItemStack - The method isEmpty() is undefined for the type ItemStack - stack cannot be resolved
est celle de la ligne juste en dessous
Multiple markers at this line - The method getItem() is undefined for the type AmnethysteArmor - The type of the expression must be an array type but it resolved to ItemStack - Syntax error, insert "]" to complete Expression - Syntax error on token ")", [ expected after this token
-
Je pense que pour la deuxieme erreur, tu as oublié de mettre une parenthèse et un crochet quelque part, mais si non, cela signifie que tu a mal placé (au mauvais endroit) ton code.
-
je viens de vérifier ma ligne les parenthèses sont bien deux à deux et j’ai placer mon code dans un Override dans le bas de mon code
package fr.priya.simpleores.items; import fr.priya.simpleores.ModSimpleores; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.init.SoundEvents; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; import net.minecraft.world.World; import net.minecraftforge.common.ISpecialArmor; import net.minecraftforge.common.util.EnumHelper; public class AmnethysteArmor extends ItemArmor implements ISpecialArmor { public static final ArmorMaterial material = EnumHelper.addArmorMaterial("armoramnethyste", ModSimpleores.MODID + ":armoramnethyste", 500, new int[] {6, 8, 9, 50}, 5, SoundEvents.ITEM_ARMOR_EQUIP_DIAMOND, 0.0F); public AmnethysteArmor(EntityEquipmentSlot equipmentSlotIn) { super(material, 0, equipmentSlotIn); } @Override public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, int slot) { switch(slot) { case 3: //Helmet return null; case 2: //Chestplate return null; case 1: //Leggings return null; case 0: //Boots return null; default: //Nothing, to disable eclipse warning return null; } } @Override public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) { // TODO Auto-generated method stub return 0; } @Override public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) { // TODO Auto-generated method stub } @Override public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack){ if(stack.getItem().equals(SimpleoresItems.AMNETHYSTE_HELMET) && !player.inventory.armorInventory.get(1).isEmpty() && !player.inventory.armorInventory.get(2).isEmpty() && !player.inventory.armorInventory.get(3).isEmpty()) // Si tout ces slots d'armure sont remplies { if(player.inventory.armorInventory.get(1)getItem().equals(SimpleoresItems.AMNETHYSTE_CHESTPLATE) && player.inventory.armorInventory.get(2).getItem().equals(SimpleoresItems.AMNETHYSTE_LEGGINGS) && player.inventory.armorInventory.get(3).getItem().equals(SimpleoresItems.AMNETHYSTE_BOOTS)) // Si tout ces slots comprennent bien ta bonne armure d'obsidienne { player.addPotionEffect(new PotionEffect(MobEffects.SPEED, 100, 2)); }} } }
-
Alors :
- “- The method isEmpty() is undefined for the type ItemStack” : Je vois pas pourquoi t’as ça je regarde ce soir.
- “- stack cannot be resolved” : Si tu comprenais un minimum le code, tu verrais qu’il suffit de remplacer par “itemStack”.
- “- The method getItem() is undefined for the type AmnethysteArmor” : Si tu comprenais un minimum le java tu verrais que j’ai oublié un point dans le début du if de la ligne 63 : “player.inventory.armorInventory.get(1)getItem().equals(SimpleoresItems.AMNETHYSTE_CHESTPLATE)” ==> “player.inventory.armorInventory.get(1).getItem().equals(SimpleoresItems.AMNETHYSTE_CHESTPLATE)”.
Les deux autres erreurs doivent être dues à la 3e.
-
Merci AymericRed j’ai rajouté le point que je n’avais pas vu par contre pour l’erreur du stack j’avais déjà essayer de le remplacer par itemStack et ItemStack (pour correspondre au paramètre de la fonction armorTick ) sans succès
-
Merci AymericRed j’ai corrigé les erreurs que tu m’as indiqués les seuls qui persiste sont celle avec la méthode isempty
-
Utilise tu des mappings récents ? Ton problème peut venir de mappings trop anciens donc il te faudrait la version obfusquée de la fonction isEmpty().
-
J’utilise cela snapshot_20161111
-
Met ceux-la 20170612
-
J’ai mis les bons mappings et je n’ai plus d’erreurs mais je n’arrive toujours pas a avoir des effets quand l’armure est entierement équipée maintenant je n’ai absolument aucun effet
j’ai essayer le code de AymerciRed@Override public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack){ if(itemStack.getItem().equals(SimpleoresItems.AMNETHYSTE_HELMET) && !player.inventory.armorInventory.get(1).isEmpty() && !player.inventory.armorInventory.get(2).isEmpty() && !player.inventory.armorInventory.get(3).isEmpty()) // Si tout ces slots d'armure sont remplies { if(player.inventory.armorInventory.get(1).getItem().equals(SimpleoresItems.AMNETHYSTE_CHESTPLATE) && player.inventory.armorInventory.get(2).getItem().equals(SimpleoresItems.AMNETHYSTE_LEGGINGS) && player.inventory.armorInventory.get(3).getItem().equals(SimpleoresItems.AMNETHYSTE_BOOTS)) // Si tout ces slots comprennent bien ta bonne armure d'obsidienne { player.addPotionEffect(new PotionEffect(MobEffects.SPEED, 100, 2)); }}
ainsi qu’une variante que j’ai essayer de bidouiller pour que ça fonctionne sans succès
@Override public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack){ if(player.inventory.armorInventory.get(0).getItem().equals(SimpleoresItems.AMNETHYSTE_HELMET) && !player.inventory.armorInventory.get(1).isEmpty() && !player.inventory.armorInventory.get(2).isEmpty() && !player.inventory.armorInventory.get(3).isEmpty()) // Si tout ces slots d'armure sont remplies { if(player.inventory.armorInventory.get(1).getItem().equals(SimpleoresItems.AMNETHYSTE_CHESTPLATE) && player.inventory.armorInventory.get(2).getItem().equals(SimpleoresItems.AMNETHYSTE_LEGGINGS) && player.inventory.armorInventory.get(3).getItem().equals(SimpleoresItems.AMNETHYSTE_BOOTS)) // Si tout ces slots comprennent bien ta bonne armure d'obsidienne { player.addPotionEffect(new PotionEffect(MobEffects.SPEED, 100, 2)); }} }
-
Je te conseilles de faire du debug (soit avec des System.out.println() soit avec eclipse) pour voir où est-ce que ça bloque.
-
Je viens de faire du debug eclipse lit bien la première condition c’est la deuxième qui pose problème (quand on vérifie que soit bien la bonne armure qui est dans les slots)
EDIT: j’ai remarqué que la première condition (celle des slots) était valide même quand le joueur n’avait pas équipé ses bottes jevais essayer d’arranger ça
AymerciRed si tu as une idée pour la deuxième condition je suis preneuse -
Alors je te prpose de mettre ça juste avant la deuxième condition :
System.out.println(player.inventory.armorInventory.get(1).getItem() + " " + player.inventory.armorInventory.get(2).getItem() + " " + player.inventory.armorInventory.get(3).getItem());
et voir ce qui ne va pas (tu peux faire un print SimpleoresItems.AMNETHYSTE_CHESTPLATE etc pour comparer).
-
[22:16:08] [Server thread/INFO]: [STDOUT]: fr.priya.simpleores.items.armor.AmnethysteArmor@45e931a9 fr.priya.simpleores.items.armor.AmnethysteArmor@238fcafa fr.priya.simpleores.items.armor.AmnethysteArmor@250c5892
voici ce que ça donne j’avoue que je suis incapable d’interpréter ce logs si toi tu sais je suis preneuse
-
@‘AymericRed’:
Alors je te prpose de mettre ça juste avant la deuxième condition :
System.out.println(player.inventory.armorInventory.get(1).getItem() + " " + player.inventory.armorInventory.get(2).getItem() + " " + player.inventory.armorInventory.get(3).getItem());
et voir ce qui ne va pas (tu peux faire un print SimpleoresItems.AMNETHYSTE_CHESTPLATE etc pour comparer).
Il faut faire un print des SimpleoresItems.AMNETHYSTE_“piece d’armure” et comparer les numéros aprés le @, comme là dit AymericRed. Si les numéros sont les mêmes c’est le même item. Cette ligne toute seule n’est pas trés utile ^^ Enfin je crois
-
“Enfin je crois”
Si toute seule elle est utile, là ça indique que le joueur a bien l’armure sur lui. Mais pas assez utile oui ^^
Il va donc falloir que tu fasses ce que Timmypote a dit aypristile.