[1.7.10] Créer un Item dynamite



  • Sommaire

    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

    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:


    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

    Retour vers le sommaire des tutoriels