Modifier le menu principal



  • Ce tutoriel est également disponible en vidéo.

    Sommaire

    Introduction

    Vous voulez modifier le menu principal de Minecraft et vous n'arrivez pas à le faire correctement ? Voici un tutoriel qui vous montrera comment le faire proprement.

    Pré-requis

    Code

    ClientProxy :

    package fr.scarex.tutorialmod.client;
    
    import java.awt.Desktop;
    import java.net.URI;
    
    import net.minecraft.client.gui.GuiButton;
    import net.minecraft.client.gui.GuiMainMenu;
    import net.minecraft.client.gui.GuiOptions;
    import net.minecraft.client.gui.GuiScreenResourcePacks;
    import net.minecraftforge.client.event.GuiOpenEvent;
    import net.minecraftforge.client.event.GuiScreenEvent.ActionPerformedEvent;
    import net.minecraftforge.client.event.GuiScreenEvent.InitGuiEvent;
    import net.minecraftforge.common.MinecraftForge;
    import cpw.mods.fml.common.ObfuscationReflectionHelper;
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    import fr.scarex.tutorialmod.CommonProxy;
    import fr.scarex.tutorialmod.TutorialMod;
    
    /**
        * @author SCAREX
        * 
        */
    public class ClientProxy extends CommonProxy
    {
        public ClientProxy() {
            // registering the PROXY to use events from MinecraftForge
            MinecraftForge.EVENT_BUS.register(this);
        }
    
        /**
            * This function is called when the init method of a GuiScreen is called and
            * modify the current buttons and the splash text
            */
        @SubscribeEvent
        public void onInitGuiEvent(InitGuiEvent.Post event) {
            if (event.gui instanceof GuiMainMenu) { // On regarde si le gui est bien le menu principal
                for (Object b : event.buttonList) { // On parcourt la liste des boutons
                    if (((GuiButton) b).id == 14) { // Si c'est le bouton "Minecraft Realms" (qui a l'ID 14)
                        ((GuiButton) b).visible = false; // On ne l'affiche plus
                    }
                }
                int i = event.gui.height / 4 + 48; // On définit une variable pour simplifier le code (elle est utilisée par Minecraft)
                event.buttonList.add(new GuiButton(30, event.gui.width / 2 - 100, i + 24 * 2, 100, 20, "Teamspeak") { // On crée un bouton avec l'ID 30 de 100 de large et 20 de large appelé "Teamspeak"
                    @Override
                    public void mouseReleased(int x, int y) { // Lorsque l'on clique
                        if (Desktop.isDesktopSupported()) { // Si on peut utiliser des URIs
                            try {
                                Desktop.getDesktop().browse(new URI("ts3server://ts.minecraftforgefrance.fr?port=9987")); // On essaye de lancer TeamSpeak
                            } catch (Exception e) {
                                TutorialMod.LOGGER.warn("Douldn't open teamspeak", e);
                            }
                        }
                    }
                });
    
                ObfuscationReflectionHelper.setPrivateValue(GuiMainMenu.class, (GuiMainMenu) event.gui, "Bienvenue dans ce tutoriel", "splashText", "field_73975_c"); // On modifie le SplashText
            }
        }
    
        /**
            * This event is called when an action is performed 
    
            * This method avoid opening the resource packs GUI
            */
        @SubscribeEvent
        public void onActionPerformed(ActionPerformedEvent.Pre event) {
            if (event.gui instanceof GuiOptions && event.button.id == 105) event.setCanceled(true); // Si l'ID est 100 (le bouton des Resource Packs), on annule
        }
    
        /**
            * This event is called when a GUI is opened 
    
            * This method avoid opening the resource packs GUI
            */
        @SubscribeEvent
        public void onGuiOpen(GuiOpenEvent event) {
            if (event.gui instanceof GuiScreenResourcePacks) event.setCanceled(true); // Même chose, si on essaye d'ouvrir les Resource Packs, on annule
        }
    }
    

    Si vous toutes ces fonctionnalités ne suffisent pas, vous pouvez rediriger vers un autre GUI en utilisant le GuiOpenEvent et changer la variable event.gui en lui associant un GUI comme ceci :

    @SubscribeEvent
        public void onGuiOpen(GuiOpenEvent event) {
            if (event.gui instanceof LeGuiVoulut) event.gui = new VotreGui();
        }
    

    ***NOTE : j'ai enlevé des boutons de Minecraft et bloqué certaines fonctionnalités, il est déconseillé de faire çà pour votre mod, je l'ai fait uniquement pour vous montrer comment faire.***

    ***ATTENTION : il ne faut pas oublier de rajouter "field_73975_c" dans la liste de reflection (se reporter au code modifié) pour faire fonctionner le mod dans un environnement obfusqué (une fois le mod exporté)***

    Résultat

    Liste des commits GitHub :
    Commit initial
    Correction d'un bug lors de l'exportation du mod
    Les commits sur github montrent clairement où ont été placés les fichiers, ainsi que ce qui a été ajouté et retiré dans le fichier.

    En vidéo

    Youtube Video

    Crédits

    Rédaction :

    • SCAREX

    Correction :


    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

    Retour vers le sommaire des tutoriels





  • J'avais déjà lancé l'upload avant que le post sorte, je vais relancer un montage avec l'intro.



  • Je propose juste d'aussi l'upload sur la chaîne du site, a toi de voir 😛
    Et pas grave pour l'intro 😉


  • Administrateurs

    Le set private value sur le spash texte ne va pas fonctionner correctement.



  • Car le nom obfusqué ne sera pas correct à l'exportation ?

    EDIT : je test


  • Administrateurs

    Oui.



  • Effectivement, j'avais pensé à çà sauf que je ne connais pas de moyen d'avoir le nom obfusqué de la variable.


  • Administrateurs

    Suite à la requête de SCAREX, la vidéo du topic a été modifié pour ajouter la version qui a été publié sur la chaîne Minecraft Forge France.


  • Administrateurs

    Il faut chercher dans les mappings. Les fichiers se trouve dans C:\Users\Robin.gradle\caches\minecraft\de\oceanlabs\mcp\mcp_snapshot\


  • Modérateurs

    Ou alors tu peux aussi utiliser l'index du field dans la classe 😉

    Sent from my GT-I9000 using Tapatalk 2



  • J'aime pas utiliser les index car ils changent en fonction de la classe mère. Je corrigerais le tuto une fois chez moi (d'ici 3 jours).



  • J'ai fixé le problème d'obfuscation, le tutoriel est valide.



  • c'est quoi la ligne de code pour pouvoir directement rejoindre un serveur?



  • Je crois que c'est FMLCommonHandler. connectToServerAtStartup

    Envoyé de mon SM-G920F en utilisant Tapatalk



  • @'SCAREX':

    Je crois que c'est FMLCommonHandler. connectToServerAtStartup

    Envoyé de mon SM-G920F en utilisant Tapat

    Tu pourrais appronfondire car cela nous aide pas a créé un bouton qui nous connecte a notre serveur ( Avec une IP )
    Merci d'avance j'en ai grandement besoin



  • package fr.scarex.tutorialmod.client;
    
    /* Ici vont les imports
    
    /**
    * @author SCAREX
    *
    */
    public class ClientProxy extends CommonProxy
    {
    public ClientProxy() {
    // registering the PROXY to use events from MinecraftForge
    MinecraftForge.EVENT_BUS.register(this);
    }
    
    /**
    * This function is called when the init method of a GuiScreen is called and
    * modify the current buttons and the splash text
    */
    @SubscribeEvent
    public void onInitGuiEvent(InitGuiEvent.Post event) {
    if (event.gui instanceof GuiMainMenu) { // On regarde si le gui est bien le menu principal
    int i = event.gui.height / 4 + 48; // On définit une variable pour simplifier le code (elle est utilisée par Minecraft)
    event.buttonList.add(new GuiButton(30, event.gui.width / 2 - 100, i + 24 * 2, 100, 20, "Bouton de connexion") { // On crée un bouton avec l'ID 30 de 100 de large et 20 de large
    @Override
    public void mouseReleased(int x, int y) { // Lorsque l'on clique
    FMLClientHandler.connectToServerAtStartup("tonAdresse", lePort); // On lance la connection au serveur
    }
    });
    }
    }
    }
    

    Voilà le code qu'il faut, si tu as besoin de plus de détails, n'hésite pas.



  • Merci beaucoup je vais voir si tu m'as avancé dans mon projet  😉



  • [font=monospaceFMLClientHandler][font=monospace.][font=monospaceconnectToServerAtStartup][font=monospace(][font=monospace"tonAdresse"][font=monospace,] lePort[font=monospace);] [font=monospace// On lance la connection au serveur]
    Je vois pas ce que tu veut dire pas lePort :/



  • 25565 le port par défaut d'un serveur genre adresse_ip : port