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

      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
                  • JoelchasseuJ Hors-ligne
                    Joelchasseu
                    dernière édition par

                    Avec l’aide de ce cher Plaigon j’ai enfin réussi a finir l’indicateur de chat (reste plus que le tesselator a configurer pour un résultat propre). Voici le code :

                    Packets :
                    :::

                    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);
                        network.registerMessage(com.heimnor.packet.IMessageChatClose.IMessageHandlerChatClose.class, IMessageChatClose.class, 3, Side.SERVER);
                        network.registerMessage(com.heimnor.packet.IMessageChatCloseReponse.IMessageHandlerChatReponseClose.class, IMessageChatCloseReponse.class, 4, 
                        Side.CLIENT);
                    

                    :::

                    IMessageChat :
                    :::

                    public class IMessageChat implements IMessage {
                    private boolean LivingEventHandler;
                    
                    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) {
                    
                    EntityPlayerMP player = ctx.getServerHandler().playerEntity;
                    Heimnor.network.sendToAll(new IMessageChatReponse(Minecraft.getMinecraft().getSession().getUsername()));
                    
                    return null;
                    }
                    
                    }
                    
                    }
                    

                    :::

                    IMessageChatReponse :

                    :::

                    public class IMessageChatReponse implements IMessage {
                    
                    private String username;
                    
                    public IMessageChatReponse() {
                    }
                    
                    public IMessageChatReponse(String text) {
                    this.username = text;
                    }
                    
                    @Override
                    public void fromBytes(ByteBuf buf) {
                    
                    ByteBufUtils.readUTF8String(buf);
                    }
                    
                    @Override
                    public void toBytes(ByteBuf buf) {
                    
                    ByteBufUtils.writeUTF8String(buf, username);
                    }
                    
                    public static class IMessageHandlerChatReponse implements IMessageHandler <imessagechatreponse, imessage="">{
                    
                    @Override
                    public IMessage onMessage(IMessageChatReponse message, MessageContext ctx) {
                    
                    ClientProxy.CHATTING_PLAYERS_USERNAME.add(Minecraft.getMinecraft().getSession().getUsername());
                    EntityPlayer player = Minecraft.getMinecraft().thePlayer;
                    LivingEventHandler onEvent = new LivingEventHandler();
                    System.out.print(ClientProxy.CHATTING_PLAYERS_USERNAME);
                    return null;
                    }
                    
                    }
                    
                    }
                    

                    :::

                    IMessageChatClose :

                    :::

                    public class IMessageChatClose implements IMessage {
                    
                    private boolean ChatGui;
                    
                    public IMessageChatClose() {
                    }
                    
                    public IMessageChatClose(boolean ChatGui) {
                    this.ChatGui = ChatGui;
                    }
                    
                    @Override
                    public void fromBytes(ByteBuf buf) {
                    
                    this.ChatGui = buf.readBoolean();
                    }
                    
                    @Override
                    public void toBytes(ByteBuf buf) {
                    
                    buf.writeBoolean(this.ChatGui);
                    }
                    
                    public static class IMessageHandlerChatClose implements IMessageHandler <imessagechatclose, imessage="">{
                    
                    @Override
                    public IMessage onMessage(IMessageChatClose message, MessageContext ctx) {
                    
                    EntityPlayerMP player = ctx.getServerHandler().playerEntity;
                    Heimnor.network
                    .sendToAll(new IMessageChatCloseReponse(Minecraft.getMinecraft().getSession().getUsername()));
                    
                    return null;
                    }
                    
                    }
                    
                    }
                    

                    :::

                    IMessagechatCloseReponse :
                    :::

                    public class IMessageChatCloseReponse implements IMessage {
                    
                    private String username;
                    
                    public IMessageChatCloseReponse() {
                    }
                    
                    public IMessageChatCloseReponse(String text) {
                    this.username = text;
                    }
                    
                    @Override
                    public void fromBytes(ByteBuf buf) {
                    
                    ByteBufUtils.readUTF8String(buf);
                    }
                    
                    @Override
                    public void toBytes(ByteBuf buf) {
                    
                    ByteBufUtils.writeUTF8String(buf, username);
                    }
                    
                    public static class IMessageHandlerChatReponseClose implements IMessageHandler <imessagechatclosereponse, imessage="">{
                    
                    @Override
                    public IMessage onMessage(IMessageChatCloseReponse message, MessageContext ctx) {
                    
                    ClientProxy.CHATTING_PLAYERS_USERNAME.remove(Minecraft.getMinecraft().getSession().getUsername());
                    EntityPlayer player = Minecraft.getMinecraft().thePlayer;
                    System.out.println("Message Reçu !");
                    return null;
                    }
                    
                    }
                    
                    }
                    

                    :::

                    L’ArrayList dans le ClientProxy :

                    public static ArrayList <string>CHATTING_PLAYERS_USERNAME = new ArrayList<string>();
                    

                    La classe LivingEventHandler :

                    :::

                    public class LivingEventHandler {
                    
                    @SubscribeEvent
                    @SideOnly(Side.CLIENT)
                    public void onPlayersChatOpened(KeyInputEvent event) {
                    if (!(Minecraft.getMinecraft().currentScreen instanceof GuiChat)
                    && Keyboard.isKeyDown(Minecraft.getMinecraft().gameSettings.keyBindChat.getKeyCode())) {
                    
                    if (Minecraft.getMinecraft().theWorld != null) {
                    
                    Heimnor.network.sendToServer(new IMessageChat(true));
                    
                    // Packet à envoyer
                    System.out.println("chat ouvert !");
                    
                    }
                    }
                    }
                    
                    @SubscribeEvent
                    @SideOnly(Side.CLIENT)
                    public void openChatGui(GuiOpenEvent event) {
                    
                    if (event.gui != null && event.gui.getClass().equals(GuiChat.class)) {
                    
                    event.gui = new ChatGui();
                    System.out.println(event.gui);
                    }
                    }
                    
                    @SideOnly(Side.CLIENT)
                    @SubscribeEvent
                    public void playerRender(RenderPlayerEvent.Pre event) {
                    
                    if (ClientProxy.CHATTING_PLAYERS_USERNAME.contains(event.entityPlayer.getDisplayName())) {
                    
                    RenderManager renderManager = (RenderManager) ObfuscationReflectionHelper.getPrivateValue(Render.class,
                    event.renderer, 1);
                    float x;
                    
                    float scaleFactor = 0.15F / 1.5F;
                    float yOffsetFactor = -0.05F;
                    
                    GL11.glPushMatrix();
                    GL11.glTranslatef(0.0F, 0.0F - yOffsetFactor, 2.92F);
                    GL11.glNormal3f(0.0F, 1.0F, 0.0F);
                    GL11.glRotatef(renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
                    GL11.glScalef(-scaleFactor, -scaleFactor, scaleFactor);
                    GL11.glEnable(GL11.GL_BLEND);
                    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
                    Minecraft.getMinecraft().renderEngine
                    .bindTexture(new ResourceLocation("heimnormod", "textures/items/bulle.png"));
                    
                    Tessellator tessellator = Tessellator.instance;
                    tessellator.startDrawingQuads();
                    tessellator.addVertexWithUV(-16 + 0, -56 + 32, 0.0D, 0.1F, 0.1F);
                    tessellator.addVertexWithUV(-16 + 32, -56 + 32, 0.0D, 0.1F, 0.0F);
                    tessellator.addVertexWithUV(-16 + 32, -56 + 0, 0.0D, 0.0F, 0.0F);
                    tessellator.addVertexWithUV(-16 + 0, -56 + 0, 0.0D, 0.0F, 0.1F);
                    tessellator.draw();
                    GL11.glPopMatrix();
                    }
                    }
                    }
                    

                    :::

                    ChatGui :

                    :::

                    @Override
                    public void onGuiClosed() {
                    
                    Heimnor.network.sendToServer(new IMessageChatClose(true));
                    }
                    
                    }
                    

                    :::

                    Voilà comme je le disais il ne manque qu’a centrer l’image sur le joueur mais sinon c’est parfaitement fonctionnel.

                    PS: Encore merci à Plaigon pour sa patience et pour avoir pris le temps de m’aider pendant plusieurs heures et d’avoir plusieurs fois frôlé la crise cardiaque lors de mes nombreuses questions. ;)</string></string></imessagechatclosereponse,></imessagechatclose,></imessagechatreponse,></imessagechat,>

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

                      Aucun problèmes, j’ai bien aimé t’aider surtout que j’avais réalisé un mod très similaire il y a plusieurs semaines.
                      Au cas où quelqu’un d’autre aurait une question, n’hésitez pas à redemander 🙂

                      PS: mon VDD, c’est Plaigon et non Playgon 😃

                      ÉDIT: Il y a encore des erreurs qui traînent dans cet extrait de classes, on s’arrangera pour les fix ensemble!

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

                        Excuse pour le pseudo c’est corrigé 😕

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

                        MINECRAFT FORGE FRANCE © 2024

                        Powered by NodeBB