Faire une plantation



  • Bonjour à tous, nous allons voir dans ce tutoriel comment créer une nouvelle plantation de type orge 😉

    La classe principale

    Commençons par déclarer nos items et blocs.

    public static Block BlockOrgeCulture;
    public static Item ItemOrge, ItemOrgeGraines;
    

    Ensuite dans le PreInit :

    BlockOrgeCulture = new BlockOrgeCulture(2000).setUnlocalizedName("Culture d'orge");
    ItemOrge = new Item(12000).setUnlocalizedName("Orge").setTextureName("modid:ItemOrge");
    ItemOrgeGraines = new ItemSeeds(12001, this.BlockOrgeCulture.blockID, Block.tilledField.blockID).setUnlocalizedName("Graines d'orge").setTextureName("modid:ItemOrgeGraines");
    

    "new ItemSeeds" et "new Item" permettent d'éviter de créer les classes de ces items qui ne serviront à rien (avec juste le constructeur), donc importez ItemSeeds ( import net.minecraft.item.ItemSeeds; ) ainsi que Item ( import net.minecraft.item.Item; ).
    this.BlockOrgeCulture.blockID, Block.tilledField.blockID signifie que lorsque l'on fait un clique droit avec la graine sur un tilledfield (terre bêchée), elle se plante dedans.

    Enfin enregistrer votre bloc et vos items (pour les items c'est facultatif).

    GameRegistry.registerBlock(BlockOrgeCulture, "Culture d'orge");
    GameRegistry.registerItem(ItemOrge, "Orge", "Modid");
    GameRegistry.registerItem(ItemOrgeGraines, "Graines d'orge", "Modid");
    

    N'oubliez pas de modifier modid par le nom de votre propre modid 😉 Maintenant créer la classe BlockOrgeCulture, la plus importante !

    La classe du bloc

    Maintenant rajouter ceci dans votre classe :

    public class BlockOrgeCulture extends BlockCarrot
    {
        public static String[] type = new String[]{"Culture d'orge_0", "Culture d'orge_1", "Culture d'orge_2", "Culture d'orge_3", "Culture d'orge_4", "Culture d'orge_5", "Culture d'orge_6", "Culture d'orge_7"};
        private Icon[] IconArray;
    
        public BlockOrgeCulture (int id)
        {
            super(id);
        }
    
        public Icon getIcon(int side, int metadata)
        {
            return metadata < type.length && metadata >= 0 ? IconArray[metadata] : IconArray[0];
        }
    
        public void registerIcons(IconRegister iconregister)
        {
            IconArray = new Icon[type.length];
    
            for(int i = 0; i < type.length; i++)
            {
                IconArray[i] = iconregister.registerIcon("modid:" + type[i]);
            }
        }
    
        protected int getSeedItem()
        {
            return ClassePrincipale.ItemOrgeGraines.itemID; // donne la graine
        }
    
        protected int getCropItem()
        {
            return ClassePrincipale.ItemOrge.itemID; // donne la récolte
        }
    
        public int damageDropped(int metadata)
        {
            return metadata;
        }
    }
    

    Pas de panique ! Je vous invite à regarder le tuto de robin sur les metadata si vous ne connaissez pas 😉 Le reste est expliqué en commentaire. N'oubliez pas les imports !

    Résultat

    Équipez-vous d'une houe et plantez vos graines, et voilà votre orge pousse ! Vous pouvez utiliser de la poudre d'os dessus pour accélérer le résultat, et ensuite récolter votre orge (n'oubliez pas de passer en mod survival sinon vous cassez la plantation).

    J'espère que ce tutorial vous aura plu =D


  • Administrateurs

    Excellent tutoriel, mais tu pourrais aller plus loin, en expliquant, par exemple, comment utiliser un de nos blocs pour planter notre graine dedans.



  • Merci de ton commentaire, c'est vrai je peux encore l'améliorer mais au moins ça pourra aider des gens en attendant que je le complète 🙂



  • Bon tutoriel :), mais sa serai sympa d'aller un peu plus loin comme dit Superloup10 ^^.



  • Bon tutoriel.

    Pour ce qui est du bloc custom pour planter, je doute que ça prenne du temps, étant donné que c'est certainement une variable a changer.



  • Petit souci de mon côté :

    2013-10-27 12:14:51 [INFO] [STDERR] java.lang.ArrayIndexOutOfBoundsException: 12262
    2013-10-27 12:14:51 [INFO] [STDERR] at net.minecraft.world.chunk.storage.ExtendedBlockStorage.setExtBlockID(ExtendedBlockStorage.java:88)
    2013-10-27 12:14:51 [INFO] [STDERR] at net.minecraft.world.chunk.Chunk.setBlockIDWithMetadata(Chunk.java:705)
    2013-10-27 12:14:51 [INFO] [STDERR] at net.minecraft.world.World.setBlock(World.java:559)
    2013-10-27 12:14:51 [INFO] [STDERR] at net.minecraft.world.World.setBlock(World.java:721)

    Sans que je sache vraiment pourquoi… A noter que cela se passe lorsqu'en jeu, je plante une graine sur le sol labouré

    Mon code

    Pour la classe du block

    
    package minetux.common;
    
    import net.minecraft.block.BlockCarrot;
    import net.minecraft.client.renderer.texture.IconRegister;
    import net.minecraft.item.Item;
    import net.minecraft.util.Icon;
    
    public class BlockHop extends BlockCarrot{
    
    public static String[] type = new String[]{"BlockHop_stage_0", "BlockHop_stage_1", "BlockHop_stage_2", "BlockHop_stage_3", "BlockHop_stage_4", "BlockHop_stage_5", "BlockHop_stage_6", "BlockHop_stage_7"};
    private Icon[] IconArray;
    
    protected BlockHop(int id) {
    super(id);
    }
    
    public Icon getIcon(int side, int metadata)
    {
    return metadata < type.length && metadata >= 0 ? IconArray[metadata] : IconArray[0];
    }
    
    public void registerIcons(IconRegister iconregister)
    {
    IconArray = new Icon[type.length];
    
    for(int i = 0; i < type.length; i++)
    {
    IconArray* = iconregister.registerIcon("minetux:" + type*);
    }
    }
    
    protected int getSeedItem()
    {
    return MineTux.HopSeed.itemID;
    }
    
    protected int getCropItem()
    {
    return MineTux.HopItem.itemID;
    }
    
    public int damageDropped(int metadata)
    {
    return metadata;
    }
    }
    
    

    Dans la classe principale

    
    BlockHop = new BlockHop(2602).setUnlocalizedName("BlockHop").setTextureName("minetux:BlockHop");
    GameRegistry.registerBlock(BlockHop, "BlockHop");
    
    HopItem = new Item(12006).setUnlocalizedName("HopItem").setCreativeTab(CreativeTabs.tabMaterials).setTextureName("minetux:HopItem");
    GameRegistry.registerItem(HopItem, "HopItem", "MineTux");
    
    HopSeed = new ItemSeeds(12007,this.HopItem.itemID,Block.tilledField.blockID).setUnlocalizedName("HopSeed").setTextureName("minetux:HopSeed");
    GameRegistry.registerItem(HopSeed, "HopSeed", "MineTux");
    
    

  • Administrateurs

    Déjà met ton code, dans une balise [java][/java] sans les *.
    Ensuite, ce serais bien que tu donnes en entier le rapport de forge dans une balise [code][/code] ou par pastebin.



  • Bon bein vive le debuggeur de java qui m'a permis de me rendre compte que ItemSeeds attend en paramètre un blockID et non un itemID…

    Bon tuto !



  • Aussi, essaie d'ajouter un moyen de faire les autres types de plantations : Canne a sucre, Pastèques / Citrouilles et Cacao


  • Administrateurs

    Je valide.



  • Bonjour , j'ai un problème , j'ai suivi ce tuto pour créer un fraisier mais lorsque je lance le jeu il crash et il m'indique :2013-11-27 15:20:33 [Infos] [STDOUT] Vec3 Pool Size: ERROR NullPointerException: null
    éclipse ne m'indique pas d'erreur et je ne l'ai pas trouvé par moi même.
    Merci d'avance si vous pouvez m'aider.

    La classe principale:

    La classe du block fraisier :

    Maintenant la class itemblockfraisierculture (je sais le nom est long xd)
    Je ne suis pas sur qu'il fallait faire cette class mais elle était dans le tuto sur les métadatas alors j'ai préféré la faire.

    et le log du crash :


  • Administrateurs

    @Instance("ModTutoriel")
    public static Block blockfraisierculture;
    public static Item fraise, fraiseseeds;
    public static ModTutoriel instance;
    

    ->

    @Instance("ModTutoriel")
    public static ModTutoriel instance;
    
    public static Block blockfraisierculture;
    public static Item fraise, fraiseseeds;
    

    Le @Instance DOIT être au dessus du field public static ModTutoriel instance;



  • Je test ça bientôt et je te dis ce que ça donne , merci 😉
    edit: je l'ai fait mais ça crash toujours 😕



  • Très bon tuto mais j'ai un gros problème avec les textures, en suivant le tutoriel sur les metadatas, mes plantations reste toujours sans texture 😞

    Je suis sur d'avoir bien placer mes textures
    Mes class :

    Classe Principale (NaturalThings.java) :

    BeetrootcultureBlock.java :

    ItemBeetrootcultureBlock.java :

    Je comprends pas trop là…



  • J'ai fini par trouver, mes texture étaient dans le dossier "block" et non "blocks"

    Mais j'ai toujours un problème, les textures des différents stades de la plantation sont aléatoires 😞



  • Bonjour tout le monde ! 😉
    Alors voila j'ai suivi ce tuto (que je trouve très bien expliqué) mais au lancement du test, Minecraft crash !
    Je ne trouve auncune erreur mais d'apres la console cela provient du PreInit… (Je n'en suis pas sur je ne suis qu'un debutant en codding):-/
    Merci d'avance et bonne journée !:)

    Mes class:
    Class Principale
    Console
    Class de mon bloc d'argiculture

    (Vous remarquerez sans doute que j'ai appeler la class BlockTomatCulture avec tomate sans e ce n'est pas une erreur…):dodgy:


  • Administrateurs

    Salut,
    Tu as un NPE (NullPointerException) au niveau de l'enregistrement des blocs, et en effet, ton GameRegistry.registerBlock et ton GameRegistry.registerItem sont avant la ligne ou tes items et blocs sont initialisés.
    Il faut donc que tu mettes les GameRegistry après les BlockTomatCulture = new BlockTomatCulture(8471)[…]



  • /!\ J'ai peut etre fais un fouble poste , si c'est le cas désolé 😕 (je ne vois pas ma reponse s'afficher) /!
    Donc, je les ai inversé mais une nouvelle erreur apparait : new BlockTomatCulture(8471).setUnlocalizedName
    Tout ceci est souligné …
    Nouvelle console :http://pastebin.com/mEx4n14r



  • ligne 79 de ton main tu as quoi?



  • Cette ligne :
    ItemTomate = new Item(9160).setUnlocalizedName("Tomate").setTextureName("EnderCraft:Tomate");