Problème avec les achievements



  • Salut,

    J'ai essayé de faire des achievements customs pour mon mod en suivant le tuto d'ici (qui est en 1.6.x) et en regardant des sources codes d'autres mods.
    J'ai donc ma page d'achievements, et 2 succès qui fonctionnent (récupération d'un item, et cuisson de cet item).
    Mais ils ne restent pas enregistrés, si je quitte la partie et que je reviens, tout est remit à zéro. Et ça affiche ceci en jeu:

    Voici la classe des achievements:

    package net.killermapper.roadstuff.common.init;
    
    import net.killermapper.roadstuff.common.items.RoadStuffItems;
    import net.minecraft.item.ItemStack;
    import net.minecraft.stats.Achievement;
    import net.minecraftforge.common.AchievementPage;
    
    public class RoadStuffAchievements
    {
       public static Achievement getBitumen;
       public static Achievement smeltBitumen;
    
       public static AchievementPage page;
    
       public static void loadAchievements()
       {
           getBitumen = new Achievement("achievement.roadstuff_getbitumen", "roadstuff_getbitumen", 0, 0, new ItemStack(RoadStuffItems.itemBitumen, 1, 0), null);
           smeltBitumen = new Achievement("achievement.roadstuff_smeltbitumen", "roadstuff_smeltbitumen", 0, 3, new ItemStack(RoadStuffItems.itemBitumen, 1, 1), getBitumen);
    
           page = new AchievementPage("Road Stuff", getBitumen, smeltBitumen);
       }
    
       public static void registerPage()
       {
           AchievementPage.registerAchievementPage(page);
       }
    }
    

    Tout ceci est initialisé dans le preInit(FMLPreInitializationEvent event) dans la classe principale.
    Mon code pour les events:

    package net.killermapper.roadstuff.common;
    
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    import cpw.mods.fml.common.gameevent.PlayerEvent.ItemPickupEvent;
    import cpw.mods.fml.common.gameevent.PlayerEvent.ItemSmeltedEvent;
    import net.killermapper.roadstuff.common.init.RoadStuffAchievements;
    import net.killermapper.roadstuff.common.items.RoadStuffItems;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraftforge.event.entity.EntityJoinWorldEvent;
    
    public class EventPlayer
    {
       @SubscribeEvent
       public void itemPickup(ItemPickupEvent event)
       {
           if(event.pickedUp.getEntityItem().getItem() == RoadStuffItems.itemBitumen && event.pickedUp.getEntityItem().getItemDamage() == 0)
           {
               if(event.player != null)
                   event.player.triggerAchievement(RoadStuffAchievements.getBitumen);
           }
       }
    
       @SubscribeEvent
       public void itemSmelting(ItemSmeltedEvent event1)
       {
           if(event1.smelting.getItem() == RoadStuffItems.itemBitumen) //Need to find how to get metadata here
           {
               event1.player.addStat(RoadStuffAchievements.smeltBitumen, 1);
           }
       }
    }
    
    

    Avec le FMLCommonHandler.instance().bus().register(new EventPlayer()); dans la classe principale, dans le init(FMLInitializationEvent event).

    J'ai essayé avec addStat et triggerAchievement pour voir si ça change quelque chose (d'où les 2 méthodes dans le code), mais sans succès.

    Du coup je ne sais pas ce que j'ai pu rater.

    Merci de votre aide.



  • Lors de la déclaration de l'achievement il faut l'enregistrer (.register() je crois)



  • Et oui c'était bien ça, plus précisément: .registerStat()

    En plus je les avais bien mis avant, mais je m'étais trompé dans le code à un moment et je les avais enlevé en pensant que ça venait de là… puis j'ai oublié de les remettre après avoir corrigé mon bug.

    Dire que j'ai passé tant de temps à essayer de trouver quelque chose d'aussi simple... Bref merci 🙂



  • Moi aussi j'ai bugué dessus un bon moment, d'ailleurs je comprends toujours pas la logique de devoir enregistrer des achievements