1. Le forum de Minecraft-France va définitivement fermer ses portes. Celui-ci restera en lecture seule mais vous ne pourrez plus y apporter de nouveaux topics. Nous vous invitons à nous rejoindre sur le Discord de Minecraft-France qui permet de présenter vos projets, discuter avec la communauté etc.. Merci à tous d'avoir fait vivre ce forum de nombreuses années. Pour nous rejoindre sur Discord, Cliquez ici

[1.7.2] donner un item au joueur, si l'armure ce brise

Discussion dans 'Aide à la création de mod' créé par Jodge, 14 Juil 2014.

  1. Jodge

    Jodge Explorateur

    Inscrit:
    13 Oct 2013
    Messages:
    65
    Points:
    89
    Sexe:
    Homme
    Hello les gens !

    Bon je vais pas tournée autour du pot, je suis coincer sur un truc... Tous con pour ceux qui s'y connaissent ^^'

    J'ai une armure. Si je suis en feu (onfire) alors l'armure subit énormément de dégât (logique, elle est en bois).
    Ce que je veux c'est qu'as la destruction de l'armure, PAR LES FLAMMES, un "charcoal" soit donner dans l'inventaire du joueur.
    Pour cela j'ai fait

    Code (cpp):
                if (boots != null
                        && boots.getItem() == ModVanilla_armor_extend.Woodboots) {
                    boots.damageItem(MathHelper.floor_float(event.ammount*2),
                            event.entityLiving);
                    if (boots.stackSize == 0) {
    //                    event.entityLiving.addItemStackToInventory(new ItemStack(Items.coal, 1));
                    }
                }
     
    Pour la partie dégât, ça vas, aucun problème (si ce n'est les bug minecraft commum a toute les armures avec l’icône "empty armor" qui ne s'affiche pas si l'on est dans le menu pendant que l'armure est détruire).

    Mais voila la ligne (ici en commentaire) ne fonctionne pas (et ne donne pas le bon objet, mais c'est un autre problème).
    J'ai testé plusieurs "truc" (de véritable bidouillage) mais aucun n'as marcher.

    Donc me voila devant vous avec comme question :

    Comment donner un objet a une entity (joueur ou monstre) dans une classe "EventHandler" (classe avec les "@SubscribeEvent") ?

    merci d'avance :D


    Edit :
    Code (cpp):

        if (boots.stackSize == 0 && event.entityLiving instanceof EntityPlayer){
          if(!((EntityPlayer)event.entityLiving).inventory.addItemStackToInventory(new ItemStack(Items.coal)))
          event.entityLiving.dropItem(Items.coal, 1);
          event.entityLiving.setCurrentItemOrArmor(1, null);}
           }
     
     
    #1 Jodge, 14 Juil 2014
    Dernière édition: 14 Juil 2014
  2. pifou92000

    pifou92000 Mineur de Diamants

    Inscrit:
    23 Juin 2011
    Messages:
    2 690
    Points:
    195
    Sexe:
    Homme
    Es-tu sûr que c'est la ligne en commentaire qui ne marche pas ?
    Ça pourrait très bien être la condition "if(boots.stackSize==0)" qui n'est pas validée.
    Je te conseille déjà de faire du debug, en affichant du texte dans la console, pour voir si on rentre bien dans la condition.
    Si ce n'est pas le cas, affiche dans la console boots.stackSize pour comprendre pourquoi ça ne vaut pas 0.
     
  3. Jodge

    Jodge Explorateur

    Inscrit:
    13 Oct 2013
    Messages:
    65
    Points:
    89
    Sexe:
    Homme
    Heu... J'ai pas testé la condition pour voir si elle marchais ou non, mais je sais que le problème (ou la majeur partie) viens bien de la ligne en commentaire, puisque ce n'est pas la bonne syntaxe (erreur Eclipse)... Le problème c'est que je n'arrive pas a trouver la bonne syntaxe dans les packages Event...

    Sous spoiler je met la classe complète :

    Code (cpp):

    package vanilla_armor_extend.common;

    import java.util.Random;

    import net.minecraft.entity.item.EntityItem;
    import net.minecraft.init.Blocks;
    import net.minecraft.init.Items;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.MathHelper;
    import net.minecraftforge.event.entity.EntityEvent;
    import net.minecraftforge.event.entity.item.ItemEvent;
    import net.minecraftforge.event.entity.living.LivingHurtEvent;
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;

    public class LivingEventHandler {

       @SubscribeEvent
       public void onLivingHurtEvent(LivingHurtEvent event) {
         if (event.source.getDamageType().equals("onFire")) {

           ItemStack boots = event.entityLiving.getEquipmentInSlot(1);


           if (boots != null
               && boots.getItem() == ModVanilla_armor_extend.Woodboots) {
             boots.damageItem(MathHelper.floor_float(event.ammount*2),
                 event.entityLiving);
             if (boots.stackSize == 0) {
               event.entityLiving.addItemStackToInventory(new ItemStack(Items.coal, 1));
             }
           }

         }
       }
    }



     
     
  4. pifou92000

    pifou92000 Mineur de Diamants

    Inscrit:
    23 Juin 2011
    Messages:
    2 690
    Points:
    195
    Sexe:
    Homme
    Ah d'accord, tu n'avais pas précisé que l'erreur était à la compilation. Remplace la condition par ça :
    Code (cpp):
    if (boots.stackSize == 0 && event.entityLiving instanceof EntityPlayer)
                   if(!((EntityPlayer)event.entityLiving).inventory.addItemStackToInventory(new ItemStack(Items.coal)))
                       event.entityLiving.dropItem(Items.coal, 1);
           
    En gros, si les bottes sont mortes et que l'entité est un joueur, on essaie d'ajouter le charbon à l'inventaire, si ça ne marche pas (inventaire plein), le charbon drop par terre.
     
  5. Jodge

    Jodge Explorateur

    Inscrit:
    13 Oct 2013
    Messages:
    65
    Points:
    89
    Sexe:
    Homme
    L'objet est correctement donner, en revanche, il m'en donne a chaque fois que je prend des dégâts a cause du feu, et ceux jusqu’à ce que les flammes s’arrête (il uptade alors et supprime les bottes, et l'armure donner par celle ci) ...

    Je vais réfléchir a passer outre ce problème, mais merci pour ton aide :D


    Par contre, sans vouloir abusé, tu pourrais m’expliquer "instanceof", parceque je n'ai jamais vue cette fonction ^^'
     
  6. pifou92000

    pifou92000 Mineur de Diamants

    Inscrit:
    23 Juin 2011
    Messages:
    2 690
    Points:
    195
    Sexe:
    Homme
    Pas de problème, c'est normal que tu cherches à comprendre le code de ton mod. x)
    Ce n'est pas une fonction mais un mot clé qui s'utilise comme ça : "Objet instanceof Classe"
    L'expression renvoie true si l'objet est une instance de la classe spécifiée, false sinon.
    Par exemple "entity instanceof EntityZombie" renvoie true si entity est un Zombie ou PigZombie (car EntityPigZombie est une classe fille de EntityZombie), mais false s'il s'agit d'une autre entité.
    En gros tu peux traduire instanceof par "est un". Donc dans le cas qui t'intéresse, on vérifie que l'entité est un joueur.

    N'hésite pas à demander si tu as encore besoin d'aide.
     
  7. Jodge

    Jodge Explorateur

    Inscrit:
    13 Oct 2013
    Messages:
    65
    Points:
    89
    Sexe:
    Homme
    Ha d'accord ! Bha merci bien, je passe le sujet en résolu, et je rajoute le code final (sans le bug de duplication) pour ceux qui aurai le même problème :)
     

Partager cette page