• Récent
  • Mots-clés
  • Populaire
  • Utilisateurs
  • Groupes
  • S'inscrire
  • Se connecter
  • S'inscrire
  • Se connecter
  • Recherche
  • Récent
  • Mots-clés
  • Populaire
  • Utilisateurs
  • Groupes

Résolu Garder en mémoire, IA

Anciennes versions
1.6.4
3
9
2.6k
Charger plus de messages
  • Du plus ancien au plus récent
  • Du plus récent au plus ancien
  • Les plus votés
Répondre
  • Répondre à l'aide d'un nouveau sujet
Se connecter pour répondre
Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
  • T
    totos51 dernière édition par 9 sept. 2014, 18:50

    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 ^^

    1 réponse Dernière réponse Répondre Citer 0
    • T
      totos51 dernière édition par 16 sept. 2014, 06:25

      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 blocks

      Un 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;
      }
      1 réponse Dernière réponse Répondre Citer 0
      • elias54
        elias54 Administrateurs dernière édition par 16 sept. 2014, 07:19

        Si tu veux que ton zombie fonctionne en multijoueur, évite d’utiliser la classe Minecraft… ^^’

        Mon site | GitHub

        1 réponse Dernière réponse Répondre Citer 0
        • T
          totos51 dernière édition par 16 sept. 2014, 07:49

          bah je me suis simplement basé sur un tuto qui est sur MFF, je devrais privilégier quoi??

          1 réponse Dernière réponse Répondre Citer 0
          • elias54
            elias54 Administrateurs dernière édition par 16 sept. 2014, 09:16

            Le serveur ne trouvera pas la classe “Minecraft”… Voilà tout 😛 Et tu auras un crash ClassNotFoundException (ou quelque chose du genre)

            Mon site | GitHub

            1 réponse Dernière réponse Répondre Citer 0
            • T
              totos51 dernière édition par 16 sept. 2014, 11:19

              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…

              1 réponse Dernière réponse Répondre Citer 0
              • elias54
                elias54 Administrateurs dernière édition par 16 sept. 2014, 11:31

                @‘totos51’:

                oui mais du coup comment remédier à cela? :3

                Pas d’équivalent pour le serveur ^^

                Mon site | GitHub

                1 réponse Dernière réponse Répondre Citer 0
                • robin4002
                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par 16 sept. 2014, 11:37

                  Il faut en effet vérifier par rapport à toutes les entités autours du mob.

                  1 réponse Dernière réponse Répondre Citer 0
                  • T
                    totos51 dernière édition par 16 sept. 2014, 11:51

                    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

                    1 réponse Dernière réponse Répondre Citer 0
                    • 1 / 1
                    9 sur 9
                    • Premier message
                      9/9
                      Dernier message
                    Design by Woryk
                    Contact / Mentions Légales

                    MINECRAFT FORGE FRANCE © 2018

                    Powered by NodeBB