Comment récupérer la vie d'un joueur lorsqu'elle change ?



  • Bonjour
    Je suis un novice avec Forge mais j'ai des bases plutôt solides avec Bukkit. Avec un ami, on a un projet en tête et pour ce projet on a besoin de récupérer la vie d'un jouer lorsque celui prend des dégâts ou récupère de la vie. J'ai donc pensé aux events mais comme c'est du côte client, c'est un peu différent. Et donc je n'ai trouvé qu'un seul event concluant : LivingAttackEvent. Mais je n'ai pas trouvé d'autres events qui sont appelés quand le joueur regagne de la vie. Donc voila, je demande votre aide. J'aimerais un moyen qui marche aussi sur serveur ( je ne sais pas si c'est possible mais ça me paraitrait logique que ça le soit, peut-être que c'est possible avec les packets, mais je n'y ai jamais vraiment touché )
    Merci d'avance pour vos réponses ^^


  • Administrateurs

    Salut,
    Il faut utiliser LivingHealEvent et LivingHurtEvent dans ton cas.



  • @'robin4002':

    Salut,
    Il faut utiliser LivingHealEvent et LivingHurtEvent dans ton cas.

    Merci pour cette réponse rapide 🙂 J'essaierai ça demain 
    Je suppose que ça marche aussi sur serveur ?



  • Oui, normalement des 2 côtés



  • @'SCAREX':

    Oui, normalement des 2 côtés

    D'accord merci à vous deux pour vos conseils 🙂



  • Bon alors j'ai essayé 2-3 trucs mais je ne sais pas si cela marche vraiment car j'envoie un message au joueur avec sa vie dedans mais je ne reçois aucun message alors je ne sais pas d'où cela vient 😕

    Le code :

    
    package com.Toinou.LifeBarMod;
    
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.util.ChatComponentTranslation;
    import net.minecraftforge.event.entity.living.LivingHealEvent;
    import net.minecraftforge.event.entity.living.LivingHurtEvent;
    import net.minecraftforge.fml.common.Mod;
    import net.minecraftforge.fml.common.Mod.EventHandler;
    import net.minecraftforge.fml.common.event.FMLInitializationEvent;
    import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
    import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
    
    @Mod(modid = Reference.MOD_ID, name = Reference.MOD_NAME, version = Reference.VERSION)
    public class MainClass {
    
        @EventHandler
        public void preInit(FMLPreInitializationEvent e) {
    
        }
    
        @EventHandler
        public void init(FMLInitializationEvent e) {
    
        }
    
        @EventHandler
        public void postInit(FMLPostInitializationEvent e) {
    
        }
    
        @EventHandler
        public void onPlayerHeal(LivingHealEvent e) {
    
            if(e.entity instanceof EntityPlayer) {
    
                float Vie = ((EntityLivingBase) e.entity).getHealth();
                String strVie = String.valueOf(Vie);
                e.entity.addChatMessage(new ChatComponentTranslation(strVie));
            }
        }
    
        @EventHandler
        public void onPlayerHurt(LivingHurtEvent e) {
    
            if(e.entity instanceof EntityPlayer) {
    
                float Vie = ((EntityLivingBase) e.entity).getHealth();
                String strVie = String.valueOf(Vie);
                e.entity.addChatMessage(new ChatComponentTranslation(strVie));
            }
        }
    
    }
    
    

    Voilà, donc comme je l'ai dit je suis débutant et je m'excuse si c'est une erreur toute bête ou un alors que je ne me suispas assez renseigné.
    J’espère que vous pourrez m'aider 🙂



  • Regarde le tuto du fofo sur les event.
    Déjà ton annotation est la mauvaise, sa devrait être @SubscribeEvent
    Vois aussi pour la ligne d enregistrement de ta classe comportant des event.



  • Tu dois enregistrer ta classe pour utiliser les événements avec MinecraftForge.EVENT_BUS.register(instanceDeLaClasse)

    PS : Pense à utiliser les balises java plutôt



  • Merci pour tous ces conseils, je vais tester ça 🙂

    PS : désolé de ne pas m'être assez renseigne, ce sont des erreurs bêtes que j'aurais pu remarquer



  • Bon, j'ai fait tout ce que vous m'avez dit et cela marche parfaitement mais que en solo 😕
    Et là j'avoue que je ne vois plus quoi faire.

    Le code de ma classe Main :

    
    package com.Toinou.LifeBarMod;
    
    import net.minecraftforge.common.MinecraftForge;
    import net.minecraftforge.fml.common.Mod;
    import net.minecraftforge.fml.common.Mod.EventHandler;
    import net.minecraftforge.fml.common.event.FMLInitializationEvent;
    import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
    import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
    
    @Mod(modid = Reference.MOD_ID, name = Reference.MOD_NAME, version = Reference.VERSION)
    public class MainClass {
    
        @EventHandler
        public void preInit(FMLPreInitializationEvent e) {
    
        }
    
        @EventHandler
        public void init(FMLInitializationEvent e) {
    
            MinecraftForge.EVENT_BUS.register(new EventClass());
        }
    
        @EventHandler
        public void postInit(FMLPostInitializationEvent e) {
    
        }
    
    }
    
    

    Et celui de ma classe où il y a mes events :

    
    package com.Toinou.LifeBarMod;
    
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.util.ChatComponentTranslation;
    import net.minecraftforge.event.entity.living.LivingHealEvent;
    import net.minecraftforge.event.entity.living.LivingHurtEvent;
    import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
    
    public class EventClass {
    
        @SubscribeEvent
        public void onPlayerHeal(LivingHealEvent e) {
    
            if(e.entity instanceof EntityPlayer) {
    
                EntityPlayer p = (EntityPlayer) e.entity;
    
                float Vie = ((EntityLivingBase) p).getHealth();
                String strVie = String.valueOf(Vie);
                p.addChatMessage(new ChatComponentTranslation(strVie));
            }
        }
    
        @SubscribeEvent
        public void onPlayerHurt(LivingHurtEvent e) {
    
            if(e.entity instanceof EntityPlayer) {
    
                EntityPlayer p = (EntityPlayer) e.entity;
    
                float Vie = ((EntityLivingBase) p).getHealth();
                String strVie = String.valueOf(Vie);
                p.addChatMessage(new ChatComponentTranslation(strVie));
            }
        }
    
    }
    
    

    J'ai vu qu'il y avait un DataWatcher, il faudrait peut-être que j'utilise ça, je vais me renseigner un peu.



  • Ton message est-il affiché 2 fois ?
    Si c'est le c'est le cas rajoute une condition de ce genre

    
    @SubscribeEvent
    public void onPlayerHurt(LivingHurtEvent e) {
    
    if(e.entity instanceof EntityPlayer) {
    
    EntityPlayer p = (EntityPlayer) e.entity;
    
    float Vie = ((EntityLivingBase) p).getHealth();
    String strVie = String.valueOf(Vie);
    if(!world.isRemote)
    p.addChatMessage(new ChatComponentTranslation(strVie));
    }
    }
    
    


  • Merci de ta réponse rapide, mais non mon message n'est pas affiché deux fois mais j'ai quand même essayé ton code mais Eclipse m'a d'abord souligné "world". J'ai essayé avec une majuscule et j'ai importé " import net.minecraft.world.World; " mais maintenant "World.isRemote" est souligné et j'ai comme message d'erreur : Cannot make a static reference to the non-static field World.isRemote.
    Du coup, je ne sais pas trop quoi faire.



  • SI ton message ne s'affiche pas 2 fois, oublie ce que j'ai dit.
    A mon avis ton event n'est appelé que sur le side Server, la vie n'est géré que par le serveur.
    Mais je ne comprends pas trop où est ton erreur. Le message est bien affiché ?



  • L'erreur est dans Eclipse en fait, "World.isRemote" est souligné et quand je passe ma souris dessus, j'ai comme erreur ": Cannot make a static reference to the non-static field World.isRemote".
    Et du coup j'aurais pas moyen de récupérer la vie avec les packets ou quelque chose dans ce style ?



  • Oui mais lis un peu mes messages…Si tu n'as pas le message t'indiquant ta vie qui apparaît 2 fois dans le chat, oublie la condition que je t'ai filée.



  • J'avais lu tes mes messages, c'est juste que tu me demandais quand même d'où venait l'erreur et je voulais donc t'expliquer.
    Finalement, j'ai trouvé un moyen d'aussi récupérer la vie sur serveur avec l'event PlayerTickEvent.
    Merci quand même pour ton aide 🙂



  • Bon si tu voulais vraiment corriger ça, il suffisait de te servir de ton paramètre e en faisant e.entity.worldObj.isRemote 😉
    N'oublie pas la balise résolue 😉



  • Je ne mets pas encore le sujet en résolu parce qu'il se passe des choses très très étranges sur les serveurs, genre j'obtiens des chiffres bizarres. Je vais un peu explorer ça.



  • Bon, il se passe des trucs assez bizarres :

    • En solo, tout va bien, les nombres correspondent avec la vie :

    Mais en multi, les chiffres semblent complétement aléatoires à certains moments :

    Au début, tout va bien :

    Mais après j'ai des chiffres complétement étranges, à moitié en rapport avec ma vie :

    Mais par contre, sur les serveurs sans Bukkit, les serveurs vanilla, tout marche bien :

    Donc je pense que ça vient de Bukkit, ça serait un peu embêtant surtout que je ne vois pas de solutions  😕

    Voici le code de mon event, mais je ne pense pas que ce soit très utile :

    
    @SubscribeEvent
        public void onPlayerTickEvent(PlayerTickEvent e) {
    
            EntityPlayer p = e.player;
            Vie = p.getHealth();
            String strVie = String.valueOf(Vie);
            p.addChatMessage(new ChatComponentTranslation(strVie));
    
        }
    
    

    J’espère que quelqu'un a une solution ..


  • Administrateurs

    Tes tests montrent clairement que le problème vient de bukkit …