Ajout d'un header et d'un footer sur la liste de joueur



  • Sommaire

    Introduction

    Comme on peut le voir sur la plupart des nouveaux serveurs, lorsque l'on appuie sur TAB, le gui qui apparaît possède un header (en-tête) et un footer (bas de page). Nous allons voir comment faire de même dans ce tutoriel.

    NOTE : ceci est un tutoriel utilise de code à mettre côté serveur et est donc à éviter sur un mod solo.

    Pré-requis

    Code

    Dans la classe où est enregistré votre événement PlayerLoggedInEvent :

    package VotrePackage;
    
    public class VotreClasse
    {
        @SubscribeEvent
        public void onPlayerLoggedInEvent(PlayerLoggedInEvent event)
        {
            try
            {
                // Création du paquet à envoyer au joueur
                Packet packet = new S47PacketPlayerListHeaderFooter();
    
                // On va devoir réécrire les variables
                // ici on s'occupe du header
                Field fi1 = packet.getClass().getDeclaredFields()[0];
                // On la met accessible car elle est "private"
                fi1.setAccessible(true);
                // On créé le texte qui va le remplacer
                ChatComponentText compH = new ChatComponentText("votre header");
                // On remplace la valeur
                fi1.set(packet, compH);
                // Et on la remet en non-accessible pour éviter les problèmes d'autres mods
                fi1.setAccessible(false);
    
                // Même chose mais pour le footer cette fois
                Field fi2 = packet.getClass().getDeclaredFields()[1];
                fi2.setAccessible(true);
                ChatComponentText compF = new ChatComponentText("votre footer");
                fi2.set(packet, compF);
                fi2.setAccessible(false);
    
                // On envoi le paquet
                event.player.playerNetServerHandler.sendPacket(packet);
    
            }
            catch(Exception e)
            {
                System.err.println("Error sending packet tab " + e);
            }
        }
    }
    

    Résultat

    Voilà :
    Liste de joueur personnalisé

    Crédits

    Rédaction :

    Correction :

    Creative Commons
    Ce tutoriel de SCAREX publié sur Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International

    retourRetour vers le sommaire des tutoriels



  • L'image ne marche pas, sinon j'essaye demain 🙂



  • @'sosoh':

    L'image ne marche pas, sinon j'essaye demain 🙂

    J'arrive pas à la rajouter, problème avec les pièces jointes.


  • Administrateurs

    Je vois ça, sinon passe par un hébergeur comme imgur.



  • Je comprends pas tout le tuto ? Tu entends quoi par un Header et un Footer ? Ils permettent de faire quoi une fois ajoutés ?



  • @'ZeAmateis':

    Je comprends pas tout le tuto ? Tu entends quoi par un Header et un Footer ? Ils permettent de faire quoi une fois ajoutés ?

    Il permet de rajouter un texte en haut (header) et en bas (footer) de la liste des joueurs lorsque l'on appuie sur TAB. C'est quelque chose de présent sur pas mal de serveurs connus.



  • Ok merci de l'éclairage !



  • Tu dit TAB ? dit plutôt la touche pour afficher la list des joueurs. Dans mon cas au début je n'ai pas compris car pour afficher la liste des joueurs j'utilise shift.



  • @'Diangle':

    Tu dit TAB ? dit plutôt la touche pour afficher la list des joueurs. Dans mon cas au début je n'ai pas compris car pour afficher la liste des joueurs j'utilise shift.

    Dans les classes de Minecraft cet overlay s'appelle GuiPlayerTabOverlay voilà pourquoi je l'appelle le tab overlay.



  • Est-ce que c'est juste en 1.8 ou aussi possible en version antérieur?



  • @'Degraduck':

    Est-ce que c'est juste en 1.8 ou aussi possible en version antérieur?

    Le texte en bas et en haut du Gui a été rajouté par Mojang en 1.8 donc ça ne peut marcher qu'en 1.8.



  • Merci de l'information


  • Rédacteurs

    Ce tutoriel fonctionne en 1.12 (en modifiant le nom des classes en des fonctions vu qu'elles ont changées) mais je ne doute pas qu'il fonctionne en 1.8 aussi. Je valide ce tutoriel qui est intéressant je trouve. Pour ceux qui veulent, voici le code en 1.12 :

    
    @SubscribeEvent
    public static void playerConnect(PlayerLoggedInEvent event) {
    if (!event.player.getEntityWorld().isRemote) {
    SPacketPlayerListHeaderFooter packet = new SPacketPlayerListHeaderFooter();
    Field header = packet.getClass().getDeclaredFields()[0];
    header.setAccessible(true);
    Field footer = packet.getClass().getDeclaredFields()[1];
    footer.setAccessible(true);
    try {
    header.set(packet, new TextComponentString(TextFormatting.RED + "My Header"));
    footer.set(packet, new TextComponentString(TextFormatting.RED + "My Footer"));
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    }
    ((EntityPlayerMP)event.player).connection.sendPacket(packet);
    }
    
    }
    
    


  • @'BrokenSwing':

    Ce tutoriel fonctionne en 1.12 (en modifiant le nom des classes en des fonctions vu qu'elles ont changées) mais je ne doute pas qu'il fonctionne en 1.8 aussi. Je valide ce tutoriel qui est intéressant je trouve. Pour ceux qui veulent, voici le code en 1.12 :

    
    @SubscribeEvent
    public static void playerConnect(PlayerLoggedInEvent event) {
       if (!event.player.getEntityWorld().isRemote) {
           SPacketPlayerListHeaderFooter packet = new SPacketPlayerListHeaderFooter();
           Field header = packet.getClass().getDeclaredFields()[0];
           header.setAccessible(true);
           Field footer = packet.getClass().getDeclaredFields()[1];
           footer.setAccessible(true);
           try {
               header.set(packet, new TextComponentString(TextFormatting.RED + "My Header"));
               footer.set(packet, new TextComponentString(TextFormatting.RED + "My Footer"));
           } catch (IllegalArgumentException e) {
               e.printStackTrace();
           } catch (IllegalAccessException e) {
               e.printStackTrace();
           }
           ((EntityPlayerMP)event.player).connection.sendPacket(packet);
       }
    
    }
    
    

    Cela Ne Fonctionne Pas En 1.9.4 !

    j'utiliser l'importe

    import java.lang.reflect.Field;


  • Rédacteurs

    Le seul truc qui peux changer entre les version est SPacketPlayerListHeaderFooter et ((EntityPlayerMP)event.player).connection.sendPacket(packet);



  • @'BrokenSwing':

    Le seul truc qui peux changer entre les version est SPacketPlayerListHeaderFooter et ((EntityPlayerMP)event.player).connection.sendPacket(packet);

    Mais le truc c'est que cela mais aucune, mais aucune erreur (J'ai bien pensé a enlevez le static car j'utilise que les fonctions non-static) !


  • Rédacteurs

    T'as fonction est donc bien appelée ?