Modding FR

nostre

Aventurier
13 Novembre 2010
424
5
0
30
subject_mods_32.png

Minecraft est un jeu en plein développement,aussi bien du coté de chez Mojang que de celui de la communauté, qui ne cesse de développer toujours plus de mods et de extures packs.

Cependant, pour toute personne voulant tenter le modding de Minecraft,il faudra passer par les tutoriaux du forum officiel,où le français n'est pas vraiment courant.
De plus,si la personne en question ne connait pas un minimum certaines bases de code,sa devient vite un enfer de se lancer dans le domaines...

C'est pourquoi,devant l'absence total de tutoriel français sur le sujet,et afin d'encourager de nouveaux modder français,j'ai décidé de créer le 1er Tutoriel de Modding Minecraft FR.

Le but n'est pas seulement de créer un tutoriel en français,j'esseye de faire en sorte qu'il sois le plus accessible possible pour toutes personnes, compréhensible même pour des non initiés a toutes formes de codes (ou presque).

tutorial.gif


changelog.png
ChangeLog:
changelog.png

*27-02-11: Mise a jour des tutos I et III pour MCP 29a et ModLoader Beta 1.3_01v4.
*27-02-11: Correction d'une erreur dans le tuto II,merci a Woreck de me l'avoir fait remarquer !
*11-04-11: Mise a jour complète pour Minecraft Beta 1.4_01,MCP211 et ModLoader B1.4_01 v1.
*27-04-2011: Mise a jour pour Minecraft B1.5_01,MCP v2.12 et ModLoader v3 B1.5_01.
*30-04-2011: Correction d'une erreur avec les recettes,et mise a disposition des fichiers mod_MyMod.java et BlockMyBloc.java.
exclamation.gif
*29-05-11: Mise a jour pour Minecraft B1.6.5,MCP v3.3 et ModLoader v1 B1.6.5.


! Les liens suivants sont morts !

tuto.png

green-download-arrow-grey-line.png
Tutorial Modding FR - Téléchargement:
green-download-arrow-grey-line.png

asus_download_arrow004.gif
Tuto I - Téléchargement et installation
asus_download_arrow004.gif
Tuto II - Création d'un mod simple,ajout de nouveaux blocs
asus_download_arrow004.gif
Tuto III - Compilation et tests
asus_download_arrow004.gif
Tuto IV - Quelques petits trucs a savoir avant de continuer
asus_download_arrow004.gif
Tuto - Création de nouveaux objets
asus_download_arrow004.gif
Tuto - Ajouter des blocs et objets pour le four
asus_download_arrow004.gif
Tuto - Blocs – Autres possibilités
asus_download_arrow004.gif
Tuto - Autres possibilités - objets
asus_download_arrow004.gif
Sources du mod du Tuto II

Nouveaux fichiers ajoutés suite aux liens morts à la fin du message.
Il manque juste les "Sources du mod du Tuto II".
Je précise que ce sont les fichiers d'origine, le code est parfois obsolète !
 

Fichiers joints

Pour les chiffres, ça je sais.
Le premier est l'id, le deuxième est le niveau d'armure (niveau de résistance de l'armure), le troisième l'index de rendu (?), dans les exemple que j'ai vu, c'est là qu'il mette un modLoader.addOveride(String, String), et le quatrième est le type d'équipement (0 = casque, 1 = buste, 2 = jambes et 3 = pieds).

Je vais essayer en créant un fichier .java pour chaque morceau d'armure, même si normalement, ya pas besoin de faire ça si l'armure n'a aucun effet particulier.
 
C'est bon, j'ai trouvé comment faire pour ajouter une armure ! (mais sans utiliser ModLoader, si quelqu'un arrive à ajouter correctement une armure en utilisant ModLoader, merci d'en faire part).

Je vous explique la méthode sans utiliser ModLoader (garder à l'esprit que cette méthode est mauvaise dans le sens où votre mod sera pas forcément compatible avec les autres mods).

  • Première chose à faire, ouvrez le fichier Item.java et ajouter un nouvel item correspondant à une pièce de votre armure.

    Code:
    public static Item helmetExample = (new ItemArmor(id, armorLevel, renderIndex, armorType)).setIconCoord(x, y).setItemName("helmetExample");

    Alors, id est l'id que l'on attache à l'objet. Cette id doit être unique pour chaque objet, autrement il y aura des conflits.
    armorLevel est le niveau d'armure, par défaut, il va de 0 à 4 (0 pour l'armure en cuir, 1 pour l'armure de maille et l'armure en or, 2 pour l'armure de fer et 3 pour l'armure de diamant).
    Il y a moyen de rajouter de nouveau stade de level si vous aviez envie de créer des armures plus résistantes.
    renderIndex sert à définir l'image à charger pour les textures. Par défaut, il y en a 5 (cuir, maille, fer, diamant et or). Si vous voulez ajouter une armure avec un graphisme personnaliser, il va falloir créer un nouveau champ pour le renderIndex (nous verrons à la suite comment faire).
    armorType sert à définir de quelle pièce d'armure il s'agit : 0 pour le casque, 1 pour le buste, 2 pour les jambes et 3 pour les pieds.

    setIconCoord(x, y) définit l'emplacement de l'icone correspondant à l'objet.
    Les icones se trouvent sur le fichier items.png qui se trouve dans le dossier gui. Vous devez ajouter vos icones dans ce fichier si vous voulez avoir des icones personnalisées. x correspond à la colonne et y à la ligne, ainsi, setIconCoord(10, 0) pointe l'icone de la pomme rouge.

    Finalement, setItemName("helmetExample") permet de nommer votre objet (nom utilisé dans le programme, ne sera pas visible dans le jeu).


  • Alors, voilà, ça c'était la première partie.
    Il reste une chose à faire si vous voulez avoir une texture personnelle pour votre armure.
    Assurez vous d'avoir bien placer votre fichier de texture pour votre armure dans le dossier armor. Vous devez obligatoirement donner comme nom à vos fichier "lenomdevotrearmure_1.png" s'il s'agit des textures du casque, du buste et des pieds, et "lenomdevotrearmure_2.png" s'il s'agit des textures des jambes.
    Le nom est super important ! Vous devez bien faire attention à ne pas mettre deux nom différents (dans le cas où vous avez deux fichier évidemment, si vous faite une armure sans jambières par exemple, vous pouvez vous passer du deuxième fichier).

    Maintenant, retournons au code, ouvrez le fichier RenderPlayer.java.
    Tout en bas de page, vous avez un String sous forme de tableau se nommant armorFilenamePrefix.
    Vous devriez avoir ça :

    Code:
    private static final String armorFilenamePrefix[] = {
            "cloth", "chain", "iron", "diamond", "gold"
        };

    Chaque entré correspond à un indexRender, il y en a bien 5 différents comme dit plus haut.
    Il vous suffit d'y ajouter le nom de votre armure, nom qui doit correspondre à celui que vous avez donnez à vos fichiers de texture sinon ça ne fonctionnera pas.
    Dans mon exemple, ça donnera donc :

    Code:
    private static final String armorFilenamePrefix[] = {
            "cloth", "chain", "iron", "diamond", "gold", "lenomdevotrearmure"
        };

    Si en déclarant mon objet, je lui donne un indexRender de 6, il ira voir le String qui correspond, à savoir lenomdevotrearmure, et il en déduira les fichiers à charger (en ajoutant "_1.png" ou "_2.png" à la fin).


  • Voila, il ne reste plus qu'à créer une formule de craft et le tour est jouer :) (vous pouvez évidemment créer cette formule de craft via ModLoader ou directement dans un des fichiers sources de Minecraft (RecipeArmor ou RecipeCrafting par exemple), cela n'a pas d'importance).
 
Bonjour à tous
Je viens vous supplierpour de l'aide en me prosternant car
MCP à des problèmes pour trouver Java SDK et JRE
Ma variable PATH est

C:\Program Files\Java\jdk1.6.0_24\bin;C:\Program Files\Java\jre6\bin

mais à la compilation il me dit toujours
Code:
*** Minecraft Coder Pack Version 2.9 ***
Finding javac.exe... if you want to speed this up, add it to your PATH
La syntaxe du nom de fichier, de répertoire ou de volume est incorrecte.
Path set.
Unable to locate javac.exe. Please verify that it is in the PATH.
If you don't know where to get it, please visit http://www.oracle.com/technetwor
k/java/javase/downloads/index.html and download a JDK.
Appuyez sur une touche pour continuer...

Je suis sous Seven 64 bits

Merci de votre aide
 
DarkVarano, je ne sais pas trop... Tu as vérifié que le chemin est bon ?
Tu vas dans Poste de Travail (ou Ordinateur, selon ta version de Windows), tu vas voir sur le disque C:, dans Program Files (ou Programme tout court, dépend encore), et tu cherches après le Java, puis jdk et jre6.


Sinon, j'ai enfin réussi à ajouter des armures avec ModLoader ! (en fait, c'est tout simple, je n'y arrivais pas car j'avais fait une faute (minuscule à la place d'une majuscule... Le genre de faute super conne, mais super difficile à repérer)).

Donc, voila un ptit tuto pour créer de nouvelle armure avec ModLoader (en fait, c'est très facile).

Alors, dans le fichier de votre mod (pour l'exemple, mon mod s'appellera mod_armor_example) :

Code:
public class mod_armor_example extends BaseMod{}

Ajouter une cette ligne :

Code:
public static final Item helmetExample= (new ItemArmor(id, armorLevel, renderIndex, armorType)).setIconIndex().setItemName("helmetExample");

Alors, concernant l'id, l'armorLevel et l'armorType, c'est pareil que lorsque l'on fait un mod sans ModLoader.
Petit rappel :
Alors, id est l'id que l'on attache à l'objet. Cette id doit être unique pour chaque objet, autrement il y aura des conflits.
armorLevel est le niveau d'armure, par défaut, il va de 0 à 4 (0 pour l'armure en cuir, 1 pour l'armure de maille et l'armure en or, 2 pour l'armure de fer et 3 pour l'armure de diamant).
Il y a moyen de rajouter de nouveau stade de level si vous aviez envie de créer des armures plus résistantes.
armorType sert à définir de quelle pièce d'armure il s'agit : 0 pour le casque, 1 pour le buste, 2 pour les jambes et 3 pour les pieds.

Concernant le renderIndex, c'est différent. Vous avez vu que lorsque l'on fait sans ModLoader, il faut ajouter une entré dans armorFilenamePrefix.
ModLoader nous propose une fonction permettant d'ajouter directement une entré sans aller toucher à RenderPlayer.java, cette fonction, c'est ModLoader.AddArmor(String).
Le string correspond au nom du fichier de texture qui se trouve dans le dossier armor (petit rappel, par exemple, si votre fichier texture s'appelle newArmor_1.png, alors, vous devez inscrire ModLoader.AddArmor("newArmor")).

Vous avez remarqué le setIconIndex ? Vous vous dites que d'habitude, c'est setIconCoord qui se trouve à cette endroit ?
Hé bien oui, la différence, c'est que setIconCoord va chercher l'icone dans le fichier items.png. Tandis que setIconIndex va aller chercher un fichier à part.
Ainsi, si vous voulez charger un fichier s'appelant "newHelmet.png", vous devrez écrire setIconIndex(ModLoader.addOverride("/gui/items.png", "/newHelmet.png")).
Si votre fichier se trouve dans un dossier, n'oublier pas de préciser le chemin d'accès, ainsi, si vous avez placer votre fichier dans le dossier gui, vous devrez écrire /gui/newHelmet.png.

Voila ce que ça donnera dans mon exemple :

Code:
public class mod_armor_example extends BaseMod{

   public static final Item helmetExample= (new ItemArmor(240, 3, ModLoader.AddArmor("newArmor"), 0)).setIconIndex(ModLoader.addOverride("/gui/items.png", "/newHelmet.png")).setItemName("helmetExample");

}


Voila, votre casque est près ! Ne vous reste à faire que les autres morceaux si vous voulez une armure complète.

N'oubliez pas que si vous voulez voir le nom de votre objet, vous devez ajouter un ModLoader.AddName(obj, String) (obj étant le nom de votre objet dans le code (ici, c'est helmetExample) et le String étant le nom qui apparaitra en jeu (ici, je pourrais inscrire "New Helmet" par exemple).

Ca donnera :

Code:
public class mod_armor_example extends BaseMod{

   public static final Item helmetExample= (new ItemArmor(240, 3, ModLoader.AddArmor("newArmor"), 0)).setIconIndex(ModLoader.addOverride("/gui/items.png", "/newHelmet.png")).setItemName("helmetExample");

   public mod_armor_example{
      ModLoader.AddName(helmetExample, "New Helmet");
   }

}

Voila, j'espère que ça vous aidera.
Si vous avez des questions, n'hésitez pas.
Nostre, si tu veux rajouter ça dans ton tutoriel, ça sera avec plaisir ;)
 
J'avais déjà prévu un tuto sur le modding sans ModLoader,donc ton ajout d'armure sera inclus dedans !
Idem pour la méthode avec le ModLoader.
Je manque un peu de temps en ce moment,donc ça va beaucoup m'aider,merci !
 
Après quelques heures de retard , oui je suis sur que le chemin est le bon, j'ai fait un copier coller de l'explorateur windows à la variable je vais juste essayer de changer le sens du slash,
ce sera sûrement inutile mais bon...

EDIT : C'etait CA, je me sens VRAIMENT idiot :dodgy:
 
Bon maintenant, c'est à mon tour d'avoir un problème :
Je m'intéresse depuis peu à la génération du monde de minecraft et je voudrais générer quelques constructions dans mes prochains mondes. donc j'ai trouvé un tuto sur le forum anglais officiel minecraft mais quand je génère mon monde, ça ne fonctionne pas. (En passant, le recompilateur ne detecte aucunes fautes)

Code:
package net.minecraft.src;

import java.util.Random;

public class WorldGenTour extends WorldGenerator
{
    
   public WorldGenTour()
   {
   }
   public boolean generate(World world, Random random, int i, int j, int k)
    {
        if (random.nextInt(10) == 0)
        {
            for (int z = 0; z < 64; z++)
            {
                int i1 = i + random.nextInt(8) - random.nextInt(8);
                int j1 = j + random.nextInt(8) - random.nextInt(8);
                int k1 = k + random.nextInt(8) - random.nextInt(8);
                if(world.getBlockId(i1, j1, k1) == 0 && world.getBlockId(i1, j1, k1) == 0 && world.getBlockId(i1, j1 + 1, k1) == 0 && world.getBlockId(i1, j1 + 2, k1) == 0 && world.getBlockId(i1, j1 + 3, k1) == 0 && world.getBlockId(i1, j1 + 4, k1) == 0 && world.getBlockId(i1, j1 + 5, k1) == 0 && world.getBlockId(i1, j1 + 6, k1) == 0 && world.getBlockId(i1, j1 + 7, k1) == 0 && world.getBlockId(i1, j1 + 8, k1) == 0 && world.getBlockId(i1, j1 + 9, k1) == 0 && world.getBlockId(i1, j1 + 10, k1) == 0 && world.getBlockId(i1, j1 + 11, k1) == 0 && world.getBlockId(i1, j1 - 1, k1) == Block.grass.blockID && Block.cobblestone.canPlaceBlockAt(world, i1, j1, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 1, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 2, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 3, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 4, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 5, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 6, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 7, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 8, k1)&& Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 9, k1) && Block.bloodStone.canPlaceBlockAt(world, i1, j1 + 10, k1) && BlockFire.fire.canPlaceBlockAt(world, i1, j1 + 11, k1))
                {
                    world.setBlockAndMetadata(i1, j1, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 1, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 2, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 3, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 4, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 5, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 6, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 7, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 8, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 9, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 10, k1, Block.bloodStone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 11, k1, BlockFire.fire.blockID, 1);
                }
				if(world.getBlockId(i1, j1, k1) == 0 && world.getBlockId(i1, j1, k1) == 0 && world.getBlockId(i1, j1 + 1, k1) == 0 && world.getBlockId(i1, j1 + 2, k1) == 0 && world.getBlockId(i1, j1 + 3, k1) == 0 && world.getBlockId(i1, j1 + 4, k1) == 0 && world.getBlockId(i1, j1 + 5, k1) == 0 && world.getBlockId(i1, j1 + 6, k1) == 0 && world.getBlockId(i1, j1 + 7, k1) == 0 && world.getBlockId(i1, j1 + 8, k1) == 0 && world.getBlockId(i1, j1 + 9, k1) == 0 && world.getBlockId(i1, j1 + 10, k1) == 0 && world.getBlockId(i1, j1 + 11, k1) == 0 && world.getBlockId(i1, j1 - 1, k1) == Block.dirt.blockID && Block.cobblestone.canPlaceBlockAt(world, i1, j1, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 1, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 2, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 3, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 4, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 5, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 6, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 7, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 8, k1)&& Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 9, k1) && Block.bloodStone.canPlaceBlockAt(world, i1, j1 + 10, k1) && BlockFire.fire.canPlaceBlockAt(world, i1, j1 + 11, k1))
                {
                    world.setBlockAndMetadata(i1, j1, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 1, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 2, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 3, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 4, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 5, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 6, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 7, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 8, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 9, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 10, k1, Block.bloodStone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 11, k1, BlockFire.fire.blockID, 1);
                }
				if(world.getBlockId(i1, j1, k1) == 0 && world.getBlockId(i1, j1, k1) == 0 && world.getBlockId(i1, j1 + 1, k1) == 0 && world.getBlockId(i1, j1 + 2, k1) == 0 && world.getBlockId(i1, j1 + 3, k1) == 0 && world.getBlockId(i1, j1 + 4, k1) == 0 && world.getBlockId(i1, j1 + 5, k1) == 0 && world.getBlockId(i1, j1 + 6, k1) == 0 && world.getBlockId(i1, j1 + 7, k1) == 0 && world.getBlockId(i1, j1 + 8, k1) == 0 && world.getBlockId(i1, j1 + 9, k1) == 0 && world.getBlockId(i1, j1 + 10, k1) == 0 && world.getBlockId(i1, j1 + 11, k1) == 0 && world.getBlockId(i1, j1 - 1, k1) == Block.sand.blockID && Block.cobblestone.canPlaceBlockAt(world, i1, j1, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 1, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 2, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 3, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 4, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 5, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 6, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 7, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 8, k1)&& Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 9, k1) && Block.bloodStone.canPlaceBlockAt(world, i1, j1 + 10, k1) && BlockFire.fire.canPlaceBlockAt(world, i1, j1 + 11, k1))
                {
                    world.setBlockAndMetadata(i1, j1, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 1, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 2, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 3, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 4, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 5, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 6, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 7, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 8, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 9, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 10, k1, Block.bloodStone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 11, k1, BlockFire.fire.blockID, 1);
                }
				if(world.getBlockId(i1, j1, k1) == 0 && world.getBlockId(i1, j1, k1) == 0 && world.getBlockId(i1, j1 + 1, k1) == 0 && world.getBlockId(i1, j1 + 2, k1) == 0 && world.getBlockId(i1, j1 + 3, k1) == 0 && world.getBlockId(i1, j1 + 4, k1) == 0 && world.getBlockId(i1, j1 + 5, k1) == 0 && world.getBlockId(i1, j1 + 6, k1) == 0 && world.getBlockId(i1, j1 + 7, k1) == 0 && world.getBlockId(i1, j1 + 8, k1) == 0 && world.getBlockId(i1, j1 + 9, k1) == 0 && world.getBlockId(i1, j1 + 10, k1) == 0 && world.getBlockId(i1, j1 + 11, k1) == 0 && world.getBlockId(i1, j1 - 1, k1) == Block.stone.blockID && Block.cobblestone.canPlaceBlockAt(world, i1, j1, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 1, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 2, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 3, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 4, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 5, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 6, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 7, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 8, k1)&& Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 9, k1) && Block.bloodStone.canPlaceBlockAt(world, i1, j1 + 10, k1) && BlockFire.fire.canPlaceBlockAt(world, i1, j1 + 11, k1))
                {
                    world.setBlockAndMetadata(i1, j1, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 1, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 2, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 3, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 4, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 5, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 6, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 7, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 8, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 9, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 10, k1, Block.bloodStone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 11, k1, BlockFire.fire.blockID, 1);
                }
				if(world.getBlockId(i1, j1, k1) == 0 && world.getBlockId(i1, j1, k1) == 0 && world.getBlockId(i1, j1 + 1, k1) == 0 && world.getBlockId(i1, j1 + 2, k1) == 0 && world.getBlockId(i1, j1 + 3, k1) == 0 && world.getBlockId(i1, j1 + 4, k1) == 0 && world.getBlockId(i1, j1 + 5, k1) == 0 && world.getBlockId(i1, j1 + 6, k1) == 0 && world.getBlockId(i1, j1 + 7, k1) == 0 && world.getBlockId(i1, j1 + 8, k1) == 0 && world.getBlockId(i1, j1 + 9, k1) == 0 && world.getBlockId(i1, j1 + 10, k1) == 0 && world.getBlockId(i1, j1 + 11, k1) == 0 && world.getBlockId(i1, j1 - 1, k1) == Block.snow.blockID && Block.cobblestone.canPlaceBlockAt(world, i1, j1, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 1, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 2, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 3, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 4, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 5, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 6, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 7, k1) && Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 8, k1)&& Block.cobblestone.canPlaceBlockAt(world, i1, j1 + 9, k1) && Block.bloodStone.canPlaceBlockAt(world, i1, j1 + 10, k1) && BlockFire.fire.canPlaceBlockAt(world, i1, j1 + 11, k1))
                {
                    world.setBlockAndMetadata(i1, j1, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 1, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 2, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 3, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 4, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 5, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 6, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 7, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 8, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 9, k1, Block.cobblestone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 10, k1, Block.bloodStone.blockID, 1);
					world.setBlockAndMetadata(i1, j1 + 11, k1, BlockFire.fire.blockID, 1);
                }
			}	
        }
		return true;
    }
}
Donc normalement, le rendu c'est 9 bloc de cobblestone empilés avec encore au-dessus un bloc de bloodstone allumé.
P.S.:Nostre si tu pense que les demandes d'aide polluent un peu ton post, surtout n'hésite pas à le préciser je m'en irais poster ailleurs .^^
 
Tu utilise le ModLoader ou non ?
Dans le cas sans ModLoader,il ne faut pas oublié de rajouter,dans "ChunkProviderGenerate.java":
Code:
(new WorldGenExample()).generate(worldObj, rand, k + rand.nextInt(16), rand.nextInt(112) + 16, l + rand.nextInt(16));
(Ici j'ai mis "WorldGenExample" parceque c'est l'exemple donné dans le tuto anglais,mais pour toi ce sera bien sur "WorldGenTour".

Pour le cas avec ModLoader,tu aura besoin du code sur le tuto anglais.

A et non les demandes d'aide ne polluent pas le post,sinon quel intérêt d'un tuto sans aide avec ? ^^
 
Oui j'avais bien pensé à le mettre sur ChunkProviderGenerate.java et j'ai résolu mon problème en cherchant encore un peu ! lol
En fait, quand on utilise cette fonction : ".canPlaceBlockAt(world, i1, j1, k1)" Je pense que c'est une fonction qui vérifie si l'on peut placer le bloc à cet endroit ou non. Dans mon cas, pour mettre des flammes en haut de mes tours, je ne peux pas utiliser cette fonction avec le bloc de flamme qui est surement considéré trop dangereux ou tout simplement inconsidéré par le jeu. Donc il m'a juste suffit d'enlever cette fonction à chaque fois pour les blocs de flamme et le tour était joué !

Si vous souhaitez comprendre comment ce code fonctionne n'hésitez pas à demander j'essayerai de vous expliquer de mon mieux dans ce cas. (Je dois avouer que je ne suis pas doué pour faire un tuto ^^' , mais pour aider au cas par cas je le ferais !)