MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Indicateur de chat

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    1.7.10
    23 Messages 5 Publieurs 3.9k Vues 1 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • JoelchasseuJ Hors-ligne
      Joelchasseu
      dernière édition par

      Bonjour !

      Je cherche a faire en sorte que quand un joueur ouvre son chat une image apparaisse au dessus de sa tête, j’ai commencé avec une méthode onUpdate avec ce genre de condition :

      public Entity onUpdate(World world, Entity player){
      
      if(!world.isRemote && Minecraft.getMinecraft().ingameGUI.getChatGUI().getChatOpen() && player instanceof EntityPlayer)
      {
      
      }
      return player;
      

      C’est pour savoir si je pars sur une bonne base ou si je fais fausse route et également ce dont j’aurais besoin pour nottamment afficher une image au dessus d’un joueur pour que cette idée voit le jour.

      Merci d’avance pour votre aide 😉

      1 réponse Dernière réponse Répondre Citer 0
      • DylemD Hors-ligne
        Dylem
        dernière édition par

        Tu as créé une entité spéciale pour les joueurs de ton mod, ou tu modifies le code source de Minecraft ? Ca me semble être une très mauvaise idée :

        Utilise plutôt les events, quelque chose comme ça :

        
        @SubscribeEvent(priority=EventPriority.NORMAL, receiveCanceled=true)
        public void onEvent(RenderTickEvent event)
        {
        if (Minecraft.getMinecraft().ingameGUI.getChatGUI().getChatOpen())
        {
        System.out.println("Le chat est ouvert");
        }
        
        }
        
        

        Si je t'ai aidé, n'hésite pas à cliquer sur le nombre vert en dessous de mon image de profil, pour me le faire savoir. Ca me motive pour continuer …

        1 réponse Dernière réponse Répondre Citer 1
        • JoelchasseuJ Hors-ligne
          Joelchasseu
          dernière édition par

          Non non je touche pas au code source de minecraft ou du moins je veux pas y toucher.

          Ca marche je test ça. Et sinon pour afficher l’image vous me conseillez quelle classe de forge ?

          Et il va falloir que je me remette dans le tuto des event car j’ai un peu zappé comment fallait faire avec la classe EventHandler 😉

          1 réponse Dernière réponse Répondre Citer 0
          • DylemD Hors-ligne
            Dylem
            dernière édition par

            @‘Joelchasseu’:

            Non non je touche pas au code source de minecraft ou du moins je veux pas y toucher.

            Ca marche je test ça. Et sinon pour afficher l’image vous me conseillez quelle classe de forge ?

            Tu ne peux pas override la fonction onUpdate si ta classe n’étend pas Entity, c’est pour ça qu’il faut que tu utilises les évènements 🙂

            Pareil pour l’image, sauf que cette fois-ci ça va être %(#272a34)[RenderLivingEvent. Ca risque d’être un peu compliqué, j’espère que t’es bon en GL  😄 ]
            J’ai trouvé un post qui demandait quelque chose de similaire, si ça peut aider : http://www.minecraftforge.net/forum/topic/9755-render-nameplate-or-image-above-mob/

            Si je t'ai aidé, n'hésite pas à cliquer sur le nombre vert en dessous de mon image de profil, pour me le faire savoir. Ca me motive pour continuer …

            1 réponse Dernière réponse Répondre Citer 0
            • JoelchasseuJ Hors-ligne
              Joelchasseu
              dernière édition par

              Ah d’accord, c’est vrai que je ne savais jamais si je devais utiliser les events ou non c’est cool.

              Jamais touché au GL mais bon faut bien mettre les mains dans le cambouis un jour hein ^^
              Super je vais zieuter car c’est en effet plutot similaire a ce que je recherche 😉

              Merci 😉  (Je laisse le sujet en ouvert pour le moment si j’ai des questions en plus, j’oublierais pas de le passer en résolu quand ça sera bon 😉 )


              Bon, j’avance doucement mais je tente de comrendre (avec difficulté je dois l’admettre, surtout le GL comme tu me disais x) )

              
              public class IndicChatOpen
              {
              
              ResourceLocation texturebulle = new ResourceLocation("/main/resources/assets/heimnormod/textures/items/bulle.png");
              
              public void BulleChat(Minecraft minecraft)
              {
              Tessellator tessellator = Tessellator.instance;
              
              minecraft.renderEngine.bindTexture(texturebulle);
              tessellator.startDrawingQuads();
              tessellator.addVertexWithUV(-1, 1, 1, 0, 0);
              tessellator.addVertexWithUV(-1, 1, -1, 0, 1);
              tessellator.addVertexWithUV(1, 1, -1, 1, 1);
              tessellator.addVertexWithUV(1, 1, 1, 1, 0);
              
              tessellator.addVertexWithUV(-1, 1, 1, 0, 0);
              tessellator.addVertexWithUV(1, 1, 1, 1, 0);
              tessellator.addVertexWithUV(1, 1, -1, 1, 1);
              tessellator.addVertexWithUV(-1, 1, -1, 0, 1);
              tessellator.draw();
              
              }
              
              }
              
              
              
              public class LivingEventHandler {
              
              IndicChatOpen bullechat = new IndicChatOpen();
              
              @SubscribeEvent(priority=EventPriority.NORMAL, receiveCanceled=true)
              public void onEvent(RenderTickEvent event)
              {
              IndicChatOpen mechanics = new IndicChatOpen();
              
              if (Minecraft.getMinecraft().ingameGUI.getChatGUI().getChatOpen())
              {
              
              mechanics.BulleChat(FMLClientHandler.instance().getClient());
              System.out.println("Ca marche");
              }
              }
              
              }
              
              
              1 réponse Dernière réponse Répondre Citer 0
              • JoelchasseuJ Hors-ligne
                Joelchasseu
                dernière édition par

                Là je suis bloqué, la String “Ca marche” s’affiche dans la console, en revanche je n’arrive toujours pas à afficher ma texture au dessus de mon perso

                EDIT : Je vies de m’appercevoir qu’il y avait un tuto a propos de l’openGL, je me penche dessus 😉

                1 réponse Dernière réponse Répondre Citer 0
                • DylemD Hors-ligne
                  Dylem
                  dernière édition par

                  @‘Joelchasseu’:

                  Là je suis bloqué, la String “Ca marche” s’affiche dans la console, en revanche je n’arrive toujours pas à afficher ma texture au dessus de mon perso

                  EDIT : Je vies de m’appercevoir qu’il y avait un tuto a propos de l’openGL, je me penche dessus 😉

                  Pour ta fonction et notamment ses paramètres, tu peux t’inspirer de la fonction net.minecraft.client.renderer.entity.Render#renderEntityOnFire

                  Par contre, il y a des chances que tu doives travailler avec les packets. En effet, ce n’est pas le même évènement pour la détection du chat et l’affichage.
                  Je m’explique avec du code commenté :

                  
                      /*
                       * Détection 
                       */
                      @SubscribeEvent(priority=EventPriority.NORMAL, receiveCanceled=true)
                      public void onRenderTick(RenderTickEvent event)
                      {
                          if (Minecraft.getMinecraft().ingameGUI.getChatGUI().getChatOpen())
                          {
                              // Envoyer un packet comme quoi le chat est ouvert
                          }
                          else
                          {
                              // Envoyer un packet comme quoi le chat est fermé
                          }
                      }
                  
                      /*
                       * Affichage de la bulle
                       */
                      @SubscribeEvent
                      public void onRenderLiving(RenderLivingEvent event)
                      {
                          // Récupérer les packets
                          // Si le chat est ouvert, appeler la fonction d'affichage
                      }
                  
                  

                  Si je t'ai aidé, n'hésite pas à cliquer sur le nombre vert en dessous de mon image de profil, pour me le faire savoir. Ca me motive pour continuer …

                  1 réponse Dernière réponse Répondre Citer 1
                  • JoelchasseuJ Hors-ligne
                    Joelchasseu
                    dernière édition par

                    Décidément je vais avoir du travail d’apprentissage je n’ai jamais travailler avec les paquets non plus !

                    En tout cas merci, tes explications sont très claires, je vous tiens au courant 😉

                    1 réponse Dernière réponse Répondre Citer 0
                    • DeletedD Hors-ligne
                      Deleted
                      dernière édition par

                      Oui, il serait temps de mettre la main à la pâte, l’ami !

                      1 réponse Dernière réponse Répondre Citer 0
                      • jglrxavpokJ Hors-ligne
                        jglrxavpok Modérateurs
                        dernière édition par

                        Il risque d’y avoir un problème vu comment c’est parti.

                        Minecraft.getMinecraft().ingameGUI.getChatGUI().getChatOpen()
                        ``` ne permet de savoir que si le client sur lequel le mod tourne a son tchat ouvert. Il faudrait envoyer un message (via des packets) au serveur pour lui dire que le joueur est en train d'écrire, puis de retransmettre cette information à tous les clients connectés, et enfin d'afficher la bulle uniquement si ton client a reçu l'information que le joueur J est bien en train d'écrire.
                        
                        PS: N'hésite pas à poster tes retours sur le tuto OpenGL dans ses commentaires, il manque cruellement de retours ce tuto.
                        
                        Edit: J'ai lu trop en diagonale et quelqu'un d'autre a déjà soulevé ce problème, mais j'espère que mon explication pourra t'aider quand même.

                        Modérateur sur MFF. 
                        Mon Github: http://github.com/jglrxavpok
                        Mon compte Steam si vous voulez jouer à CS:GO ou TF2 avec moi: https://steamcommunity.com/id/jglrxavpok/

                        1 réponse Dernière réponse Répondre Citer 0
                        • BrokenSwingB Hors-ligne
                          BrokenSwing Moddeurs confirmés Rédacteurs
                          dernière édition par

                          Ouais, c’est ce que Dylem lui a indiqué, qu’il fallait utiliser les paquets

                          1 réponse Dernière réponse Répondre Citer 0
                          • DeletedD Hors-ligne
                            Deleted
                            dernière édition par

                            DataWatcher ou autre packet a coder, que le serveur enverra à tous ses clients connectés.

                            1 réponse Dernière réponse Répondre Citer 0
                            • JoelchasseuJ Hors-ligne
                              Joelchasseu
                              dernière édition par

                              Oui je suis encore à l’apprentissage du network mais dès que j’en aurais fini avec l’openGL je ferais un retour dessus promis 😉


                              @‘Plaigon’:

                              Oui, il serait temps de mettre la main à la pâte, l’ami !

                              Oui mais j’essayais d’apprendre progressivement, et c’est vrai que maintenant je commence a connaitre la base mais quand je tombe dans quelques chose de nouveau (comme l’openGL ou les paquets) j’ai l’impression de revenir a zéro ^^ Je pense qu’il faut aimer souffrir pour apprendre la programmation vu le temps qu’on passe a régler des problèmes quand on débute x)

                              1 réponse Dernière réponse Répondre Citer 0
                              • JoelchasseuJ Hors-ligne
                                Joelchasseu
                                dernière édition par

                                Rebonjour, bon j’ai avancé un peu mais j’avoue être toujours un poil perdu sur les packets

                                Pour le moment j’ai fait ça (je sais que ce n’est pas fini mais je suis pas sur de moi dutout jusqu’ici)
                                J’ai créer un packet qui sera envoyé au serveur quand le joueur ouvrira son chat

                                
                                @SubscribeEvent
                                    public void onRenderLiving(Minecraft minecraft, RenderLivingEvent event)
                                    {
                                IndicChatOpen mechanics = new IndicChatOpen();
                                mechanics.BulleChat(FMLClientHandler.instance().getClient(), event);
                                
                                IndicChatOpen.BulleChat(minecraft, event);
                                
                                }
                                
                                

                                que j’ai bien enregistrer dans ma classe principale Mais le problème se pose pour le packet que le serveur enverra a tous les autres joueurs pour prévenir que le joueur en question à le chat d’ouvert

                                
                                public class IMessageChatReponse implements IMessage {
                                
                                private String text;
                                
                                public IMessageChatReponse() { }  
                                public IMessageChatReponse(String text) 
                                {
                                       this.text = text;
                                  }
                                
                                @Override
                                public void fromBytes(ByteBuf buf) {
                                ByteBufUtils.readUTF8String(buf);
                                }
                                
                                @Override
                                public void toBytes(ByteBuf buf) {
                                ByteBufUtils.writeUTF8String(buf, text);
                                }
                                
                                @SideOnly(Side.CLIENT)
                                public static class IMessageHandlerChatReponse implements IMessageHandler <imessagechatreponse, imessage="">{
                                
                                @Override
                                public IMessage onMessage(IMessageChatReponse message, MessageContext ctx) {
                                
                                EntityPlayerMP player = ctx.getServerHandler().playerEntity;
                                Heimnor.network.sendTo(message, player);
                                System.out.println("Message Serveur –> client");
                                return null;
                                }
                                
                                }
                                
                                }
                                
                                

                                Je vous mets mes autres classes au cas ou :

                                Packet Client --> Serveur :

                                
                                public class IMessageChat implements IMessage
                                {
                                private boolean LivingEventHandler;
                                
                                private String text;
                                
                                public IMessageChat() { }
                                
                                public IMessageChat(boolean LivingEventHandler) 
                                {
                                       this.LivingEventHandler = LivingEventHandler;
                                  }
                                
                                @Override
                                public void fromBytes(ByteBuf buf) {
                                
                                this.LivingEventHandler = buf.readBoolean();
                                }
                                
                                @Override
                                public void toBytes(ByteBuf buf) {
                                
                                buf.writeBoolean(this.LivingEventHandler);
                                
                                }
                                
                                public static class IMessageHandlerChat implements IMessageHandler <imessagechat, imessage="">{
                                
                                @Override
                                public IMessage onMessage(IMessageChat message, MessageContext ctx) {
                                
                                if(message.text.equals("chatouvert")) 
                                {
                                EntityPlayerMP player = ctx.getServerHandler().playerEntity;
                                Heimnor.network.sendTo(message, player);
                                }
                                return null;
                                }
                                
                                }
                                
                                }
                                
                                

                                Classe Principale :

                                network = NetworkRegistry.INSTANCE.newSimpleChannel("chatChannel");
                                    network.registerMessage(com.heimnor.packet.IMessageChat.IMessageHandlerChat.class, IMessageChat.class, 1, Side.SERVER);
                                    network.registerMessage(com.heimnor.packet.IMessageChatReponse.IMessageHandlerChatReponse.class, IMessageChatReponse.class, 2, Side.CLIENT);
                                

                                La classe censée afficher l’image (IndicChatOpen) est crée et j’ai copié collé un code trouvé sur internet mais je compte la refaire(car j’y comprend rien vu que je l’ai jamais fait), en reprenant le tuto sur l’OpenGL ;), après avoir régler l’histoire des packets.

                                Enfin ,voilà c’est surtout pour savoir ce que vous en pensez et si vous avez des remarques car je me suis un peu perdu moi même je dois dire… ^^</imessagechat,></imessagechatreponse,>

                                1 réponse Dernière réponse Répondre Citer 0
                                • DeletedD Hors-ligne
                                  Deleted
                                  dernière édition par

                                  Salut,
                                  Premièrement ta méthode-event onRenderLiving n’est pas censé avoir de paramètre de type Minecraft. Uniquement un paramètre event, ici RenderLivingEvent.
                                  Ensuite je t’aurai recommandé d’utiliser les datawatchers pour la synchro serveur -> tous les clients connectés, plutôt qu’encore passer par une nouvelle classe de packet. Tu gagneras sûrement en lisibilité dans tous tes packages/classes et probablement en rapidité. Après j’avoue également ne pas avoir compris grand chose à tes packets, comme tu n’effectues aucune chose dedans, par-exemple ton handler du packet IMessageChatReponse est client-side, donc ton joueur devrait plutôt être instancié par du Minecraft.getMinecraft().thePlayer. Et pour ensuite renvoyer au serveur le packet que le client vient de recevoir ?!! Cela n’a aucun sens, à la limite ton packet Serveur-Client, aurait dû indiquer au Joueur A, que le joueur B était en train de chat, via pourquoi pas une ArrayList de String présente, et qui contiendrait toutes les instances de EntityPlayer chez qui le chat est ouvert. Bref, mes formulations sont sûrement confuses et trop peu ponctuées pour un débutant. Si tu ne parviens toujours pas, j’irai te filer un coup de main en privé pour éviter de s’étendre, comme je viens de réaliser un mod identique il y a 2 semaine, pour la 1.7.10 aussi 😃
                                  Dernièrement il serait intéressant pour nous d’avoir accès à ta classe IndicChatOpen pour être sûr que tu n’as pas mis n’importe quoi dedans ^^’

                                  1 réponse Dernière réponse Répondre Citer 1
                                  • JoelchasseuJ Hors-ligne
                                    Joelchasseu
                                    dernière édition par

                                    C’est un peu confus notamment au niveau des datawatchers et de l’ArrayList car je n’ai jamais regardé a quoi cela servais ni comment ça se présentais, mais je vais aller faire des recherches .

                                    Merci de ta proposition c’est gentil de prendre le temps de vouloir m’expliquer, je vais quand même essayer de voir si je ne peux pas régler le problème par moi même, je te tiens au courant 😉

                                    Pour le IMessageChatReponse, je pensais que network#SendTo envoyais le packet du Serveur au client 😕

                                    En fait dans ma logique je voulais faire en sorte que, quand le joueur ouvre son chat, le packet contenant le boolean true parte vers le serveur, ensuite en vérifiant avec une condition “if” le packet contient true, alors on envois aux joueur du serveur le fait que tel joueur à le chat d’ouvert et qu’il faut afficher une texture au dessus de sa tête. visiblement j’y étais pas…

                                    Pour ce qui est de la classe IndicChatOpen c’est du pur copié collé je n’ai pas encore pris le temps de me pencher dessus car je voulais régler ces problèmes de packets avant de penser à l’affichage de l’indicateur de chat à l’écran .

                                    public class IndicChatOpen
                                    {
                                    
                                    static ResourceLocation texturebulle = new ResourceLocation("/main/resources/assets/heimnormod/textures/items/bulle.png");
                                    
                                    public static void BulleChat(Minecraft minecraft, RenderLivingEvent event)
                                    {
                                    Tessellator tessellator = Tessellator.instance;
                                    
                                    EntityPlayer localPlayer = Minecraft.getMinecraft().thePlayer;
                                        double x = event.entity.posX - localPlayer.posX;
                                        double y = event.entity.posY - localPlayer.posY;
                                        double z = event.entity.posZ - localPlayer.posZ;
                                        //double x = localPlayer.posX - event.entity.posX;
                                        //double y = localPlayer.posY - event.entity.posY;
                                        //double z = localPlayer.posZ - event.entity.posZ;
                                    
                                    glPushMatrix();
                                    glTranslated(x, y, z);
                                    minecraft.renderEngine.bindTexture(texturebulle);
                                    tessellator.startDrawingQuads();
                                    tessellator.addVertexWithUV(1, 1, 0, 0, 0);
                                    tessellator.addVertexWithUV(1, 1, 0+2, 0, 1);
                                    tessellator.addVertexWithUV(1+1, 1+2, 0, 1, 1);
                                    tessellator.addVertexWithUV(1, 1+1, 0, 1, 0);
                                    
                                            tessellator.addVertexWithUV(1, 1, 0, 0, 0);
                                    tessellator.addVertexWithUV(1, 1+1, 0, 1, 0);
                                    tessellator.addVertexWithUV(1+1, 1+2, 0, 1, 1);
                                    tessellator.addVertexWithUV(1, 1, 0+2, 0, 1);
                                    tessellator.draw();
                                    glPopMatrix();
                                    }
                                    
                                    }
                                    
                                    1 réponse Dernière réponse Répondre Citer 0
                                    • DeletedD Hors-ligne
                                      Deleted
                                      dernière édition par

                                      Viens me mp Skype, on s’en sortira jamais. On filerai les classes finales en guise de meilleure réponse!

                                      1 réponse Dernière réponse Répondre Citer 1
                                      • JoelchasseuJ Hors-ligne
                                        Joelchasseu
                                        dernière édition par

                                        En fait mon problème c’est qu’après de multiples essais je n’arrive pas a récupérer les packets dans l’event, et pour ce qui est des DataWatchers, même sur les forums anglais j’avoue ne pas avoir trouvé de bon tutoriel, juste une question les DataWatchers marchent avec les NBTTags ?

                                        1 réponse Dernière réponse Répondre Citer 0
                                        • DylemD Hors-ligne
                                          Dylem
                                          dernière édition par

                                          tant qu’à faire, créons un discord

                                          Si je t'ai aidé, n'hésite pas à cliquer sur le nombre vert en dessous de mon image de profil, pour me le faire savoir. Ca me motive pour continuer …

                                          1 réponse Dernière réponse Répondre Citer 1
                                          • DeletedD Hors-ligne
                                            Deleted
                                            dernière édition par

                                            Non, pas besoin.

                                            1 réponse Dernière réponse Répondre Citer 1
                                            • 1
                                            • 2
                                            • 1 / 2
                                            • Premier message
                                              Dernier message
                                            Design by Woryk
                                            ContactMentions Légales

                                            MINECRAFT FORGE FRANCE © 2024

                                            Powered by NodeBB