LivingUpdateEvent + Particules + NBT



  • Salut salut!

    ça faisait bien longtemps que j'avais pas remis les pieds sur ce forum haha!

    bon j'ai un léger soucis, quand je veux faire spawner un particule, j'utilise l'Event "LivingUpdateEvent", mais visiblement sa fonctionne que quelquefois 😞
    si quelqu'un, aurais la solution a ce problème sa m’aiderais, sachant que je récupère le nom de la particules dans un "NBTTagCompound", et que je convertis le nom de cette particule en "EnumParticleType", peut être que je m'y prend mal…

    CustomEventHandler.java

    package com.xkzh.rntwk;
    
    import java.util.Random;
    
    import net.minecraft.client.Minecraft;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.nbt.NBTBase;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.util.ChatComponentText;
    import net.minecraft.util.EnumParticleTypes;
    import net.minecraftforge.event.entity.EntityJoinWorldEvent;
    import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
    import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
    import net.minecraftforge.fml.common.gameevent.InputEvent.KeyInputEvent;
    import net.minecraftforge.fml.relauncher.Side;
    import net.minecraftforge.fml.relauncher.SideOnly;
    
    import com.xkzh.rntwk.gui.GuiAuras;
    import com.xkzh.rntwk.gui.GuiLevelUp;
    
    import fr.minecraftforgefrance.ffmtlibs.FFMTLibs;
    
    public class CustomEventHandler
    {
    
    /* @SideOnly(Side.CLIENT)
    @SubscribeEvent
    public void replaceguimenu(GuiOpenEvent guievt)
    {
    
    if(guievt.gui != null && guievt.gui instanceof GuiIngame)
    {
    Minecraft.getMinecraft().displayGuiScreen(new GuiCustomMainMenu());
    //System.out.println("test");
    guievt.setCanceled(true);
    
    }
    }
    */
    @SideOnly(Side.CLIENT)
    @SubscribeEvent
    public void onEvent(KeyInputEvent event)
    {
    if(ClientSidedProxy.keyAura.isPressed())
    {
    EntityPlayer player = Minecraft.getMinecraft().thePlayer;
    player.openGui(Main.Instance, GuiAuras.GuiID, Minecraft.getMinecraft().theWorld, (int)player.posX, (int)player.posY, (int)player.posZ);
    }
    if(ClientSidedProxy.keyStats.isPressed())
    {
    EntityPlayer player = Minecraft.getMinecraft().thePlayer;
    player.openGui(Main.Instance, GuiLevelUp.GuiID, Minecraft.getMinecraft().theWorld, (int)player.posX, (int)player.posY, (int)player.posZ);
    }
    }
    @SideOnly(Side.SERVER)
    @SubscribeEvent
    public void onPlayerUpdate(LivingUpdateEvent event)
    {
    if(event.entityLiving instanceof EntityPlayer)
    {
    EntityPlayer player = (EntityPlayer)event.entityLiving;
    Random rand = new Random();
    
    NBTTagCompound nbt = player.getEntityData();
    String nbt2 = nbt.getTag("Aura").toString().replace("\"", "");
    System.out.println("Aura : " + nbt2);
    player.worldObj.spawnParticle(EnumParticlesToString.getParticle(nbt2) , player.posX + (rand.nextDouble() - 0.5D) * (double) (player.width - 0.1D),player.posY + rand.nextDouble() * (double) (player.height - 0.1D),player.posZ + (rand.nextDouble() - 0.5D)* (double) (player.width - 0.1D), 0.0D, 0.0D, 0.0D);
    }
    }
    @SideOnly(Side.SERVER)
    @SubscribeEvent
    public void onJoinWorld(EntityJoinWorldEvent event)
    {
    if(event.entity instanceof EntityPlayer)
    {
    EntityPlayer player = (EntityPlayer) event.entity;
    NBTTagCompound nbt = player.getEntityData();
    if(!nbt.hasKey("Aura"))
    {
    nbt.setString("Aura", "null");
    }
    }
    }
    }
    
    

    EnumParticlesToString.java (faut que je change le nom de ce truc btw)

    package com.xkzh.rntwk;
    
    import java.lang.reflect.Array;
    
    import scala.actors.threadpool.Arrays;
    import net.minecraft.util.EnumParticleTypes;
    
    public class EnumParticlesToString
    {
    public static EnumParticleTypes getParticle(String part)
    {
    if(part.equalsIgnoreCase("redstone"))
    return EnumParticleTypes.REDSTONE;
    if(part.equalsIgnoreCase("coeurs"))
    return EnumParticleTypes.HEART;
    if(part.equalsIgnoreCase("notes"))
    return EnumParticleTypes.NOTE;
    if(part.equalsIgnoreCase("null"))
    return EnumParticleTypes.BLOCK_DUST;
    else
    return null;
    }
    }
    
    

    je pense que c'est a peu pres tout !
    Merci 🙂



  • Je ne comprends pas l'utilité du .replace(""", "") et pour le NBT, pourquoi ne pas utiliser nbt.getString("Aura") ?



  • C'est vrai que c'est un peu stupide xD



  • Je pense que le problème vient du random, essaie avec des coordonnées fixe comme player.posX player.posY et player.posZ pour voir.



  • visiblement sa ne viens pas du random, alors il semblerais que ceci fonctionne

    @SubscribeEvent
    public void onPlayerUpdate(LivingUpdateEvent event)
    {
    if(event.entityLiving instanceof EntityPlayer)
    {
    EntityPlayer player = (EntityPlayer)event.entityLiving;
    Random rand = new Random();
    player.worldObj.spawnParticle(EnumParticleTypes.HEART , player.posX + (rand.nextDouble() - 0.5D) * (double) (player.width - 0.1D),player.posY + rand.nextDouble() * (double) (player.height - 0.1D),player.posZ + (rand.nextDouble() - 0.5D)* (double) (player.width - 0.1D), 0.0D, 0.0D, 0.0D);
    }
    }
    

    il faut que j'enleve le SideOnly, et cette fonction EnumParticlesToString.getParticle(nbt2) (qui ne fonctionne pas a mon plus grand desepoir…



  • @'Kushhh':

    visiblement sa ne viens pas du random, alors il semblerais que ceci fonctionne

    @SubscribeEvent
    public void onPlayerUpdate(LivingUpdateEvent event)
    {
    if(event.entityLiving instanceof EntityPlayer)
    {
    EntityPlayer player = (EntityPlayer)event.entityLiving;
    Random rand = new Random();
    player.worldObj.spawnParticle(EnumParticleTypes.HEART , player.posX + (rand.nextDouble() - 0.5D) * (double) (player.width - 0.1D),player.posY + rand.nextDouble() * (double) (player.height - 0.1D),player.posZ + (rand.nextDouble() - 0.5D)* (double) (player.width - 0.1D), 0.0D, 0.0D, 0.0D);
    }
    }
    

    il faut que j'enleve le SideOnly, et cette fonction EnumParticlesToString.getParticle(nbt2) (qui ne fonctionne pas a mon plus grand desepoir…

    Effectivement, je n'y avait pas pensé mais je pense que le livingUpdateEvent se fait uniquement côté serveur, si tu veux générer des particules, il te faudra un autre event. pour ta fonction getParticle(String) le problème vient de comment tu le récupère, fait un System.out.println(nbt2) pour voir ce qui est mis dans ta variable.



  • [size=smallSystem.out.println(nbt2) -> j'ai deja fait sa il me retourne ce que je veux mais apres la convertion texte vers Particule se fait pas]:([size=xx-small ]



  • @'Kushhh':

    [size=smallSystem.out.println(nbt2) -> j'ai deja fait sa il me retourne ce que je veux mais apres la convertion texte vers Particule se fait pas]:([size=xx-small ]

    Essaie avec une particules déjà implémenter dans le jeux.



  • les particules que je teste sont déja implémentées dans le jeu 😞



  • @'Kushhh':

    les particules que je teste sont déja implémentées dans le jeu 😞

    Essaie avec quelque chose comme ça :

    
    for (int l = 0; l < 100; l++) {
    world.spawnParticle(EnumParticleTypes.SNOWBALL, 112.5D, 77.5D, 11.5D, 0.0D, 0.0D, 0.0D, new int[0]);
    }
    
    

    change les 3 premiers double avec tes coordonnées et dis moi si ça fonctionne. (en t'assurant bien d'avoir les particules d'affichées)



  • C est toujours le même souci de side sa rejoint mon post la 
    http://www.minecraftforgefrance.fr/showthread.php?tid=887

    Il faut que tu passes par des packets ou alors que tu trouves un event qui irait ou même un méthode



  • @'Julot10085':

    C est toujours le même souci de side sa rejoint mon post la 
    http://www.minecraftforgefrance.fr/showthread.php?tid=887

    Il faut que tu passes par des packets ou alors que tu trouves un event qui irait ou même un méthode

    Non puisque ça méthode ne se fait pas lorsqu'il y a un événement côté serveur, son problème est qu'il utilise un event serveur au lieu d'un event côté client.



  • @'SCAREX':

    @'Julot10085':

    C est toujours le même souci de side sa rejoint mon post la 
    http://www.minecraftforgefrance.fr/showthread.php?tid=887

    Il faut que tu passes par des packets ou alors que tu trouves un event qui irait ou même un méthode

    Non puisque ça méthode ne se fait pas lorsqu'il y a un événement côté serveur, son problème est qu'il utilise un event serveur au lieu d'un event côté client.

    C'est bien ce que je dis il faut qu'il passe par un autre event ou une méthode appellée côté client puisque spawnParticle est une méthode côté client. Ou alors si tu souhaites quand même te servir de cet event (LivingUpdate) alors crée un packet pour les particules et envoies-le ici