Après quelques recherches, nous nous sommes rendu compte que « modding » prend deux ‘d’. Vous avez été nombreux à nous faire remarquer le manque de contenu dans les articles du guide et cette fois ci, vous allez être servis en informations avec ces 3194 mots exactement ! Aujourd’hui, nous aborderons la première partie du codage, mais avant tout, comme la semaine dernière, un petit planning :
Commençons tout de suite avec la création !
Vous avez été nombreux à attendre ce moment où nous allons enfin coder. Quelque chose de simple pour commencer : lançons Eclipse. De là, il vous faut créer un nouveau fichier que nous allons appeler « mod_minecraftfr » ; vous n’êtes pas obligé de mettre comme moi le « minecraftfr » mais il est à savoir qu’il faut obligatoirement mettre le « mod_ » devant. Si tout se passe bien vous devriez avoir :
package net.minecraft.src;
public class mod_minecraftfr {
}
dans votre classe. Maintenant, il faut faire un héritage vers le fichier « BaseMod » de Modloader. Pour ça, on ajoute simplement « extends BaseMod » après « public class mod_minecraftfr » ce qui devrait vous donner :
public class mod_minecraftfr extends BaseMod
À quoi sert un héritage ? Et bien tout simplement à donner les propriétés de la class héritée. C’est à dire que maintenant, notre class « mod_minecraftfr » a les mêmes propriétés que le fichier « BaseMod » de ModLoader.
Si tout a fonctionné, « mod_minecraftfr » devrait être souligné en rouge. Nous allons passer notre souris dessus, sans cliquer, et attendre qu’il nous affiche quelque chose. Il vous suffira de cliquer sur « Add unimplamented methods » qui va simplement ajouter les fonctions abstraites du fichier « BaseMod ».
Maintenant que nous avons fait le plus simple, passons à la partie code ! Normalement votre fichier devrait ressembler à :
package net.minecraft.src;
public class mod_minecraftfr extends BaseMod {
@Override
public String getVersion() {
// TODO Auto-generated method stub
return null;
}
@Override
public void load() {
// TODO Auto-generated method stub
}
}
Il nous faut créer la première méthode dans ce fichier qui doit obligatoirement s’appeler « mod_minecraftfr » ; la fonction sera donc :
public mod_minecraftfr()
{
}
à ajouter entre
public class mod_minecraftfr extends BaseMod {
et
@Override
public String getVersion() {
// TODO Auto-generated method stub
return null;
}
C’est dans cette méthode que nous ajouterons la création du bloc et de l’item, ainsi que pour leur ajouter un nom et une recette. Pour ça il va falloir faire appel à la class « ModLoader ». Nous allons créer notre premier bloc avec le code :
ModLoader.registerBlock(premierbloc);
qui demande, ici, à ModLoader d’ajouter le bloc représenté par la variable « premierbloc ». Pour ceux qui ont suivi jusqu’ici, vous devriez en être là :
public mod_minecraftfr()
{
ModLoader.registerBlock(premierbloc);
}
Nous allons maintenant, ajouter un nom à notre bloc grâce à la fonction : addName. La fonction sera donc :
ModLoader.addName(premierbloc, "Le bloc du tutoriel");
Pourquoi j’ai remis la variable « premierbloc » ? Car il faut que le bloc « premierbloc » ait comme nom « Le bloc du tutoriel » !
Et maintenant c’est certainement le code le plus dur à comprendre, comment lui ajouter une recette. Il nous faut tout d’abord, utiliser la fonction : addRecipe. Ce qui va nous donner finalement :
ModLoader.addRecipe(new ItemStack(premierbloc, 1), new Object[]
{"X", Character.valueOf('X'), Item.stick});
Ne faites pas la grimace, nous allons tout détailler ! On demande d’abord à ModLoader de créer une nouvelle recette, ensuite le « new ItemStack » dit à Minecraft qu’il va falloir créer une nouvelle pile d’item. Avec le « premierbloc » on lui dit qu’il faut qu’il nous créer l’objet « premierbloc » et le 1 signifie qu’on en veut un. Le « new Object[] » est impossible à expliquer. Voilà le plus important de ce code : la recette en elle-même. Ici le X signifie que pour avoir notre bloc, il nous faut placer dans la table de craft 1 stick. La recette peut donc être
comme
Si nous avions voulu faire le même craft que la table d’enchantement par exemple le code aurait été :
ModLoader.addRecipe(new ItemStack(premierbloc, 1), new Object[]
{" B ", "DOD", "OOO", Character.valueOf('O'), Block.obsidian, Character.valueOf('B'), Item.book, Character.valueOf('D'), Item.diamond});
En fait, les lettres B, DOD et OOO sont des représentations littéraires des objets à mettre dans la table de crafting : si on considère que O c’est de l’obsidienne, B un livre et D du diamant et qu’on met les lignes du craft les unes sur les autres on tombe sur ça :
B
DOD
OOO
Ce qui correspond au patron in-game de la table d’enchantement !
Voilà maintenant le passage le plus dur. La création de la variable et l’instauration des paramètres de bloc. Donc on va sortir de la méthode que nous modifions jusqu’ici et nous allons donc initialiser notre variable « premierbloc ». Pour ça il va falloir écrire :
public static final Block premierbloc;
Nous venons d’initialiser le bloc. Le seul problème c’est que notre bloc n’a ni texture, ni ID, ni résistance, ni son, ni nom. Il va falloir continuer d’initialiser notre variable pour que le jeu reconnaisse notre bloc comme un vrai bloc.
public static final Block premierbloc = new BlockPremierBloc;
Le jeu comprend maintenant que la variable « premierbloc » est attribué à la classe « BlockPremierBloc ». Rien de vous fait tilt dans la tête ? Nous n’avons même pas encore créé cette classe ! Et nous le ferons tout à l’heure. En attendant, finissons notre bloc. Maintenant il faut lui donner un ID unique et une texture grâce, encore, à une fonction de ModLoader.
public static final Block premierbloc = new BlockPremierBloc(125, ModLoader.addOverride("/terrain.png","/minecraftfr/premierbloc.png"));
Ici nous avons mis en ID 125, sachez que lors de la rédaction de ce tutoriel, le dernier ID utilisé par Minecraft est le 124 c’est pour quoi nous avons utiliser 125. Aussi, nous demandons à ModLoader d’ajouter une texture grâce à la fonction « addOverride » ; ensuite, nous faisons appel au terrain.png et ça il ne faut pas le toucher ! Par contre, nous faisons appel juste après à l’image « premierbloc.png » qui est placé dans le dossier « minecraftfr ». Vous l’aurez compris il faut le créer !
Pour créer ce dossier il vous faut retourner dans le dossier « jars » de MCP et accéder à votre minecraft.jar avec 7ZIP ou Winrar.
Et vous placez dans ce dossier la texture de votre nouveau bloc. Nous allons utiliser, pour ce tutoriel, la texture d’un bloc de redstone :
Enregistrez la bien sous le nom « premierbloc » et sous l’extension d’image « .png ». Vous pouvez lancer le jeu ? Que nenni ! Il nous reste encore quelques paramètres à mettre sur notre bloc. Pour commencer la résistance à l’explosion et la résistance à la main. Pour ça nous allons utiliser un petit morceau de la variable de l’obsidian.
public static final Block obsidian = new BlockObsidian(49, 37)
.setHardness(50F).setResistance(2000F);
Bien entendu ce code n’est pas l’original, nous l’avons simplement modifié de façon à l’adapter à nos capacités actuelles. Ici nous pouvons voir que le hardness vaut 50, nous pouvons donc imaginer que c’est la destruction à la main et la Resistance c’est la résistance aux explosions. Donc nous allons mettre dans la variable de notre bloc
public static final Block premierbloc = new BlockPremierBloc(125, ModLoader.addOverride("/terrain.png","/minecraftfr/premierbloc.png"))
.setHardness(1.5F).setResistance(2F);
Donc la résistance à la main est de 1,5 et la résistance aux explosifs est de 2. Maintenant il faut faire appel au nom de la variable dans la fonction setBlockName de la class Block. Pour ça on va simplement ajouter :
public static final Block premierbloc = new BlockPremierBloc(125, ModLoader.addOverride("/terrain.png","/minecraftfr/premierbloc.png"))
.setHardness(1.5F).setResistance(2F).setBlockName("premierbloc");
Ce qui est entre guillemets doit obligatoirement être votre variable. Il nous reste plus qu’une chose à paramétrer sur notre bloc : le son. Pour ça nous allons utiliser la fonction setStepSound.
public static final Block premierbloc = new BlockPremierBloc(125, ModLoader.addOverride("/terrain.png","/minecraftfr/premierbloc.png"))
.setHardness(1.5F).setResistance(2F).setBlockName("premierbloc").setStepSound(Block.soundGrassFootstep);
On peut voir tout simplement ici que nous avons demander à Minecraft de nous jouer le son de la grass (ou de l’herbe pour ceux qui ont le jeu en français). Il existe d’autres types de sons qui sont énumérés à la suite :
– Glass
– Grass
– Wood
– Gravel
– Sand
– Metal
– Stone
Nous venons de terminer notre travail sur le fichier « mod_minecraftfr » mais vous ne pouvez toujours voir votre bloc en jeu et ça vient tout simplement qu’il vous manque un fichier primordial : BlockPremierBloc. Donc nous allons le créer mais avant tout je vous donne le code complet de « mod_minecraftfr » pour éviter que vous ne vous perdiez.
package net.minecraft.src;
public class mod_minecraftfr extends BaseMod {
public static final Block premierbloc = new BlockPremierBloc(125, ModLoader.addOverride(“/terrain.png”, “/minecraftfr/premierbloc.png”))
.setBlockName(“premierbloc”).setHardness(1.5F)
.setResistance(2F).setStepSound(Block.soundGrassFootstep);
public mod_minecraftfr()
{
ModLoader.registerBlock(premierbloc);
ModLoader.addName(premierbloc, “Le bloc du tutoriel”);
ModLoader.addRecipe(new ItemStack(premierbloc, 1), new Object[]
{“X”, Character.valueOf(‘X’), Item.stick});
}
@Override
public String getVersion() {
// TODO Auto-generated method stub
return null;
}
@Override
public void load() {
// TODO Auto-generated method stub
}
}
Ceci fait, nous pouvons créer notre fichier « BlockPremierBloc ». Si tout se passe bien vous devriez avoir :
package net.minecraft.src;
public class BlockPremierBloc {
}
Ici nous allons faire comme tout à l’heure, c’est à dire créer un héritage de la class Block. Votre code devrait, normalement, ressembler à ça :
package net.minecraft.src;
public class BlockPremierBloc extends Block {
}
Mais là, comme tout à l’heure, il va falloir survoler « BlockPremierBloc » et cliquer sur « Add constructor ‘BlockPremierBloc(int, int, Material)’ ».
Le code doit ressembler à :
package net.minecraft.src;
public class BlockPremierBloc extends Block {
protected BlockPremierBloc(int par1, int par2, Material par3Material) {
super(par1, par2, par3Material);
// TODO Auto-generated constructor stub
}
}
C’est maintenant qu’un partie légèrement plus dure va arriver. Entre parenthèse dans la fonction nous pouvons lire :
int par1, int par2, Material par3Material
Là dedans il va vous falloir supprimer «, Material par3Material » pour la simple raison que nous ne nous en servirons pas et ce, quel que soit le mod que vous réalisez avec ModLoader. Et maintenant la partie la plus simple dans ce fichier. Nous pouvons voir ce code :
super(par1, par2, par3Material);
et nous allons le modifier en
super(par1, par2, Material.grass);
Maintenant, une petite explication. En fait nous disons simplement à Minecraft que le bloc de nous venons de créer est de type « grass ». Il existe d’autres types que nous vous laissons découvrir directement dans les codes.
Si vous avez bien suivi jusque là, vous devriez avoir ceci après le craft :
Et bien chers lecteurs, vous venez de réaliser votre premier bloc !
Passons maintenant à la création de l’item. Cette partie est plus courte car nous avons vu une grosse partie dans la partie dédiée à la création du bloc.
Nous allons tout simplement reprendre notre fichier « mod_minecraftfr » ajouter le nom et la recette de notre item comme tout à l’heure pour le bloc. Pour ceux qui auraient déjà oublié, nous allons revoir les code ensemble.
ModLoader.addName(premieritem, "L'item du tuto");
Comme tout l’heure, j’ai appliqué le texte « L’item du tuto » à la variable « premieritem » que nous créerons tout à l’heure. Maintenant il nous faudra ajouter la recette. Pour cette recette nous allons faire un bâton de redstone donc nous allons créer un recette semblable à une pelle.
[spoiler]ModLoader.addRecipe(new ItemStack(premieritem, 1), new Object[]
{" # ", " X ", " X ", Character.valueOf('X'), Item.blazeRod, Character.valueOf('#'), Item.redstone});
[/spoiler]
Ceci fait il nous faut créer la variable « premieritem » qui, comme le bloc, va définir les paramètres. La première chose à faire est de créer cette variable, l’affecter à un fichier et donner un ID à l’item. Rien de dur vous allez voir :
public static final Item premieritem = new ItemPremierItem(500);
Comme dit plus haut, j’ai initialisé ma variable, je l’ai affectée à un fichier (que nous créerons plus tard) et je lui ai donné l’ID 500. Maintenant il faut ajouter comme paramètre le nom du bloc qui est obligatoirement le même que votre variable soit ici « premieritem » :
public static final Item premieritem = new ItemPremierItem(500).setItemName("premieritem");
Et maintenant la chose la plus aisée, lui affecter une texture. Nous allons utiliser deux fonctions pour ça : la fonction setIconIndex de Minecraft et la fonction addOverride de ModLoader.
Bon je vous l’accorde on dirait plus une sucette à la fraise croisée avec une orange mais bon.
Pour ça il va falloir procéder comme suit :
public static final Item premieritem = new ItemPremierItem(500).setItemName("premieritem")
.setIconIndex(ModLoader.addOverride("/gui/items.png", "/minecraftfr/premieritem.png"));
Lorsque j’ai écrit « /gui/items.png » c’est car c’est obligatoire. Considérez le « terrain.png » des items. Lorsque vous assimilerez des textures à un item vous serez obligé de le mettre avant la texture. Maintenant que c’est fait, placez votre texture dans « .minecraft » dans le dossier « minecraftfr » que nous avons créé nous à l’heure. Vous l’aurez peut-être remarqué, nous avons attribué un fichier à notre variable qui n’existe pas ! C’est le moment de le créer. Créer ce fichier et héritez le de la class « Item ». Votre code devrait ressembler à celui ci :
package net.minecraft.src;
public class ItemPremierItem extends Item {
}
Comme pour « BlockPremierBloc » survolez ItemPremierItem et cliquez sur « Add constructor ‘ItemPremierItem(int)’ ». Comme un bloc de décoration ou un item d’encombrement n’est pas intéressant, nous allons nous atteler à leur donner des fonctions simples pour le début mais la semaine prochaine nous verrons les fonctions de Minecraft plus en détail afin de mieux s’amuser avec nos blocs et items.
Comme il est plus intéressant de savoir à l’avance nos objectifs nous allons en fixer deux. Deux simples pour se mettre dans le bain. Pour l’item, notre but est que lorsqu’on fait clique droit sur un bloc de fer, il va se transformer en bloc de redstone précédemment créé. Et pour notre bloc, on va lui faire droper de la redstone, par nombre de 5. Simple vous pensez ? Nous allons voir ça tout de suite !
On va commencer par le bloc car c’est le plus simple des deux. Le mieux pour commencer est de demander à Minecraft que notre bloc drope de la redstone. Dans le fichier Block de Minecraft il existe une fonction idDropped et une autre fonction quantityDropped. Nous allons donc utiliser les deux. Comme c’est une nouvelle fonction, il va falloir l’ajouter en la première et la dernière accolade ( { et } ) de notre fichier BlockPremierBloc.
La première fonction à ajouter est idDropped :
public int idDropped(int par1, Random par2Random, int par3)
{
return mod_minecraftfr.premierbloc.blockID;
}
Dans ce code nous voyons que nous avons fait appel à la variable qui est contenue dans notre fichier « mod_minecraftfr » et qui représente notre bloc. Attendez un instant, nous demandons à Minecraft qu’il se drope lui même ; le Java nous offre une possibilité pour raccourcir ce code :
public int idDropped(int par1, Random par2Random, int par3)
{
return this.blockID;
}
Ce petit mot « this » veut dire en Java « lui-même », donc nous demandons tout simplement à Java qu’il drope le bloc lui même. Si vous vous rappelez bien, notre objectif est de faire droper à notre bloc, de la redstone. Vous comprendrez que nous ne pouvons pas demander à Minecraft de droper le bloc dans ce cas là. Il va falloir faire appel à la class Item.
public int idDropped(int par1, Random par2Random, int par3)
{
return Item.redstone.shiftedIndex;
}
Comme la redstone est un item déjà présent dans Minecraft, il vous suffit de faire appel à lui. Vous avez peut-être remarqué le « blockID » s’est changé en « shiftedIndex », cela est dû au fait nous sommes passé d’un bloc à un item ; avouez que si nous avions mis « blockID » lorsqu’on fait appel à un item, le code n’aurait plus de logique ! Bon maintenant que nous avons notre item qui est dropé, il faut le faire droper un nombre de fois voulu et pour ça nous faisons appel à la fonction quantityDropped :
public int quantityDropped(Random par1Random)
{
return 5;
}
Donc comme nous pouvons le voir ici, nous avons fait appel à notre fonction et nous lui avons assimilé 5 de drop. Notre bloc est désormais fini, tout fonctionne ; le drop est opérationnel, passons maintenant à l’item.
Pour l’item c’est un poil plus dur. Il va falloir modifier cette fois ci notre fichier « ItemPremierItem ». Il va falloir utiliser la fonction onItemUse faire une condition pour récupérer l’ID du bloc sur lequel on fait clique droit et le changer en bloc de redstone. On va commencer par récupérer l’ID du bloc et ses coordonnées :
public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int i, int j, int k, int l)
{
if(par3World.getBlockId(i, j, k) == Block.blockSteel.blockID)
{
return true;
}
return false;
}
Ici nous avons fait appel au monde via « par3World » et nous avons récupérer l’ID du bloc via la fonction getBlockID. Nous avons récupéré les coordonnées du bloc avec les variable i, j et k et nous avons fait en sorte que si l’ID du bloc est celui du bloc de fer alors il exécute le code qui est entre les accolades. Maintenant, comment faisons-nous pour le bloc se transforme ? Nous demandons au monde de changer le bloc et de mettre le monde à jour grâce à la fonction setBlockWithNotify !
public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int i, int j, int k, int l)
{
if(par3World.getBlockId(i, j, k) == Block.blockSteel.blockID)
{
par3World.setBlockWithNotify(i, j, k, mod_minecraftfr.premierbloc.blockID);
return true;
}
return false;
}
On n’oublie pas de donner les position du bloc via les variable i, j et k et de dire par quel bloc on veut qu’il se change ! Voilà nous avons créé notre premier, premier item et nous leur avons donné des fonctions ! Avant de vous laisser, sachez que rien de vaut un petit travail pratique !
N’oubliez pas que cette partie est réservée à ceux qui ont bien tout compris, qui ont réussi, qui ont déjà varié les codes du tutoriel, bref ceux qui ont envie de percer là dedans ! Le TP de cette semaine n’est pas très dur je l’avoue. Il consiste à ce qui suit :
– Créer un bloc qui produit de la lumière
– Créer un item qui va changer aléatoirement un bloc de stone en bloc de diamant ou bien en bloc de dirt
Rien de bien dur comme dit précédemment mais c’est une bonne technique de travail. Nous n’allons pas vous laisser sur votre fin alors on va vous léguer quelques indices :
– Pour la lumière, lors que l’initialisation de la variable il y a une fonction .setLightValue(f)
– Pour le changement de bloc aléatoirement il existe un code en Java appelé « Random » (doc.)
Bonne chance à vous jeunes codeurs, n’hésitez pas à envoyer vos codes et/ou résultats à xVoltaire par MP sur le forum !
Tout codeur à forcément besoin d’aide un jour ou l’autre, car il bug, ne trouve pas un code ou autre. Nous avons pensé à ça, surtout si vous débutez. C’est pour quoi nous avons créé un topic spécial pour les questions, problèmes ou autre à cette adresse (sur le forum de Minecraft.fr). N’hésitez pas à exprimer vos problèmes mais nous vous demandons simplement de lire le premier post avant de poster car peut-être que votre réponse se trouve dedant. En attendant, nous vous souhaitons bonne chance !
Lien du topic : http://minecraft.fr/forum/index.php?threads/les-questions-relatives-aux-articles-sur-le-modding.41135/