• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Résolu Draw ne fonctionne pas avec BackgroundDrawnEvent

    Autres
    4
    12
    2518
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • Alexandre1156
      Alexandre1156 dernière édition par

      Yop,

      J’ai fait en sorte de dessiner des têtes de joueurs à coté d’un serveur mais ceux-ci se dessinent au dessus des textures se trouvant en bas et en haut :

      Pour contrer cela, il fallait trouver un moyen de dessiner les têtes avant ces textures. Et c’est ainsi que je découvris le BackgroundDrawnEvent, puisque contrairement à DrawScreenEvent.Post, il va se déclencher une fois que le fond va être dessiné, mais pas les textures du haut et du bas.
      Sauf qu’en utilisant cet event, mes têtes ne sont plus dessinés et je ne sais pas pourquoi  😕 .
      Voici le code utilisé pour les dessiner :

      @SubscribeEvent
      public void drawHeadNextEpicubeServer(BackgroundDrawnEvent e){
      if(e.getGui() instanceof GuiMultiplayer){
          GuiMultiplayer gm = (GuiMultiplayer) e.getGui();
          ServerSelectionList ssl = ObfuscationReflectionHelper.getPrivateValue(GuiMultiplayer.class, gm, 3);
          int slotServer = MugiwaraMod.utils.getSlotServer(gm);
          int yScreen = e.getGui().height;
          int xScreen = e.getGui().width;
          int mouseX = Mouse.getX();
          int mouseY = Mouse.getY();
          if((xScreen == 640 && yScreen == 334) || Minecraft.getMinecraft().isFullScreen()){
              if(!frame.isEmpty() && slotServer > -1){
                  for(FrameMember memberFrame : frame){
                      memberFrame.setY(memberFrame.getOriginalY() + (slotServer * 36) + ssl.getAmountScrolled()*-1);
                          Minecraft.getMinecraft().renderEngine.bindTexture(memberFrame.getTheMember().getHeadTextureLocation());
                          e.getGui().drawTexturedModalRect(memberFrame.getX(), memberFrame.getY(), 0, 0, 16, 16);
                  }
              }
          }
          x = 0;
          y = 0;
      
          int slotText = slotServer * 36;
          if(!frame.isEmpty()){
              for(FrameMember memberFrame : frame){
                  if(memberFrame.isMouseOver16px(e.getMouseX(), e.getMouseY())){
                      String name = memberFrame.getTheMember().getUsername();
                      e.getGui().drawCenteredString(Minecraft.getMinecraft().fontRendererObj, name, memberFrame.getX()+10,                                                                  memberFrame.getY()-10, 
                                                    MugiwaraMod.memUtils.getColorByGrade(memberFrame.getTheMember().getGroup()));
                  }
              }
          }
      }
      }
      

      Merci d’avance pour votre aide  ;).

      1 réponse Dernière réponse Répondre Citer 0
      • robin4002
        robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

        Salut,
        Je n’ai pas vraiment compris cette phrase x)
        @‘Alexandre1156’:

        mais ceux-ci se dessinent au dessus des textures se trouvant en bas et en haut :

        Et je ne comprends pas où est le problème avec le screenshot.

        1 réponse Dernière réponse Répondre Citer 0
        • Alexandre1156
          Alexandre1156 dernière édition par

          @‘robin4002’:

          Salut,
          Je n’ai pas vraiment compris cette phrase x)
          @‘Alexandre1156’:

          mais ceux-ci se dessinent au dessus des textures se trouvant en bas et en haut :

          Et je ne comprends pas où est le problème avec le screenshot.

          Les “textures se trouvant en haut et en bas” sont celles-ci :

          Le problème est que les têtes à droite du serveur Epicube se superposent à ces textures alors que je veux qu’elles aillent en “dessous”, comme les serveurs :

          Donc pour palier ce problème, j’utilise l’event BackgroundDrawnEvent car il est déclenché après avoir dessiner le background mais avant les textures du haut et du bas.
          Mais je ne sais pour qu’elle raison, les têtes ne sont plus dessinés :

          Voilà, j’espère avoir était plus clair !

          1 réponse Dernière réponse Répondre Citer 0
          • AymericRed
            AymericRed dernière édition par

            Ah oui d’accord, bah sinon tu peux peut être essayer d’obtenir la position du serveur et ne pas dessiner les têtes si il est trop bah/haut.

            Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

            AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

            Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
            Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

            1 réponse Dernière réponse Répondre Citer 0
            • robin4002
              robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

              En effet il faudrait tout simplement ne pas le draw si le serveur n’est pas visiblement en se basant sur la position du curseur.

              Autre potentiel solution : mettre le zLevel plus bas avant de draw, mais ça ne fonctionnera que si la partie du bas à un zLevel plus élevé que celle du milieu et je ne crois pas que c’est le cas.

              1 réponse Dernière réponse Répondre Citer 0
              • Alexandre1156
                Alexandre1156 dernière édition par

                @‘AymericRed’:

                Ah oui d’accord, bah sinon tu peux peut être essayer d’obtenir la position du serveur et ne pas dessiner les têtes si il est trop bah/haut.

                Pourquoi pas, même si la transition apparition/disparition des têtes risque d’être un peu “brutal”.

                @‘robin4002’:

                Autre potentiel solution : mettre le zLevel plus bas avant de draw, mais ça ne fonctionnera que si la partie du bas à un zLevel plus élevé que celle du milieu et je ne crois pas que c’est le cas.

                Et comment fait on cela ?

                Une autre solution, plus radicale, que j’ai eu est de carrément faire un copier/coller du GuiMutliplayer et de rajouter l’affichage de mes têtes. Je vais tester ça tiens.

                1 réponse Dernière réponse Répondre Citer 0
                • robin4002
                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

                  Il faut changer la valeur de la variable zLevel du gui avant de faire le rendu.

                  1 réponse Dernière réponse Répondre Citer 0
                  • AymericRed
                    AymericRed dernière édition par

                    “Une autre solution, plus radicale, que j’ai eu est de carrément faire un copier/coller du GuiMutliplayer et de rajouter l’affichage de mes têtes. Je vais tester ça tiens.”
                    C’est une bonne idée aussi.

                    Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                    AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                    Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                    Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

                    1 réponse Dernière réponse Répondre Citer 0
                    • jglrxavpok
                      jglrxavpok Modérateurs dernière édition par

                      Si tu t’y connais avec OpenGL, tu peux aussi utiliser le Scissor Test pour ne dessiner que dans le cadre voulu.

                      Modérateur sur MFF. 
                      Mon Github: http://github.com/jglrxavpok
                      Mon compte Steam si vous voulez jouer à CS:GO ou TF2 avec moi: https://steamcommunity.com/id/jglrxavpok/

                      1 réponse Dernière réponse Répondre Citer 0
                      • Alexandre1156
                        Alexandre1156 dernière édition par

                        Eh bien finalement la méthode bourrin fonctionne :

                        Pour comprendre comment j’ai réussi, il faut ce dire une chose : *this.drawDefaultBackground(); *n’est pas la méthode qui dessine le fond (vous pouvez la supprimer, vous ne verrez aucun changement) mais *this.serverListSelector.drawScreen(mouseX, mouseY, partialTicks); *et cette même méthode dessine les textures du bas et du haut. Donc j’ai dû faire un copier/coller de cette méthode et y incruster mes lignes de codes permettant de dessiner mes têtes.
                        Et donc voici à quoi ressemble finalement ma class :
                        :::

                        
                        package fr.alexandre1156.mugiwara.gui;
                        
                        import java.lang.reflect.Field;
                        import java.util.ArrayList;
                        import java.util.Timer;
                        import java.util.TimerTask;
                        
                        import org.apache.logging.log4j.Logger;
                        import org.lwjgl.input.Keyboard;
                        
                        import com.google.common.base.Splitter;
                        import com.google.common.collect.Lists;
                        
                        import fr.alexandre1156.mugiwara.MugiwaraMod;
                        import fr.alexandre1156.mugiwara.members.FrameMember;
                        import fr.alexandre1156.mugiwara.members.MugiMember;
                        import net.minecraft.client.Minecraft;
                        import net.minecraft.client.gui.GuiButton;
                        import net.minecraft.client.gui.GuiLabel;
                        import net.minecraft.client.gui.GuiMultiplayer;
                        import net.minecraft.client.gui.GuiScreen;
                        import net.minecraft.client.gui.ServerSelectionList;
                        import net.minecraft.client.multiplayer.ServerList;
                        import net.minecraft.client.network.LanServerDetector;
                        import net.minecraft.client.network.LanServerDetector.LanServerList;
                        import net.minecraft.client.renderer.GlStateManager;
                        import net.minecraft.client.renderer.RenderHelper;
                        import net.minecraft.client.renderer.Tessellator;
                        import net.minecraft.client.renderer.VertexBuffer;
                        import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
                        import net.minecraft.client.resources.I18n;
                        import net.minecraft.util.math.MathHelper;
                        
                        public class GuiMultiplayerMugi extends GuiMultiplayer {
                        
                        private Timer timer = new Timer();
                        private ArrayList <framemember>frame = new ArrayList<framemember>();
                        private int x = 0;
                        private int y = 0;
                        
                        public GuiMultiplayerMugi(GuiScreen parentScreen) {
                        super(parentScreen);
                        x = 0;
                        y = 0;
                        this.startTimer();
                        for(MugiMember member : MugiwaraMod.memUtils.getAllMembersConnected()){
                        frame.add(new FrameMember(475 + x, 35 + y, member));
                        x += 19;
                        if(x == 171){
                        y = 17;
                        x = 0;
                        }
                        }
                        }
                        
                        @Override
                        public void initGui() {
                        try {
                        Keyboard.enableRepeatEvents(true);
                               this.buttonList.clear();
                        
                               Class clazz = this.getClass().getSuperclass();
                               Field initField = clazz.getDeclaredField("initialized");
                               final Field slsField = clazz.getDeclaredField("serverListSelector");
                               Field sslField = clazz.getDeclaredField("savedServerList");
                               Field lslField = clazz.getDeclaredField("lanServerList");
                               Field lanSDField = clazz.getDeclaredField("lanServerDetector");
                               Field loggerField = clazz.getDeclaredField("LOGGER");
                               initField.setAccessible(true);
                               slsField.setAccessible(true);
                               sslField.setAccessible(true);
                               lslField.setAccessible(true);
                               loggerField.setAccessible(true);
                        
                               if (initField.getBoolean(this)) {
                                   ((ServerSelectionList)slsField.get(this)).setDimensions(this.width, this.height, 32, this.height - 64);
                               } else {
                                   initField.set(this, true);
                                   sslField.set(this, new ServerList(this.mc));
                                   ((ServerList) sslField.get(this)).loadServerList();
                                   lslField.set(this, new LanServerDetector.LanServerList());
                        
                                   try {
                                    lanSDField.set(this, new LanServerDetector.ThreadLanServerFind((LanServerList) lslField.get(this)));
                                       ((LanServerDetector.ThreadLanServerFind) lanSDField.get(this)).start();
                                   } catch (Exception exception) {
                                       ((Logger) loggerField.get(this)).warn("Unable to start LAN server detection: {}", new Object[] {exception.getMessage()});
                                   }
                        
                                   slsField.set(this, new ServerSelectionList(this, this.mc, this.width, this.height, 32, this.height - 64, 36){
                                    @Override
                                    public void drawScreen(int mouseXIn, int mouseYIn, float partialTicks) {
                                    if (this.visible)
                                           {
                                               this.mouseX = mouseXIn;
                                               this.mouseY = mouseYIn;
                                               this.drawBackground();
                                               int i = this.getScrollBarX();
                                               int j = i + 6;
                                               this.bindAmountScrolled();
                                               GlStateManager.disableLighting();
                                               GlStateManager.disableFog();
                                               Tessellator tessellator = Tessellator.getInstance();
                                               VertexBuffer vertexbuffer = tessellator.getBuffer();
                                               // Forge: background rendering moved into separate method.
                                               this.drawContainerBackground(tessellator);
                                               int k = this.left + this.width / 2 - this.getListWidth() / 2 + 2;
                                               int l = this.top + 4 - (int)this.amountScrolled;
                        
                                               if (this.hasListHeader)
                                               {
                                                   this.drawListHeader(k, l, tessellator);
                                               }
                        
                                               this.drawSelectionBox(k, l, mouseXIn, mouseYIn);
                                               GlStateManager.disableDepth();
                        
                                               int slotServer = MugiwaraMod.utils.getSlotServer(GuiMultiplayerMugi.this);
                                    int yScreen = this.height;
                                    int xScreen = this.width;
                                    if((xScreen == 640 && yScreen == 334) || Minecraft.getMinecraft().isFullScreen()){
                                    if(!frame.isEmpty() && slotServer > -1){
                                               RenderHelper.disableStandardItemLighting();
                                    GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f);
                                    for(FrameMember memberFrame : frame){
                                    try {
                        memberFrame.setY(memberFrame.getOriginalY() + (slotServer * 36) + ((ServerSelectionList)slsField.get(GuiMultiplayerMugi.this)).getAmountScrolled()*-1);
                        } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                        } catch (IllegalAccessException e) {
                        e.printStackTrace();
                        }
                                    Minecraft.getMinecraft().renderEngine.bindTexture(memberFrame
                                    .getTheMember()
                                    .getHeadTextureLocation());
                                    GuiMultiplayerMugi.this.drawTexturedModalRect(memberFrame.getX(), memberFrame.getY(), 0, 0, 16, 16);
                                    }
                                               RenderHelper.enableStandardItemLighting();
                                    }
                                    }
                        
                                    int slotText = slotServer * 36;
                                    if(!frame.isEmpty()){
                                    for(FrameMember memberFrame : frame){
                                    if(memberFrame.isMouseOver16px(mouseX, mouseY)){
                                    String name = memberFrame.getTheMember().getUsername();
                                    GuiMultiplayerMugi.this.drawCenteredString(Minecraft.getMinecraft().fontRendererObj, name, memberFrame.getX()+10, memberFrame.getY()-10, MugiwaraMod.memUtils.getColorByGrade(memberFrame.getTheMember().getGroup()));
                                    }
                                    }
                                    }
                        
                                               this.overlayBackground(0, this.top, 255, 255);
                                               this.overlayBackground(this.bottom, this.height, 255, 255);
                                               GlStateManager.enableBlend();
                                               GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ZERO, GlStateManager.DestFactor.ONE);
                                               GlStateManager.disableAlpha();
                                               GlStateManager.shadeModel(7425);
                                               GlStateManager.disableTexture2D();
                                               int i1 = 4;
                                               vertexbuffer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
                                               vertexbuffer.pos((double)this.left, (double)(this.top + 4), 0.0D).tex(0.0D, 1.0D).color(0, 0, 0, 0).endVertex();
                                               vertexbuffer.pos((double)this.right, (double)(this.top + 4), 0.0D).tex(1.0D, 1.0D).color(0, 0, 0, 0).endVertex();
                                               vertexbuffer.pos((double)this.right, (double)this.top, 0.0D).tex(1.0D, 0.0D).color(0, 0, 0, 255).endVertex();
                                               vertexbuffer.pos((double)this.left, (double)this.top, 0.0D).tex(0.0D, 0.0D).color(0, 0, 0, 255).endVertex();
                                               tessellator.draw();
                                               vertexbuffer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
                                               vertexbuffer.pos((double)this.left, (double)this.bottom, 0.0D).tex(0.0D, 1.0D).color(0, 0, 0, 255).endVertex();
                                               vertexbuffer.pos((double)this.right, (double)this.bottom, 0.0D).tex(1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
                                               vertexbuffer.pos((double)this.right, (double)(this.bottom - 4), 0.0D).tex(1.0D, 0.0D).color(0, 0, 0, 0).endVertex();
                                               vertexbuffer.pos((double)this.left, (double)(this.bottom - 4), 0.0D).tex(0.0D, 0.0D).color(0, 0, 0, 0).endVertex();
                                               tessellator.draw();
                                               int j1 = this.getMaxScroll();
                        
                                               if (j1 > 0)
                                               {
                                                   int k1 = (this.bottom - this.top) * (this.bottom - this.top) / this.getContentHeight();
                                                   k1 = MathHelper.clamp(k1, 32, this.bottom - this.top - 8);
                                                   int l1 = (int)this.amountScrolled * (this.bottom - this.top - k1) / j1 + this.top;
                        
                                                   if (l1 < this.top)
                                                   {
                                                       l1 = this.top;
                                                   }
                        
                                                   vertexbuffer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
                                                   vertexbuffer.pos((double)i, (double)this.bottom, 0.0D).tex(0.0D, 1.0D).color(0, 0, 0, 255).endVertex();
                                                   vertexbuffer.pos((double)j, (double)this.bottom, 0.0D).tex(1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
                                                   vertexbuffer.pos((double)j, (double)this.top, 0.0D).tex(1.0D, 0.0D).color(0, 0, 0, 255).endVertex();
                                                   vertexbuffer.pos((double)i, (double)this.top, 0.0D).tex(0.0D, 0.0D).color(0, 0, 0, 255).endVertex();
                                                   tessellator.draw();
                                                   vertexbuffer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
                                                   vertexbuffer.pos((double)i, (double)(l1 + k1), 0.0D).tex(0.0D, 1.0D).color(128, 128, 128, 255).endVertex();
                                                   vertexbuffer.pos((double)j, (double)(l1 + k1), 0.0D).tex(1.0D, 1.0D).color(128, 128, 128, 255).endVertex();
                                                   vertexbuffer.pos((double)j, (double)l1, 0.0D).tex(1.0D, 0.0D).color(128, 128, 128, 255).endVertex();
                                                   vertexbuffer.pos((double)i, (double)l1, 0.0D).tex(0.0D, 0.0D).color(128, 128, 128, 255).endVertex();
                                                   tessellator.draw();
                                                   vertexbuffer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
                                                   vertexbuffer.pos((double)i, (double)(l1 + k1 - 1), 0.0D).tex(0.0D, 1.0D).color(192, 192, 192, 255).endVertex();
                                                   vertexbuffer.pos((double)(j - 1), (double)(l1 + k1 - 1), 0.0D).tex(1.0D, 1.0D).color(192, 192, 192, 255).endVertex();
                                                   vertexbuffer.pos((double)(j - 1), (double)l1, 0.0D).tex(1.0D, 0.0D).color(192, 192, 192, 255).endVertex();
                                                   vertexbuffer.pos((double)i, (double)l1, 0.0D).tex(0.0D, 0.0D).color(192, 192, 192, 255).endVertex();
                                                   tessellator.draw();
                                               }
                        
                                               this.renderDecorations(mouseXIn, mouseYIn);
                                               GlStateManager.enableTexture2D();
                                               GlStateManager.shadeModel(7424);
                                               GlStateManager.enableAlpha();
                                               GlStateManager.disableBlend();
                                           }
                                    }
                                   });
                                   ((ServerSelectionList) slsField.get(this)).updateOnlineServers((ServerList) sslField.get(this));
                               }
                        
                               this.createButtons();
                        } catch(Exception e){
                        e.printStackTrace();
                        }
                        }
                        
                        @Override
                        public void drawScreen(int mouseX, int mouseY, float partialTicks) {
                                try {
                                Class clazz = this.getClass().getSuperclass();
                                    Field hoverTextField = clazz.getDeclaredField("hoveringText");
                                    hoverTextField.setAccessible(true);
                                    hoverTextField.set(this, null);
                                    //this.drawDefaultBackground();
                                    Field slsField = clazz.getDeclaredField("serverListSelector");
                                    slsField.setAccessible(true);
                        
                                   ((ServerSelectionList) slsField.get(this)).drawScreen(mouseX, mouseY, partialTicks);
                        
                                    for (int i = 0; i < this.buttonList.size(); ++i)
                                    {
                                        ((GuiButton)this.buttonList.get(i)).drawButton(this.mc, mouseX, mouseY);
                                    }
                        
                                    for (int j = 0; j < this.labelList.size(); ++j)
                                    {
                                        ((GuiLabel)this.labelList.get(j)).drawLabel(this.mc, mouseX, mouseY);
                                    }
                        
                                    this.drawCenteredString(this.fontRendererObj, I18n.format("multiplayer.title", new Object[0]), this.width / 2, 20, 16777215);
                                    if (hoverTextField.get(this) != null) {
                                    this.drawHoveringText(Lists.newArrayList(Splitter.on("\n").split((CharSequence) hoverTextField.get(this))), mouseX, mouseY);
                                    }
                        
                        } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                        } catch (IllegalAccessException e) {
                        e.printStackTrace();
                        } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                        } catch (SecurityException e) {
                        e.printStackTrace();
                        }
                        }
                        
                        public void startTimer(){
                        TimerTask timerTask = new TimerTask(){
                        
                        @Override
                        public void run() {
                        startTimer();
                        MugiwaraMod.memUtils.reloadMembersConnected(false);
                        frame.clear();
                        x = 0;
                        y = 0;
                        for(MugiMember member : MugiwaraMod.memUtils.getAllMembersConnected()){
                        frame.add(new FrameMember(475 + x, 35 + y, member));
                        x += 19;
                        if(x == 171){ // 153
                        y = 17;
                        x = 0;
                        }
                        }
                        }
                        
                        };
                        timer.schedule(timerTask, 30000);
                        }
                        
                        }
                        
                        

                        :::
                        Quand je vous avez dis que c’était bourrin !

                        Par contre, la barre de défilement ce dessine après, mais je pense qu’il suffit juste de changer de place les lignes de codes qui la dessine.</framemember></framemember>

                        1 réponse Dernière réponse Répondre Citer 0
                        • AymericRed
                          AymericRed dernière édition par

                          Par contre fait attention, quand tu vas compiler ton mod les field.getDeclaredField vont pas trouver les fields vu qu’il faut leur nom obfusqué (tu peux heureusement lui proposer plusieurs noms à tester).

                          Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                          AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                          Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                          Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

                          1 réponse Dernière réponse Répondre Citer 0
                          • Alexandre1156
                            Alexandre1156 dernière édition par

                            @‘AymericRed’:

                            Par contre fait attention, quand tu vas compiler ton mod les field.getDeclaredField vont pas trouver les fields vu qu’il faut leur nom obfusqué (tu peux heureusement lui proposer plusieurs noms à tester).

                            Oui, j’ai eu l’erreur quelques minutes après avoir écrits mon message.
                            Maintenant, pour récupérer les fields, j’utilise ObfuscationReflectionHelper.

                            Et donc voilà le code final (car j’ai modifié 2-3 petites choses) :
                            :::

                            
                            package fr.alexandre1156.mugiwara.gui;
                            
                            import java.util.ArrayList;
                            import java.util.Timer;
                            import java.util.TimerTask;
                            
                            import org.apache.logging.log4j.Logger;
                            import org.lwjgl.input.Keyboard;
                            
                            import com.google.common.base.Splitter;
                            import com.google.common.collect.Lists;
                            
                            import fr.alexandre1156.mugiwara.MugiwaraMod;
                            import fr.alexandre1156.mugiwara.members.FrameMember;
                            import fr.alexandre1156.mugiwara.members.MugiMember;
                            import net.minecraft.client.Minecraft;
                            import net.minecraft.client.gui.GuiButton;
                            import net.minecraft.client.gui.GuiLabel;
                            import net.minecraft.client.gui.GuiMultiplayer;
                            import net.minecraft.client.gui.GuiScreen;
                            import net.minecraft.client.gui.ServerSelectionList;
                            import net.minecraft.client.multiplayer.ServerList;
                            import net.minecraft.client.network.LanServerDetector;
                            import net.minecraft.client.renderer.GlStateManager;
                            import net.minecraft.client.renderer.RenderHelper;
                            import net.minecraft.client.renderer.Tessellator;
                            import net.minecraft.client.renderer.VertexBuffer;
                            import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
                            import net.minecraft.client.resources.I18n;
                            import net.minecraft.util.math.MathHelper;
                            import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
                            
                            public class GuiMultiplayerMugi extends GuiMultiplayer {
                            
                            private Timer timer = new Timer();
                            private boolean isStarted;
                            private ArrayList <framemember>frame = new ArrayList<framemember>();
                            /** Augmente de 17 à chaque icone*/
                            private int x = 0;
                            /** Augmente de 17 quand il y a plus de 6 joueurs connectés*/
                            private int y = 0;
                            
                            public GuiMultiplayerMugi(GuiScreen parentScreen) {
                            super(parentScreen);
                            x = 0;
                            y = 0;
                            isStarted = false;
                            this.startTimer();
                            for(MugiMember member : MugiwaraMod.memUtils.getAllMembersConnected()){
                            frame.add(new FrameMember(475 + x, 35 + y, member));
                            x += 19;
                            if(x == 171){
                            y = 17;
                            x = 0;
                            }
                            }
                            }
                            
                            @Override
                            public void initGui() {
                            try {
                            Keyboard.enableRepeatEvents(true);
                                   this.buttonList.clear();
                            
                                  // boolean devEnv = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment");
                                  // System.out.println("DEV MODE : "+devEnv);
                            
                                   boolean initialized = ObfuscationReflectionHelper.getPrivateValue(GuiMultiplayer.class, this, 16);
                                   ServerSelectionList serverListSelector = ObfuscationReflectionHelper.getPrivateValue(GuiMultiplayer.class, this, 3);
                                   ServerList savedServerList = ObfuscationReflectionHelper.getPrivateValue(GuiMultiplayer.class, this, 4);
                                   LanServerDetector.LanServerList lanServerList = ObfuscationReflectionHelper.getPrivateValue(GuiMultiplayer.class, this, 14);
                                   LanServerDetector.ThreadLanServerFind lanServerDetector = ObfuscationReflectionHelper.getPrivateValue(GuiMultiplayer.class, this, 15);
                                   Logger LOGGER = ObfuscationReflectionHelper.getPrivateValue(GuiMultiplayer.class, this, 0);
                            
                                   if (initialized) {
                                    serverListSelector.setDimensions(this.width, this.height, 32, this.height - 64);
                                    ObfuscationReflectionHelper.setPrivateValue(GuiMultiplayer.class, this, serverListSelector, 3);
                                   } else {
                                    initialized = true;
                                    savedServerList = new ServerList(this.mc);
                                    savedServerList.loadServerList();
                                    lanServerList = new LanServerDetector.LanServerList();
                                    ObfuscationReflectionHelper.setPrivateValue(GuiMultiplayer.class, this, initialized, 16);
                                    ObfuscationReflectionHelper.setPrivateValue(GuiMultiplayer.class, this, savedServerList, 4);
                                    ObfuscationReflectionHelper.setPrivateValue(GuiMultiplayer.class, this, lanServerDetector, 15);
                                    ObfuscationReflectionHelper.setPrivateValue(GuiMultiplayer.class, this, lanServerList, 14);
                                       try {
                                        lanServerDetector = new LanServerDetector.ThreadLanServerFind(lanServerList);
                                        lanServerDetector.start();
                                        ObfuscationReflectionHelper.setPrivateValue(GuiMultiplayer.class, this, lanServerDetector, 15);
                                       } catch (Exception exception) {
                                           LOGGER.warn("Unable to start LAN server detection: {}", new Object[] {exception.getMessage()});
                                       }
                            
                                       serverListSelector = new ServerSelectionList(this, this.mc, this.width, this.height, 32, this.height - 64, 36){
                                        @Override
                                        public void drawScreen(int mouseXIn, int mouseYIn, float partialTicks) {
                                        if (this.visible)
                                               {
                                                   this.mouseX = mouseXIn;
                                                   this.mouseY = mouseYIn;
                                                   this.drawBackground();
                                                   int i = this.getScrollBarX();
                                                   int j = i + 6;
                                                   this.bindAmountScrolled();
                                                   GlStateManager.disableLighting();
                                                   GlStateManager.disableFog();
                                                   Tessellator tessellator = Tessellator.getInstance();
                                                   VertexBuffer vertexbuffer = tessellator.getBuffer();
                                                   // Forge: background rendering moved into separate method.
                                                   this.drawContainerBackground(tessellator);
                                                   int k = this.left + this.width / 2 - this.getListWidth() / 2 + 2;
                                                   int l = this.top + 4 - (int)this.amountScrolled;
                            
                                                   if (this.hasListHeader)
                                                   {
                                                       this.drawListHeader(k, l, tessellator);
                                                   }
                            
                                                   this.drawSelectionBox(k, l, mouseXIn, mouseYIn);
                                                   GlStateManager.disableDepth();
                            
                                                   ServerSelectionList serverListSelector = ObfuscationReflectionHelper.getPrivateValue(GuiMultiplayer.class, GuiMultiplayerMugi.this, 3);
                                                   int slotServer = MugiwaraMod.utils.getSlotServer(GuiMultiplayerMugi.this);
                                        int yScreen = this.height;
                                        int xScreen = this.width;
                                        if((xScreen == 640 && yScreen == 334) || Minecraft.getMinecraft().isFullScreen()){
                                        if(!frame.isEmpty() && slotServer > -1){
                                                   RenderHelper.disableStandardItemLighting();
                                        GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f);
                                        for(FrameMember memberFrame : frame){
                                        try {
                                        if(serverListSelector != null)
                                        memberFrame.setY(memberFrame.getOriginalY() + (slotServer * 36) + serverListSelector.getAmountScrolled()*-1);
                            } catch (IllegalArgumentException e) {
                            e.printStackTrace();
                            }
                                        //if(!(memberFrame.getY() > 254 || memberFrame.getY() < 33)){
                                        Minecraft.getMinecraft().renderEngine.bindTexture(memberFrame
                                        .getTheMember()
                                        .getHeadTextureLocation());
                                        GuiMultiplayerMugi.this.drawTexturedModalRect(memberFrame.getX(), memberFrame.getY(), 0, 0, 16, 16);
                                        //}
                                        }
                                                   RenderHelper.enableStandardItemLighting();
                                        }
                                        }
                            
                                                   this.overlayBackground(0, this.top, 255, 255);
                                                   this.overlayBackground(this.bottom, this.height, 255, 255);
                            
                                                   int slotText = slotServer * 36;
                                        if(!frame.isEmpty()){
                                        for(FrameMember memberFrame : frame){
                                        if(memberFrame.isMouseOver16px(mouseX, mouseY)){
                                        String name = memberFrame.getTheMember().getUsername();
                                        GuiMultiplayerMugi.this.drawCenteredString(Minecraft.getMinecraft().fontRendererObj, name, memberFrame.getX()+10, memberFrame.getY()-10, MugiwaraMod.memUtils.getColorByGrade(memberFrame.getTheMember().getGroup()));
                                        }
                                        }
                                        }
                            
                                                   GlStateManager.enableBlend();
                                                   GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ZERO, GlStateManager.DestFactor.ONE);
                                                   GlStateManager.disableAlpha();
                                                   GlStateManager.shadeModel(7425);
                                                   GlStateManager.disableTexture2D();
                                                   int i1 = 4;
                                                   vertexbuffer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
                                                   vertexbuffer.pos((double)this.left, (double)(this.top + 4), 0.0D).tex(0.0D, 1.0D).color(0, 0, 0, 0).endVertex();
                                                   vertexbuffer.pos((double)this.right, (double)(this.top + 4), 0.0D).tex(1.0D, 1.0D).color(0, 0, 0, 0).endVertex();
                                                   vertexbuffer.pos((double)this.right, (double)this.top, 0.0D).tex(1.0D, 0.0D).color(0, 0, 0, 255).endVertex();
                                                   vertexbuffer.pos((double)this.left, (double)this.top, 0.0D).tex(0.0D, 0.0D).color(0, 0, 0, 255).endVertex();
                                                   tessellator.draw();
                                                   vertexbuffer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
                                                   vertexbuffer.pos((double)this.left, (double)this.bottom, 0.0D).tex(0.0D, 1.0D).color(0, 0, 0, 255).endVertex();
                                                   vertexbuffer.pos((double)this.right, (double)this.bottom, 0.0D).tex(1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
                                                   vertexbuffer.pos((double)this.right, (double)(this.bottom - 4), 0.0D).tex(1.0D, 0.0D).color(0, 0, 0, 0).endVertex();
                                                   vertexbuffer.pos((double)this.left, (double)(this.bottom - 4), 0.0D).tex(0.0D, 0.0D).color(0, 0, 0, 0).endVertex();
                                                   tessellator.draw();
                                                   int j1 = this.getMaxScroll();
                            
                                                   if (j1 > 0)
                                                   {
                                                       int k1 = (this.bottom - this.top) * (this.bottom - this.top) / this.getContentHeight();
                                                       k1 = MathHelper.clamp(k1, 32, this.bottom - this.top - 8);
                                                       int l1 = (int)this.amountScrolled * (this.bottom - this.top - k1) / j1 + this.top;
                            
                                                       if (l1 < this.top)
                                                       {
                                                           l1 = this.top;
                                                       }
                            
                                                       vertexbuffer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
                                                       vertexbuffer.pos((double)i, (double)this.bottom, 0.0D).tex(0.0D, 1.0D).color(0, 0, 0, 255).endVertex();
                                                       vertexbuffer.pos((double)j, (double)this.bottom, 0.0D).tex(1.0D, 1.0D).color(0, 0, 0, 255).endVertex();
                                                       vertexbuffer.pos((double)j, (double)this.top, 0.0D).tex(1.0D, 0.0D).color(0, 0, 0, 255).endVertex();
                                                       vertexbuffer.pos((double)i, (double)this.top, 0.0D).tex(0.0D, 0.0D).color(0, 0, 0, 255).endVertex();
                                                       tessellator.draw();
                                                       vertexbuffer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
                                                       vertexbuffer.pos((double)i, (double)(l1 + k1), 0.0D).tex(0.0D, 1.0D).color(128, 128, 128, 255).endVertex();
                                                       vertexbuffer.pos((double)j, (double)(l1 + k1), 0.0D).tex(1.0D, 1.0D).color(128, 128, 128, 255).endVertex();
                                                       vertexbuffer.pos((double)j, (double)l1, 0.0D).tex(1.0D, 0.0D).color(128, 128, 128, 255).endVertex();
                                                       vertexbuffer.pos((double)i, (double)l1, 0.0D).tex(0.0D, 0.0D).color(128, 128, 128, 255).endVertex();
                                                       tessellator.draw();
                                                       vertexbuffer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR);
                                                       vertexbuffer.pos((double)i, (double)(l1 + k1 - 1), 0.0D).tex(0.0D, 1.0D).color(192, 192, 192, 255).endVertex();
                                                       vertexbuffer.pos((double)(j - 1), (double)(l1 + k1 - 1), 0.0D).tex(1.0D, 1.0D).color(192, 192, 192, 255).endVertex();
                                                       vertexbuffer.pos((double)(j - 1), (double)l1, 0.0D).tex(1.0D, 0.0D).color(192, 192, 192, 255).endVertex();
                                                       vertexbuffer.pos((double)i, (double)l1, 0.0D).tex(0.0D, 0.0D).color(192, 192, 192, 255).endVertex();
                                                       tessellator.draw();
                                                   }
                            
                                                   this.renderDecorations(mouseXIn, mouseYIn);
                                                   GlStateManager.enableTexture2D();
                                                   GlStateManager.shadeModel(7424);
                                                   GlStateManager.enableAlpha();
                                                   GlStateManager.disableBlend();
                                               }
                                        }
                                       };
                                       serverListSelector.updateOnlineServers(savedServerList);
                                       ObfuscationReflectionHelper.setPrivateValue(GuiMultiplayer.class, this, serverListSelector, 3);
                                   }
                            
                                   this.createButtons();
                            } catch(Exception e){
                            e.printStackTrace();
                            }
                            }
                            
                            @Override
                            public void drawScreen(int mouseX, int mouseY, float partialTicks) {
                                    try {
                                    ObfuscationReflectionHelper.setPrivateValue(GuiMultiplayer.class, this, null, 12);
                                        //this.drawDefaultBackground();
                                    ServerSelectionList ssl = ObfuscationReflectionHelper.getPrivateValue(GuiMultiplayer.class, this, 3);
                            
                                       ssl.drawScreen(mouseX, mouseY, partialTicks);
                            
                                        for (int i = 0; i < this.buttonList.size(); ++i)
                                        {
                                            ((GuiButton)this.buttonList.get(i)).drawButton(this.mc, mouseX, mouseY);
                                        }
                            
                                        for (int j = 0; j < this.labelList.size(); ++j)
                                        {
                                            ((GuiLabel)this.labelList.get(j)).drawLabel(this.mc, mouseX, mouseY);
                                        }
                            
                                        this.drawCenteredString(this.fontRendererObj, I18n.format("multiplayer.title", new Object[0]), this.width / 2, 20, 16777215);
                                        if (ObfuscationReflectionHelper.getPrivateValue(GuiMultiplayer.class, this, 12) != null) {
                                        this.drawHoveringText(Lists.newArrayList(Splitter.on("\n").split((CharSequence) ObfuscationReflectionHelper.getPrivateValue(GuiMultiplayer.class, this, 12))), mouseX, mouseY);
                                        }
                            
                            } catch (IllegalArgumentException e) {
                            e.printStackTrace();
                            } catch (SecurityException e) {
                            e.printStackTrace();
                            }
                            }
                            
                            public void startTimer(){
                            TimerTask timerTask = new TimerTask(){
                            
                            @Override
                            public void run() {
                            MugiwaraMod.memUtils.reloadMembersConnected(false);
                            frame.clear();
                            x = 0;
                            y = 0;
                            for(MugiMember member : MugiwaraMod.memUtils.getAllMembersConnected()){
                            frame.add(new FrameMember(475 + x, 35 + y, member));
                            x += 19;
                            if(x == 171){ // 153
                            y = 17;
                            x = 0;
                            }
                            }
                            }
                            
                            };
                            timer.scheduleAtFixedRate(timerTask, 0, 30000);
                            }
                            
                            }
                            
                            

                            :::</framemember></framemember>

                            1 réponse Dernière réponse Répondre Citer 0
                            • 1 / 1
                            • Premier message
                              Dernier message
                            Design by Woryk
                            Contact / Mentions Légales

                            MINECRAFT FORGE FRANCE © 2018

                            Powered by NodeBB