Résolu Détéction de x mobs dans y zone
-
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
-
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. -
Un truc comme getCollisionBoundingBoxFromPool il me semble
-
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>
-
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é aussiOn est d’accord que c’est a codé dans le tileEntity ?</entitymobarakne></entitymobarakne>
-
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.
-
Résolue via Skype, Merci Reden !