Pointeur et entité



  • Salut (et oui j'allais pas vous laisser tranquille très longtemps)
    J'ai quelques petits problèmes dans une portion de code :

    
    EntitySonicFX fx = null;
    final IEntitySelector livingFilter = new SonicEntityFilter();
    
    List entityTagetList = player.worldObj.selectEntitiesWithinAABB(Entity.class, player.boundingBox.expand(64.0D, 64.0D, 64.0D), livingFilter);
    for(int i = 0; i < entityTagetList.size(); i++)
    {
    Entity entityTarget = (Entity)entityTagetList.get(i);
    if(entityTarget != player && entityTarget instanceof EntityLivingBase)
    {
    EntityLivingBase entityLivingTarget = (EntityLivingBase)entityTarget;
    Vec3 vec3 = player.getLook(1.0F).normalize();
    Vec3 vec31 = entityLivingTarget.worldObj.getWorldVec3Pool().getVecFromPool(entityLivingTarget.posX - player.posX, entityLivingTarget.boundingBox.minY + (double)(entityLivingTarget.height / 2.0F) - (player.posY + (double)player.getEyeHeight()), entityLivingTarget.posZ - player.posZ);
    double d0 = vec31.lengthVector();
    vec31 = vec31.normalize();
    double d1 = vec3.dotProduct(vec31);
    if(d1 > 1.0D - 0.025D / d0 && player.canEntityBeSeen(entityLivingTarget) && !player.onGround)
    {
    if(!particleSpawn){
    fx = new EntitySonicFX(Minecraft.getMinecraft().theWorld, entityLivingTarget.posX, entityLivingTarget.boundingBox.maxY / 2, entityLivingTarget.posZ);
    FMLClientHandler.instance().getClient().effectRenderer.addEffect((EntityFX) fx);
    particleSpawn = true;
    }
    if(particleSpawn && fx != null){
    fx.setPosition(entityLivingTarget.posX, (entityLivingTarget.posY + (entityLivingTarget.boundingBox.maxY - entityLivingTarget.posY) / 2), entityLivingTarget.posZ);
    }
    }
    else{
    if(fx != null){
    fx.setDead();
    fx = null;
    particleSpawn = false;
    System.out.println(particleSpawn);
    }
    }
    }
    

    En première partie j'aimerais pouvoir augmenter "l'angle de vue" du viseur (donc en faite il faut plus vraiment visé quoi), de plus j'aimerais réduire la distance d'où on peut voir l'entité (quand l'entité est à 200 blocs je ne vois plus vraiment l'intérêt 😛 ), il me semble avoir déjà vu quelque part que ça se régler ici

    d1 > 1.0D - 0.025D / d0
    

    Mais n'étant pas sur je préfère m'informer (et comprendre ^^)

    En seconde partie, je ne comprends pas pourquoi le else est déclenché lorsque l'on regarde encore l'entité, de plus je pense que je n'ai pas utilisé la meilleur méthode pour tuer l'entité (par exemple

    fx.setDead();
    fx = null;
    

    me semble pas vraiment la meilleure idée)

    Merci d'avance ^^



  • Personne n'a d'idée 😮 ?
    Je pensais pourtant que c'était moins compliqué mon dernier problème ^^'



  • Est-ce que tu pourrais clarifier un peu tes noms de variables ?
    Parce que j'ai du mal à identifier à quoi elles correspondent…



  • En soit le viseur est récupéré de là : https://github.com/FFMT/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotechmod/main/items/ItemNanomiteArrowGun.java#L127-L144
    Après je l'ai modifié "à ma sauce" pour créer une particule
    Ce que j'en comprends (je ne connais pas très bien Vec3) c'est qu'il récupère toute les entités vues par le joueur ensuite il vérifie si c'est une EntityLivingBase (ex:une vache) ensuite il doit vérifier si c'est bien au centre de l'écran, vérifie si il n'y a pas de bloc et si le joueur n'est pas au sol afin de faire spawn la particle qui est censé être tuer dès que le joueur touche le sol et si le mob bouge pendant ce temps la particule est censé se téléporter à ses coordonnées



  • Et non ! Là il récupère tous les mobs AUTOUR du joueur. Ca explique tous tes problèmes.



  • Hum oui et non, c'est bien ce qui est fait mais au final qu'une seul entité ressort et c'est celle que l'on fixe donc je ne vois pas le rapport ^^' sauf peut-être qu'en éditant

    ​List entityTagetList = player.worldObj.selectEntitiesWithinAABB(Entity.class, player.boundingBox.expand(64.0D, 64.0D, 64.0D), livingFilter);
    

    ça me permettera d'avoir un rayon plus petit



  • En fait, je me rends compte que je disais un peu n'importe quoi. C'est pas autour du joueur, mais autour de sa boundingBox, je sais pas lire. Mais ça revient au même, 64.0D c'est beaucoup trop large pour ce que tu veux faire. Et de toute façon, utiliser une méthode comme ça c'est pas adapté pour cet usage. Tu ferrais mieux de te baser sur l'axe de regard pour calculer la zone vue.



  • Tu ferrais mieux de te baser sur les coordonnées précises du joueur pour calculer la zone action par rapport à l'axe de regard. Mais attention, si ça se trouve y a plus simple.

    Bah à ce niveau là je n'y connais pas grand chose en faite
    L'axe du regarde je ne sais pas quelles sont les fonctions pour récupéré les entités vu avec



  • Non, je veux dire tu calcules grâce à l'axe de regard une AABB.



  • En ligne de code ça donne quoi à peu près ^^' ?



  • Bah c'est à toi de voir, j'ai jamais fait concrètement. Mais en gros tu dois déterminer quelle est la largeur en bloc de ce que tu vois le plus loin entre le bord gauche et le bord droit de l'écran. Ensuite par rapport à l'axe de regard du joueur tu détermines quelle zone cela représente en AABB. Et après tu fais les calculs habituels. Mais ça c'est sans compter si il y a des murs ou non devant le joueur, etc…

    Mais attention, c'est surement pas la chose la plus optimisée d'autant que si c'est mal fait ça peut être très très lourd. Tu ne devrais pas faire comme ça, mais au moins dit toi que ça existe.



  • Allez je suis généreux ce soir 🙂

    Je te renvoie vers le repo de mon mod, ici (c'est ma solution, peut etre pas la meilleur mais le rendu est tres bien):

    Ligne 74, ma fonction: public Entity getLookingEntity(double range); (range correspondant à la distance de l'entité)

    [size=medium]https://github.com/iToss/Magic_Crusade_Mod/blob/master/main/java/fr/toss/common/player/spells/Spell.java



  • Merci mais le résultat est le même ^^ peut-être en un peu mieux
    Ce que j'entends par "le même" c'est que j'aimerais que ce soit l'entité la plus proche du joueur dans (à peu près) tout le champ de vision visible à la première personne et même en mettant

    player.boundingBox.expand(10D, 10D, 10D)
    

    j'arrive à viser des entités lointaines



  • Pas d'idée ?

    ​d1 > 1.0D - 0.025000000000000001D / d
    

    Ce sont ces chiffres à changer qui me posent problèmes je ne sais pas quoi mettre :s je ne connais pas les vecteur



  • Ok donc après avoir essayé plusieurs possibilités et après avoir bien rager dessus 😛 j'ai enfin réussi à faire quelque chose qui marche
    Maintenant il ne reste "plus qu'à" faire en sorte que ce soit sur tout ce que peux voir le joueur et non le centre et en revanche là je ne sais pas du tout où chercher ne connaissant pas les Vec3

    ​
    Vec3 vec3d;
    Vec3 vec3d1;
    
    double d;
    
    double d1;
    
    double a;
    
    double b;
    
    double c;
    
    vec3d = thePlayer.getLook(1.0F).normalize();
    
    vec3d1 = Vec3.createVectorHelper(entity.posX - thePlayer.posX, (entity.boundingBox.minY + (double)(entity.height / 2.0F)) - (thePlayer.posY + (double)thePlayer.getEyeHeight()), entity.posZ - thePlayer.posZ);
    
    d = vec3d1.lengthVector();
    
    vec3d1 = vec3d1.normalize();
    
    d1 = vec3d.dotProduct(vec3d1);
    
    if (d1 > 1.0D - 0.025000000000000001D / d)
    
    {
    
    System.out.println("Looking at " + entity);
    
    return (entity);
    
    }
    
    }
    

    Si quelqu'un à une idée et/ou peux m'expliquer Vec3 ce serait vraiment parfait 😄