Changer de pseudo in-game



  • Bonsoir,
    En recherchant un peu j'ai trouvé sur Minecraft Forge France (ici pour le coup) ce sujet et celui-ci qui étaient sur le même principe donc je les ai suivis et utilisé les informations disponibles afin d'arriver à faire fonctionner le système.
    Ahah comme le sujet le témoigne ça n'as pas très bien fonctionné !

    Donc j'aimerai changer les pseudos in-game et mon problème c'est que j'ai bien les pseudos changés dans le chat, mais pas au dessus de la tête des joueurs.
    Et pour ça j'ai fais exactement comme ce sujet, tout fonctionne bien, les clients sont bien synchronisés, le problème c'est juste l'affichage et je ne comprends vraiment pas pourquoi, voilà la raison pour laquelle je fais un nouveau sujet sur ça !

    Voici la partie du code (j'ai rajouté des commentaires pour que vous compreniez un peu plus) :

    
    @SubscribeEvent
        public void playerLoggedInEvent(PlayerLoggedInEvent e) {
            EntityPlayer player = e.player;
    
            if(player.hasCapability(MS_Main.CHARACTER_CAP, null)) {
                CharacterCapabilities character = player.getCapability(MS_Main.CHARACTER_CAP, null);
                if(character.getCharacterName() == null || character.getCharacterName().isEmpty()) {
                    character.setCharacterName(MS_Main.instance.playerData.character.getCharacterName());
                    character.sync();
                } else {
                    character.sync();
                }
            }
        }
    
        public void onJoinWorld(EntityJoinWorldEvent e) {
            if(e.getWorld().isRemote && e.getEntity() instanceof EntityPlayer)
            {
                EntityPlayer player = (EntityPlayer) e.getEntity();
                player.refreshDisplayName();
                MS_Main.network.sendToServer(new MS_PacketRequestCharacter(player.getGameProfile().getId().toString()));
    
                NetworkPlayerInfo pInfo = Minecraft.getMinecraft().getConnection().getPlayerInfo(Minecraft.getMinecraft().getSession().getProfile().getId());
    
                if(pInfo != null) {
                    System.out.println("Pas null ");
                }
            }
        }
    
        @SubscribeEvent
        public void onPlayerNameFormat(NameFormat e) {
            EntityPlayer player = e.getEntityPlayer();
    
            //e.setDisplayname("PseudoUltraStyle"); <– celui là marche très bien, pourquoi pas l'autre ?
    
            if(player.hasCapability(MS_Main.CHARACTER_CAP, null)) {
                CharacterCapabilities character = player.getCapability(MS_Main.CHARACTER_CAP, null);
    
                if(character.getCharacterName() != null && !character.getCharacterName().isEmpty()) {
                    /**
                     * Ici ça donne bien le nom que je veux afficher pour le bon joueur donc tout est ok à partir d'ici
                     */
                    System.out.println("Character name for " + player.getName() + " : " +  character.characterName);
                    e.setDisplayname(character.characterName);
                } else {
                    System.out.println("Character name not set for " + player.getName());
                }
            }
        }
    
        @SubscribeEvent
        public void onPlayerCloned(PlayerEvent.Clone event) {
            if(event.isWasDeath()) {
                if(event.getOriginal().hasCapability(MS_Main.CHARACTER_CAP, null)) {
                    CharacterCapabilities cap = event.getOriginal().getCapability(MS_Main.CHARACTER_CAP, null);
                    CharacterCapabilities newCap = event.getEntityPlayer().getCapability(MS_Main.CHARACTER_CAP, null);
                    newCap.setCharacterName(cap.getCharacterName());
                }
            }
        }
    
        @SideOnly(Side.CLIENT)
        @SubscribeEvent
        public void onRenderLabel(RenderLivingEvent.Specials.Pre event)
        {
            if(event.getEntity() instanceof EntityPlayer)
            {
                EntityPlayer player = (EntityPlayer)event.getEntity();
    
                if(Minecraft.getMinecraft().thePlayer.getPosition().distanceSq(player.posX, player.posY, player.posZ) > 12)
                {
                   event.setCanceled(true);
                   RenderManager renderManager = Minecraft.getMinecraft().getRenderManager();
                   CharacterCapabilities cap = player.getCapability(MS_Main.CHARACTER_CAP, null);
    
                   boolean flag = player.isSneaking();
                   float f = renderManager.playerViewY;
                   float f1 = renderManager.playerViewX;
                   boolean flag1 = renderManager.options.thirdPersonView == 2;
                   float f2 = player.height + 0.5F - (flag ? 0.25F : 0.0F);
                   int i = "deadmau5".equals(cap.getCharacterName()) ? -10 : 0;
                   EntityRenderer.drawNameplate(renderManager.getFontRenderer(), cap.getCharacterName(), (float)player.posX, (float)player.posY + f2, (float)player.posZ, i, f, f1, flag1, flag);
                }
            }
        }
    
        @SubscribeEvent
        public void onPlayerRespawn(PlayerRespawnEvent event) {
            if(!event.player.worldObj.isRemote) {
                event.player.getCapability(MS_Main.CHARACTER_CAP, null).sync();
            }
        }
    
        @SubscribeEvent
        public void onAttachCapability(AttachCapabilitiesEvent.Entity event) {
            if(event.getEntity() instanceof EntityPlayer) {
                event.addCapability(new ResourceLocation(MS_Main.ID + ":CHARACTER_CAP"), new CharacterCapabilities((EntityPlayer) event.getEntity()));
            }
        }
    
    

    J'ai vraiment hésité à faire un nouveau sujet car j'ai pas mal vu sur le web que c'était très recherché.
    Merci de votre attention :)

    [EDIT]
    Oh je viens de remarquer que "onJoinWorld" n'avait pas été marqué "@SubscribeEvent" du coup ça ne synchronisait jamais mon problème est règlé de ce côté là.

    Maintenant j'essaie de le changer dès la connexion du joueur et pour ça je vais essayer de refresh comme je peux le displayname du joueur pour éviter la déco-réco obligatoire.
    [/EDIT]



  • Ok apparemment le packet pour synchroniser tous les joueurs n'est pas envoyé, aucuns debug ne ressorts.
    Je vous tiens au jus.