SOLVED Event Forge : DrawBlockHighlightEvent

  • Moddeurs confirmés Rédacteurs

    Bonsoir, j’aimerai déclencher un achievement via l’évènement “DrawBlockHighlightEvent”, je sais que c’est un event qui se déclenche côté client mais je ne sais pas trop comment faire.

    #Ma classe qui gère les events côté client(Ma classe qui gère les events côté client)

    package fr.andemar.common;
    
    import net.minecraftforge.client.event.DrawBlockHighlightEvent;
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    
    public class EventSolo {
    
    @SubscribeEvent
    public void onWatchingBlock (DrawBlockHighlightEvent event)
    {
    if((event.player.getEntityWorld().getBlock(event.target.blockX, event.target.blockY, event.target.blockZ) == Andemar.adamantiumOre)  )
    {
    if(event.player != null)
    event.player.triggerAchievement(Andemar.seeAdamantiumOre);
    }
    }
    
    }
    

    Je test si le bloc pointé correspond à mon bloc adamantiumOre, si oui alors je déclenche mon achievement.

    Voici aussi ma méthode init()

    #Méthode init()(Méthode init())

    @EventHandler
    public void init(FMLInitializationEvent event)
    {
    proxy.registerRender();
    proxy.registerTileEntityRender();
    
    if(event.getSide().isClient())
    {
    MinecraftForge.EVENT_BUS.register(new EventSolo());
    }
    MinecraftForge.EVENT_BUS.register(new Event());
    FMLCommonHandler.instance().bus().register(new Event());
    
    }
    

    Le jeu se lance sans erreur et ma fonction onWatchingBlock est bien appelée (test par message affichant le nom du bloc pointé -> test concluant) cependant lorsque je pointe mon bloc adamantiumOre, mon achievement ne se déclenche pas. Je soupçonne le fait que l’erreur vienne de ma méthode init().

    J’espère que vous pourrez m’aider. Merci d’avance.


  • @‘bodri’:

    Bonsoir, j’aimerai déclencher un achievement via l’évènement “DrawBlockHighlightEvent”, je sais que c’est un event qui se déclenche côté client mais je ne sais pas trop comment faire.

    #Ma classe qui gère les events côté client(Ma classe qui gère les events côté client)

    package fr.andemar.common;
    
    import net.minecraftforge.client.event.DrawBlockHighlightEvent;
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    
    public class EventSolo {
    
    @SubscribeEvent
    public void onWatchingBlock (DrawBlockHighlightEvent event)
    {
    if((event.player.getEntityWorld().getBlock(event.target.blockX, event.target.blockY, event.target.blockZ) == Andemar.adamantiumOre)  )
    {
    if(event.player != null)
    event.player.triggerAchievement(Andemar.seeAdamantiumOre);
    }
    }
    
    }
    

    Je test si le bloc pointé correspond à mon bloc adamantiumOre, si oui alors je déclenche mon achievement.

    Voici aussi ma méthode init()

    #Méthode init()(Méthode init())

    @EventHandler
    public void init(FMLInitializationEvent event)
    {
    proxy.registerRender();
    proxy.registerTileEntityRender();
    
    if(event.getSide().isClient())
    {
    MinecraftForge.EVENT_BUS.register(new EventSolo());
    }
    MinecraftForge.EVENT_BUS.register(new Event());
    FMLCommonHandler.instance().bus().register(new Event());
    
    }
    

    Le jeu se lance sans erreur et ma fonction onWatchingBlock est bien appelée (test par message affichant le nom du bloc pointé -> test concluant) cependant lorsque je pointe mon bloc adamantiumOre, mon achievement ne se déclenche pas. Je soupçonne le fait que l’erreur vienne de ma méthode init().

    J’espère que vous pourrez m’aider. Merci d’avance.

    Nan ta méthode init est correct cependant ajoute un
    @SideOnly(Side.CLIENT)
    Au dessus de ta méthode event comme ça ton jeu sera sûr de déclencher cet event que en client
    Et de 2 je pense que c’est parce que la méthode pour les achievements est du côté du serveur. Essaie donc de remonter cette méthode pour voir et si c’est le cas il faudra envoyer un packet.
    J’espère t’avoir aidé si tu as du mal avec les packets je peux peut-être aidé et en plus il y a une vidéo sur la chaine youtube de mff qui explique très bien ^^


  • 
    if(event.player != null)
    
    

    Cette condition ne sert à rien puisque si ton event.player est null, tu auras un NPE dans la ligne avant.

    
    event.player.triggerAchievement(Andemar.seeAdamantiumOre);
    
    

    Je ne connais pas très bien la méthode triggerAchievement mais je doute qu’elle ai en seul paramètre un block. (Je n’ai pas accès aux sources de Minecraft en ce moment donc quel paramètre est attendu dans cette méthode ?)


  • @‘SCAREX’:

    
    if(event.player != null)
    

    Cette condition ne sert à rien puisque si ton event.player est null, tu auras un NPE dans la ligne avant.

    
    event.player.triggerAchievement(Andemar.seeAdamantiumOre);
    

    Je ne connais pas très bien la méthode triggerAchievement mais je doute qu’elle ai en seul paramètre un block. (Je n’ai pas accès aux sources de Minecraft en ce moment donc quel paramètre est attendu dans cette méthode ?)

    Ce n’est pas un block ce qu’il y a en paramètre c’est un achievement, sinon il n’aurait pas mis see devant AdmantiumOre, du moins je pense.

  • Administrateurs Rédacteurs Moddeurs confirmés

    Le problème c’est que la fonction triggerAchievement n’a que effet côté serveur.
    Il faut donc passer par un paquet.

  • Moddeurs confirmés Rédacteurs

    Merci à tous pour vos réponses, je me mettrai à code les packets dès que j’en aurai le temps. Et effectivement Andemar.seeAdamantiumOre est un achievement et non pas un bloc.

    Encore merci !