• 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
    2505
    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

      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

        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

          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

            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

              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

                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

                  @‘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

                    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

                      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
                      • Premier message
                        Dernier message
                      Design by Woryk
                      Contact / Mentions Légales

                      MINECRAFT FORGE FRANCE © 2018

                      Powered by NodeBB