Résolu Garder en mémoire, IA
-
Salut à tous, désolé pour ce titre pas très clair, j’ai modifié un peu l’IA de mon zombie, mais j’aimerai savoir s’il y a moyen de lui faire une mémoire, c’est à dire que si il a vu le joueur il y a moins de 5 secondes il continue de le poursuivre, voici mon “IA”:
public void onLivingUpdate() { Minecraft mc = Minecraft.getMinecraft(); EntityPlayer player = mc.thePlayer; PathEntity pathentity; if (player != null) { float f = player.getDistanceToEntity(this); if (player.isSneaking()) { if (f <= 10) { if (this.canSeeEntity(player)) { pathentity = worldObj.getPathEntityToEntity(this, player, 50F, true, false, false, true); } else { if (f <= 5) { pathentity = worldObj.getPathEntityToEntity(this, player, 50F, true, false, false, true); } else { pathentity = null; } } } else { pathentity = null; } } else { if (f <= 20) { if (this.canSeeEntity(player)) { System.out.println(1); pathentity = worldObj.getPathEntityToEntity(this, player, 50F, true, false, false, true); } else { if (f <= 8) { pathentity = worldObj.getPathEntityToEntity(this, player, 50F, true, false, false, true); } else { pathentity = null; } } } else { pathentity = null; } } setPathToEntity(pathentity); } super.onLivingUpdate(); } private boolean canSeeEntity(EntityPlayer player) { double norme = Math.sqrt((Math.pow((this.posX - player.posX), 2))+(Math.pow((((this.posY + 1.20) + 1.20) - player.posY), 2))+(Math.pow((this.posZ - player.posZ), 2))); System.out.println(norme); for (int k = 0; k <= (int)(norme + 1); k++) { if (this.worldObj.isAirBlock((int)(player.posX + ((this.posX - player.posX)*k)/(2*norme)), (int)(player.posY + (((this.posY + 1.20) - player.posY)*k)/(2*norme)), (int)(player.posZ + ((this.posZ - player.posZ)*k)/(2*norme)))) { } else if(this.worldObj.getBlockId((int)(player.posX + ((this.posX - player.posX)*k)/(2*norme)), (int)(player.posY + (((this.posY + 1.20) - player.posY)*k)/(2*norme)), (int)(player.posZ + ((this.posZ - player.posZ)*k)/(2*norme))) == 20) { } else { return false; } } return true; }
Merci de votre aide,
Ps: pour ceux qui se demande c’est quoi ce bordel dans canSeeEntity, c’est encore en test, mais les formules sont toutes bonnes et vérifiés.
Edit: j’avais mis en résolu mais je remet en cours au vu de la remarque d’elias ^^
-
Up car sujet résolu, j’ai simplement fait avec System.getcurrenttimeMillis bien que je trouve ça bof, si quelqu’un a une autre idée.
Voila ce que ça donne au cas ou ça interesse quelqu’un x)
descriptif rapide de l’IA: Si le joueur avance normalement vers le zombie, il l’aggro à 20 blocks
si il sneak à 10 blocks
un joueur non sneak se fait aggro même si ya des blocs entre le zombie et lui à 8 blocks
un joueur sneak dans les mêmes conditions à 5 blocksUn zombie à 2,5 secondes de mémoire si l’on sort de son champ.
Il me reste à rajouter, la nuit/la pluie réduit le champ de vision du zombie, sachant que le champ de vision globale va être augmenté car un peu court à mon gout.
public void onLivingUpdate() { Minecraft mc = Minecraft.getMinecraft(); EntityPlayer player = mc.thePlayer; PathEntity pathentity = null; if (player != null) { if (System.currentTimeMillis() - this.sincePlayerView < 2500) { pathentity = worldObj.getPathEntityToEntity(this, player, 50F, true, false, false, true); } else { float f = player.getDistanceToEntity(this); if (player.isSneaking()) { if (f <= 10) { if (this.canSeeEntity(player)) { pathentity = worldObj.getPathEntityToEntity(this, player, 50F, true, false, false, true); } else { if (f <= 5) { pathentity = worldObj.getPathEntityToEntity(this, player, 50F, true, false, false, true); } else { pathentity = null; } } } else { pathentity = null; } } else { if (f <= 20) { if (this.canSeeEntity(player)) { pathentity = worldObj.getPathEntityToEntity(this, player, 50F, true, false, false, true); } else { if (f <= 8) { pathentity = worldObj.getPathEntityToEntity(this, player, 50F, true, false, false, true); } else { pathentity = null; } } } else { pathentity = null; } } } setPathToEntity(pathentity); } super.onLivingUpdate(); } private boolean canSeeEntity(EntityPlayer player) { double norme = Math.sqrt((Math.pow((this.posX - player.posX), 2))+(Math.pow(((this.posY + 1.20) - player.posY), 2))+(Math.pow((this.posZ - player.posZ), 2))); for (int k = 0; k <= (int)(norme + 1); k++) { if (this.worldObj.isAirBlock((int)(player.posX + ((this.posX - player.posX)*k)/(2*norme)), (int)(player.posY + (((this.posY + 1.20) - player.posY)*k)/(2*norme)), (int)(player.posZ + ((this.posZ - player.posZ)*k)/(2*norme)))) { this.sincePlayerView = System.currentTimeMillis(); } else if(this.worldObj.getBlockId((int)(player.posX + ((this.posX - player.posX)*k)/(2*norme)), (int)(player.posY + (((this.posY + 1.20) - player.posY)*k)/(2*norme)), (int)(player.posZ + ((this.posZ - player.posZ)*k)/(2*norme))) == 20) { this.sincePlayerView = System.currentTimeMillis(); } else { return false; } } return true; }
-
Si tu veux que ton zombie fonctionne en multijoueur, évite d’utiliser la classe Minecraft… ^^’
-
bah je me suis simplement basé sur un tuto qui est sur MFF, je devrais privilégier quoi??
-
Le serveur ne trouvera pas la classe “Minecraft”… Voilà tout Et tu auras un crash ClassNotFoundException (ou quelque chose du genre)
-
oui mais du coup comment remédier à cela? :3
Je cherche le joueur le plus proche?
C’est vrai que ça semble logique que mc.Theplayer va forcément se fixer que en solo… -
@‘totos51’:
oui mais du coup comment remédier à cela? :3
Pas d’équivalent pour le serveur ^^
-
Il faut en effet vérifier par rapport à toutes les entités autours du mob.
-
d’accord, me semble avoir déja fait quelque chose de semblable et avoir déja demandé ici
je vais rechercher parmis mes messages comment j’avais fait, fin surtout quelle solution vous m’aviez donné, en utlisant un filtre si je me rappelle bien