Un mob basique
-
Sommaire
Introduction
Bonjour à tous et à toutes, ici Shad, en direct de MinecraftForgeFrance ! Ceci est un petit tutoriel pour apprendre à faire des mobs, avec une IA de base.
Pré-requis
- Un environnement Minecraft 1.10 (Le lien officiel)
- Une structure basique de mod
Code
L’entitée :
Qu’est-ce qui constitue un mob ? Une entité et un rendu. L’entité est la partie qui est - vulgairement - implanté dans votre serveur. C’est dans l’entité que l’on va implémenter le comportement de notre mob.
Il existe plusieurs types d’entités (accessibles via EnumCreatureType) :
- MONSTER
- CREATURE
- AMBIENT
- WATER_CREATURE
Nous allons donc commencer cette entitée qui sera… Vous !
package fr.minecraftforge.tutoriel.entities; import net.minecraft.entity.EntityCreature; import net.minecraft.world.World; public class EntityTutoriel extends EntityCreature { public EntityTutoriel(World worldIn) { super(worldIn); } }
Voilà, c’est fini !
L’Intelligence Artificielle :
Alors vu comme ça, ça paye pas de mine, mais pour commencer, on va rajouter quelques petites choses dans notre constructeur :
public EntityTutoriel(World worldIn) { super(worldIn); this.tasks.addTask(0,new EntityAISwimming(this)); this.tasks.addTask(1, new EntityAIPanic(this,0.6D)); this.tasks.addTask(2, new EntityAIWander(this,0.5D)); this.tasks.addTask(3, new EntityAIWatchClosest(this, EntityPlayer.class,5.0F)); }
Alors, on a quoi ici ? Eh bien simplement, on a plusieurs tâches ! Eh oui, 99% du comportement de notre mob passe maintenant par des tâches et une priorité. Comment on fait pour en rajouter une ? Eh bien c’est simple :
this.tasks.addTask(0,new EntityAISwimming(this));
0 est la priorité de notre comportement, EntityAISwimming(EntityLiving) est le comportement IA que l’on veut rajouter. Par exemple, pour rajouter le comportement “Peut être tenté avec un objet tenu” (le fameux “Le blé attire les vaches”) il s’agit de :
this.tasks.addTask(new EntityAITempt(this,0.65D,Items.WHEAT,false));
maintenant il va s’agit d’activer cette intelligence artificielle !
on fera ça avec :
@Override public boolean isAIDisabled() { return false; }
Les SoundEvent:
Rajoutons des sons à notre entité maintenant !
Pour rajouter des sons, on va commencer par rajouter une méthode qui va s’occuper de créer l’évènement sonore !private SoundEvent getSoundEvent(String event){ return new SoundEvent(new ResourceLocation(Tutoriel.MODID + ":mob.tutoriel." + event)); }
Maintenant, on va rajouter 3 méthodes d’un coup !
@Nullable @Override protected SoundEvent getHurtSound() { return getSoundEvent("hurt"); } @Nullable @Override protected SoundEvent getAmbientSound() { return getSoundEvent("idle"); } @Nullable @Override protected SoundEvent getDeathSound() { return getSoundEvent("death"); }
Ceci aura pour effet de lier 3 sons à notre entité :
- le son “ambient” qui est le son ambiant d’une entité (celle qu’elle fait quand elle vit tranquillement sans qu’on interagisse de quelque façon que ce soit). Exemple : le “beuargh” du zombie à proximité
- le son “hurt” qui est le son quand une entité est blessée (déclenchée après s’être pris des dégats)
- le son “death” qui est le son joué quand une entité meurt.
Le Rendu :
Maintenant que notre entité est créée, il faut la rendre, en tout cas côté client !
Créons donc une classe “RenderMobTutoriel” qui implémentera les méthodes de IRenderFactorypublic class RenderMobTutoriel extends RenderBiped implements IRenderFactory { public final ResourceLocation texture = new ResourceLocation(Reference.MOD_ID, "textures/entity/moi.png"); public RenderMobTutoriel(ModelBiped modelBiped, float shadow) { super(Minecraft.getMinecraft().getRenderManager(), modelBiped, shadow); } private ResourceLocation getMobTexture(EntityTutoriel tutoriel) { return texture; } @Override protected ResourceLocation getEntityTexture(Entity entity) { return this.getMobTexture((EntityTutoriel) entity); } @Override public Render createRenderFor(RenderManager manager) { return manager.getEntityClassRenderObject(EntityTutoriel.class); } }
Remplacez simplement le “mobTutoriel.png” par le nom du fichier de votre skin Minecraft.
Voilà, en gros on crée un rendu de bipède, et on y lie la texture, rien de
Enregistrer le mob :
Maintenant, c’est assez simple. On va aller dans l’init de notre mod et rajouter cette ligne :
EntityRegistry.registerModEntity(EntityTutoriel.class, "mobTutoriel", 0, Tutoriel.instance,40,1,true,new Color(180, 0, 0).getRGB(), new Color(255,182,90).getRGB());
Ici, on ne va pas trop chercher à tout disséquer. sachez que les arguments sont :
- Classe de l’entité en question
- Nom de l’entité
- ID de l’entité (mettez celle que vous voulez, les conflits d’ID pour les mobs n’existent plus entre mods/avec minecraft. Mais mettez en une différente par entité)
- l’instance du mod
- la distance à laquelle l’entité est mise à jour
- La fréquence à laquelle le mob doit être mis à jour
- Est-ce qu’on envoie des mises à jour sur la vélocité (mettez true dans le doute)
- La couleur primaire de l’oeuf
- La couleur secondaire de l’oeuf
Et voilà. On a enregistré l’entité,
Enregistrer le rendu :
Pour cela, allons dans le ClientProxy, et rajoutons ceci :
@Override public void registerRender() { RenderingRegistry.registerEntityRenderingHandler(EntityTutoriel.class, (IRenderFactory) new RenderMobTutoriel(new ModelBiped(), 0.5F)); }
En gros, on rajoute le lien entre “entité” et “rendu”.
Et voilà, tout est lié, tout fonctionne !
Crédits
Rédaction :
- ShadCanard
Ce tutoriel de ShadCanard 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 -
Ici ce n’est pas un mob que tu fais, mais plutôt une créature. Penses aux balises java pour une meilleure lisibilité. Mis à part quelques erreurs le tutoriel a l’air correct (par exemple pour enregistrer le rendu : tu n’as pas besoin de cast normalement, si c’est le cas c’est qu’il y a un problème)
-
La version uncastée est dépréciée
-
@‘ShadCanard’:
La version uncastée est dépréciée
C’est parce que dans la classe du rendu, tu dois mettre implements IRenderFactory****
-
La différence entre une créature et un mob, c’est quoi ? :dodgy: :dodgy:
-
Le mob est agressif, la créature pas forcément, puisque EntityMob hérite de EntityCreature, mais EntityAnimal également.
EDIT: La classe EntityCreature est la classe parent à tous les types d’entités vanilla de mc, sauf particules et moyens de transport, donc dedans on retrouve les agressives: comme les mobs, les neutres ou les passives, telles que les loups ou les cochons. -
D’accord, merci pour les infos, et d’avoir pris du temps pour me répondre