Navigation

    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    SOLVED Mettre le joueur à l'envers

    1.11.x
    1.11.x
    4
    13
    949
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • N
      Néorio last edited by

      Bonjour,

      Explication du contexte:
      Je code actuellement avec la version 1.11.2-13.20.1.2386, je souhaite faire en sorte que le joueur se trouve à l’envers (pieds en haut et tête en bas).

      Edit: s’il vous manque des infos ou que vous ne comprenez pas mon post n’hésitez pas à me le faire savoir

      Avancement sur le code :
      J’ai pensé qu’il fallait toucher au *RenderPlayer *et plus précisément à la méthode *doRender *puis utiliser l’event *RenderPlayerEvent *dans la classe principale, mais je ne vois aucun changement lorsque je me retrouve en jeux

      ***Question : ***

      Tout d’abord, je souhaiterai savoir si ma démarche intellectuelle est bonne, ensuite si c’est le cas peut-être que j’utilise mal les classes/méthodes mises à ma disposition par Forge et Minecraft donc si on peut m’aiguiller vers le bon chemin, ce n’est pas de refus.

      Si ma démarche n’est pas bonne alors je souhaiterai si possible qu’on m’explique pourquoi pour ne pas refaire les mêmes erreurs plus tard.

      Et enfin si je n’ai vraiment rien compris a comment marche Forge, alors faites le moi simplement savoir.

      Code actuel :

      • RenderPlayer
      import org.lwjgl.opengl.GL11;
      
      import net.minecraft.client.entity.AbstractClientPlayer;
      import net.minecraft.client.renderer.GlStateManager;
      import net.minecraft.client.renderer.entity.RenderManager;
      import net.minecraft.client.renderer.entity.RenderPlayer;
      import net.minecraftforge.fml.relauncher.Side;
      import net.minecraftforge.fml.relauncher.SideOnly;
      
      @SideOnly(Side.CLIENT)
      public class RenderEntityPlayer extends RenderPlayer
      {
      
      public RenderEntityPlayer(RenderManager renderManager) {
      super(renderManager);
      }
      
      @Override
      public void doRender(AbstractClientPlayer entity, double x, double y, double z, float entityYaw, float partialTicks) {
      
      GL11.glRotated(90.0F, x, y, z);
      
      super.doRender(entity, x, y, z, entityYaw - 90.0F, partialTicks);
      }
      }
      
      • RenderPlayerEvent
      @SideOnly(Side.CLIENT)
      @SubscribeEvent
      public void preRenderPlayer(RenderPlayerEvent.Pre event) {
      event.setCanceled(true);
      RenderEntityPlayer renderEntityPlayer = new RenderEntityPlayer(event.getRenderer().getRenderManager());
      renderEntityPlayer.doRender((AbstractClientPlayer)event.getEntityPlayer(), 0, 0, 0, 0, 0.0625f);
      }
      
      1 Reply Last reply Reply Quote 0
      • Deleted
        Deleted last edited by

        Salut, as-tu bien enregistré l’event ? Est-il appelé correctement, un println s’affiche-t-il bien ? Je ne suis pas sûr, mais crois-tu que le entityYaw - 90.0F, du super.doRender, soit réellement indispensable ? Essaie de print un message dans cette fonction de ta nouvelle classe, voir si le jeu l’appelle bien, puis ta nouvelle classe RenderEntityPlayer ne devrait être instanciée qu’une seule fois, et non à chaque tick.
        En général en pré, on cancel, et c’est dans le post qu’on rend quelque chose de nouveau. Personnellement, j’aurai utilisé la Render Player API, qui est dispo jusqu’à la 1.11.2, tu verras elle peut constituer une alternative très simple.

        1 Reply Last reply Reply Quote 0
        • LeBossMax2
          LeBossMax2 last edited by

          On autre problème est que tu utilise mal GL11.glRotated (D’ailleurs, tu devrais utiliser GLStateManager à mon avis) Le premies paramètre est bien l’angle, mais les trois suivant permettent de choisir l’axe de rotation. (Tu met 1, 0, 0 pour une rotation en x; 0, 1, 0 pour le faire en y ou 0, 0, 1 pour z)

          1 Reply Last reply Reply Quote 0
          • robin4002
            robin4002 Administrateurs Rédacteurs Moddeurs confirmés last edited by

            Salut,
            Je ne pense pas qu’il soit utile de créer une classe RenderEntityPlayer.

            Les deux event RenderPlayerEvent.Pre et .RenderPlayerEvent.Post devrait être suffisant :

               @SubscribeEvent
               public void onPreRenderPlayer(RenderPlayerEvent.Pre event)
               {
                   // on ouvre une matrice (pour être sur que la rotation va s'appliquer que à ce contexte)
                   GlStateManager.pushMatrix();
                   // on effectue la rotation
                   GlStateManager.rotate(180, 0, 1, 0);
                   // pas de cancel, le rendu normal du joueur sera exécuté
               }
            
               @SubscribeEvent
               public void onPostRenderPlayer(RenderPlayerEvent.Post event)
               {
                   // une fois le rendu fini, on oublie pas de fermer la matrice, sinon ça va faire pleins d'erreur opengl (et des bug de rendu)
                   GlStateManager.popMatrix();
               }
            
            1 Reply Last reply Reply Quote 1
            • Deleted
              Deleted last edited by

              Tout simplement robin xD

              1 Reply Last reply Reply Quote 0
              • N
                Néorio last edited by

                Merci pour vos réponses déjà.

                Salut, as-tu bien enregistré l’event ? Est-il appelé correctement, un println s’affiche-t-il bien ?

                Justement je viens de me rendre compte qu’il ne passe pas dans ma fonction qui est censé retourner le joueur.

                Je ne suis pas sûr, mais crois-tu que le entityYaw - 90.0F, du super.doRender, soit réellement indispensable ?

                C’était pour faire des tests mais je ne pense pas qu’il soit effectivement indispensable.

                On autre problème est que tu utilise mal GL11.glRotated (D’ailleurs, tu devrais utiliser GLStateManager à mon avis) Le premies paramètre est bien l’angle, mais les trois suivant permettent de choisir l’axe de rotation. (Tu met 1, 0, 0 pour une rotation en x; 0, 1, 0 pour le faire en y ou 0, 0, 1 pour z)

                Merci pour la remarque, je ne savais pas, je vais en tenir compte.

                Salut,
                Je ne pense pas qu’il soit utile de créer une classe RenderEntityPlayer.

                Les deux event RenderPlayerEvent.Pre et .RenderPlayerEvent.Post devrait être suffisant :
                Code Java : (Tout sélectionner)

                   @SubscribeEvent
                   public void onPreRenderPlayer(RenderPlayerEvent.Pre event)
                   {
                       // on ouvre une matrice (pour être sur que la rotation va s'appliquer que à ce contexte)
                       GlStateManager.pushMatrix();
                       // on effectue la rotation
                       GlStateManager.rotate(180, 0, 1, 0);
                       // pas de cancel, le rendu normal du joueur sera exécuté
                   }
                
                   @SubscribeEvent
                   public void onPostRenderPlayer(RenderPlayerEvent.Post event)
                   {
                       // une fois le rendu fini, on oublie pas de fermer la matrice, sinon ça va faire pleins d'erreur opengl (et des bug de rendu)
                       GlStateManager.popMatrix();
                   }
                

                J’ai essayé ton idée Robin mais je ne vois aucune différence car du au fait comme dit plutôt, je ne rentre pas dans ma fonction qui gère ceci.

                Voici un exemple de l’implémentation que Robin suggère (je n’utilise peut-être mal) :

                @EventHandler
                public static void preInit(FMLPreInitializationEvent Event)
                {
                ModItems.init();
                ModItems.register();
                ModBlocks.init();
                ModBlocks.register();
                ModAchievement.init();
                ModAchievement.registerAchievements();
                }
                
                @SubscribeEvent
                public void onPreRenderPlayer(RenderPlayerEvent.Pre event) {
                GlStateManager.pushMatrix();
                System.out.println("Coordonnées du joueur: "+event.getEntityPlayer().getPosition());
                GlStateManager.rotate(180, 0, 1,0);
                }
                
                @SubscribeEvent
                public void onPostRenderPlayer(RenderPlayerEvent.Post event) {
                GlStateManager.popMatrix();
                }
                
                @EventHandler
                public static void Init(FMLInitializationEvent Event)
                {
                proxy.init();
                ModCrafting.register();
                }
                @EventHandler
                public static void postInit(FMLPostInitializationEvent Event)
                {
                
                }
                
                
                1 Reply Last reply Reply Quote 0
                • Deleted
                  Deleted last edited by

                  Enregistres-tu bien ton event avec MinecraftForge.EVENT_BUS.register ?

                  1 Reply Last reply Reply Quote 0
                  • robin4002
                    robin4002 Administrateurs Rédacteurs Moddeurs confirmés last edited by

                    Visiblement non, le problème semble venir de là.

                    1 Reply Last reply Reply Quote 0
                    • N
                      Néorio last edited by

                      Désolé pour cette absence de réponse.

                      Enregistres-tu bien ton event avec MinecraftForge.EVENT_BUS.register ?

                      Effectivement mon problème qui était que je ne passais pas dans ma méthode est résolue car je n’enregistrais pas mon event mais maintenant je fais une boucle dessus à l’infini sans voir de changement pour le joueur.

                      1 Reply Last reply Reply Quote 0
                      • robin4002
                        robin4002 Administrateurs Rédacteurs Moddeurs confirmés last edited by

                        L’event est bien appelé maintenant ?

                        1 Reply Last reply Reply Quote 0
                        • N
                          Néorio last edited by

                          L’event est bien appelé maintenant ?

                          Oui l’event est bien appelé mais rien ne se passe pour le joueur et je ne sais pas si c’est normal que je passe en permanence dedans (j’ai toujours le contrôle de mon perso)

                          1 Reply Last reply Reply Quote 0
                          • robin4002
                            robin4002 Administrateurs Rédacteurs Moddeurs confirmés last edited by

                            La fonction est appelé à chaque frame de ton jeu, donc oui ça devrait bien spamer la console.
                            Donc la façon de faire que j’ai proposé ne fonctionne pas, faut tenter autre chose.

                            EDIT :
                            en fait si c’est bon, c’est juste l’axe de rotation qui n’était pas le bon.
                            Il faut également appliquer une translation de -2 en y, sinon le joueur est dans le sol.

                                @SubscribeEvent
                                public void onPreRenderPlayer(RenderPlayerEvent.Pre event)
                                {
                                    // on ouvre une matrice (pour être sur que la rotation va s'appliquer que à ce contexte)
                                    GlStateManager.pushMatrix();
                                    // on effectue la rotation
                                    GlStateManager.rotate(180, 1, 0, 0);
                                    GlStateManager.translate(0, -2, 0);
                                    // pas de cancel, le rendu normal du joueur sera exécuté
                                }
                            
                                @SubscribeEvent
                                public void onPostRenderPlayer(RenderPlayerEvent.Post event)
                                {
                                    // une fois le rendu fini, on oublie pas de fermer la matrice, sinon ça va faire pleins d'erreur opengl (et des bug de rendu)
                                    GlStateManager.popMatrix();
                                }
                            
                            1 Reply Last reply Reply Quote 0
                            • N
                              Néorio last edited by

                              Merci ça fonctionne.

                              Je vous remercie d’avoir aidé un boulet comme moi

                              1 Reply Last reply Reply Quote 0
                              • 1 / 1
                              • First post
                                Last post
                              Design by Woryk
                              Contact / Mentions Légales / Faire un don

                              MINECRAFT FORGE FRANCE © 2018

                              Powered by NodeBB