Créer un stick ayant un effet. Détection de clique droit



  • Introduction

    Voila, dans ce tutoriel, vous allez apprendre à créer un Item simple ayant lors du clique droit, la possibilité de vous donner un ou plusieurs effet(s), invoquez une entité ou encore faire un choix entre différents effets prevu.

    #Pré-Requis(Pré-Requis)

    Savoir créer un item

    Code

    Classe principale.

    Commencez simplement par déclarer votre Item

    public class ItemsMod 
    {      
        public static Item stick; //Vous déclarez votre Item
    
        public static void init()
        {
            stick = new **Stick**().setUnlocalizedName("LeNomDeVotreitem").setCreativeTab(ModTuto.tabTuto); //Vous l'initiez
        }
    
        public static void register()
        {
            GameRegistry.registerItem(stick, stick.getUnlocalizedName().substring(5)); //Vous l'enregistrez
        }
    
        public static void registerRenders()
        {
            registerRender(stick); //Vous faites le rendu
        }
    
        private static void registerRender(Item item)
        {
            Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0, new ModelResourceLocation(References.MOD_ID + ":" + item.getUnlocalizedName().substring(5), "inventory"));
        }
    }
    

    Ceci est la base de la création des Items
    Vous allez avoir une erreur sur l'initialisation du votre item, ici : new Stick().
    Créons donc alors la classe de l'item dans votre package Items !

    La classe de l'Item

    Voila où tout ce passe ! 
    Ici nous allons voir le B-A-BA de la création de ce genre d'Item, vu que notre Item est normal, nous extendons alors par Item, comme d'habitude, vous ajoutez les constructeurs. Ce qui vous donne donc quelque chose comme cela:

    public class Stick extends Item
    {
        public Stick()
        {
    
        }
    
    }
    

    On va ensuite ajoutez comme constructeur différentes choses (vous pouvez bien sur rajoutez ce que vous voulez)

    public class Stick extends Item
    {
        public Stick()
        {
            this.setMaxDamage(10); //La durabilité de votre Item, ici il pourra être utilisé 10 fois
    
            this.maxStackSize = 1; //Nous déclarons la taille du stack de l'item, ici l'item est instackable
        }
    }
    

    Puis ensuite on ajoute cette fonction, elle détecte le clique droit sur un Item 🙂

    
        @Override
           public ActionResult <itemstack>onItemRightClick(ItemStack itemStack, World world, EntityPlayer player, EnumHand hand)
           {
               if (!world.isRemote) // très important a ne pas oublié : le code qui se trouve dans cette condition sera executer que coté serveur. CECI EST TRES IMPORTANT 
               {
                     //Mettez ici ce qu'il va suivre
    
               }
               itemStack.damageItem(1, player); //Ici, nous enlevons 1 de durabilité a l'item
               return new ActionResult(EnumActionResult.PASS, itemStack);
           }
    
    }
    

    Dans ce script, nous déclarons la détection du clique droit de l'Item :-3

    Maintenant, nous allons mettre ce qu'il nous intéresse, cet à dire les effets ! Voila le code principal pour ajouter un effet. Pour rajouter plusieurs effets, allez à la ligne à la fin du premier effet

    player.addPotionEffect(new PotionEffect(Potion.getPotionById(16), 140, 1)); //"16" L'ID de la potion, ici Nyctalopie, "140" le temps en TICK, 20= 1seconde, ici il y a donc 7 secondes, "1" l'amplificateur de votre effet, ici la potion est de level 2
    

    Json**.**
    Ici, rien de bien dur, nous déclarons juste la posture de votre Item en main.

    {
       "parent": "item/handheld",
       "textures": {
           "layer0": "tuto:items/StickOfRandom"
       }
    }
    

    #Résultats(Résultats)

    Ce qui donne alors :

    public class Stick extends Item
    {
        public Stick()
        {
            this.setMaxDamage(10); //La durabilité de votre Item, ici il pourra être utilisé 10 fois
    
            this.maxStackSize = 1; //Nous déclarons la taille du stack de l'item, ici l'item est instackable
        }
        @Override
           public ActionResult <itemstack>onItemRightClick(ItemStack itemStack, World world, EntityPlayer player, EnumHand hand)
           {
               if (!world.isRemote) // très important a ne pas oublié : le code qui se trouve dans cette condition sera executer que coté serveur. CECI EST TRES IMPORTANT 
               {
                     player.addPotionEffect(new PotionEffect(Potion.getPotionById(16), 140, 1)); //Nyctalopie
                     player.addPotionEffect(new PotionEffect(Potion.getPotionById(1), 140, 1)); //Vitesse
    
               }
               itemStack.damageItem(1, player); //Ici, nous enlevons 1 de durabilité a l'item
               return new ActionResult(EnumActionResult.PASS, itemStack);
           }
    
    }
    

    Bonus

    Ici, tache un poil plus complexe, créer un Stick faisant des actions aléatoires parmi des actions définies. 🙂

    Comme vu dessus, nous déclarons exactement la même chose SAUF deux choses, nous allons définir notre random avant les constructeurs de notre Item et définir un nouveau int :

    public final Random rand = new Random();
    

    Ce qui donne alors :

    public class Stick extends Item
    {
        public final Random rand = new Random();
    
        public Stick()
        {
        this.setMaxDamage(20);
        this.maxStackSize = 1;
        }
    
        @Override
           public ActionResult <itemstack>onItemRightClick(ItemStack itemStack, World world, EntityPlayer player, EnumHand hand)
           {
               if (!world.isRemote) // très important a ne pas oublié : le code qui se trouve dans cette condition sera executer que coté serveur. CECI EST TRES IMPORTANT 
               {
                   int i = rand.nextInt(1); //Le 1 de ce code signifie le nombre de vos différentes actions, l'action numéro 0 est compté comme 1 (une action) exemple, vous avez 5 effets en comptant la 1ere qui défini i==0, vous allez donc déclarez après le nextInt le nombre 6
               }
               itemStack.damageItem(1, player);
               return new ActionResult(EnumActionResult.PASS, itemStack);
           }
    
    }
    

    En dessous de votre int, vous allez déclarez vos actions à base de :

     if(i == 0)
                   {
                       EntityTNTPrimed entityTNT = new EntityTNTPrimed(world); // instance de la class de l'entité
                       entityTNT.setPosition(player.posX, player.posY, player.posZ); // je lui dit la position a la quelle elle doit spawner
                       world.spawnEntityInWorld(entityTNT); // je fais spawn l'entité
                   }
                   else if(i == 1)
                   {
                       EntityItem entityItem =new EntityItem(world, player.posX, player.posY, player.posZ, new ItemStack(ItemsMod.itemTest)); 
                       world.spawnEntityInWorld(entityItem); // je fais spawn l'entité
                   }
                   else if(i == 2)
                   {
                       EntityItem entityItem =new EntityItem(world, player.posX, player.posY, player.posZ, new ItemStack(ItemsMod.itemTest)); 
                       world.spawnEntityInWorld(entityItem); // je fais spawn l'entité
                   }
    

    Pour cet exemple, nous allons donc rajouter à notre int le chiffre "3" car l'int compte à partir de 0 !
    Dans ce code, le premier random fait spawn une TNT allumé, le deuxième et le troisième random, font spawner un Item de mon mod.

    #Résultats(Résultats)

    J'ai coder un Item me mettant Vitesse et me rajoutant de l'xp ayant 10 de durabilité et n'étant pas stackable. (Je n'ai pas fait le Json, l'Item en main est donc étrange) 😕


    Avant appuis


    Après appuis, nous voyons que la durabilité a baissé et que mon xp a monté.

    #Crédit(Crédit)

    Rédacteur : Tituya


    Merci, j'espere que vous avez compris le principal de la création de ce genre d'Item très simple. 
    Si vous avez des questions, des remarques n'hésitez surtout pas, je suis la pour apprendre 😉  !</itemstack></itemstack></itemstack>



  • Personne pour juger mon tutoriel ?!


  • Administrateurs

    Navré, je n'ai pas eu l'occasion de venir donner mon avis.
    C'est un bon tutoriel, en revanche, il y a des choses inutiles.
    Tu donnes comme pré-requis de savoir créer un item, mais tu remontres comment le faire.
    D'ailleurs pourquoi la 1.9 ?
    Au passage,

                   player.addPotionEffect(new PotionEffect(Potion.getPotionById(16), 140, 1)); //Nyctalopie
                    player.addPotionEffect(new PotionEffect(Potion.getPotionById(1), 140, 1)); //Vitesse
    

    peut être remplacé par

                   player.addPotionEffect(new PotionEffect(MobEffects.NIGHT_VISION, 140, 1)); //Nyctalopie
                    player.addPotionEffect(new PotionEffect(MobEffects.SPEED, 140, 1)); //Vitesse
    

    Il y a d'autres choses à dire mais pour ça, il faut que je setup une workspace 1.9
    Autre chose, sauf erreur de ma part ```java
    int i = rand.nextInt(1);

    Du coup, le code que tu mets par la suite ne peut pas fonctionner sauf pour i = 0;


  • Le mob effect c'est sur que l'on peu le faire mais personnellement je préfère prendre les id, je rajouterais une option secondaire avec cette fonction. L'int fonctionne parfaitement pour moi, j'ai cree un stick ayant des random et sa fonctionne parfaitement, tu as raison que Cet int compte à partir de 0, c'est pour ça que je demande de prendre l'effet produit plus' 1


  • Administrateurs

    rand.nextInt(1); renvoies bien toujours 0, comme l'a dit superloup.
    En fait c'est aussi ce que tu expliques, mais ton explication n'est pas bonne :

    //Le 1 de ce code signifie le nombre d'action de votre random -1, en effet, cet int compte à partir de 0 !

    Le nombre après nextInt n'est pas le nombre d'action, mais le maximum exclut du random. Le minimum étant toujours 0.



  • Donc, que devrais-je mettre ?
    [UPDATE] j'ai modifié, est-ce plus claire ? Et si oui mon tutoriel va t-il etre valide ?


  • Administrateurs

    Ce n'est toujours pas mieux pour avoir un entier aléatoire compris entre 0 inclus et n exclus, il faut que tu fasses:

    int i = rand.nextInt(n);
    

    Donc pour n = 6, tu dois faire :

    int i = rand.nextInt(6);
    

    Ton nombre pourra donc prendre pour valeur 0, 1, 2, 3, 4, 5.



  • Bah c'est ce que j'ai mit non ?



  • Sincèrement, si ton tutoriel est validé si rapidement, je démissionne x) joke



  • X) en vrai, ça mes vraiment du temps pour être validé ?



  • J'ai un tuto du 29 septembre 2016 qui n'y a jamais été alors sois patient xD



  • Ah ouais x) apres peu etre que ton tuto etait mal fait XD





  • ouais pourtant ton tutoriel est très bien fait, enfin bref retournons au sujet de mon tutoriel, y a t-il autre chose que je devrais changer pour améliorer la compréhension ? et au passage, vous voyer sur les screens les Rubik's cube que j'ai eu du mal à créer ;D



  • Pas d'autre remarque sur le sujet ? :issou: :issou: :issou: :issou: :issou: