MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Créer un item générateur de structure

    Planifier Épinglé Verrouillé Déplacé Archives
    1.7.x
    14 Messages 4 Publieurs 4.8k Vues 1 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • MinantcraftM Hors-ligne
      Minantcraft
      dernière édition par robin4002

      Sommaire

      • Introduction
      • Pré-requis
      • code
        • Les items
        • La classe ItemStructureGen
        • Les structures
      • Bonus
        • Résultat
        • Crédits

      Introduction

      Salut à tous, dans ce tutoriel je vais vous apprendre à créer un item qui, à l’aide d’un clique droit, va faire apparaitre une structure.
      Pour ce qui est de la structure en elle même, je vous réfère au tutoriel sur les structure d’ AlphaSwittleTeam.

      Pré-requis

      • Créer un item basique
      • Générer une structure

      Code

      Les items

      Tout d’abord rajoutez ceci dans la fonction preInit de votre classe principale:

          //Déclaration des items
          public static Item gen_totem1;
          public static Item gen_totem2;
      
          //Initialisation
          gen_totem1 = new ItemStructureGen(1).setUnlocalizedName("gen_totem1").setTextureName(Reference.MOD_ID + ":gen_totem1"); 
          gen_totem2 = new ItemStructureGen(2).setUnlocalizedName("gen_totem2").setTextureName(Reference.MOD_ID + ":gen_totem2");
      
          //Enregistrements
          GameRegistry.registerItem(gen_totem1, "gen_totem1");
          GameRegistry.registerItem(gen_totem2, "gen_totem2");
      

      Ici, vous avez une erreur sur la classe ItemStructureGen, créez-là.

      La classe ItemStructureGen

      Une fois votre classe créée,

      extends Item
      

      Créez son constructeur comme ceci:

          public ItemStructureGen(int struct) //Reçoit en argument la  structure(totem1, totem2, ...)
          {
              this.structure = struct; //Enregistrement de la valeur reçue dans la variable structure
          }
      
          //N'oubliez pas de rajouter ceci juste après le { de la classe:
          public final int structure;
      

      Maintenant, rajoutez cette fonction:

          public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
          {
      
          }
      

      Elle va permettre de dire quoi faire quand on fait un clique droit avec l’item en main

      Rajoutez ce code dedans:

              switch(structure) 
              {
                  case 1:
                      StructureTotem1.generate(world, x, y+1, z); //Ici, on fait y+1 de manière à ce que quand on fait un clique sur le sol la structure se génère sur le sol et pas dedans
                      return true;
      
                  case 2:
                      StructureTotem2.generate(world, x, y+1, z);
                      return true;
      
                  default:
                      return false;
              }
      

      Donc, on switch la variable structure, si elle est égale à 1, on génère le Totem1 et si elle est égale à 2, on génère le Totem2.
      Ce qui est bien avec cette technique c’est qu’on a très facile pour rajouter d’autres structures.

      La classe ItemStructureGen doit ressembler à ça:

      public class ItemStructureGen extends Item
      {
          public final int structure;
      
          public ItemStructureGen(int struct)
          {
              this.structure = struct;
          }
      
          public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
          {
              switch(structure)
              {
                  case 1:
                      StructureTotem1.generate(world, x, y+1, z);
                      return true;
      
                  case 2:
                      StructureTotem2.generate(world, x, y+1, z);
                      return true;
      
                  default:
                      return false;
              }
          }
      }
      

      Les 2 classes si-dessus ne sont pas encore créés, faites-le.

      Les structures :

      Pour ma part, je vais créer ces 2 totems:
      1466261783-totem-1.jpg
      1466261783-totem-2.jpg

      Ajoutez cette fonction:

      public static boolean generate(World world, int x, int y, int z)
      {
      
      }
      

      Ensuite, ajoutez ceci:

          //netherrack
          world.setBlock(x-1, y, z, Blocks.netherrack);
          world.setBlock(x+1, y, z, Blocks.netherrack);
          world.setBlock(x-1, y+2, z, Blocks.netherrack);
          world.setBlock(x+1, y+2, z, Blocks.netherrack);
          world.setBlock(x, y+1, z, Blocks.netherrack);
      
          //quartz
          world.setBlock(x, y, z, Blocks.quartz_block);
          world.setBlock(x, y+2, z, Blocks.quartz_block);
      
          return true;
      

      Encore une fois, allez voir le tutoriel d’AlphaSwittleTeam pour comprendre.

      La classe StructureTotem1 finie:

      public class StructureTotem1
      {
          public static boolean generate(World world, int x, int y, int z)
          {
              //netherrack
              world.setBlock(x-1, y, z, Blocks.netherrack);
              world.setBlock(x+1, y, z, Blocks.netherrack);
              world.setBlock(x-1, y+2, z, Blocks.netherrack);
              world.setBlock(x+1, y+2, z, Blocks.netherrack);
              world.setBlock(x, y+1, z, Blocks.netherrack);
      
              //quartz
              world.setBlock(x, y, z, Blocks.quartz_block);
              world.setBlock(x, y+2, z, Blocks.quartz_block);
      
              return true;
          }
      }
      

      Et ma classe StructureTotem2:

      public class StructureTotem2
      {
          public static boolean generate(World world, int x, int y, int z)
          {
              //lapis-lazuli
              world.setBlock(x-1, y, z, Blocks.lapis_block);
              world.setBlock(x+1, y, z, Blocks.lapis_block);
              world.setBlock(x-1, y+2, z, Blocks.lapis_block);
              world.setBlock(x+1, y+2, z, Blocks.lapis_block);
              world.setBlock(x, y+1, z, Blocks.lapis_block);
      
              //dirt
              world.setBlock(x, y+2, z, Blocks.dirt);
              world.setBlock(x, y+3, z, Blocks.dirt);
      
              return true;
          }
      }
      

      Bonus

      Supprimer son item après utilisation :

      Vous pourriez trouver cela un peu cheaté de pouvoir faire apparaître des structures à l’infini avec le même item.
      Voilà comment y remédier.

      Tout d’abord rajouter en dessous de StructureTotem1.generate(…) et StructureTotem2.generate(…) ceci:

      use(itemStack, player);
      

      Créez cette méthode comme ceci:

          private void use(ItemStack itemStack, EntityPlayer player)
          {
              if (!player.capabilities.isCreativeMode) //Si le joueur n'est pas en créatif
              {
                  --itemStack.stackSize; //Décrémentation du stack, suppression de l'item
              }
          }
      

      Votre classe finie doit ressembler à ça:

      public class ItemStructureGen extends Item
      {
          public final int structure;
      
          public ItemStructureGen(int struct)
          {
              this.structure = struct;
          }
      
          public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
          {
              switch(structure)
              {
                  case 1:
                      StructureTotem1.generate(world, x, y+1, z);
                      use(itemStack, player);
                      return true;
      
                  case 2:
                      StructureTotem2.generate(world, x, y+1, z);
                      use(itemStack, player);
                      return true;
      
                  default:
                      return false;
              }
          }
      
          private void use(ItemStack itemStack, EntityPlayer player)
          {
              if (!player.capabilities.isCreativeMode)
              {
                  --itemStack.stackSize;
              }
          }
      }
      

      Résultats

      1466264136-totem1.gif
      1466264136-totem2.gif

      Crédits

      Rédaction :

      • Minantcraft

      Correction :

      • robin4002


      Ce tutoriel de Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International

      Retour vers le sommaire des tutoriels

      Minantcraft ;)

      >! Binary Dimension
      [url=https://minecraft.cu…

      1 réponse Dernière réponse Répondre Citer 0
      • BrokenSwingB Hors-ligne
        BrokenSwing Moddeurs confirmés Rédacteurs
        dernière édition par

        Pour le random tu peux utiliser celui de la variable world, et extends ta classe de génération worldGenerator ne sert à rien, de toute façon tu ne l’enregistre pas comme tel

        1 réponse Dernière réponse Répondre Citer 0
        • AymericRedA Hors-ligne
          AymericRed
          dernière édition par robin4002

          Bonjour alors déjà, bon tutoriel bien expliqué et sans aucune faute, j’ai une petite modification à proposer, tu pourrais remplacer le

          Random rand = new Random();
          

          dans la fonction onItemUse par

          Random rand = world.rand
          

          ce qui permettrait d’avoir un Random en fonction de la seed du monde 🙂
          EDIT : et aussi adapter le tuto pour la 1.8/1.9, le seul truc qui change, c’est x,y,z remplacé par BlockPos.

          Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

          AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

          Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
          Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

          1 réponse Dernière réponse Répondre Citer 0
          • MinantcraftM Hors-ligne
            Minantcraft
            dernière édition par robin4002

            @‘AymericRed’:

            Bonjour alors déjà, bon tutoriel bien expliqué et sans aucune faute, j’ai une petite modification à proposer, tu pourrais remplacer le

            Random rand = new Random();
            

            dans la fonction onItemUse par

            Random rand = world.rand
            

            ce qui permettrait d’avoir un Random en fonction de la seed du monde 🙂

            Ok je modifie ça.

            Minantcraft ;)

            >! Binary Dimension
            [url=https://minecraft.cu…

            1 réponse Dernière réponse Répondre Citer 0
            • BrokenSwingB Hors-ligne
              BrokenSwing Moddeurs confirmés Rédacteurs
              dernière édition par

              Et à un moment tu dis, “ça vous a créé un constructeur assez dégueulasse”, mais c’est pas un constructeur, c’est juste une fonction avec des paramètres

              1 réponse Dernière réponse Répondre Citer 0
              • MinantcraftM Hors-ligne
                Minantcraft
                dernière édition par

                @‘BrokenSwing’:

                Et à un moment tu dis, “ça vous a créé un constructeur assez dégueulasse”, mais c’est pas un constructeur, c’est juste une fonction avec des paramètres

                Oui je sais j’ai changé et j’ai aussi enlevé le extends WorldGenerator et le random

                EDIT: J’ai changé “Ajoutez ce constructeur” par “Ajoutez cette fonction”

                Minantcraft ;)

                >! Binary Dimension
                [url=https://minecraft.cu…

                1 réponse Dernière réponse Répondre Citer 0
                • BrokenSwingB Hors-ligne
                  BrokenSwing Moddeurs confirmés Rédacteurs
                  dernière édition par

                  Et un truc de + (désolé xD) mais tu pourrai rendre ta fonction generate(World, int, int, int) static parce que tu n’as aucune utilitée à créer une instance de la classe

                  1 réponse Dernière réponse Répondre Citer 0
                  • MinantcraftM Hors-ligne
                    Minantcraft
                    dernière édition par

                    @‘BrokenSwing’:

                    Et un truc de + (désolé xD) mais tu pourrai rendre ta fonction generate(World, int, int, int) static parce que tu n’as aucune utilitée à créer une instance de la classe

                    C’est fait!

                    Minantcraft ;)

                    >! Binary Dimension
                    [url=https://minecraft.cu…

                    1 réponse Dernière réponse Répondre Citer 0
                    • BrokenSwingB Hors-ligne
                      BrokenSwing Moddeurs confirmés Rédacteurs
                      dernière édition par robin4002

                      Mais du coup la fonction dans l’item devient :

                      public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
                      {
                          switch(structure)
                          {
                          case 1:
                              StructureTotem1.generate(world, x, y+1, z);
                              return true;
                          case 2:
                              StructureTotem2.generate(world, x, y+1, z);
                              return true;
                          default:
                              return false;
                          }
                      }
                      
                      1 réponse Dernière réponse Répondre Citer 0
                      • MinantcraftM Hors-ligne
                        Minantcraft
                        dernière édition par robin4002

                        OK.

                        Minantcraft ;)

                        >! Binary Dimension
                        [url=https://minecraft.cu…

                        1 réponse Dernière réponse Répondre Citer 0
                        • SCAREXS Hors-ligne
                          SCAREX
                          dernière édition par

                          Tutoriel pas trop mal dans l’ensemble même si un peu plus de précisions sur où placer certaines parties de code n’auraient pas étaient de trop.

                          PS : ce serait bien de rajouter le fait que l’item se détruise une fois utilisé sinon ça me paraît un peu cheaté à utiliser.

                          Site web contenant mes scripts : http://SCAREXgaming.github.io

                          Pas de demandes de support par MP ni par skype SVP.
                          Je n'accepte sur skype que l…

                          1 réponse Dernière réponse Répondre Citer 0
                          • MinantcraftM Hors-ligne
                            Minantcraft
                            dernière édition par

                            @‘SCAREX’:

                            Tutoriel pas trop mal dans l’ensemble même si un peu plus de précisions sur où placer certaines parties de code n’auraient pas étaient de trop.

                            PS : ce serait bien de rajouter le fait que l’item se détruise une fois utilisé sinon ça me paraît un peu cheaté à utiliser.

                            C’est pour ça que je met à chaque fin de partie la classe en entière.

                            PS: Ça pourrait être un item réservé au créatif qui permet d’avoir la structure sans devoir cherché dans le monde mais je vais voir pour la destruction de l’item dans la partie bonus

                            Minantcraft ;)

                            >! Binary Dimension
                            [url=https://minecraft.cu…

                            1 réponse Dernière réponse Répondre Citer 0
                            • SCAREXS Hors-ligne
                              SCAREX
                              dernière édition par

                              Un simple if (player.isInCreativeMode()) player.getEquippedItem().stacksize–; est suffisant (pas totalement sûr du code)

                              Site web contenant mes scripts : http://SCAREXgaming.github.io

                              Pas de demandes de support par MP ni par skype SVP.
                              Je n'accepte sur skype que l…

                              1 réponse Dernière réponse Répondre Citer 0
                              • MinantcraftM Hors-ligne
                                Minantcraft
                                dernière édition par

                                Tuto fini, avec BONUS.

                                Minantcraft ;)

                                >! Binary Dimension
                                [url=https://minecraft.cu…

                                1 réponse Dernière réponse Répondre Citer 0
                                • 1 / 1
                                • Premier message
                                  Dernier message
                                Design by Woryk
                                ContactMentions Légales

                                MINECRAFT FORGE FRANCE © 2024

                                Powered by NodeBB