Ajout de code lorsqu'une épée frappe



  • Salut à tous et à toutes ou re pour certain ^^

    Ce soir j'ai cherché pendant une vingtaine de minutes, certes c'est pas beaucoup mais je bloquais vraiment car mon problème :

    J'aimerais faire spawn une particule lorsque je frappe n'importe quel mob tout ça sur un item sword que j'ai refaite moi même

    J'ai donc trouvé la méthode qui indique que l'on a frappé un mob :

       public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase)
       {
           par1ItemStack.damageItem(1, par3EntityLivingBase);
           return true;
       }
    

    Et comme vous vous en apercevez sûrement (je l'espère 😉 ) c'est un boolean et plusieurs fois déjà lorsque j'a essayé d'argumenter un boolean tout ce boolean ne marchait plus alors pour certain cela s'expliquait il était déclaré dans d'autres class avec déjà des arguments de base, or pour ce boolean là je pourrais l'argumenter comme je veux afin d'ajouter ce code si précieux-là :

           par2World.spawnParticle("flame", par3EntityPlayer.posX, par3EntityPlayer.posY, par3EntityPlayer.posZ, 0.0D, 0.0D, 0.0D);
    

    Mais lorsque j'ajoute le moindre paramètre en plus tel que "EntityPlayer entityplayer" ou bien encore "World par2world" tout ce boolean ne marche plus alors par-pitié comment pourrais-je ajouter des particules en frappant un mob? J'ai essayé de le passer en void mais rien n'y fait !

    Dois-je recréer toute une fonction carrément? J'avais pensé aussi à ça :

    Si la vie d'un mob est affecté par un damageSource provenant d'un joueur alors le monde produit une particule
    J'ai juste trouvé le début, la méthode lol :

    @SideOnly(Side.CLIENT)
       public void handleHealthUpdate(byte par1)
       {
    if ()
    
    else ()
       }
    

    Si quelqu'un a la solution pour la première idée c'est vraiment celle qu'il me faut sinon je me pencherais pour le plan B lol


  • Moddeurs confirmés Rédacteurs Administrateurs

    Ouch, il faudrait vraiment que tu lise des tutoriels java.
    Déjà un boolean c'est ça :
    boolean b;
    Quand tu as :
    public boolean quelqueChose()

    C'est une méthode ou une fonction du type boolean, donc qui à la fin doit retourner un boolean.

    Ensuite, pour faire spawn tes particules, tu as besoin : de l'objet du monde et des coordonnées.
    Regarde les paramètres que tu as, tu as déjà tout ce qu'il te faut. Par contre un conseil, renomme les paramètres, on se perd vite avec par1, par2, par3 etc …

    public boolean hitEntity(ItemStack stack, EntityLivingBase attackedLiving, EntityLivingBase attackerLiving)
    {
    attackedLiving.worldObj.spawnParticle("flame", attackedLiving.posX, attackedLiving.posY, attackedLiving.posZ, 0.0D, 0.0D, 0.0D);
    stack.damageItem(1, attackerLiving);
    return true;
    }
    

  • Moddeurs confirmés

    Apprend le java. La on peut rien faire pour toi.



  • @'Blackout':

    Apprend le java. La on peut rien faire pour toi.

    Le truc c'est que j'ai commencé depuis
    semaine le java sur le SiteDuZéro mais je suis encore au tout début au chapitre des conditions pas encore au boolean

    Sinon merci Robin pour le code


  • Moddeurs confirmés Rédacteurs Administrateurs

    Du-coup c'est résolu ? Si oui, merci de mettre la balise résolu.



  • @'robin4002':

    Du-coup c'est résolu ? Si oui, merci de mettre la balise résolu.

    Je sais bien mais lorsque je clique sur "edition complète" et que je vais mettre le mot clé "résolu" avant le titre cela ne change rien


  • Moddeurs confirmés Rédacteurs Administrateurs

    Je m'en suis chargé, c'est étrange quand même, quel navigateur utilise-tu ?



  • @'robin4002':

    Je m'en suis chargé, c'est étrange quand même, quel navigateur utilise-tu ?

    Bah étrange peux-tu me dire comment as-tu fait en mp ; j'ai bien lu les règle de cette catégorie là "support moddeur" et pourtant j'ai fait pareil.
    J'utilise incontournable Google Chrome

    PS = nan c'est bon j'ai trouvé j'éditais en fait le mauvais message et pas le tout premier lol excuse moi du dérangement Robin


  • Moddeurs confirmés Rédacteurs Administrateurs

    Ah oui, je suis bête moi aussi, il y a une case pour ça sur le forum pour ça x)
    @'Julot10085':

    J'utilise incontournable Google Chrome

    Mouai, j'appelle ça plutôt l'incontournable machine à tracker de Google, perso je préfère largement Firefox, open source, aussi rapide et même plus léger depuis la nouvelle interface australis.



  • @'robin4002':

    Ah oui, je suis bête moi aussi, il y a une case pour ça sur le forum pour ça x)
    @'Julot10085':

    J'utilise incontournable Google Chrome

    Mouai, j'appelle ça plutôt l'incontournable machine à tracker de Google, perso je préfère largement Firefox, open source, aussi rapide et même plus léger depuis la nouvelle interface australis.

    Oui c'est vrai j'utilise chrome car c'est le seul que j'ai sous la main par contre tu viens de m'apprendre que Firefox était un navigateur open-Source et qu'est ce que ça apporte tu peux le custom? (Attention au HS lol)

    Euh sinon je viens juste de remarquer que le code que tu m'as filé ne marche pas Robin. C'est étrange tiens je te le refile

    
    public boolean hitEntity(ItemStack stack, EntityLivingBase attackedLiving, EntityLivingBase attackerLiving)
    {
    attackedLiving.worldObj.spawnParticle("heart", attackedLiving.posX, attackedLiving.posY, attackedLiving.posZ, 0.0D, 0.0D, 0.0D);
    stack.damageItem(1, attackerLiving);
    return true;
    }
    
    

    J'ai changé la particule pour voir si le problème venait de là mais non j'avais mis "smoke"


  • Moddeurs confirmés Rédacteurs Administrateurs

    Je re-déplace dans non résolu.
    Je viens de faire quelque test, en effet le code n'a aucun effet, il semblerait que hitEntity n'est que déclenché en serveur et non en client. Il faudrait donc utilise des paquets.

    ÉDIT : open source = le code est libre, n'importe qui peut le consulter et le modifier.



  • @'robin4002':

    Je re-déplace dans non résolu.
    Je viens de faire quelque test, en effet le code n'a aucun effet, il semblerait que hitEntity n'est que déclenché en serveur et non en client. Il faudrait donc utilise des paquets.

    ÉDIT : open source = le code est libre, n'importe qui peut le consulter et le modifier.

    En effet mais j'ai regardé dans la catégorie Gui et packets de Tutoriels et je ne vois pas vraiment comment utiliser des packets


    J'ai regardé sur serveur vanilla et aucune particule nn plus alors?


  • Moddeurs confirmés Rédacteurs Administrateurs

    Oui, il n'y a pas encore de tutoriel sur les paquets, ça ne devrait pas tarder.



  • @'robin4002':

    Oui, il n'y a pas encore de tutoriel sur les paquets, ça ne devrait pas tarder.

    Ok sinon d'ici là tu as une astuce?


  • Moddeurs confirmés Rédacteurs Administrateurs



  • @'robin4002':

    Tu peux jeter un coup d'ailleurs à Nanotech Mod si tu veux :
    https://github.com/FFMT/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotechmod/main/core/NanotechMod.java#L60
    https://github.com/FFMT/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotechmod/main/core/NanotechMod.java#L126
    https://github.com/FFMT/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotechmod/main/core/NanotechMod.java#L138
    https://github.com/FFMT/nanotech_mod/tree/master/common/fr/mcnanotech/kevin_68/nanotechmod/main/network/packet

    J'ai fait quelque test et j'ai l'impression que quand on déclare une méthode du worldobj hey bien cela ne marche pas !
    Exemple j'ai attribué un effet de potion et le lancement d'une musique sans y mettre worldObj tout cela marchait.
    Malheureusement on n'ajoute des particule que, grâce au worldObj donc je ne sais pas comment faire


  • Moddeurs confirmés Rédacteurs Administrateurs

    Rien à voir avec ça.
    Suffit de mettre :

    public boolean hitEntity(ItemStack stack, EntityLivingBase attackedLiving, EntityLivingBase attackerLiving)
    {
    System.out.println("client ? " + attackedLiving.worldObj.isRemote);
    return super.hitEntity(stack, attackedLiving, attackerLiving);
    }
    

    Et de taper un mob en jeu pour voir que le jeu va toujours indiquer false. Tout simplement car cette méthode n'est que appelé en serveur, or les particules ont besoins d'être dans une méthode qui est appelé en client. Donc il faut utiliser des paquets.



  • @'robin4002':

    Rien à voir avec ça.
    Suffit de mettre :

    public boolean hitEntity(ItemStack stack, EntityLivingBase attackedLiving, EntityLivingBase attackerLiving)
    {
    System.out.println("client ? " + attackedLiving.worldObj.isRemote);
    return super.hitEntity(stack, attackedLiving, attackerLiving);
    }
    

    Et de taper un mob en jeu pour voir que le jeu va toujours indiquer false. Tout simplement car cette méthode n'est que appelé en serveur, or les particules ont besoins d'être dans une méthode qui est appelé en client. Donc il faut utiliser des paquets.

    Toute façon je n'utilise plus cette méthode j'ai trouvé une alternative mais tu dit que "hitEntity" n'est appelé que en multi? Alors comment se fait-il que j'y ai pu faire jouer des sons ?


  • Moddeurs confirmés Rédacteurs Administrateurs

    Suffit de remonter la fonction playSound pour comprendre pourquoi :

    public void playSoundAtEntity(Entity par1Entity, String par2Str, float par3, float par4)
    {
    PlaySoundAtEntityEvent event = new PlaySoundAtEntityEvent(par1Entity, par2Str, par3, par4);
    if (MinecraftForge.EVENT_BUS.post(event))
    {
    return;
    }
    par2Str = event.name;
    for (int i = 0; i < this.worldAccesses.size(); ++i)
    {
    ((IWorldAccess)this.worldAccesses.get(i)).playSound(par2Str, par1Entity.posX, par1Entity.posY - (double)par1Entity.yOffset, par1Entity.posZ, par3, par4);
    }
    }
    

    ctrl + clic sur playSound de "((IWorldAccess)this.worldAccesses.get(i)).playSound", tu tombe sur ça dans la classe IWorldAccess :

    void playSound(String var1, double var2, double var4, double var6, float var8, float var9);
    

    ici, reste appuyer sur ctrl et passe la souris sur playSound et clic sur open implementation
    La tu as deux choix, RenderGlobal et WorldManager.
    RenderGlobal c'est pour le client.
    WorldManager c'est pour le serveur.
    Si tu ouvre WorldManager, tu tombe sur cette fonction :

    public void playSound(String par1Str, double par2, double par4, double par6, float par8, float par9)
    {
    this.mcServer.getConfigurationManager().sendToAllNear(par2, par4, par6, par8 > 1.0F ? (double)(16.0F * par8) : 16.0D, this.theWorldServer.provider.dimensionId, new S29PacketSoundEffect(par1Str, par2, par4, par6, par8, par9));
    }
    

    Et ça, c'est l'envoie d'un paquet pour le son.
    Voilà pourquoi le son fonctionne, c'est parce qu'il passe par un paquet.

    Alors que les particules, la fonction dans WorldManager est vide.

    Sinon avec l'autre fonction ça fonctionne ?



  • @'robin4002':

    Suffit de remonter la fonction playSound pour comprendre pourquoi :

    public void playSoundAtEntity(Entity par1Entity, String par2Str, float par3, float par4)
    {
    PlaySoundAtEntityEvent event = new PlaySoundAtEntityEvent(par1Entity, par2Str, par3, par4);
    if (MinecraftForge.EVENT_BUS.post(event))
    {
    return;
    }
    par2Str = event.name;
    for (int i = 0; i < this.worldAccesses.size(); ++i)
    {
    ((IWorldAccess)this.worldAccesses.get(i)).playSound(par2Str, par1Entity.posX, par1Entity.posY - (double)par1Entity.yOffset, par1Entity.posZ, par3, par4);
    }
    }
    

    ctrl + clic sur playSound de "((IWorldAccess)this.worldAccesses.get(i)).playSound", tu tombe sur ça dans la classe IWorldAccess :

    void playSound(String var1, double var2, double var4, double var6, float var8, float var9);
    

    ici, reste appuyer sur ctrl et passe la souris sur playSound et clic sur open implementation
    La tu as deux choix, RenderGlobal et WorldManager.
    RenderGlobal c'est pour le client.
    WorldManager c'est pour le serveur.
    Si tu ouvre WorldManager, tu tombe sur cette fonction :

    public void playSound(String par1Str, double par2, double par4, double par6, float par8, float par9)
    {
    this.mcServer.getConfigurationManager().sendToAllNear(par2, par4, par6, par8 > 1.0F ? (double)(16.0F * par8) : 16.0D, this.theWorldServer.provider.dimensionId, new S29PacketSoundEffect(par1Str, par2, par4, par6, par8, par9));
    }
    

    Et ça, c'est l'envoie d'un paquet pour le son.
    Voilà pourquoi le son fonctionne, c'est parce qu'il passe par un paquet.

    Alors que les particules, la fonction dans WorldManager est vide.

    Sinon avec l'autre fonction ça fonctionne ?

    Merci beaucoup pour toutes ces explications Robin
    Oui en fait je suis passer directement par l'Entity en question et lui ait crée une condition (en me basant sur le creeper si il se fait tué par un skeleton) du genre :
    Si tu te fait tuer par le joueur tenant un certain item avec un damageSource directe alors il spawnera des particules et voilà ça fonctionne c'était le plan B lol


Log in to reply