Item à planter ET manger



  • [font=Ubuntu, sans-serifJe suis sur Eclipse avec forge-1.8.9-11.15.1.1722-mdk .]

    [font=Ubuntu, sans-serifBonjour, après avoir réussi à faire mon orge (planté avec des graines, avec 7 états de croissance, et dropant à maturité des graines et leur "fruit"), j'aimerais faire quelque chose dans le même genre, mais avec une variante.]

    [font=Ubuntu, sans-serifJ'ai farfouillé un peu dans les fichiers du jeu, Eclipse, à la recherche des codes relatifs aux carottes. ]
    Mes recherches m'ont apporté une seule chose: ItemSeedFood.
    Peut-être cela a-t'il un rapport avec ce que je veux faire?

    Car oui, mon but est là:
    Créer une un item qui se mange ET se plante, en sachant que la plante ne drope que cet item en quantité définie (ou entre telle et telle quantité).

    Merci!


  • Rédacteurs

    C'est simple, tu fait de la même façon que pour une culture normale sauf que ta graine n'est plus un ItemSeed mais un ItemSeedFood

    public class ItemSeedFood extends ItemFood implements net.minecraftforge.common.IPlantable {
    public ItemSeedFood(int healAmount, float saturation, Block crops, Block soil)
    }
    

    Et ton BlockCrops renvoie le même item pour getSeed() et getCrop() et pour le nombre d'item qui drop il me semble que c'est

    public java.util.List <itemstack>getDrops(net.minecraft.world.IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
    
    ```</itemstack>

  • Administrateurs

    Salut,
    Il suffit de regarder le code de la carotte :

    package net.minecraft.block;
    
    import net.minecraft.init.Items;
    import net.minecraft.item.Item;
    
    public class BlockCarrot extends BlockCrops
    {
    protected Item getSeed()
    {
    return Items.carrot;
    }
    
    protected Item getCrop()
    {
    return Items.carrot;
    }
    }
    


  • Tout fonctionne bien maintenant, mais je n'y arrive pas avec cette fonction pour le bloc 'BlockOnion' :

    [font=monospacepublic][font=monospace java][font=monospace.][font=monospaceutil][font=monospace.][font=monospaceList][font=monospace<][font=monospaceItemStack][font=monospace>][font=monospace getDrops][font=monospace(][font=monospacenet][font=monospace.][font=monospaceminecraft][font=monospace.][font=monospaceworld][font=monospace.][font=monospaceIBlockAccess][font=monospace world][font=monospace,] [font=monospaceBlockPos][font=monospace pos][font=monospace,] [font=monospaceIBlockState][font=monospace state][font=monospace,] [font=monospaceint][font=monospace fortune][font=monospace)]

    Disons par exemple que je veux droper 3 items nommés 'onion' , je mets quoi dans cette ligne exactement? Et il ne faut remplacer qu'un seul des mots de cette ligne?


  • Rédacteurs

    Normalement ça devrait marcher si t'override la fonction, un truc comme ça :

    
    @Override
    public java.util.List <itemstack>getDrops(net.minecraft.world.IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
    {
    java.util.List <itemstack>ret = super.getDrops(world, pos, state, fortune);
    int age = ((Integer)state.getValue(AGE)).intValue();
    
    if (age >= 7)
    {
    ret.add(new ItemStack(this.getSeed(), 3, 0)); //Là tu met ce que tu veut en paramètre, t'es pas débile d'après se que j'ai vu donc tu devrait comprendre
    }
    return ret;
    }
    
    ```</itemstack></itemstack>


  • Non, il faut changer ce que retourne la fonction :

    public List<itemstack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
    {
    List <itemstack>list = new ArrayList();
    list.add(new ItemStack(l\'item, la quantité, la metadata)); 
    list.add(new ItemStack(un autre item, la quantité, la metadata)); 
    //Et ainsi de suite, tu peux aussi faire des loots random en fonction de la fortune
    return list;
    }
    

    Pense à utiliser le state pour savoir si la plante était à maturité.
    EDIT : avec ce que BrokenSwing a mis : "int age = ((Integer)state.getValue(AGE)).intValue();"</itemstack></itemstack>



  • 1ère solution, pas d'erreur, mais droppe beaucoup trop (5 le plus souvent) malgré les réglages à la ligne:
     ret.add(new ItemStack(this.getSeed(), 1, 3));

    3 c'est bien le maximum non?

    Et puis quand j'utilise cette solution, il y a certains items dropés qui n'ont pas de textures, alors que d'autres si, et ce sont les mêmes items!

    Et puis le '(age >= 7)' comme il y a 0,1,2,3 de croissance, il ne faudrait pas remplacer par 3? Ou alors il se base par rapport au json, et considère qu'il y a 7 formes de croissance, mais qu'on ne voit pas comme il y a 4 textures de croissance?

    package fr.vorax.egypte.common;
    
    import net.minecraft.block.BlockCrops;
    import net.minecraft.block.state.IBlockState;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.BlockPos;
    
    public class BlockOnion extends BlockCrops
    {
        @Override
        protected Item getSeed()
        {
        return ModEgypte.onion;
        }    
    
        @Override
        protected Item getCrop()
        {
            return ModEgypte.onion;
        }
    
        @Override
        public java.util.List <itemstack>getDrops(net.minecraft.world.IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
        {
            java.util.List <itemstack>ret = super.getDrops(world, pos, state, fortune);
            int age = ((Integer)state.getValue(AGE)).intValue();
    
            if (age >= 7)
            {
                  ret.add(new ItemStack(this.getSeed(), 1, 3));
            }
            return ret;
        }
    
    }
    
    

    2ème solution, une erreur à list.add(new ItemStack(onion, 2, 0));

    package fr.vorax.egypte.common;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import net.minecraft.block.BlockCrops;
    import net.minecraft.block.state.IBlockState;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.BlockPos;
    import net.minecraft.world.IBlockAccess;
    
    public class BlockOnion extends BlockCrops
    {
        @Override
        protected Item getSeed()
        {
        return ModEgypte.onion;
        }    
    
        @Override
        protected Item getCrop()
        {
            return ModEgypte.onion;
        }
    
        public List <itemstack>getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
        {
        List <itemstack>list = new ArrayList();
        list.add(new ItemStack(onion, 2, 0)); 
        //Et ainsi de suite, tu peux aussi faire des loots random en fonction de la fortune
        return list;
        }
    
    }
    
    

    Une autre petite chose dont je ne m'étais pas rendu compte, piétiner les cultures (sauter dessus quoi) enlève la terre cultivée pour remettre le bloc de terre d'origine, mais la plante reste en place.
    Comment faire pour que cette plante disparaisse et drope un item quand elle n'est pas à maturité et plusieurs items quand elle est à maturité?</itemstack></itemstack></itemstack></itemstack>


  • Rédacteurs

    Oui, désolé j'avais pas vu le super, ça donne plus un truc comme ça :

    
    @Override
    public java.util.List <itemstack>getDrops(net.minecraft.world.IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
    {
    java.util.List <itemstack>ret = new ArrayList<itemstack>();
    int age = ((Integer)state.getValue(AGE)).intValue();
    
    if (age >= 7)
    {
    ret.add(new ItemStack(this.getSeed(), 3, 0)); //CTRL + CLIC sur ItemStack -> ItemStack(Item itemIn, int amount, int meta), si tu met 3 en metadata c'est normal qu'il y est des problèmes de texture
    }
    return ret;
    }
    
    

    Pour ce qui est que la plante reste, je ne sais pas je vais voir et si jamais lorsque la plante se casse (par exemple si tu casse le bloc sur lequel elle est posée) et que ça ne drop pas 1 graine (comme le font la plupart des plantes de minecraft) Il fait que tu rajoute 1 graine à la list de drop en dehors de la condition de maturité et le reste à l'intérieur de la condition. Pour ce qui est de la propriétée AGE, il y a bien 8 states de qui vont de 0 à 7 (cf net.minecraft.block.BlockCrops), même si on utilise seulement 4 textures se qui correspond à 1 texture = 2 states

    Pour la deuxième solution, ton problème et que tu as mal compris, il faut remplacer onion par l'item de tu veut droper (au pire met this.getSeed())</itemstack></itemstack></itemstack>



  • C'est vrai que j'aurais dû faire un ctrl + clic gauche, m'enfin c'est bon, comme la 1ère méthode (corrigée) fonctionne, je l'ai adoptée, mais je vous remercie tous quand-même.

    Ma plante d'onion drope donc 3 onions (oignons en Français pour ceux qui pensent que je ne sais pas écrire!), voilà c'est tout bon, merci!
    Oui, c'est bien ça alors, il se base au json, mais en temps que joueur lambda, on ne voit que la croissance de la plante via texture, alors que le jeu, lui il sait que la croissance change dans les données, même si la texture est la même.

    Sujet résolu!