[SEMI TUTO] Création de mon mob hostile: spawn, attaque etc.
-
Pour qu’il attaque et qu’il bouge, il lui faut une IA, tu l’as mise ?> c’est à dire?
C’est pas ça?
Protected void applyEntityAI()
{
this.tasks.addTask(4, new EntityAIAttackOnCollide(this, EntityIronGolem.class, 1.0D, true));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, true));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityVillager.class, true));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityIronGolem.class, true));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityChicken.class, true));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPig.class, true));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityRabbit.class, true));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityCow.class, true));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityHorse.class, true));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityOcelot.class, true)); -
@‘conquerorguepard’:
(avec findGlobalUniqueEntityId et registerGlobalEntityID barrés je ne sais pas pourquoi)
Car ce sont des méthodes obsolètes, donc qui ne devrait plus être utilisé.
Pour les biomes, tu peux faire un tableau de tout les biomes et le réutiliser pour tous les entités, je ne crois pas qu’on peut faire mieux
-
Tu en as mis beaucoup trop, surtout que tu leur as donné la meme priorité (2) à chacun.
-
D’accord.
Mais mon plus gros problème c’est que mon mob ne bouge pas et n’attaque pas
Et c’est quoi les différences entre ambient creature monster.
Parce que mon mob est monster mais ne spawn que la nuit alors que je voudrais qu’il spawn le jour. -
Il faut que tu mettes la fonction canSpawn sur true (la fonction est dans Entity Mob).
-
C’est où que je la mets exactement cette fonction? Entity Handler ou EntityClass? Dans quel endroit exacte?
Et du coup on m’a toujours pas dit comment je dois faire pour qu’il puisse bouger :/…Et c’est mieux comme ça?
this.tasks.addTask(4, new EntityAIAttackOnCollide(this, EntityIronGolem.class, 1.0D, true));
this.targetTasks.addTask(1, new EntityAINearestAttackableTarget(this, EntityPlayer.class, true));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityVillager.class, true));
this.targetTasks.addTask(3, new EntityAINearestAttackableTarget(this, EntityIronGolem.class, true));
this.targetTasks.addTask(4, new EntityAINearestAttackableTarget(this, EntityChicken.class, true));
this.targetTasks.addTask(5, new EntityAINearestAttackableTarget(this, EntityPig.class, true));
this.targetTasks.addTask(6, new EntityAINearestAttackableTarget(this, EntityRabbit.class, true));
this.targetTasks.addTask(7, new EntityAINearestAttackableTarget(this, EntityCow.class, true));
this.targetTasks.addTask(8, new EntityAINearestAttackableTarget(this, EntityHorse.class, true));
this.targetTasks.addTask(9, new EntityAINearestAttackableTarget(this, EntityOcelot.class, true));
} -
Dans la classe de l’entité.
Comme je l’ai dit dans l’autre post, fais un nettoyage dans tes ai -
Et du coup je fais comment pour qu’il attaque tous les mobs non hostiles?
Et ça ne résout pas les problèmes de déplacements
-
Nomalement EnumCreatureType.monster suffit à les rendre aggressifs.
-
Non il faut mettre les ai en rapport avec l’attaque (récupères celles des zombies et pour attaquer toutes les entitées, tu n’auras qu’à changer les sélécteurs.
-
C’est quoi les sélecteurs? Lesquels? Comment?
Et canspawn sur true sur quelle mise en forme et dans quelle variable?
Il me faut du détail c’est mon premier et je ne sais pas dans quel variable mettre vos commandes ni comment les formuler.
Sinon toutoune, je connais ça, mais je cherche à ce que les monstres attaquent aussi les autres mobs passifs -
Tu récupères les EntityAI du zombie, aux endroits où il y a new EntityAI[Quelque chose], dans le contructeur, il y a des noms d’entité pour certaines de ces entityAi, tu as juste à les modifier. (Je te dis ça de mémoire, je l’ai pas en face).
Pour le “canSpawn”, dans la classe Entity, recherches la fonction qui s’appelle comme ça (ctrl+f pour rechercher) et copies-colles là dans ton entitée, en mettant bien “return true;” -
J’ai modifié la classe entity :
package Entity; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAIAttackOnCollide; import net.minecraft.entity.ai.EntityAIHurtByTarget; import net.minecraft.entity.ai.EntityAILookIdle; import net.minecraft.entity.ai.EntityAIMoveThroughVillage; import net.minecraft.entity.ai.EntityAIMoveTowardsRestriction; import net.minecraft.entity.ai.EntityAINearestAttackableTarget; import net.minecraft.entity.ai.EntityAISwimming; import net.minecraft.entity.ai.EntityAIWander; import net.minecraft.entity.ai.EntityAIWatchClosest; import net.minecraft.entity.monster.EntityIronGolem; import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.monster.EntityPigZombie; import net.minecraft.entity.passive.EntityChicken; import net.minecraft.entity.passive.EntityCow; import net.minecraft.entity.passive.EntityHorse; import net.minecraft.entity.passive.EntityOcelot; import net.minecraft.entity.passive.EntityPig; import net.minecraft.entity.passive.EntityRabbit; import net.minecraft.entity.passive.EntityVillager; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.pathfinding.PathNavigateGround; import net.minecraft.world.World; public class Entityclass extends EntityMob { public Entityclass(World world) { super(world); ((PathNavigateGround)this.getNavigator()).setBreakDoors(true); this.tasks.addTask(0, new EntityAISwimming(this)); this.tasks.addTask(2, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false)); this.tasks.addTask(5, new EntityAIMoveTowardsRestriction(this, 1.0D)); this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); this.tasks.addTask(8, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); this.tasks.addTask(8, new EntityAILookIdle(this)); this.setSize(2, 3); this.applyEntityAI(); } public void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(62D); this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(9D); this.getEntityAttribute(SharedMonsterAttributes.knockbackResistance).setBaseValue(2D); this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(1D); this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(120D); } protected void applyEntityAI() { this.tasks.addTask(4, new EntityAIAttackOnCollide(this, EntityIronGolem.class, 1.0D, true)); this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true, new Class[] {EntityPigZombie.class})); this.targetTasks.addTask(1, new EntityAINearestAttackableTarget(this, EntityPlayer.class, true)); this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityVillager.class, true)); this.targetTasks.addTask(3, new EntityAINearestAttackableTarget(this, EntityIronGolem.class, true)); this.targetTasks.addTask(4, new EntityAINearestAttackableTarget(this, EntityChicken.class, true)); this.targetTasks.addTask(5, new EntityAINearestAttackableTarget(this, EntityPig.class, true)); this.targetTasks.addTask(6, new EntityAINearestAttackableTarget(this, EntityRabbit.class, true)); this.targetTasks.addTask(7, new EntityAINearestAttackableTarget(this, EntityCow.class, true)); this.targetTasks.addTask(8, new EntityAINearestAttackableTarget(this, EntityHorse.class, true)); this.targetTasks.addTask(9, new EntityAINearestAttackableTarget(this, EntityOcelot.class, true)); }Et maintenant il me fait ça: (j’ai voulu mettre une vidéo ça a pas marché. En gros mon mob avance à une très grande vitesse et fait des tours de moins d’une seconde autour de moi. Par contre il n’attaque que moi. Il va tellement vite qu’on dirait qu’il se tp. Des idées? Et sinon j’ai essayé de chercher canspawn, ça n’a rien trouvé, comme le montre le screen. De toutes façons, j’ai mis tous mes fichiers en première page, donc vous trouverez si quelque chose manque :))
Vous savez pourquoi? -
Pour le fait qu’il aille très vite, il faut que tu modifies sa vitesse (le movementSpeed) (tu as mis 1.0D et les mobs de Minecraft sont tous à moins de 1.0D, par exemple le zombie a “0.23000000417232513D”).
Pour le canspawn, effectivement je me suis trompé de nom :(, je regarde ça tout de suite.EDIT : C’est bon en fait la fonction c’est getCanSpawnHere, mais elle vérifies aussi les boites de collision donc il vaut mieux pas la remplacer (ça va juste te compliquer la vie) donc tu as juste à mettre cette fonction pour l’empêcher de vérifier le niveau de lumière :
@Override //Permet de dire que tu remplace une fonction de la superclass (le extends …) protected boolean isValidLightLevel() { return true; } -
Edit: Tout est bon. J’ai baisser sa vitesse, et j’ai fait en sorte qu’il n’y ai que this.targetTasks.addTask(1, new EntityAINearestAttackableTarget(this, EntityPlayer.class, true)); dans Protected void. Il ne manque que quatre choses, dont deux très importantes:
1.L’autoriser à pouvoir spawn le jour, et à ce qu’il ne disparaisse pas lorsqu’on s’éloigne trop.
2.Le faire attaquer tous les mobs autres que lui.Moins important: 3.Trouver comment lui rajouter un son. Je vais réfléchir moi même sur cela pour le moment.
4.Lui rajouter une animation de marche, ça je pense que je vais avoir du mal… -
Effectivement c’est byzarre…
Pour le fait qu’il attaque byzarrement, remplace ça :1. **this**.targetTasks.addTask(2, **new** EntityAINearestAttackableTarget(**this**, EntityPlayer.**class**, **true**)); 2. **this**.targetTasks.addTask(2, **new** EntityAINearestAttackableTarget(**this**, EntityVillager.**class**, **true**)); 3. **this**.targetTasks.addTask(2, **new** EntityAINearestAttackableTarget(**this**, EntityIronGolem.**class**, **true**)); 4. **this**.targetTasks.addTask(2, **new** EntityAINearestAttackableTarget(**this**, EntityChicken.**class**, **true**)); 5. **this**.targetTasks.addTask(2, **new** EntityAINearestAttackableTarget(**this**, EntityPig.**class**, **true**)); 6. **this**.targetTasks.addTask(2, **new** EntityAINearestAttackableTarget(**this**, EntityRabbit.**class**, **true**)); 7. **this**.targetTasks.addTask(2, **new** EntityAINearestAttackableTarget(**this**, EntityCow.**class**, **true**)); 8. **this**.targetTasks.addTask(2, **new** EntityAINearestAttackableTarget(**this**, EntityHorse.**class**, **true**)); 9. **this**.targetTasks.addTask(2, **new** EntityAINearestAttackableTarget(**this**, EntityOcelot.**class**, **true**));par ça :
[font=monospace****this**][font=monospace.][font=monospacetargetTasks][font=monospace.][font=monospaceaddTask][font=monospace(][font=monospace2][font=monospace,][font=monospace ][font=monospace**new**][font=monospace ][font=monospaceEntityAINearestAttackableTarget][font=monospace(][font=monospace**this**][font=monospace,][font=monospace ][font=monospaceEntityPlayer][font=monospace.][font=monospace**class**][font=monospace,][font=monospace ][font=monospace**true**][font=monospace));]** [font=monospace**this**][font=monospace.][font=monospacetargetTasks][font=monospace.][font=monospaceaddTask][font=monospace(3][font=monospace,][font=monospace ][font=monospace**new**][font=monospace ][font=monospaceEntityAINearestAttackableTarget][font=monospace(][font=monospace**this**][font=monospace,][font=monospace ][font=monospaceEntityCreature][font=monospace.][font=monospace**class**][font=monospace,][font=monospace ][font=monospace**true**][font=monospace));]ça aura le même effet et au moins ils n’entreront pas en conflit.
Pour le spawn, j’aurais pensé que ça aurait marché, je vais continuer à voir ça.
Pour le son, il y a des fonctions comme getDeathSound(), getHurtSound() dans la classe EntityMob que tu peux reprendre.
Pour l’animation de marche, regarde dans ModelBiped (package net.minecraft.client.model) que les jambes sont animées.
-
Et j’aimerai savoir comment faire pour qu’il saute aussi
svp
Sinon merci déjà! -
Il ne saute pas déjà ? Parce qu’on est pas censé mettre quelque chose de spécial (du moins je crois pas).
Et si tu as toujours un problème de spawn, mets un System.out.println(“Fonction appelee”); avant le return true; dans ta fonction getCanSpawnHere(), pour savoir si le serveur essaye bien de faire spawn le mob (Joues pendant un petit temps puis regarde la console d’eclipse, si il y a ce message dans la console, ton mob a spawn sinon c’est qu’il essaye même pas de spawn (un bug/il faut changer une des valeurs où tu enregistres le spawn).
-
Du coup j’ai trouvé une autre solution :). Mettre le mob en “Creature”.
Il spawn le jour maintenant. Bon sinon il veut toujours pas manger les autres mobs. Et il ne saute pas, c’est son plus gros problème actuel. -
En fait depuis le début (si j’avais été toi) je n’aurai pas ajouté la moindre AI car de 1) tu n’en pas réellement besoin : simple mob agressif sur toutes les autres entity, exclus les mobs, et de 2) c’est te compliquer la vie et SURTOUT la compréhension du code, étant donné que tu as l’air de débuter. Donc vire toute ta méthode applyEntityAI(). Pour que ton mob puisse donc attaquer un simple extends EntitMob suffira.
Quand à l’EnumCreatureType (je rerends ce que robin avait déjà indiqué), cela n’a rien à voir avec l’agressivité ou non de l’entity, mais sa capacité à pouvoir spawn en fonction de la difficulté sélectionnée de la partie. Laisse donc en monster.
Pour qu’elle puisse attaquer toutes les entity passives, suis tout simplement ce tuto :
http://www.minecraftforgefrance.fr/showthread.php?tid=730Et enfin pour qu’elle puisse sauter, ce tuto :
http://www.minecraftforgefrance.fr/showthread.php?tid=907