Créer un arbre de A à Z
-
Introduction
Bonjour à toutes et à tous, je vais vous apprendre à créer… Un arbre de A à Z, qui comprendra donc(principalement) les bûches, les feuilles, la pousse, la génération et la réaction à la BoneMeal.
Sommaire:
-Les Pré-requis
-Les bûches
-Les feuilles
-La pousse
-La génération
-La réaction à la BoneMeal
-BonusLes pré-requis
Il vous faudra savoir faire un bloc simple et un minimum de connaissance en Java.
Les bûches
Pour commencer créez le bloc “TutorielWood”, créez sa classe, puis faite la héritée de la classe BlockRotatedPillar et faite “add constructor” comme pour un bloc simple(après avoir ajouter le constructeur il y aura encore une erreur sur “TutorielWood” on verra sa plus tard), n’oubliez pas d’ajouter cette ligne dans le constructeur:
this.setBurnProperties(this.blockID, 5, 20);
Elle permet de rendre le bloc inflammable (pour plus d’info ellez voir ce tutoriel).
Vous devriez avoir sa:
public class TutorielWood extends BlockRotatedPillar { public TutorielWood(int id) { super(id, Material.wood); setCreativeTab(CreativeTabs.tabBlock); this.setBurnProperties(this.blockID, 5, 20); } }
Maintenant on va passer aux petites méthodes :
public int quantityDropped(Random par1Random) { return 1; }
Cette méthode sert à déterminer la quantiter de bloc(ou item) dropper une fois le bloc casser.
@Override public boolean canSustainLeaves(World world, int x, int y, int z) { return true; }
Celle-ci permet au bloc de pouvoir “alimenter les feuilles en énergie”(j’ai rien trouver d’autres comme explication ).
@Override public boolean isWood(World world, int x, int y, int z) { return true; }
Cette méthode la renvoi si le bloc est du bois ou pas(si vous voulez récupérer le bloc avec une pioche ou autres…).
public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) { byte b0 = 4; int j1 = b0 + 1; if (par1World.checkChunksExist(par2 - j1, par3 - j1, par4 - j1, par2 + j1, par3 + j1, par4 + j1)) { for (int k1 = -b0; k1 <= b0; ++k1) { for (int l1 = -b0; l1 <= b0; ++l1) { for (int i2 = -b0; i2 <= b0; ++i2) { int j2 = par1World.getBlockId(par2 + k1, par3 + l1, par4 + i2); if (Block.blocksList[j2] != null) { Block.blocksList[j2].beginLeavesDecay(par1World, par2 + k1, par3 + l1, par4 + i2); } } } } } }
Et une dernière pour la route , elle détermine l’action produite une fois le bloc casser(ici les feuilles commence à disparètre quand la méthode est executer).
Il est temps mes ami(e)s de passer aux choses serieuses… La textures du bloc, donc maintenant vous allez pouvoir corriger l’erreur qu’il y a depuis le début du tuto en implémentant la méthode demander(vous devrier avoir sa de nouveau):
@Override @SideOnly(Side.CLIENT) protected Icon getSideIcon(int i) { return null; }
Vous allez remplacer null par iconSide il y aurat une erreur sur iconSide, allez dessu et créez le field de iconSide.
Ajoutez en dessous:
@SideOnly(Side.CLIENT) protected Icon getEndIcon(int i) { return iconTop; }
Il y aurat aussi une erreur sur iconTop, faites la même chose que pour iconSide.
Je ne vous ai pas encore dit à quoi peuvent bien servir ces deux méthodes, et bin elles servent à définir l’emplacement des textures sur le bloc.
C’est bien on à dit au bloc quel texture aller où mais on ne les a pas enregistrées.
Donc on rajoute cette méthode:@SideOnly(Side.CLIENT) public void registerIcons(IconRegister iconRegister) { iconSide = iconRegister.registerIcon("modtutoriel:tutorielWood"); iconTop = iconRegister.registerIcon("modtutoriel:tutorielWood_top");
Bien sûr vous remplacez “modtutoriel” par votre mod id, “tutorielWood” par le nom de la texture à afficher sur les cotés puis “tutorielWood_top” par le nom de la texture à afficher en dessous et au dessus du bloc.
Vous vouliez un petit aperçu, en voilà un:
#Les feuilles(Les feuilles)
Pour les feulles créez un bloc simple, qui s’appellera “TutorielLeaves” et ajoutez sa dans le constructeur pour que le bloc soit inflamable:
this.setBurnProperties(this.blockID, 5, 20);
Je n’en dit pas plus tout a déjà était expliquer.
Et ajoutez aussi sa:
this.setTickRandomly(true);
Cette le ligne sert(si je ne me plante pas :s ) à rendre l’update des tick du bloc aléatoire, elle sera utilisé dans la méthode qui fais disparaitre les feuilles.
Vous devriez avoir sa(je sais je me répète mais c’est pour le bien du tuto
public class TutorielWood extends BlockRotatedPillar { public TutorielLeaves(int id) { super(id, Material.leaves); setCreativeTab(CreativeTabs.tabDecoration); this.setTickRandomly(true); this.setBurnProperties(this.blockID, 5, 20); } }
Et maintenant il est temps de passer voir chaque petite méthode de la classe:
@SideOnly(Side.CLIENT) public int getBlockColor() { double d0 = 1.0D; double d1 = 0.5D; return ColorizerFoliage.getFoliageColor(d0, d1); }
Cette méthode définit la couleur de base des feuilles(le vert);
@SideOnly(Side.CLIENT) public int getRenderColor(int par1) { return ColorizerFoliage.getFoliageColorBasic(); }
Elle gère la couleur du bloc et celle du bloc en main. Cette couleur peut être modifié dans la méthode ci-dessous mais j’expliquerais sa en détails dans la partie Bonus.
@SideOnly(Side.CLIENT) public int colorMultiplier(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) { { int i1 = 0; int j1 = 0; int k1 = 0; for (int l1 = -1; l1 <= 1; ++l1) { for (int i2 = -1; i2 <= 1; ++i2) { int j2 = par1IBlockAccess.getBiomeGenForCoords(par2 + i2, par4 + l1).getBiomeFoliageColor(); i1 += (j2 & 16711680) >> 16; j1 += (j2 & 65280) >> 8; k1 += j2 & 255; } } return (i1 / 9 & 255) << 16 | (j1 / 9 & 255) << 8 | k1 / 9 & 255; } }
Comme je l’ai dit, cette méthode aussi gère la couleur du bloc mais en fonction du biome où le bloc est placé.
@SideOnly(Side.CLIENT) public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random) { if (par1World.canLightningStrikeAt(par2, par3 + 1, par4) && !par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4) && par5Random.nextInt(15) == 1) { double d0 = (double)((float)par2 + par5Random.nextFloat()); double d1 = (double)par3 - 0.05D; double d2 = (double)((float)par4 + par5Random.nextFloat()); par1World.spawnParticle("dripWater", d0, d1, d2, 0.0D, 0.0D, 0.0D); } }
Celle ci est utilisée pour faire apparaitre des goutes d’eau qui tombes des feuilles quand il pleut.
private void removeLeaves(World par1World, int par2, int par3, int par4) { this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0); par1World.setBlockToAir(par2, par3, par4); }
Celle la définie la/las action(s) produite(s) lors de la disparition des feuilles.
public int quantityDropped(Random par1Random) { return par1Random.nextInt(20) == 0 ? 1 : 0; }
Cette méthode la définie la quantitée d’items à dropper de façon aléatoire.
public int idDropped(int par1, Random par2Random, int par3) { return tutoriel.TutorielSapling.blockID; }
Pour cette méthode, son sera de définir la pousse dropper par les feuilles(pour moi TutorielSapling extrait de ma classe principale tutoriel)
public void harvestBlock(World par1World, EntityPlayer par2EntityPlayer, int par3, int par4, int par5, int par6) { super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6); }
Elle définie le harvest du bloc(ne me demander pas ce que c’est car moi aussi je sais pas )
public int damageDropped(int par1) { return par1 & 3; }
Sa je sais pas à quoi sa sert :huh:
j’arrête pour aujourd’hui car je suis un peut fatigué[/java]
-
Hum … I LOVE TROLE FACE !!!
Quand tu dit de A a Z, j’espère que tu expliquera comment on peu le personnalisé ;). -
bien sûr mais je rentrerais plus en détail dans la partie bonus
-
Ok pas de problème :).
-
Trollface?
-
t’inquiète pas, je devrait bientôt pouvoir le commencer.
-
salut,
c’est pousse et non pouce sinon merci à toi.
-
@‘utybo’:
Trollface?
Tu c’est pas se que s’est ? …
-
Si si je suis juste déçu…
-
Lol !
Déçu de quoi ? -
Déçu que le tutoriel soit vide …
D’ailleurs j’attends aussi, s’il n’est plus continué il passe dans les tutoriels refusés. -
Et voila, les bûches c’est fais.
PS: si il y a des erreurs/fautes d’orthographes etc… faite le moi remarquer.
-
Avec l’ajout de cette nouvelle partie, je considère le tutoriel comme toujours actif.
Merci de le terminer le plus tôt possible.
-
je fais se que je peut(surtout j’ai fais sa sur mon iphone)
-
J’ai un problème avec le bloc de bois tout est bon sauf au niveau de la texture “iconTop”
il ne ma l’affiche pas en jeu
j’ai verifié le nom et tout rien a faire -
fais voir ta classe
-
package lunarblocks; import java.util.Random; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockRotatedPillar; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.util.Icon; import net.minecraft.world.World; public class BlockWoodL extends BlockRotatedPillar { private Icon iconSide; private Icon iconTop; public BlockWoodL(int id) { super(id, Material.wood); setCreativeTab(CreativeTabs.tabBlock); this.setBurnProperties(this.blockID, 5, 20); } public int quantityDropped(Random par1Random) { return 1; } @Override public boolean canSustainLeaves(World world, int x, int y, int z) { return true; } public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) { byte b0 = 4; int j1 = b0 + 1; if (par1World.checkChunksExist(par2 - j1, par3 - j1, par4 - j1, par2 + j1, par3 + j1, par4 + j1)) { for (int k1 = -b0; k1 <= b0; ++k1) { for (int l1 = -b0; l1 <= b0; ++l1) { for (int i2 = -b0; i2 <= b0; ++i2) { int j2 = par1World.getBlockId(par2 + k1, par3 + l1, par4 + i2); if (Block.blocksList[j2] != null) { Block.blocksList[j2].beginLeavesDecay(par1World, par2 + k1, par3 + l1, par4 + i2); } } } } } } @Override @SideOnly(Side.CLIENT) protected Icon func_111048_c(int i) { return iconSide; } @SideOnly(Side.CLIENT) protected Icon getEndIcon(int i) { return iconTop; } @SideOnly(Side.CLIENT) public void registerIcons(IconRegister iconRegister) { iconSide = iconRegister.registerIcon("rm:LUNARWOOD"); iconTop = iconRegister.registerIcon("rm:LUNARWOODTOP"); } }
-
iconSide = iconRegister.registerIcon("rm:LUNARWOOD"); iconTop = iconRegister.registerIcon("rm:LUNARWOODTOP");
De 1: pas de majuscules dans les noms de textures, car après tu vas te demander pouquoi elles ne sont plus là après recompilation.
De 2: le nom de ton image est bien “LUNARWOODTOP.png” ? -
Ok merci
et Oui j’ai fait copier coller du nom
j’ai meme enlever la texture il a rien remarquer il n’a pas mis de missing texture … -
Plus de nouvelle ?