[Abandonné] Active Item



  • Hey ! Cela faisait un baille que je n'avais pas posté !

    Aujourd'hui, je reviens vers vous car je me retrouve dans une impasse. L'ajout de la 2nd main a drastiquement changé la méthode gérant les dégâts.

    Mon problème est sans aucun doute très con et la solution m'as sans doute échappé m'enfin : 
    Comment récupérer l'item (ou itemstack) utilisé par le joueurs pour frapper (dans l’événement forge "LivingAttackEvent") ?

    Je sais qu'avec

    ((EntityLivingBase)entity).getItemStackFromSlot(EntityEquipmentSlot.MAINHAND)
    

    et

    ((EntityLivingBase)entity).getItemStackFromSlot(EntityEquipmentSlot.OFFHAND)
    

    on peut récupérer les deux itemstack actif. 
    Le problème étant de savoir lequel à été utilisé pour frapper…

    if(((EntityLivingBase) entity).getAttributeMap().getAttributeInstance(SharedMonsterAttributes.ATTACK_DAMAGE) != null)
    {
    baseDamage = (float)((EntityLivingBase) entity).getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).getAttributeValue();
    }
    

    me permet de récupérer uniquement la valeurs des dégât, mais aucune indication sur l'item utilisé. Cette valeur ne peu pas me permettre de choisir a coup sur l'item utilisé (ex : deux item ayant les même dommages et vitesse d'attaque)

    voila voila..



  • Je pence que la réponse est simple : (si je me trompe pas) on ne peut attaquer que avec la main principale donc tu peut utiliser directement :

    ((EntityLivingBase)entity).getItemStackFromSlot(EntityEquipmentSlot.MAINHAND)
    


  • @'LeBossMax2':

    Je pence que la réponse est simple : (si je me trompe pas) on ne peut attaquer que avec la main principale donc tu peut utiliser directement :

    ((EntityLivingBase)entity).getItemStackFromSlot(EntityEquipmentSlot.MAINHAND)
    

    Oui et non. C'est exacte que l'on ne peu frapper que avec la main principal, mais l'arc (ou de façon plus commune, toutes les armes de jet), lui, peut être utilisé des deux mains 😕



  • player.getCurrentUsingHand je crois, sinon regarde dans l'event si tu n'as pas quelque chose qui donne accès



  • Juste une question, à quoi cela va te servir de savoir de quelle main est partie la flèche ? Car si le joueur à un arc dans sa main principale, la main gauche ne sera pas utilisée et ducoup tu as juste à tester si l'item de la main principale "utilise" le clic gauche.



  • [size=smallplayer.getCurrentUsingHand je crois, sinon regarde dans l'event si tu n'as pas quelque chose qui donne accès]

    La fonction doit fonctionner avec EntityLivingBase comme plus haut niveau commun (monstre, golem, player). Il ne faut donc aucune fonction spécifique a une classe de plus haut niveau…

    [size=smallJuste une question, à quoi cela va te servir de savoir de quelle main est partie la flèche ? Car si le joueur à un arc dans sa main principale, la main gauche ne sera pas utilisée et ducoup tu as juste à tester si l'item de la main principale "utilise" le clic gauche.]

    Contre exemple : tien dans ta main secondaire une potion, et dans ta main principal un objet avec cooldown (vanilla tu a l'enderpearl). Spawn clic gauche. Lorsque l'objet est en "recharge" c'est l'autre qui est utilisé.
    Alors vanilla, je l'avoue ça n'as pas d'importance. Mais prenons le mod Tinker's (que j'utilise dans mes test) si tu prend deux armes de lancé différentes dans chaque main et que tu spam clic, tu utilisera l'un puis l'autres…



  • Regarde les variables disponibles dans l'event. Mais il me semble que les 2 mains ne sont disponibles que pour les joueurs



  • @'SCAREX':

    Regarde les variables disponibles dans l'event. Mais il me semble que les 2 mains ne sont disponibles que pour les joueurs

    Les deux mains sont disponible dès EntityLivingBase (et peu être même un cran au dessous). En revanche, il n'existe (à ma connaissance) aucun monstre vanilla qui puissent nativement utilisé la 2nd main.

    Concernant les variables, il n'y a pas grand chose : DamageSource et montant des dégâts (float). Damage sources me donne l'entité attaquante, et si il s'agit de dégat de type 'thorns' ou non.

    L'utilisation de :

    ((EntityLivingBase)attacker).getHeldItemMainhand();
    

    n'est qu'une réduction permettant d'obtenir la main principal. Mojang a considérer que les monstres n'utiliseraient que leurs mains principal. Mais cela ne change rien au problème à la fois pour le joueurs, et les monstres moddée ambidextre.


  • Administrateurs

    EntityLivingBase:2692 :

       public EnumHand getActiveHand()
       {
           return (((Byte)this.dataManager.get(HAND_STATES)).byteValue() & 2) > 0 ? EnumHand.OFF_HAND : EnumHand.MAIN_HAND;
       }
    

    Et ensuite :
    EntityLivingBase:1611 :

       @Nullable
       public ItemStack getHeldItem(EnumHand hand)
       {
           if (hand == EnumHand.MAIN_HAND)
           {
               return this.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND);
           }
           else if (hand == EnumHand.OFF_HAND)
           {
               return this.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND);
           }
           else
           {
               throw new IllegalArgumentException("Invalid hand " + hand);
           }
       }
    


  • Sinon tu as EntityLivingBase.getActiveItemStack



  • Si tu parlais d'utiliser :

    ((EntityLivingBase)attacker).getHeldItem(((EntityLivingBase)attacker).getActiveHand());
    

    alors non. Cela me retourne l'élément courant dans ma main principal, même si je tire a l'arc avec l'autre…


  • Administrateurs

    Pourtant cette fonction est sensé retourner l'item que le joueur utilise actuellement.



  • @'robin4002':

    Pourtant cette fonction est sensé retourner l'item que le joueur utilise actuellement.

    C'est peu être dus à l'intervalle entre le moment ou le projectile par et atteint sa cible ?

    EDIT : remarque ce serait logique : un bug de minecraft permet de profité du looting d'une épée en switchant la main dessus après avoir lancé une potion.



  • Si tu veux quelque chose de particulier pour les flèches il va falloir récupérer le moment où le joueur tire et ça devient plus complexe, au passage je te rappelle qu'une flèche ne vient pas forcément d'une entité mais peut venir de n'importe où



  • Bon… alors d'après mes observations, ce n'est, à l'heure actuel, et sans développer une fonctionnalité tierce, pas possible, puisque Minecraft ne le gère pas.

    Etant donné que c'est un cas peu présent, assez lourds à régler, et que j'ai d'autres priorités plus gênantes, je met pour le moment en stand-by ce problème. Il passe donc en abandonné.