11 sept. 2013, 15:42

Salut à tous!

Dans ce tutoriel, vous allez apprendre à créer un achievement que vous pourrez activer quand vous voulez!

Sommaire

  1. Initialisation de l’achievement.
  2. Préparation des fichiers .lang
  3. Activation !
  4. Une page ?

L’initialisation

Dans votre classe principale, créez une nouvelle variable de type Achievement:

public Achievement achievementTuto;

Dans une méthode preInit, initialisez votre variable comme ceci:

achievementTuto = new Achievement(ID,NAME,X,Y,ITEM,PARENT).registerAchievement();

Explications:
ID (int): représente un nombre utilisé par Minecraft pour reconnaître l’achievement.
NAME (String): le nom utilisé dans les fichiers de lang pour changer le nom de l’achievement.
X;Y: La position de l’icône (en cases qui peut contenir chacune un achievement) de l’achievement sur le menu des achievements. (0;0 étant la position de l’achievement “Ouvrir l’inventaire”)
ITEM: Une instance de bloc, d’item ou un itemstack pour être afficher comme icône.
PARENT: L’achievement requis pour être débloqué. Null si l’achievement est débloqué directement (comme celui “Ouvrir l’inventaire”)

Exemple:

achievementTuto = new Achievement(2100,"achievementTuto",-2,0,Block.dirt,AchievementList.openInventory).registerAchievement();

En suivant cet exemple, vous devriez avoir un résultat comme cela:
0_1529788066568_tutoAchievements1.png

L’ajout du contenu via les fichiers .lang

Créez un fichier en_US.lang (et fr_FR.lang pour le français) (si ce n’est pas déjà fait) que vous placerez dans
assets.modid.lang
Où vous replacerez le “modid” par le modid du votre en minuscules.
achievementsLang.png

Si tout va bien de votre côté, vous devriez avoir ceci:
tutoAchievements2.png

L’activation

Pour l’activation, c’est très simple.
Pour ce tutoriel, cela consistera à récupérer un cube de terre.
Je vais utiliser l’event drop, donc allez voir le tuto de robin ici: https://www.minecraftforgefrance.fr/topic/78/l-event-drop

@ForgeSubscribe
public void onBlockPickedUp(EntityItemPickupEvent event)
{
    if(event.item.getEntityItem().itemID == Block.dirt.blockID)
    {
        if(event.entityPlayer != null)
            event.entityPlayer.triggerAchievement(achievementTuto);
    }
}

La partie qui nous intéresse ici est celle-ci:

event.entityPlayer.triggerAchievement(achievementTuto);

C’est cette instruction qui va activer l’achievement donné au joueur 🙂

On teste maintenant!

Récupérez un cube de terre et… magie! L’achievement est activé!
tutoAchievements3.png

Vous pouvez activé un achievement avec n’importe quel méthode qui a en argument EntityPlayer.
Quelques autres exemples utiles :
Dans la fonction init de la classe principale :

GameRegistry.registerCraftingHandler(new CraftingHandler());

La classe CraftingHandler :

package mon.package;

public class CraftingHandler implements ICraftingHandler
{
    @Override
    public void onCrafting(EntityPlayer player, ItemStack stack, IInventory craftMatrix)
    {
        //exécuté lorsqu'un item/bloc est crafté
        if(stack.itemID == ClassePrincipale.monItem.itemID/monBloc.blockID && stack.getItemDamage() == metadata_voulu)
        {
            player.triggerAchievement(ClassePrincipale.nomDeLAchievement);
        }
    }

    @Override
    public void onSmelting(EntityPlayer player, ItemStack stack)
    {
        //exécuté lorsqu'un item/bloc est cuit
        if(stack.itemID == ClassePrincipale.monItem.itemID/monBloc.blockID && stack.getItemDamage() == metadata_voulu)
        {
            player.triggerAchievement(ClassePrincipale.nomDeLAchievement);
        }
    }
}

À nouveau dans la classe principale :

GameRegistry.registerPlayerTracker(new PlayerTracker());

La classe :

package mon.package;

public class PlayerTracker implements IPlayerTracker
{
    @Override
    public void onPlayerLogin(EntityPlayer player)
    {
        //exécuté lorsque le joueur lance un monde, peut être utilisé pour les achievements du genre "installez xxx mods".
        player.triggerAchievement(ClassePrincipale.installMod);
    }

    @Override
    public void onPlayerLogout(EntityPlayer player)
    {
        //exécuté lorsque le joueur quitte un monde, inutile pour les achievements.
    }

    @Override
    public void onPlayerChangedDimension(EntityPlayer player)
    {
        //exécuté lorsque le joueur change de dimension.
        if(player.dimension == ClassePrincipale.MaDimensionID)
        {
            player.triggerAchievement(ClassePrincipale.dimensionAchievement);
        }
    }

    @Override
    public void onPlayerRespawn(EntityPlayer player)
    {
        //exécuté lorsque le joueur respawn.
    }
}

Retour sur les events, par exemple avec l’event “LivingFallEvent” :

    @ForgeSubscribe
    public void onLivingFall(LivingFallEvent event)
    {
        if(event.entity.isDead && event.entity instanceof EntityPlayer && event.distance > 64F)
        {
            ((EntityPlayer)event.entity).triggerAchievement(ClassePrincipale.longueChute);
        }
    }

L’event death :

    @ForgeSubscribe
    public void onLivingDeath(LivingDeathEvent event)
    {
        if(event.entityLiving instanceof EntityCreeper && event.source.getEntity() != null && event.source.getEntity() instanceof EntityPlayer)
        {
            ((EntityPlayer)event.source.getEntity()).triggerAchievement(ClassePrincipale.killCreeper);
        }
    }

Il y a beaucoup d’autre fonction ayant EntityPlayer en paramètre, il serait difficile de toutes les lister, mais vous avez déjà 5 exemples, ça devrait être suffisant 😉

Une page ?

À la suite des déclarations, déclarez votre page :

public static AchievementPage maPage;

Ensuite, dans la méthode preInit après les achievements, initialisez et enregistrez-la :

maPage = new AchievementPage("Nom de la page", achievementTuto, achievementTuto2, achievementTuto3, […]);
AchievementPage.registerAchievementPage(maPage);

Votre méthode preInit devrait ressembler à ça :

@EventHandler
public void PreInit(FMLPreInitializationEvent event)
{
    // Configuration
    […]
    // Blocks
    […]
    // Enregistrement des blocs
    […]
    // Items
    […]
    // Enregistrement des items
    […]
    // Achievements
    achievementTuto = new Achievement(2100, "achievementTuto", -2, 0, Block.dirt, AchievementList.openInventory).registerAchievement();
    achievementTuto2 = new Achievement(2101, "achievementTuto2", -1, 0, this.BlockTutorial, null).registerAchievement();
    maPage = new AchievementPage("Nom de la page", achievementTuto, achievementTuto2);
    AchievementPage.registerAchievementPage(maPage);
}

Les blocs est items doivent être initialisés avant les achievements (sinon NPE (= NullPointerException)), et la page après les achievements (pareil, si vous ne le faite pas dans cette ordre, craft avec NPE). Petit rappel, si en icône vous voulez mettre un bloc ou item de votre mod, il faudra utiliser this.nomDuBloc/Item et non Item. ou Block.

Voilà! Vous savez maintenant créer un achievement pour vos mods! 😄

Questions / Réponses

Rien pour l’instant.