Ajouter un bouton dans l'inventaire.



  • Versions : 1.7.10
    **API utilisée : Forge **
    Explication du problème :

    Hello tout le monde, je poste aujourd'hui car je sais pas comment ajouter un bouton dans une class déjà fait ? A vrais un class que tu peu pas modfier. J'essai de créer un bouton dans GuiInventory qui va ouvrir un gui qui va servir a ajouter une genre de boutique sous forge de gui avec plugins.

    J'ai aussi une autre petite info que j'aimerais savoir sous forge, est ce que je peu enregistrer un GUI comme ceci

    ​ @SubscribeEvent
    
    @SideOnly(Side.CLIENT)
    public void onTickClient(TickEvent.ClientTickEvent event)
    { if(event.phase == Phase.END)
    
    {
    Minecraft mc = Minecraft.getMinecraft();
    GuiScreen currentScreen = mc.currentScreen;
    GuiBoutique customMenu = new GuiBoutique();
    
    }}
    

    ou ceci

    ​%(#555555)[[size=xx-small]NetworkRegistry.INSTANCE.registerGuiHandler(this.instance, new GuiHandlerCrusher());]
    

    je me pause cette cette question car ma class je les extends en GuiScreen et je sais pas si sa va bug car je peu pas la voir j'arrive pas a faire se bouton dans l'inventaire du joueur.

    Voici ma class j'ai riens fait encore car j'essais trouver comment ajouter un bouton dans l'inventaire.

    ​package ca.mathmatboy.axialcraft.GUI;
    
    import org.lwjgl.opengl.GL11;
    
    import net.minecraft.client.gui.GuiScreen;
    import net.minecraft.util.ResourceLocation;
    
    public class GuiBoutique extends GuiScreen
    {
        private static final ResourceLocation GuiTexturesBoutique = new ResourceLocation("textures/gui/container/boutique.png");
    
        public void drawScreen(int p_73863_1_, int p_73863_2_, float p_73863_3_)
        {
            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
            this.mc.getTextureManager().bindTexture(GuiTexturesBoutique);
            int k = (this.width - this.height) / 2;
            int l = (this.height - this.width) / 2;
            this.drawTexturedModalRect(k, l, 0, 0, this.height, this.width);
        }
    }
    
    

  • Administrateurs

    https://github.com/MinecraftForge/MinecraftForge/blob/master/src/main/java/net/minecraftforge/client/event/GuiScreenEvent.java#L31
    Avec cette event tu as accès à la liste de bouton, donc peut tu peux en ajouter normalement.



  • Merci et j'ai une question ? est ce que c'est mieux que je créer un class fait pour sa ou je peu mettres dans ma class GuiBoutique ?

    Aussi, le public List boutonList; est ce que je remplace par public guiInventory inventaire; ??



    1. [size=xx-small​] @SubscribeEvent

    2. [size=xx-small @SideOnly](Side.CLIENT)

    3. [size=xx-small public] void onTickClient(TickEvent.ClientTickEvent event)

    4. [size=xx-small {] if(event.phase == Phase.END)

    5. [size=xx-small {]

    6. [size=xx-small Minecraft] mc = Minecraft.getMinecraft();

    7. [size=xx-small GuiScreen] currentScreen = mc.currentScreen;

    8. GuiBoutique customMenu = new GuiBoutique();

    9. [size=xx-small }}]


  • Administrateurs

    @'mathmatboy':

    Merci et j'ai une question ? est ce que c'est mieux que je créer un class fait pour sa ou je peu mettres dans ma class GuiBoutique ?

    Aussi, le public List boutonList; est ce que je remplace par public guiInventory inventaire; ??

    Hein ? C'est un event a utiliser, tu peux mettre ça dans n'importe quelle classe qui est enregistré avec MinecraftForge.EVENT_BUS.register et concernant l'histoire du boutonList je ne vois pas du tout pourquoi tu veux le remplacer.



  • @'robin4002':

    Hein ? C'est un event a utiliser, tu peux mettre ça dans n'importe quelle classe qui est enregistré avec MinecraftForge.EVENT_BUS.register et concernant l'histoire du boutonList je ne vois pas du tout pourquoi tu veux le remplacer.

    Ok merci pour info mais pour l'histoire du boutonList, je comprend pas comment je fait pour qu'il trouve ma class guiInventory et mettre le bouton.

    @'Blackout':

    1. [size=xx-small @SubscribeEvent]

    2. [size=xx-small@SideOnly](Side.CLIENT)

    3. [size=xx-smallpublicvoid onTickClient(TickEvent.ClientTickEvent event)

    4. [size=xx-small{] if(event.phase == Phase.END)

    5. [size=xx-small{]

    6. [size=xx-smallMinecraft] mc = Minecraft.getMinecraft();

    7. [size=xx-smallGuiScreen] currentScreen = mc.currentScreen;

    8. GuiBoutique customMenu = new GuiBoutique();

    9. [size=xx-small}}]



  • Il doit te manquer un sacré bagage en Java, tu devrais prendre des cours hors minecraft pour t'améliorer et comprendre le code que tu écris.

    Quand tu fais un GuiBoutique customMenu = new GuiBoutique(); tu reserves un nouvel espace mémoire dans la RAM qui va acceuillir ton objet, et on te renvoie un pointeur (c'est a dire une adresse mémoire sur 4 octects) qui va te permettre d'accéder a l'objet. customMenu est donc un lien vers une zone mémoire. Ton pointeur est local a la fonction, a la fin de la fonction tu n'a plus aucun moyen d'y accédé.
    En Java, il faudra attendre que le garbage collector, c'est a dire un processus propre a java que tu ne contrôle pas, inspecte la mémoire pour libérer les zones mémoires dont tu n'a plus l'accès.

    Ici, a chaque tick client, la fonction est appelé, réserve une nouvelle zone mémoire et te donne un pointeur que tu vu perdre directement.
    Donc rien n'est enregistré.

    Tu n'as pas besoin d'enregistrer tes GUI, par contre il faut enregistrer tes handlers.
    Le fonctionnement est assez simple. Pour faire simple, Forge possède des objets qui contient des listes de pointeurs.
    Par exemple lorsque dans Minecraft tu ouvre un GUI, l'objet de forge est prévenu qu'un GUI s'est ouvert, il parcours tous ses pointeurs et appelle la methode qui va bien en fonction du type d’événement.

    Toujours pour faire simple, l'objet qui s'occupe de ça, c'est MinecraftForge.EVENT_BUS et la méthode register() permet de demander a l'objet d'ajouter ton pointeur a cette fameuse liste. Donc ici ton objet est enregistré, le programme garde toujours un pointeur vers l'objet qui se trouve dans la liste.

    Ce n'est pas ton GUI qu'il faut enregistrer, c'est ton handler, c'est a dire un classe qui va posséder des methodes qui pourront être appelé selon l’événement.

    Ici, il te faut donc 1 handler : il faut que tu détectes quand un GUI est ouvert, que tu checks si le GUI ouvert est celui de l'inventaire, si c'est le cas tu dois ajouter ton bouton au GUI.

    Généralement je n'aime pas donner du code, j'espère que tu tentera de le comprendre au lieu de faire un simple copier/coller. Comme je l'ai dit plus tu as besoin de plus de base en Java avant de faire du modding je pense. Sinon tu va bloquer toute les 5 minutes.

    Voici l'Handler que tu dois avoir :

    public class InventoryInitHandler (tu choisis le nom que tu veux, ça n'a pas d'importance) {
    
    @SubscribeEvent
    
    public void onGuiInit(InitGuiEvent event) { //tu n'es pas obliger de choisir le nom onGuiInit
    if(event.gui instanceof GuiInventory) { //Si le GUI qui s'initialise est du type GuiInventory
    event.buttonList.add(new MonBouton()); //J'ajoute mon bouton a la liste de bouton
    }
    }
    }
    

    Ensuite, il faut enregistrer ton handler, ce bout de code chacun le place un peu ou il veut. Moi j'ai une methode registerHandler() dans mon CommonProxy. MinecraftForge.EVENT_BUS.register(new InventoryInitHandler());

    Il te faut ensuite faire ton bouton :

    ​public class MonBouton extends GuiButton {
    
    public MonBouton() {
    //tu remplaces par ce que tu veux, les variables selon tes besoins, evite d'utiliser un ID déjà pris par l'inventaire par contre
    super(int id, int xPosition, int xPosition, int width /*Facultatif*/, int height/*Facultatif*/, String displayString);
    }
    
    /**
    * Appelé lorsque l'utilisateur clique sur le bouton
    */
    @Override
    public void mouseReleased(int mouseX, int mouseY) {
    super.mouseReleased(mouseX, mouseY);
    Minecraft.getMinecraft().displayGuiScreen(new MonGuiPerso()); //Tu ouvre ton Gui
    }
    
    }
    

    Ensuite tu fais ton GUI

    ​public class MonGuiPerso extends GuiInventory {
    
    public MonGuiPerso() {
    super(Minecraft.getMinecraft().thePlayer);
    }
    
    /* Tu surcharges les methodes dont tu as besoin, tu joues avec les variables etc … */
    
    }
    


  • Ah j'y vois déjà beaucoup plus clairs !! et j'ai une question ? ou je pourrai apprendre a enforcir mon java correctement car oui sa pas des année je code non plus sa fait seulement 7 mois environ.



  • j'ai un problème avec 2 class j'ai un peu modifier ta class "MonBouton" car la méthode fonctionnait pas et j'ai donc modifier mais sa toujours pas fonctionner et l'autres class aucune idée comment les réglés les erreurs.

    L'images : 


  • Administrateurs

    What ? Il sort d'où ce Init dans la classe ??! ça n'a rien à faire la, c'est impossible en Java ça x)
    Et pareil pourquoi tu as foutu super.buttonList x) ?



  • Bon voila j'ai enlever le  init et je t'explique pourquoi j'ai mis sa, j'ai mis sa car blackout a dit tu pouvais mettre n'importez quoi et que sa avait pas d'importance et donc j'ai mis init car javais pas d'idée quoi mettre xd.

    Et j'ai donc enlever le init et pour le bouton j'ai mis celui de blackout et voila les erreur =>


  • Administrateurs

    MinecraftForge.EVENT_BUS.register(new TaClasse()) que tu peux mettre n'importe où dans la classe principale, et par exemple dans init

    Et
    public class NomDeClass()
    {
    ce n'est toujours pas valide …
    Mais tu code en Java ou non ? C'est pourtant évidant pour n'importe qui qu'il faut mettre 
    public class NomDeClass
    {

    Idem pour les int  / String qui n'ont rien à faire là dans l'autre classe, c'est du Java u_U



  • Aucune idée comment réglé.


  • Administrateurs

    Dans ce cas il serait temps d'apprendre le java …

    public MonBouton(int id, int xPosition, int xPosition, String displayString)
    {
    super(id, xPosition, xPosition, displayString);
    }
    


  • 1- Il n'y a pas de (Init) après le nom de ta classe quand j'écris que tu choisis le nom que tu veux c'était pour [size=xx-smallInventoryInitHandler]
    2 - ça ne sert a rien d'avoir des variables static width et height : elle sont déjà dans la classe mère, c'est eux que tu dois modifier.
    3 - Un bouton ne possède pas de bouton a l'intérieur buttonList ne sert a rien dans ta classe.

    Pour apprendre lentement, avec des illustrations, du blabla comme si tu avais un jeune mentor en face de toi et plein plein d'exemple : http://openclassrooms.com/courses/apprenez-a-programmer-en-java

    Si tu veux aller plus vite, sans blabla, que l'essentiel : http://jmdoudoux.developpez.com/cours/developpons/java/

    Le dernier liens et très complet, tu n'auras pas besoin de tout lire jusqu'au bout pour faire des mods, il est plus professionnel que le premier.

    Mais franchement apprend le Java, ça sert a rien de continuer modder avec tes connaissances. Je ne dis pas ça pour te décourager, au contraire. Sans connaissance de base, tu n'arriveras a rien même en travaillant durant des plombs et c'est ça qui va te décourager. Avec les liens que je t'ai mis, tu va apprendre et tu va réutiliser ce que tu a appris dans tes mods.
    Je te conseil le second liens, mais tout dépend de comment tu veux apprendre.



  • Merci de ta réponse blackout, j'ai déjà un peu commencer sur openclassrooms mais je vais aller faire un tour sur celui que tu conseil ! Merci encore !