18 juil. 2015, 14:35

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

https://www.youtube.com/watch?v=hv0HJDuzu9k

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

retourSommaire des tutoriels