Ce tutoriel est également disponible en vidéo.
Une entité est quelque chose qui peut se déplacer dans le monde (ou pas pour certaines). Elles peuvent spawn et mourir. Il existe plusieurs types d’entités, les EntityItem qui servent pour les items au sol, les minecart et les bateaux, les tableaux et les items frames, les tnt activées, et de nombreuses autres sont des entités non vivantes (même si elles ont aussi des points de vie et une fonction setDeath()). Ensuite il y a les EntityLiving, qui héritent de EntityLivingBase tout comme les joueurs qui sont des entités vivantes. Les pnj, les mobs agressifs ou passifs héritent tous d’EntityLiving. Toutes les entités vivantes ont une IA (sauf le joueur, puisque l’IA qu’il possède est la votre :p) c’est ce qui différencie les entités vivantes des autres. Comme il faut bien commencer par quelque chose de simple nous allons créer une entité vivante agressive (EntityMob).
La classe de l’entité :
Commencez par créer une nouvelle classe dans votre package common, (clic droit, new class). Dans Superclass, mettez : net.minecraft.entity.monster.EntityMob
Vous allez avoir une erreur sur la classe, c’est normal, il faut ajouter un constructeur. Passer la souris sur l’erreur, et faites “Add constructor nom de votre class(world)”. Changez le nom du paramètre si vous le souhaitez, personnellement je préfère world plutôt que par1World. La classe du mob ressemble à ça :
| package fr.minecraftforgefrance.tutoriel.common; |
| |
| import net.minecraft.entity.monster.EntityMob; |
| import net.minecraft.world.World; |
| |
| public class EntityMobTutoriel extends EntityMob |
| { |
| public EntityMobTutoriel(World world) |
| { |
| super(world); |
| } |
| } |
Ajoutez ensuite cette fonction :
| public void applyEntityAttributes() |
| { |
| super.applyEntityAttributes(); |
| |
| |
| } |
Elle va permettre d’appliquer les attributs, ces derniers gèrent : la vie, la force d’attaque, la vitesse de déplacement, la résistance à l’enchantement recul et la distance de détection d’autres entités.
En dessous ou à la place du commentaire “la suite va ici” mettez :
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20D);
Cela définira la vie par défaut. Elle est exprimée en demi-cœurs, donc 20D = 10 cœurs. Si vous ne mettez pas cette fonction, la vie sera 20 par défaut.
Quelques autres fonctions que vous pouvez mettre à la suite :
| this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(6D); |
| this.getEntityAttribute(SharedMonsterAttributes.knockbackResistance).setBaseValue(1D); |
| this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.8D); |
attackDamage = nombre de dégât, si vous ne mettez pas cette fonction, la valeur sera 1D.
knockbackResistance = la résistance à l’enchantement recul, 0D si vous ne mettez pas cette fonction.
movementSpeed = la vitesse de déplacement, 0.699999988079071D si vous ne mettez pas cette fonction.
Voilà, c’est tout pour la classe de l’entité.
Le rendu :
Dans le package client, créez une nouvelle classe nommée “Render<le nom de votre mod>”, mettez net.minecraft.client.renderer.entity.RenderBiped en superClass.
À nouveau vous allez avoir une erreur sur la classe, il faut ajouter un constructeur (prenez le premier de la liste : ModelBiped,float)
Une fois de plus, pour une question de lisibilité du code, je vais changer les noms des paramètres. Ce qui donne :
| package fr.minecraftforgefrance.tutoriel.client; |
| |
| import net.minecraft.client.model.ModelBiped; |
| import net.minecraft.client.renderer.entity.RenderBiped; |
| |
| public class RenderMobTutoriel extends RenderBiped |
| { |
| |
| public RenderMobTutoriel(ModelBiped model, float shadow) |
| { |
| super(model, shadow); |
| } |
| |
| } |
À la place de la déclaration du ResourceLocation, mettez :
public final ResourceLocation texture = new ResourceLocation(ModTutoriel.MODID, "textures/entity/mob_tutoriel.png");
Ce field va définir la texture, si vous n’avez pas fait de field MODID dans votre classe principale comme montré dans le tutoriel sur les items, remplacez directement par votre modid :
public final ResourceLocation texture = new ResourceLocation("tutoriel", "textures/entity/mob_tutoriel.png");
Ma texture sera dans forge/src/main/resources/assets/tutoriel/textures/entity/mob_tutoriel.png.
Attention, contrairement aux blocs et aux items, il faut mettre le chemin complet et le .png.
Maintenant nous allons ajouter deux méthodes pour indiquer au rendu qu’il faut utiliser pour cette texture :
| protected ResourceLocation getEntityTexture(EntityLiving living) |
| { |
| return this.getMobTutorielTexture((EntityMobTutoriel)living); |
| } |
| |
| private ResourceLocation getMobTutorielTexture(EntityMobTutoriel mobTutoriel) |
| { |
| return texture; |
| } |
Vous pouvez appeler la fonction getMobTutorielTexture comme vous le souhaitez, ça n’a pas d’importance, il faut juste que la classe de votre mod soit en argument. EntityMobTutoriel correspond donc à la classe de votre mob.
La classe principale :
Votre mob ne risque pas de fonctionner s’il est enregistré nulle part.
Dans la classe principale, dans la fonction init, ajoutez :
| EntityRegistry.registerGlobalEntityID(EntityMobTutoriel.class, "mobTutoriel", EntityRegistry.findGlobalUniqueEntityId(), new Color(0, 255, 0).getRGB(), new Color(255, 0, 0).getRGB()); |
| EntityRegistry.registerModEntity(EntityMobTutoriel.class, "mobTutoriel", 420, this.instance, 40, 1, true); |
La première ligne enregistre l’entité dans le système global de minecraft. EntityMobTutoriel.class est la classe de mon mob, “mobTutoriel” le nom non localisé de l’entité, EntityRegistry.findGlobalUniqueEntityId() sert à avoir un id libre dans le système global de minecraft, et les deux derniers arguments sont pour la couleur du bas et du haut de l’œuf de votre mob. Vous pouvez utiliser directement un int, mais il est plus simple d’utiliser new Color(rouge, vert, bleu).getRGB(). Cependant, n’oubliez pas d’importer Color en plus de EntityRegistry (ctrl + shift + o).
La deuxième enregistre le mob dans FML. le première argument est à nouveau la classe du mob, le second à nouveau le nom non localisé, le troisième est l’id du mob, this.instance est l’instance du mod, si vous enregistrez votre mob à un autre endroit que dans votre classe principale, il faut remplacer par NomDeLaClassePrincipale.instance. Vous pouvez mettre juste this si l’enregistrement est dans la classe principale. 40 est un rayon autour du mob qui définit tous les joueurs qui doivent avoir les informations de ce mob. Ne mettez pas une valeur trop petite, sinon vous devrez vous approcher de très près du mob pour avoir ses données (je n’ai pas testé, mais a mon avis vous risquer de ne pas le voir de loin). 1 correspond à la vitesse de tick, avec 1 le mob est tické à chaque tick, avec 20 tous les 20 ticks, donc une fois par seconde. Le dernier boolean sert pour les paquets, mettez-le sur true.
Voilà, notre mob est enregistré, dans la foulée nous allons lui donner un nom.
Dans le fichier lang (forge/src/main/resources/assets/votre id de mod/lang/en_US.lang et fr_FR.lang et éventuellement d’autres, ajoutez :
entity.nom non localisé du mob.name=Nom localisé
Dans mon cas :
entity.mobTutoriel.name=Tutorial Mob
Le proxy client :
Il ne reste plus qu’à enregistrer le rendu, ce qui se fait dans le client proxy puisque les rendus ne se font que dans le client.
Dans la méthode registerRender de votre client proxy, ajoutez :
RenderingRegistry.registerEntityRenderingHandler(EntityMobTutoriel.class, new RenderMobTutoriel(new ModelBiped(), 0.5F));
EntityMobTutoriel.class correspond à la classe de mon entité,
RenderMobTutoriel à la classe de mon render
new ModelBiped() à une nouvelle instance de ModelBiped (nous verrons plus tard comment créer son propre modèle).
0.5F est la taille de l’ombre. Et voilà, le mob est opérationnel !
Retournez dans la classe de votre mob, et ajoutez cette fonction :
| public Item getDropItem() |
| { |
| return Item.getItemFromBlock(ModTutoriel.blockTutoriel); |
| } |
Elle va définir le drop du mob lors de sa mort. Pour drop, mettez :
- Pour un item de votre mod : ClassePrincipale.field_de_l’item (le field est le nom dans public static Item nom;)
- Pour un bloc de votre mod : Item.getItemFromBlock(ClassePrincipale.field_du_bloc) (le field est le nom dans public static Block nom;)
- Pour un item de minecraft : Items.field_de_l’item
- Pour un bloc de minecraft : Item.getItemFromBlock(Blocks.field_de_l’item).
Voir le commit sur github
Le commit sur github montre clairement où ont été placés les fichiers, ainsi que ce qui a été ajouté et retiré dans le fichier.
Rédaction :
Vidéo :
Correction :

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