[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 -
-
bon tuto, mais tu n’as pas mis le fait de baisser le nombre d’items au cours d’un click droit
-
un topic reglant le problème
-
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
-
@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)
-
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 ?
-
Désolé mais la 1.7.10 n’est plus supporté par MFF, donc va falloir aller ici
https://discord.gg/uWyKve