MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Détéction de x mobs dans y zone

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    1.7.10
    7 Messages 4 Publieurs 2.1k Vues 1 Watching
    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.
    • KujarothK Hors-ligne
      Kujaroth
      dernière édition par

      Salut,

      je pense que ceci sera mon dernier topic ici avant un moment 😉

      J’aimerai savoir comment faire en sorte que mon bloc check dans un rayon défini, le nombre d’un mob. Je ne sais pas vraiment comment procédé, ni dans quoi chercher exactement…

      y’a surement un AxisAlignedBB dans l’histoire, mais après je suis largué ^^’

      Cordialement 😕

      >! Bonjour/Bonsoir,
      >! Vous désirez un Modèle ou une Texture pour votre Mod ? Vous pouvez faire un…

      1 réponse Dernière réponse Répondre Citer 0
      • robin4002R Hors-ligne
        robin4002 Moddeurs confirmés Rédacteurs Administrateurs
        dernière édition par

        Salut,
        Dans la classe world il y a une fonction pour get toutes les entités à partir d’un AxisAlignedBB. Il te suffit de check la taille de la liste ensuite.

        1 réponse Dernière réponse Répondre Citer 0
        • FolganskyF Hors-ligne
          Folgansky Correcteurs
          dernière édition par

          Un truc comme getCollisionBoundingBoxFromPool il me semble

          1 réponse Dernière réponse Répondre Citer 0
          • RedenR Hors-ligne
            Reden
            dernière édition par

            Au lieu de juste copier coller mon code je vais t’expliquer.
            Il faut partir de ce que l’on a:
            position : BlockPos (la position centrale de la zone)
            **radius : **[color=#ffffffInteger (le rayon de la zone)

            Voici un petit schéma de ce qu’on l’on pourrait attendre. Tu as le choix entre récupérer les mobs d’une zone cubique (bleue, je l’ai représentée en 2D mais elle est en 3D) ou sphérique (orange, idem)
            ]
            Pour se faire tu peux utiliser la méthode AxisAlignedBB.expand depuis la position du bloc central.

            AxisAlignedBB axisAlignedBB = new AxisAlignedBB(blockPos, blockPos.east().south().up());
            axisAlignedBB = axisAlignedBB.expand(radius, radius, radius);
            

            Ainsi on aura créé une zone rectangulaire comme celle en bleue.
            Pour récupérer les mobs dans cette zone, rien de plus simple:

            List <entitycreature>entities = this.worldObj.getEntitiesWithinAABB(EntityCreature.class, axisAlignedBB);
            

            /!\ Ceci récupère tous les types de mobs, offensifs et passifs, si tu veux un seul des deux types, change EntityCreature par EntityMob ou EntityAnimal.

            %(#333333)[Pour récupérer les mobs dans une sphère et non un cube on va ajouter un bout de code supplémentaire pour supprimer de la liste les mobs la distance entre le centre (rouge) et leur propre position est strictement supérieur au rayon (radius).
            Ainsi:
            ]

            Iterator <entitycreature>iter = entities.iterator();
            
            while(iter.hasNext()) {
               EntityCreature entity = iter.next();
            
               if(entity.getDistanceSqToCenter(blockPos) > radius * radius) {
                  iter.remove();
               }
            }
            

            %(#333333)[…supprime les entités en dehors de la zone orange.

            Finalement tu as une liste avec les entités dans la zone, tu peux récupérer leur nombre tout simplement en faisant entities.size() ou même lister les entités présente depuis la liste.]</entitycreature></entitycreature>

            1 réponse Dernière réponse Répondre Citer 1
            • KujarothK Hors-ligne
              Kujaroth
              dernière édition par

              Merci !

              Par contre, comment récupéré la position du bloc ? this.worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord); car BlockPos c’est en 1.8 :s

              Block blockPos = this.worldObj.getBlock((int)this.xCoord, (int)this.yCoord,(int) this.zCoord);
                      int radius = 5;
              
                      AxisAlignedBB axisAlignedBB = new AxisAlignedBB(blockPos, blockPos.east().south().up());    
                      axisAlignedBB = axisAlignedBB.expand(radius, radius, radius);
              
                      List <entitymobarakne>entities = Minecraft.getMinecraft().theWorld.getEntitiesWithinAABB(EntityMobArakne.class, axisAlignedBB);
              
                      Iterator <entitymobarakne>iter = entities.iterator();
              
                      while(iter.hasNext()) {
                          EntityMobArakne entity = iter.next();
              
                         if(entity.getDistanceSqToCenter(blockPos) > radius * radius) {
                            iter.remove();
                         }
                      }
              

              getDistanceSqToCenter est surligné et ne me propose rien avec Center 😕
              blockPos.east().south().up()) les .east est surligné aussi

              On est d’accord que c’est a codé dans le tileEntity ?</entitymobarakne></entitymobarakne>

              >! Bonjour/Bonsoir,
              >! Vous désirez un Modèle ou une Texture pour votre Mod ? Vous pouvez faire un…

              1 réponse Dernière réponse Répondre Citer 0
              • RedenR Hors-ligne
                Reden
                dernière édition par

                Au lieu de blockPos tu peux directement utiliser les coordonnées brutes dans le constructeur de AxisAlignedBB(x1,y1,z1,x2,y2,z2)
                En fait tu auras:

                AxisAlignedBB axisAlignedBB = new AxisAlignedBB((int)xCoord, (int)yCoord, (int)zCoord, (int)xCoord+1, (int)yCoord+1, (int)zCoord+1)
                

                Concernant la distance séparant l’entité du centre de la zone, c’est le théorème de Pythagore. Il te faut les coordonnées du centre de la zone càd:

                float xCenter = (int)xCoord+0.5F;
                float yCenter = (int)yCoord+0.5F;
                float zCenter = (int)zCoord+0.5F;
                

                Du coup avec le théorème de Pythagore et comme tu as les coordonnées du centre et de l’entité, tu fais:

                float distanceSq = Math.pow(xCenter-entity.posX, 2) + Math.pow(yCenter-entity.posY, 2) + Math.pow(zCenter-entity.posZ, 2);
                

                On a donc la distance au carré qui sépare le centre de l’entité, si cette distance est strictement supérieure à radius² alors l’entité est en dehors de la zone, on l’enlève comme je l’ai fait dans le code du post précédent.

                1 réponse Dernière réponse Répondre Citer 1
                • KujarothK Hors-ligne
                  Kujaroth
                  dernière édition par

                  Résolue via Skype, Merci Reden !

                  >! Bonjour/Bonsoir,
                  >! Vous désirez un Modèle ou une Texture pour votre Mod ? Vous pouvez faire un…

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

                  MINECRAFT FORGE FRANCE © 2024

                  Powered by NodeBB