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
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 -
-
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 -
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
-
Oui.
-
Effectivement, j’avais pensé à çà sauf que je ne connais pas de moyen d’avoir le nom obfusqué de la variable.
-
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.
-
Il faut chercher dans les mappings. Les fichiers se trouve dans C:\Users\Robin.gradle\caches\minecraft\de\oceanlabs\mcp\mcp_snapshot\
-
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