SOLVED Bug event EntityJoinWorldEvent


  • Salut tout le monde
    Je suis en train de recoder le mod More Creeps And Weirdos en 1.7.10 sous forge à but privé (donc non commercial, donc non hors-la-loi) et je commence par créer ma class d’event handler comportant juste cet event

    
    package fr.mrplaigon.morecreeps.common.handler;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.util.ChatComponentTranslation;
    import net.minecraftforge.event.entity.EntityJoinWorldEvent;
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    
    public class EventCommonHandler 
    {
    
        static final String welcome[] =
        {
            "Now, go out there and have some fun!", "Don't let those stinky Floobs push you around!", "Give a diamond to a level 25 HotDog for a special reward!", "Urinating Bums can help with landscaping. Try one today!", "You're doing something right!", "Watch out for grumpy G's!", "Guinea Pigs make nice pets.", "Bring a lost Kid back to a Lolliman for a nice reward.", "Robot Ted thinks Robot Todd is a dirty chicken wing.", "Sneaky Sal changes his prices. Check back for bargains.",
            "Power your HotDog with redstone for a fire attack!", "You want money? Punch a Lawyer From Hell!", "Equip your HotDogs with Redstone for fire attacks!", "Guinea Pigs eat Wheat and Apples.", "A Floob Ship will spit out Floobs until it is destroyed.", "Drop a BubbleScum 100 blocks for the MERCILESS achievement!", "Throw a BubbleScum down a DigBug hole for a cookie fountain!", "Feed lots of cake to a Hunchback and he will stay loyal.", "The longer you ride a RocketPony, the more tame it will be.", "Visit Sneaky Sal for those hard to find items.",
            "Hitting a Caveman will turn him/her evil!", "SNEAK KEY + RIGHT CLICK on creeps for info or to name them.", "Give a level 20 Guinea Pig a diamond to build a Hotel!", "If you hear disco music - RUN!"
        };
    
    @SubscribeEvent
    public void onEntitySpawned(EntityJoinWorldEvent event)
    {
    if(event.entity instanceof EntityPlayer)
    {
    EntityPlayer player = ((EntityPlayer)event.entity);
    player.worldObj.playSoundAtEntity(player, "morecreepsandweirdos:welcome", 1.55F, 1.0F);
    if(!player.worldObj.isRemote)
    {
    String s = welcome[player.worldObj.rand.nextInt(welcome.length)];
                player.addChatComponentMessage(new ChatComponentTranslation("\2476More Creeps and Weirdos \247ev2.55 \2476loaded.", new Object[0]));
                player.addChatComponentMessage(new ChatComponentTranslation(s, new Object[0]));
                System.out.println("combien de fois est appele l event ?" + player.worldObj.isRemote);
    }
    }
    }
    }
    

    Mais le soucis étant que j’ai beau mettre la condition avec ! ou sans ! le problème persistera. J’ai l’impression que la méthode est appelée 2 fois, en gros mon son est bien joué qu’une seule fois mais mon message apparait 2 fois et avant cette condition c’était pire ! C’était 4 fois mais c’est normal 2 fois pour le client et 2 fois pour le common.
    En gros je voudrai bien de l’aide soit pour trouver un code qui fonctionne (ou me mettre sur la piste) soit pour me donner un autre event (j’ai déjà utilisé EntityConstruction comme event mais c’est peine perdue car dès que j’arrive sur la map le jeu crash).
    Je vous remercie d’avance 😉

  • Moddeurs confirmés Rédacteurs

    Personellement, lorsque j’exécute ton code, les messages ne s’affichent qu’une fois chacun.

    EDIT : Je ne pense pas que cela résolve ton problème (même pas du tout) mais je me demandais pourquoi tu mettais :
    new ChatComponentTranslation(s, new Object[0])
    Si tu n’utilise pas le second argument, préfère new ChatComponentText(s) mais pour ton problème essaie de voir si rien ne cause un double spawn de ton joueur, car comme dit plus haut, j’ai testé ton code et il marche très bien.


  • @‘bodri’:

    Personellement, lorsque j’exécute ton code, les messages ne s’affichent qu’une fois chacun.

    EDIT : Je ne pense pas que cela résolve ton problème (même pas du tout) mais je me demandais pourquoi tu mettais :
    new ChatComponentTranslation(s, new Object[0])
    Si tu n’utilise pas le second argument, préfère new ChatComponentText(s) mais pour ton problème essaie de voir si rien ne cause un double spawn de ton joueur, car comme dit plus haut, j’ai testé ton code et il marche très bien.

    Voici un screen explicatif:
    http://hpics.li/f761f04

    Mon problème est que je ne voudrai qu’uns seule fois le message More Creeps a bien été chargé….en oragne et une seule fois aussi le message random d’en dessous or là comme vous pouvez le voir j’arrive sur ma map (même avec l’argument que tu m’as conseillé de retirer) et j’ai 2 fois le message en orange et celui random.
    Merci d’avance

  • Moddeurs confirmés Rédacteurs

    @‘Julot10085’:

    @‘bodri’:

    Personellement, lorsque j’exécute ton code, les messages ne s’affichent qu’une fois chacun.

    EDIT : Je ne pense pas que cela résolve ton problème (même pas du tout) mais je me demandais pourquoi tu mettais :
    new ChatComponentTranslation(s, new Object[0])
    Si tu n’utilise pas le second argument, préfère new ChatComponentText(s) mais pour ton problème essaie de voir si rien ne cause un double spawn de ton joueur, car comme dit plus haut, j’ai testé ton code et il marche très bien.

    Voici un screen explicatif:
    http://hpics.li/f761f04

    Mon problème est que je ne voudrai qu’uns seule fois le message More Creeps a bien été chargé….en oragne et une seule fois aussi le message random d’en dessous or là comme vous pouvez le voir j’arrive sur ma map (même avec l’argument que tu m’as conseillé de retirer) et j’ai 2 fois le message en orange et celui random.
    Merci d’avance

    J’ai compris ton problème mais je ne vois pas d’où cela peut venir, mais ce qui est sûr (j’ai pas trop envie de m’avancer mais bon) c’est que le problème ne viens pas de la fonction, comme je l’ai déjà dit, quand je la test je n’ai qu’une seule fois chaque message.


  • mets çà pour ta condition :

    if (event.entity instanceof EntityPlayerMp)
    

    ou utilise l’event PlayerLoggedInEvent (PlayerEvent.PlayerLoggedInEvent).

    Si je peux me permettre, il vaut mieux éviter d’utiliser le random de la classe World car c’est le random utilisé dans la génération donc quand tu l’utilises, tu modifies la génération du monde.


  • @‘SCAREX’:

    mets çà pour ta condition :

    if (event.entity instanceof EntityPlayerMp)
    

    ou utilise l’event PlayerLoggedInEvent (PlayerEvent.PlayerLoggedInEvent).

    Si je peux me permettre, il vaut mieux éviter d’utiliser le random de la classe World car c’est le random utilisé dans la génération donc quand tu l’utilises, tu modifies la génération du monde.

    Merci SCAREX ça marche !
    Voici mon code actuel pour les intéressés:

    
    @SubscribeEvent
    
    public void onEntitySpawned(PlayerEvent.PlayerLoggedInEvent event)
    {
    Random rand = new Random();
    EntityPlayer player = event.player;
    player.worldObj.playSoundAtEntity(player, "morecreepsandweirdos:welcome", 1.55F, 1.0F);
    if(!player.worldObj.isRemote)
    {
    String s = welcome[rand.nextInt(welcome.length)];
                player.addChatComponentMessage(new ChatComponentTranslation("\2476More Creeps and Weirdos \247ev2.55 \2476loaded."));
                player.addChatComponentMessage(new ChatComponentTranslation(s));
                System.out.println("combien de fois est appele l event ?" + player.worldObj.isRemote);
    
    }
    }