Tutoriel [1.5.1] [FORGE] Créer un Achievement !

  • Auteur de la discussion Auteur de la discussion elias54
  • Date de début Date de début

elias54

Graph & dev MFF
17 Juillet 2011
465
45
135
26
Salut à tous et à toutes c'est elias54 ! On se retrouve pour un nouveau tutoriel sur FORGE cette fois ci :D. Ce tutoriel va consiste à vous montrer comment faire un Achievement et comment faire pour qu'il se déclanche lors d'une action. (ex: Lors qu'on tue un mob, lors d'un craft, etc...)

-Avoir une class principale (pour les achievements, les proxy ne sont pas nécessaire)
-Avoir une connaissance en Java

Pour commencer, nous allons déclarer cet Achievement ! Dans votre class principale, insérez ceci au tout début du code (entre la fonction Preload et le public class) :

Code:
public static Achievement Tuto;

Ensuite, une fois cette ligne ajouté, il vous faudra maintenant (comme un item) ajouter la ligne qui déclare l'ID etc, dans la fonction load(FMLInitializationEvent event) :

Code:
Tuto = new Achievement(125, "Tuto", 0, 0, Block.bedrock, null).registerAchievement();

C'est bien beau de taper cette ligne... Mais qu'est-ce que c'est ? :D
Je vous propose de passer à l'analyse !
Tuto = new Achievement(125, "Tuto", 0, 0, Block.bedrock, null).registerAchievement();

Tuto : Ce qu'on a déclaré en premier (le public static Achievement Tuto; )
new Achievement : Ici, on définit que c'est un nouvel Achievement ;)
125 : Ce nombre définit l'ID de l'Achievement (oui oui, les achievements aussi ont leurs ID :p)
"Tuto" : C'est Tuto mais en String ^^ (Vous verrez à quoi il sert par la suite :))
0, 0 : Apparement, c'est l'emplacement de l'achievement dans le GUI des achievements, mais ça parait un peu buggé ^^
Block.bedrock : C'est l'icône qui va s'afficher quand l'achievement sera remporté.
null : On ne s'en occupe pas, dans tous les achievement, c'est la même chose. Sauf si le votre est un SOUS Achievement (donc inutile ^^)
.registerAchievement() : Et enfin, ce qui permet d'enregistrer l'achievement !

Maintenant que nous avons enregistré notre Achievements, il nous faut lui assigner un nom et une description !
Voici ce que vous devez mettre :
this.addAchievementName("Tuto", "Tuto LOL !");

"Tuto" : Vous vous rappelez quand je vous ai dis en haut que "Vous verrez à quoi il sert" ? Vous avez désormais la réponse ! :) En effet, c'est une sorte d'ID mais en String (on va en avoir besoin pour la dernière partie encore !)^^
"Tuto LOL !" : Hum.... Voici en image ce que c'est ^^

Maintenant, nous avons le nom ! Mais NE PAS oublier d'ajouter une description !

this.addAchievementDesc("Tuto", "TUEZ MOI !");

"Tuto" : J'ai déjà expliqué juste au dessus ^^

"TUEZ MOI !" : C'est la description de l'achievement qui apparaîtra dans le GUI Achievements. :)

Et voilà ! Nous avons maintenant créer notre Achievement !

Oui, mais comment faire pour que le joueur remporte l'Achievement ?
-Ah ah ^^. Et bien nous allons faire en sorte que l'achievement se déclare lors qu'on tue un mob ! :)

Dans votre Entity de mob, mettez ce code :

public void onDeath(DamageSource par1DamageSource)
{
super.onDeath(par1DamageSource);

if (par1DamageSource.getEntity() instanceof EntityPlayer)
{
((EntityPlayer)par1DamageSource.getEntity()).triggerAchievement(VotreMod.Tuto);
}
}
VotreMod : Le nom de votre class principale :)
Tuto : L'achievement ^^

Le reste du code ne concerne pas le tuto, mais je peux vous dire vite fait :
C'est en quelque sorte ce qui permet de savoir ce qui va se passer lors de la mort du mob :p
/!\ VOUS DEVEZ IMPORTER LES CLASS : EntityPlayer ET DamageSource /!\

Maintenant que nous avons notre achievement c'est b... ATTENDEZ ! Nous avons une erreur à addAchievementName et à addAchievementDesc !!!

C'est NORMAL ! On a oublié de déclarer ces méthodes ! :)

Ajoutez ce code tout en bas de votre class principal :
private void addAchievementName(String ach, String name)
{
LanguageRegistry.instance().addStringLocalization("achievement." + ach, "en_US", name);
}

private void addAchievementDesc(String ach, String desc)
{
LanguageRegistry.instance().addStringLocalization("achievement." + ach + ".desc", "en_US", desc);
}

Et voilà ! ^^ Maintenant testez et admirez le résultat. :p

J'espère que mon tuto vous a plus, si vous voulez me suivre d'avantage; RDV sur ma chaîne YouTube où je prévois (peut être) de faire des tutos en vidéo, et des petits live détente sur du modding ^^
 
  • J'aime
Reactions: RRomaric
Bonjour,

J’aurais une question : comment faire pour que l'image de l'achievement soit celle d'un item du mod en cours, qui n'est déclaré que dans init (pour pouvoir configurer l'Id) ?

En haut :
Code:
public static Item MonNouvelItem;
Ensuite : (ici l'image de "MonNouvelItem")
Code:
static final Achievement MonNouvelAchievement = new Achievement(2002, "MonNouvelAchievement", -2, 6,  MonNouvelItem, AchievementList.openInventory).registerAchievement().setSpecial();
Dans PreInit :
Code:
ItemId = configuration.getItem("ItemId", 8943).getInt(8943);

Dans Init :
Code:
MonNouvelItem = (new MonNouvelItem(ItemId, NouvelItem).setUnlocalizedName("MonNouvelItem"));


Merci :D
 
Oui, mais ça marche que si MonNouvelItem = (new MonNouvelItem(ItemId, NouvelItem).setUnlocalizedName("MonNouvelItem")); est AVANT static final Achievement […]

Or ici ce n'est pas le cas, car pour pouvoir configurer les ID dans le fichier config, MonNouvelItem = (new MonNouvelItem est mis dans Init.

Et si je met static final Achievement […] dans Init après
MonNouvelItem = (new MonNouvelItem ça ne fonctionne pas…

:)
 
C'est normal ^^

Je m'explique :
Pour pouvoir changer les id des items avec le fichier config, la déclaration de l'item, et donc sa texture se fait dans Init.

Pour l'achievement qui est au début du fichier, j'ai besoin de la texture de l'item qui n'est déclarée qu'ensuite dans Init.

Ce qui fait que quand Minecraft charge les achievements ça demande une texture d'item qui n'existe pas, vu qu'elle n'est pas encore définie.

J'espère que c'est plus compréhensible. ;)
 
Oui, c'est ce que j'ai fait !
On définit l'id dans le pre init mais on déclare l'item dans init…