Effet de knockback



  • Bonjour à tous,
    ça fait maintenant 2 jours que je me casses la tête pour ajouter un effet de knockback que je clic droit sur une entité avec un item spécifique.
    Eclipse n'affiche aucune erreur, mais cela ne marche simplement pas. Voici le code :

    @Override
    public ActionResult <itemstack>onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
    
    Minecraft mc = Minecraft.getMinecraft();
    RayTraceResult rayTrace = mc.objectMouseOver;
    Entity entity = rayTrace.entityHit;
    
    if (rayTrace.entityHit != null) {
    if (rayTrace.entityHit instanceof EntityLivingBase) {
    ((EntityLivingBase) rayTrace.entityHit).knockBack(playerIn, 5, (double) MathHelper.sin(playerIn.rotationYaw * 0.017453292F),
    (double) (-MathHelper.cos(playerIn.rotationYaw * 0.017453292F)));
    }
    }
    return new ActionResult(EnumActionResult.SUCCESS, playerIn.getHeldItem(handIn));
    }
    

    J'ai cru comprendre qu'a la place de mettre l'argument playerIn de onItemRightClick() directement dans la méthode knockback, il faudrait avoir un argument de type EntityPlayerMP.
    Seulement je ne sais pas comment l'instancier.

    Merci d'avance</itemstack>



  • Salut,
    La méthode knockback est à appeler uniquement côté serveur comme elle gère les motion. Par ailleurs le paramètre Entity est inutilisée dans la déclaration de la méthode, donc peu importe ce que tu mets, le soucis ne peut venir de là.
    En revanche, toi tu as besoin de get l'entity visée par un outil client side, le ray tracer. Donc tu as besoin d'un packet à envoyer au serveur avec l'id de l'entity visée, que tu pourras ensuite instancier côté serveur à l'aide d'un World#getEntityByID, afin d'appeler la fonction knockback.
    D'autres questions ?

    PS = Pour le moment, méfies toi de ta variable Minecraft, le serveur dédié n'aimera pas du tout au lancement, et crashera avec un ClassNotFoundException.



  • Donc je dois utiliser MonMod.network.sendToServer(); ?
    Et a l'intérieur je met quoi ?



  • @'Plaigon':

    Donc tu as besoin d'un packet à envoyer au serveur avec l'id de l'entity visée, que tu pourras ensuite **instancier **côté serveur à l'aide d'un World#getEntityByID, afin **d'appeler **la fonction knockback.



  • Faut-il donc que j'ajoute a ma classe de Packet une nouvelle variable de knockback ?

    Car pour l'instant j'ai réussi à trouver ça :

    ModSWMod.network.sendToServer(new PacketCapabilitiesSWMod());

    A vrai dire j'avance très lentement car j'ai beaucoup de mal à comprendre le network



  • Non, il faut que l'appel de la fonction knockback sur ton entity visée soit fait côté serveur (dans ton ta fonction onMessage de ta sous-classe Handler) plutôt que côté client (dans ta fonction onItemRightClick).



  • Je ne comprends vraiment pas ce que je dois faire.
    Où est ce que je dois mettre mon code pour le knockback ? Dans un event ? Le laisser dans onItemRightClick ?
    Comment je suis sensé envoyé l'ID de l'entité au serveur ? Je ne sais pas comment il faut faire et faut il créer une nouvelle variable ?
    Une fois que j'ai envoyé le packet, comment je peux instancier cette entité ?

    N'as tu pas un bout de code à me fournir, cela pourrait être plus explicite et je pourrai comprendre mieux ?



  • "Où est ce que je dois mettre mon code pour le knockback ? Dans un event ? Le laisser dans onItemRightClick ?"
    –>
    @'Plaigon':

    il faut que l'appel de la fonction knockback […] dans ton ta fonction onMessage de ta sous-classe Handler

    "Comment je suis sensé envoyé l'ID de l'entité au serveur ? Je ne sais pas comment il faut faire et faut il créer une nouvelle variable ?"
    Tu as la méthode Entity#getEntityId, tout bêtement.

    "Une fois que j'ai envoyé le packet, comment je peux instancier cette entité ?"
    Une fois le packet reçu* plutôt
    –>
    @'Plaigon':

    avec l'id de l'entity visée, que tu pourras ensuite instancier côté serveur à l'aide d'un World#getEntityByID

    A mettre dans un try, au cas où l'id ne soit pas bon/l'entity ne puisse pas être instancé !

    "N'as tu pas un bout de code à me fournir, cela pourrait être plus explicite et je pourrai comprendre mieux ?"
    Tu dois savoir apprendre par toi même, surtout cette notion. En revanche MFF est pour te mettre sur la piste !



  • Merci pour ton aide et merci pour le tuto même si je l'ai déjà lu, est ce que je dois faire une nouvelle classe de packet exprès pour ce que je veux faire ?



  • Peut-être que MC a déjà un packet adapté (notamment lors du middle click sur un entity pour get son oeuf). Faut que tu diriges tes recherches vers ceci, si tu veux éviter ta propre classe de packet, qui disons le, ne contiendrais pas grand chose.



  • Pourquoi faire simple quand on peut faire compliqué ?

    onItemRightClick est utilisé quand tu fais click droit en général, mais il existe la même chose pour le click sur une entité : itemInteractionForEntity -> pas besoin de rayTrace et pas besoin de packet !



  • Franchement je ne comprends rien du tout, je n'y arrive pas.
    EDIT : je vais essayer ton idée


    Merci ça marche ^^



  • Bien joué, je n'en n'avais plus connaissance !

    EDIT = LeBossMax2, ce serait plutôt "Pourquoi faire compliqué quand on peut faire simple ?" 😃