MFF

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

    Problème RenderPlayerEvent

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    1.7.10
    9 Messages 2 Publieurs 1.3k 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 a tous et à toutes,

      J’ai un petit soucis, j’ai réussi a créer (avec un peu d’aide il faut le dire) un RenderPlayerEvent qui devrait afficher une image pour tout joueur présent dans l’ArrayList, en solo cela marche niquel mais mon problème est lors du multijoueur. En effet, quand un joueur A ouvre son chat, son nom est ajouté a une ArrayList, cependant (je pense que cela vient de la condition if dans l’event) quand le joueur A ouvre son chat il voit bien une image au dessus de sa tête mais le joueur B lui (qui a le chat fermé) ne voit pas l’image au dessus de la tête du joueur A mais au dessus de lui même.

      Après de nombreux test j’ai pu remarquer que les deux clients on bien la même ArrayList (qui contient l’username du client ayant le chat ouvert) donc aucun soucis de ce côté là.

      Ma 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())) {
      
      Heimnor.network.sendToServer(new IMessageChat());
      
      // 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) {System.out.println(ClientProxy.CHATTING_PLAYERS_USERNAME);
      
      if (ClientProxy.CHATTING_PLAYERS_USERNAME.contains(event.entityPlayer.getDisplayName())) {
      
      RenderManager renderManager = (RenderManager) ObfuscationReflectionHelper.getPrivateValue(Render.class,
      event.renderer, 1);
      
      float scaleFactor = 0.10F / 6.0F;
      float yOffsetFactor = -0.05F;
      
      GL11.glPushMatrix();
      GL11.glTranslated(0, -1, 0);
      GL11.glNormal3f(0.0F, 0.0F, 0.0F);
      GL11.glRotatef(-renderManager.playerViewY, 0.0F, 0.1F, 0.0F);
      GL11.glScalef(-scaleFactor, -scaleFactor, scaleFactor);
      GL11.glDisable(GL11.GL_LIGHTING);
      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, -120 + 32, -10, 0.1F, 0.1F);
      tessellator.addVertexWithUV(-16 + 32, -120 + 32, -10, 0.1F, 0.0F);
      tessellator.addVertexWithUV(-16 + 32, -120 + 0, -10, 0.0F, 0.0F);
      tessellator.addVertexWithUV(-16 + 0, -120 + 0, -10, 0.0F, 0.1F);
      tessellator.draw();
      GL11.glPopMatrix();
      }
      }
      }
      
      

      Si quelqu’un a une idée pour résoudre mon problème, merci d’avance 😉

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

        Si mon problème n’est pas clair, n’hésitez pas a poser des questions, j’y répondrais 😉

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

          Salut,
          Un System.out.println(event.entityPlayer.getDisplayName()) dans l’event te donnes bien le pseudo du joueur A dans tous les cas, y compris dans les logs du client B ?

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

            Oui les deux clients ont bien le même contenu dans l’ArrayList, soit l’username du client qui à le chat ouvert.

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

              Ce n’était pas la question.

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

                Excuse moi, j’ai mal répondu mais oui le print dans l’event me donne bien le bon username sur les deux clients 😉 (Dans ma tête c’était clair xD)

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

                  Il faudrait peut-être un GL11.glTranslated vers les coordonnées du joueur en question alors. Soit en mettant directement les coordonnées du joueur, soit faire la différence entre le joueur du client et le joueur qui tape au clavier.

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

                    Super merci ça marche ! c’était vraiment le genre de détail qui te font péter en câble ça en vrai …

                    :::

                    @SideOnly(Side.CLIENT)
                    @SubscribeEvent
                    public void playerRender(RenderPlayerEvent.Pre event) {
                    
                    double x = event.entityPlayer.posX - Minecraft.getMinecraft().thePlayer.posX;
                    double y = event.entityPlayer.posY - Minecraft.getMinecraft().thePlayer.posY;
                    double z = event.entityPlayer.posZ - Minecraft.getMinecraft().thePlayer.posZ;
                    
                    if (ClientProxy.CHATTING_PLAYERS_USERNAME.contains(event.entityPlayer.getDisplayName())) {
                    
                    RenderManager renderManager = (RenderManager) ObfuscationReflectionHelper.getPrivateValue(Render.class,
                    event.renderer, 1);
                    
                    System.out.println(event.entityPlayer.getDisplayName());
                    
                    float scaleFactor = 0.10F / 6.0F;
                    float yOffsetFactor = -0.05F;
                    
                    GL11.glPushMatrix();
                    GL11.glTranslated(x, y, z);
                    GL11.glNormal3f(0.0F, 0.0F, 0.0F);
                    GL11.glRotatef(-renderManager.playerViewY, 0.0F, 0.1F, 0.0F);
                    GL11.glScalef(-scaleFactor, -scaleFactor, scaleFactor);
                    GL11.glDisable(GL11.GL_LIGHTING);
                    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, -120 + 32, -10, 0.1F, 0.1F);
                    tessellator.addVertexWithUV(-16 + 32, -120 + 32, -10, 0.1F, 0.0F);
                    tessellator.addVertexWithUV(-16 + 32, -120 + 0, -10, 0.0F, 0.0F);
                    tessellator.addVertexWithUV(-16 + 0, -120 + 0, -10, 0.0F, 0.1F);
                    tessellator.draw();
                    GL11.glPopMatrix();
                    System.out.println("Rendu effectué !");
                    }
                    }
                    }
                    

                    :::

                    EDIT : Même si cela fonctionne j’ai des questions d’ordre esthétiques, genre quand je me déplace l’image tremble de gauche a droite en regardant l’indicateur de quelqu’un d’autre, et deuxièmement en 3eme personne et qu’on ouvre le chat, l’indicateur se trouve super haut par rapport au personnage.

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

                      Tu peux faire ceci :

                      if(Minecraft.getMinecraft().gameSettings.thirdPersonView == 1)
                      {
                         GL11.glTranslated(0, -2.0F, 0);
                      }
                      

                      pour baisser la hauteur du rendu en 3ème personne. (faudra juste vérifier la condition, je suis sur que le 0 correspond à la vue en 1ère personne, pour la 3ème personne je ne sais pas si c’est 1 ou 2).
                      Pour l’image qui tremble je ne sais pas trop par contre 😕

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

                      MINECRAFT FORGE FRANCE © 2024

                      Powered by NodeBB