Système de backstab



  • Heya tout le monde,

    J'aurais juste besoin d'un petit peu d'aide : je souhaiterais créer une lame secrète à la manière de celles que l'on peut trouver dans Assassin's Creed, mais comment s'y prendre au niveau des backstabs, sachant que je vient de commencer à modder (et que je suis la pire des noobs en Java au passage) ?  😛

    Merci de votre potentielle aide !~


  • Administrateurs

    Salut,
    Étant donné que je ne joue pas à Assassin's Creed, il va falloir m'expliquer le fonctionnement de ce que tu veux faire.



  • J'aimerais tout simplement faire en sorte que lorsque l'arme est utilisée dans le dos d'un ennemi, celle-ci lui retire toute sa vie (autres exemple : Couteaux du Spy dans TF2)


  • Administrateurs

    Il faut regarder en fonction de la rotation l'entité qui se fait attaquer et celle de l'entité qui attaque.
    Ce qui tombe bien c'est que xavpok a déjà fait ça pour NHG par contre il me faut son autorisation pour distribuer son code.



  • @'robin4002':

    Il faut regarder en fonction de la rotation l'entité qui se fait attaquer et celle de l'entité qui attaque.

    Effectivement, j'avais déjà vu plusieurs vidéos et sites qui expliquaient le principe, comme quoi il fallait prendre les deux axes yaw et qu'il fallait faire des trucs avec… Mais reste à savoir quels trucs...  😕


  • Modérateurs

    Autorisation accordée robin ^^
    De toute façon c'est pas très compliqué une fois qu'on a compris le principe

    Sent from my GT-I9000 using Tapatalk 2


  • Administrateurs

    Pas compliqué. Si la rotation yaw des deux entités est identique ça veut dire qu'elles sont alignées.

    Bon peut-être que l'angle yaw n'est pas en fonction de X dans Minecraft mais on s'en fou c'est pour l'exemple.
    Comme je suis nul avec gimp (surtout qu'en plus il faudrait plutôt un logiciel de dessin vectoriel comme inkscape pour faire x)) je ne fais pas te faire un dessin pour quand elle ne regarde pas dans le même sens, je te laisse imaginer ça et voir par toi même que les angles ne seront plus égaux.

    Cependant le cas où les deux angles seront égaux va être très rare (en fait il risque de ne jamais arriver, le cas où les deux entités étant parfaitement aligné étant très rare). Donc le mieux serait de soustraire un angle à l'autre et si la valeur est proche de 0 (par exemple compris entre -0,1 radian et 0,1 radian) pour avoir une petite marge.

    ÉDIT : le temps que je fasse mon super dessin xavpok a répondu. Je te laisse quand même essayer et en cas de problème je te donnerai le code de xavpok à titre d'exemple.
    ÉDIT 2 : je me rends compte à quel point les images sont pratiques pour expliquer. Je pense que je vais en faire pour les tutoriels moi.



  • @'robin4002':

    Bon peut-être que l'angle yaw n'est pas en fonction de X dans Minecraft mais on s'en fou c'est pour l'exemple.

    L'angle yaw est en fonction de X et de Y (merci Google), mais on s'en fiche x3

    Ton schéma fait sur GIMP (j'ai crû que c'était Paint à la base, whew) m'a pas mal aidé, je vais essayer de me débrouiller et de mettre les mains dans le cambouis. Si jamais je n'y parvient pas, je ferais un piti up  😉



  • J ai beaucoup plus simple les gars ^^
    Les points cardinaux, sa ne vous dit rien xD
    Compare si ton entity attaquée regarde dans la même direction que celle qui attaque et si oui, tu lui retires toute sa vie



  • @'Julot10085':

    Compare si ton entity attaquée regarde dans la même direction que celle qui attaque et si oui, tu lui retires toute sa vie

    C'est pas bête, mais c'est tout de même plus précis de le faire avec des angles… Sachant que je compte créer mon mod pour mon propre serveur, il faudrait que le gameplay soit équilibré pour que je ne me retrouve pas submergée de "PLZ AMBRE NERF LA LAME SECRETE C'EST TROP OP!!1!" (désolée du trash-talk ^^)



  • Je ne suis pas trop d accord. Certes les angles restent plus précis mais les direction de 1 sont a mon goût beaucoup plus faciles et puis quand tu dis attaquer dans le dos a partir du moment où toi et ton ennemi avez le même point cardinal en commun, tu ne pourras voir que son dos.


  • Administrateurs

    Je ne vois pas en quoi passer par les points cardinaux simplifierait les choses. Pour moi ça fait plus usine à gaz d'autre chose. Car de toute façon comment tu connais le point cardinal vers lequel l'entité regarde ? Avec son angle … Donc au final il faut utiliser l'angle. Plus simple de comparer directement les deux angles.



  • Bon ok, deux heures que je suis stuck là-dessus, j'ai hésitée à faire une nuit blanche pour trouver la solution au problème, mais vu mes skills en Java c'est mort pour que je trouve la solution toute seule… Je donne ma langue au chat.  -_-



  • Ok je te file le code 2 sec

    EDIT = Voici le code, alors j'ai testé sur des cochons, vaches et autres animaux de mc. Certes c'est précis mais pas autant que les angles, cependant si comme tu l'as dit, tu le fais sur ton serv, ça devrait poser aucun problème sur des ModelBiped, tels que les joueurs ^^

    
    @SubscribeEvent
    public void onEntityAttacked2(LivingAttackEvent event) 
    {
    if(!event.entityLiving.worldObj.isRemote)
    {
    int var1 = MathHelper.floor_double((double) (event.entityLiving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;//On récupère l'angle de l'entity qui se fait attaqué
    String direction1 = Direction.directions[var1];//On crée un String de la direction vers laquelle regarde l'entity au-dessus
    int var2 = MathHelper.floor_double((double) (event.source.getEntity().rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;//idem mais pour celle qui attaque
    String direction2 = Direction.directions[var2];//idem
    //Maintenant place à la condition
    if(direction1 == direction2)
    {
    //event.entityLiving.setDead();//Le fait disparaître instantannément, c'est violent ^^', prend la lige d'en dessous sinon
    event.entityLiving.setHealth(0);//Moins radical 
    System.out.println("dans son dos");
    //Et voilà ton code n'est pas plus gros que ça =D (et pas plus compliqué non plus…)
    }
    }
    }
    
    

    Event se trouvant sur le bus minecraftforge, donc rajoute cette ligne dans la méthode init de ta classe principale
    MinecraftForge.EVENT_BUS.register(new TaClasseOuTAsMisLEvent());

    Voilà j'espère que mon code t'aura aidé. J'ai pris soin comme tu as vu de mettre des commentaires (n'oublie pas le petit + x))


  • Modérateurs

    Le principe est simple: quand tu tapes une entité, tu vérifies si oui ou non tu est derrière la-dite entité pour choisir le nombre de dégâts.
    Le plus dur est de savoir si oui ou non tu est derrière la cible.
    Pour cela:

    • On récupère les vecteurs de 'regard' (celui qui représente la direction dans laquelle une entité regarde) du joueur et de la cible.
    • On remet à 0 leur composante Y, puisque si le joueur regarde en haut ou en bas n'influence pas trop sa capacité à planter un couteau dans le dos.
    • On les transforme en vecteurs unitaires pour faciliter les calculs d'angles.
    • On récupère le cosinus de l'angle avec le produit scalaire et on en déduit l'angle.
    • On vérifie si l'angle est dans un intervalle prédéfini. (-85° à 85° dans mon exemple)




  • Désolée de cette réponse plutôt tardive.

    Merci pour vos réponses, les deux -ont l'air de- marcher nickel, mais le problème est que, sachant que je trouve le projet de serveur basé sur Assassin's Creed un peu trop ambitieux pour une novice comme moi, j'ai décidé de me lancer sur un autre projet. En espérant que cette astuce sera utile à d'autres moddeurs…  😛

    Désolée de vous avoir dérangés pour finalement me désister au dernier moment. Je voit trop grand dans mes projets à chaque fois...

    Sur ce, merci de m'avoir aidée, je reviendrais avec plaisir sur MFF si j'ai (encore) besoin d'aide ! ^^



  • Pas grave, comme tu dis ça servira à d'autres qui passeront par là 😉


  • Modérateurs

    Même si tu abandonnes le concept, les maths derrière peuvent toujours aider.


  • Correcteurs

    Ouaip, au lieu d'instant kill ça peut jouer un son "Chat c'est toi qu'y est!" pour un mod "le chat et la souris".

    Enfin tout ce qu'on veut quoi.