• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    [1.7.10] Créer un Item dynamite

    Tutoriels des membres
    5
    7
    1626
    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.
    • Shinco
      Shinco dernière édition par robin4002

      Sommaire

      • Introduction
      • Pré-requis
      • Code
        • La classe principale
        • La classe de l’item
        • La classe de l’entité
        • La classe du DynamiteRenderTuto
        • La classe du ClientProxy
      • Texture
      • Crédits

      Introduction

      Salut !
      Dans ce tutoriel nous avons voir comment créer un item dynamite. De la création de l’entité au rendu de l’item.

      Pré-requis

      • Créer la base de votre mod

      Code

      Classe Principale :

      Dans un premier temps il faut déclarer l’item en dessous vos bloc ou votre proxy:

      public static dynamiteTuto;
      

      ou à la suite de vos items déjà existant:

      public static itemTuto, dynamiteTuto;
      

      ensuite il faut enregistrer l’item dans le jeu donc dans la méthode preInit():

      dynamiteTuto = new DynamiteTuto().setUnlocalizedName("dynamite_tuto").setTextureName(ModTudo.MODID + ":dynamite_tuto");
      GameRegistry.registerItem(dynamiteTuto, "dynamite_tuto");
      

      comme nous somme toujour dans la classe principale on va aller dans la méthode init() pour pouvoir enregistrer notre entité.

      EntityRegistry.registerModEntity(EntityDynamiteTuto.class, "EntityDynamiteTuto", 420, ModTuto.instance, 32, 20, false);
      

      Voilà on en a fini avec la classe principale.

      Classe de l’item :

      Depuis tout à l’heure vous avez une erreur dans la classe principale, normal il faut dès à présent créer la classe de l’item.
      il faut l’étendre(extends) en Item, et créer le constructeur:

      public DynamiteTuto() {
          this.setMaxStackSize(16); //Taille max d'un stack de cette item vous pouvez le changer ou l'enlever.
          this.setCreativeTab(CreativeTabs.tabCombat); //On met l'item dans la creativeTabs que l'on veux.
      }
      

      Maintenant on va s’occuper de l’action du clic droit sur l’item pour pouvoir faire spawn l’entité que l’on va créer
      après.
      En dessous du constructeur insérer la méthode onItemRightClick() elle doit contenir 3 paramètre :

      • un ItemStack

      • un World

      • un EntityPlayer

      donc ce qui donne :

      public ItemStack onItemRightClick(ItemStack stack ,World world, EntityPlayer player){
      
      }
      

      Dans cette méthode on va ajouter le son lors ce que l’on le lance et on va faire apparaitre notre entité.

      public ItemStack onItemRightClick(ItemStack stack ,World world, EntityPlayer player){
          world.playSoundAtEntity(player, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
          if(!world.isRemote){
              world.spawnEntityInWorld(new EntityDynamiteTuto(world, player)); 
          }
          return stack;
      }
      

      Classe de l’entité :

      Depuis tout à l’heure vous disposez d’une erreur dans la classe principal car on a enregistré un classe qui n’existe, je vous invite alors à créer la classe EntityDynamiteTuto.
      Une fois cela fais on vas commencer par étendre notre par EntityThrowable et implementer IEntityAdditionalSpawnData.

      Une fois ça fait on va déclarer un variable priver qui correspond au temps avant l’explosion de la dynamite, en dessous on va écrire deux méthode en public qui sont EntityDynamiteTuto(), une avec un paramètre qui est un World, et l’autre contient deux paramètres qui sont un World et un EntityLivingBase.

      Normalement vous devez obtenir ceci:

      public class EntityDynamite extends EntityThrowable implements IEntityAdditionalSpawnData{
             
          private int fuseTime = 50;
          public EntityDynamiteTuto(World world){
              super(world);
          }
         public EntityDynamiteTuto(World world, EntityLivingBase thrower){
              super(world,thrower);
          }
      

      Ensuite va écrire en dessous la méthode onImpact((MovingObjectPosition mop) qui va nous permettre à notre dynamite de reste la ou elle tomber. Ce qui donne :

      protected void onImpact(MovingObjectPosition mop){
          this.motionX = 0;
          this.motionY = 0;
          this.motionZ = 0;
      }
      

      Maintenant on va créer la méthode qui va permettre le compte à rebours de la dynamite pour cela on va utiliser la méthode onUpdate().

      @Override
      public void onUpdate()
         super.onUpdate();
         if(fuseTime > 0){  //si fuseTime est supérieur à 0 alors
             this.fuseTime --; // retire 1 a la variable fuseTime
         }
         else if(!this.worldObj.isRemote){ //si le monde n'est pas distant, on est sur le monde serveur uniquement
             this.worldObj.newExplosion(this, this.posX, this.posY, this.posZ, 3.0F, false, true);  //(l'entité que l'on veut utiliser, x, y, z, puissance de l'explosion,  si l'explosion met le feux, si l'explosion casse les blocs)
             this.setDead();//On tue l'entité, on l'enlève
         }
      }
      

      Enfin maintenant il nous reste deux méthodes à écrire qui sont writeSpawnData(ByteBuf buffer) et readSpawnData(ByteBuf additionalData) donc ce qui nous donne:

      @Override
      public void writeSpawnData(ByteBuf buffer) {
          buffer.writeInt(this.fuseTime);
          buffer.writeDouble(this.motionX);
          buffer.writeDouble(this.motionY);
          buffer.writeDouble(this.motionZ);
      }
      @Override
      public void readSpawnData(ByteBuf additionalData) {
              this.fuseTime = additionalData.readInt();
      			
              this.motionX = additionalData.readDouble();
      	this.motionY = additionalData.readDouble();
      	this.motionZ = additionalData.readDouble();
      }
      

      Classe du DynamiteRenderTuto :

      Maintenant je vous invite à créer une classe pour le rendu de votre dynamite ,cette classe doit être étendu en Render.
      Vous devez aussi déclarer deux variable privé une qui est un item et l’autre est une valeur entière(int).
      Vous devez obtenir ceci:

      public class DynamiteRenderTuto extends Render{
          private Item dynamite;
          private int renderDynamite;
      }
      

      Ensuite on va écrire a la suite deux méthode DynamiteRenderTuto ce qui donne:

      public DynamiteRender(Item Dynamite, int RenderDynamite){
          this.dynamite = Dynamite;
          this.renderDynamite = RenderDynamite;
      }
      public DynamiteRender(Item Dynamite){
          this(Dynamite,0);
      }
      

      Maintenant on va écrire en dessous la méthode doRender() qui va nous permettre de récupérer la texture de notre item et l’affecter à l’entité

      public void doRender(Entity player, double x, double y, double z, float p_76986_8_ , float p_76986_9_){
          IIcon icon = this.dynamite.getIconFromDamage(this.renderDynamite);
      }
      
      //La méthode qui suit permet de retourner l'endroit ou est la texture
      
      protected ResourceLocation getEntityTexture(Entity entity){
          return TextureMap.locationItemsTexture;et
      
      }
      

      Classe du ClientProxy :

      Pour finir la partie code du tutoriel on va devoir aller dans la classe du ClientProxy pour pouvoir enregistrer notre classe DynamiteRenderTuto. Donc dans la méthode du registerRender il faut écrire:

      RenderingRegistry.registerEntityRenderingHandler(EntityDynamiteTuto.class, new RenderSnowball(ModTuto.dynamiteTuto));
      

      Texture et le nom

      Il faut maintenant s’occuper des ressources. Allez dans le dossier forge/src/main/resources/assets/modid/
      Commençons d’abord par le dossier lang, ouvrez le fichier en_US.lang et ajoutez :

      item.le nom non localisé de votre item.name=Le nom en jeu en anglais
      

      Dans mon cas :

      item.dynamite_tuto.name=Dynamite Tuto
      

      Même chose avec les autres langages.
      Ensuite retournez dans le dossier de votre mod, et ouvrez le dossier “textures”. Ouvrez le dossier nommé “items”. Dans ce dossier, ajoutez votre texture (format .png, 16x16 ou 32x32 ou 64x64, etc …) portant le nom que nous avons mit dans le .setTextureName du bloc.

      Crédit

      Rédaction:

      • Shinco


      Ce tutoriel de Shinco publié sur 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

      retourRetour vers le sommaire des tutoriels

      1 réponse Dernière réponse Répondre Citer 0
      • JustAnDev
        JustAnDev dernière édition par

        bon tuto, mais tu n’as pas mis le fait de baisser le nombre d’items au cours d’un click droit

        s

        1 réponse Dernière réponse Répondre Citer 0
        • JustAnDev
          JustAnDev dernière édition par

          un topic reglant le problème

          https://www.minecraftforgefrance.fr/topic/5426/faire-baisser-le-nombre-d-item-lors-que-l-on-l-utilise/8

          s

          1 réponse Dernière réponse Répondre Citer 0
          • OverSquid
            OverSquid dernière édition par robin4002

            Salut moi ma dynamite se lance bien mais je n’ai aucun objet se lancant ni explosant !

            La classe Dynamite:

            package com.hypala.hypalacore.common;
            
            import net.minecraft.entity.player.EntityPlayer;
            import net.minecraft.item.Item;
            import net.minecraft.item.ItemStack;
            import net.minecraft.world.World;
            
            public class Dynamite extends Item
            {
                public ItemStack onItemRightClick(ItemStack stack ,World world, EntityPlayer player){
                    world.playSoundAtEntity(player, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
                    if(!world.isRemote){
                        world.spawnEntityInWorld(new EntityDynamite(world)); 
                    }
                    return stack;
                }
            }
            

            La classe EntityDynamite :

            package com.hypala.hypalacore.common;
            
            import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData;
            import io.netty.buffer.ByteBuf;
            import net.minecraft.entity.Entity;
            import net.minecraft.entity.EntityLivingBase;
            import net.minecraft.entity.projectile.EntityThrowable;
            import net.minecraft.nbt.NBTTagCompound;
            import net.minecraft.util.MovingObjectPosition;
            import net.minecraft.world.World;
            
            public class EntityDynamite extends EntityThrowable implements IEntityAdditionalSpawnData{
                
                
               public EntityDynamite(World world, EntityLivingBase thrower){
                    super(world,thrower);
                }
               private int fuseTime = 50;
               public EntityDynamite(World world){
                   super(world);
               }
              
               @Override
               public void onUpdate() {
                  super.onUpdate();
                  if(fuseTime > 0){  //si fuseTime est supérieur à 0 alors
                      this.fuseTime --; // retire 1 a la variable fuseTime
                  }
                  else if(!this.worldObj.isRemote){ //si le monde n'est pas distant, on est sur le monde serveur uniquement
                      this.worldObj.newExplosion(this, this.posX, this.posY, this.posZ, 7.0F, true, true);  //(l'entité que l'on veut utiliser, x, y, z, puissance de l'explosion,  si l'explosion met le feux, si l'explosion casse les blocs)
                      this.setDead();//On tue l'entité, on l'enlève
                  }
               }
               @Override
               public void writeSpawnData(ByteBuf buffer) {
                   buffer.writeInt(this.fuseTime);
                   buffer.writeDouble(this.motionX);
                   buffer.writeDouble(this.motionY);
                   buffer.writeDouble(this.motionZ);
               }
               @Override
               public void readSpawnData(ByteBuf additionalData) {
                       this.fuseTime = additionalData.readInt();
                           
                       this.motionX = additionalData.readDouble();
                   this.motionY = additionalData.readDouble();
                   this.motionZ = additionalData.readDouble();
               }
            @Override
            protected void onImpact(MovingObjectPosition mop){
                this.motionX = 0;
                this.motionY = 0;
                this.motionZ = 0;
            }
            }
            

            Et la classe RenderDynamite :

            package com.hypala.hypalacore.common;
            
            import com.sun.prism.TextureMap;
            
            import net.minecraft.client.renderer.entity.Render;
            import net.minecraft.entity.Entity;
            import net.minecraft.item.Item;
            import net.minecraft.util.IIcon;
            import net.minecraft.util.ResourceLocation;
            
            public class renderDynamite extends Render
            {
                private Item dynamite;
                private int renderdynamite;
            
                public void doRender(Entity player, double x, double y, double z, float p_76986_8_ , float p_76986_9_){
                    IIcon icon = this.dynamite.getIconFromDamage(this.renderdynamite);
                }
                
                public void DynamiteRender(Item Dynamite, int RenderDynamite){
                    this.dynamite = Dynamite;
                    this.renderdynamite = RenderDynamite;
                }
                public void DynamiteRender(Item Dynamite){
                    this.DynamiteRender(Dynamite,0);
                }
            
                @Override
                protected ResourceLocation getEntityTexture(Entity p_110775_1_)
                {
                    return null;
                }
            }
            
            

            Merci pour votre aide 😉

            L 1 réponse Dernière réponse Répondre Citer 0
            • L
              Le_Vrai_GG @OverSquid dernière édition par

              @OverSquid je suis pas sur mais je crois qu’il faut que tu change l’endroit ou tu fais exploser et mourir ton entitée car la méthode onImpact permet de dire se qui se passe lorsque ton entitée touche le sol (donc par exemple si elle explose)

              1 réponse Dernière réponse Répondre Citer 0
              • I
                iZcoKs dernière édition par

                Bonjour a vous,

                Aujourd’hui je voudrais crée une dynamite mais malheureusement je ne comprend pas tout sur ce tuto.

                Quelqu’un pourrait m’aider svp ?

                1 réponse Dernière réponse Répondre Citer 0
                • JustAnDev
                  JustAnDev dernière édition par

                  Désolé mais la 1.7.10 n’est plus supporté par MFF, donc va falloir aller ici
                  https://discord.gg/uWyKve

                  s

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

                  MINECRAFT FORGE FRANCE © 2018

                  Powered by NodeBB