4 janv. 2019, 15:53

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

retourRetour vers le sommaire des tutoriels