MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Texture item

    Planifier Épinglé Verrouillé Déplacé Résolu 1.11.x
    1.11.x
    43 Messages 9 Publieurs 8.7k Vues 1 Watching
    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.
    • S Hors-ligne
      Sebenf0rce
      dernière édition par

      Comment je peux tester la fonction isUsableByPlayer car il faut y passer en paramètre le player mais je n’y ai pas accès dans ma classe ContainerChestExplorer.

      J’ai remarqué également en faisant différent test que le programme ne rentre jamais dans ma fonction
      public boolean canInteractWith(EntityPlayer player) {
      return this.inventory.isUsableByPlayer(player);
      }

      Est-ce normal ?

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

        Tu y as accès dans canInteractWith.

        Non mais ça va avec le fait que ton gui s’ouvre pas.
        @AymericRed:

        […] et ensuite mets des prints/du debug dans les fonctions de draw, d’init et le constructeur du gui pour voir où ça bloque.

        Il te reste à faire ça 😉

        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
        • S Hors-ligne
          Sebenf0rce
          dernière édition par

          Salut,

          Du coup j’ai mis différents print :

          Classe GuiHandler :

          public class GuiHandler implements IGuiHandler {
          
          @Override
          public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
          switch (ID) {
          case 0:
          System.out.println(" création container chest explorer");
          return new ContainerChestExplorer(world.getTileEntity(new BlockPos(x, y, z)));
          }
          return null;
          }
          
          @Override
          public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
          switch (ID) {
          case 0:
          System.out.println(" création gui chest explorer");
          return new GuiChestExplorer(world.getTileEntity(new BlockPos(x, y, z)));
          }
          return null;
          }
          }
          

          Les deux print s’affiche bien.

          Classe ContainerChestExplorer :

          public class ContainerChestExplorer extends Container
           {
             IInventory inventory;
          
            public ContainerChestExplorer(TileEntity tile)
             {
           System.out.println("constructeur container");
              this.inventory = ((IInventory)tile);
          
              int i = 0;
              int j = 0;
          
              for (i = 0; i < 108; i++) {
                if (i % 12 == 0)
                   j++;
                int u = i % 12 + 1;
                if (i < this.inventory.getSizeInventory()) {
                   addSlotToContainer(new SlotChestExplorer(this.inventory, i, u * 18 - 6, j * 18 - 10));
                } else {
                  addSlotToContainer(new SlotChestExplorer(new InventoryDummy(), 0, u * 18 - 6, j * 18 - 10));
                 }
              }
             }
          
             public boolean canInteractWith(EntityPlayer player) {
            System.out.println("AAAAAAAAAAAAAAA" + this.inventory.isUsableByPlayer(player));
              return this.inventory.isUsableByPlayer(player);
            }
          
            public ItemStack slotClick(int slotIndex, int buttonPressed, int flag, EntityPlayer player)
             {
               return null;
             }
          
             public ItemStack transferStackInSlot(EntityPlayer player, int quantity)
             {
               return null;
            }
           }
          

          Le print du constructeur s’affiche bien mais celui de la méthode de canInteractWith n’apparait pas et je ne comprends pas pourquoi.

          Classe GuiChestExplorer :

          public class GuiChestExplorer extends GuiContainer
           {
            TileEntity tile;
             ResourceLocation bg = new ResourceLocation("sebenforcemod:textures/gui/chestexplorer.png");
          
             public GuiChestExplorer(TileEntity te) {
              super(new ContainerChestExplorer(te));
              System.out.println("constructeur gui");
               this.xSize = 256;
              this.ySize = 177;
             }
          
            protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_)
             {
              this.mc.renderEngine.bindTexture(this.bg);
              System.out.println("draw gui");
               drawDefaultBackground();
               GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
               int x = (this.width - this.xSize) / 2;
               int y = (this.height - this.ySize) / 2;
               drawTexturedModalRect(x, y, 0, 0, 256, 256);
             }
           }
          

          Les deux print s’affichent bien.

          Est ce qu’il est possible que le gui du coffre de base s’affiche par dessus le mien ?

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

            C’est très probable.
            Essaies dans la classe de ton item de remplacer EnumActionResult.SUCESS par FAILED pour éviter qu’il fasse l’action du clic droit du coffre.

            1 réponse Dernière réponse Répondre Citer 0
            • S Hors-ligne
              Sebenf0rce
              dernière édition par

              @robin4002:

              C’est très probable.
              Essaies dans la classe de ton item de remplacer EnumActionResult.SUCESS par FAILED pour éviter qu’il fasse l’action du clic droit du coffre.

              Salut, j’ai essayé avec le EnumActionResult.FAIL mais ça ouvre toujours le gui du coffre de base.

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

                Faudrait passer par un event alors.

                1 réponse Dernière réponse Répondre Citer 0
                • S Hors-ligne
                  Sebenf0rce
                  dernière édition par

                  @robin4002:

                  Faudrait passer par un event alors.

                  Ah d’accord 😞
                  J’ai essayé de voir la liste des event. J’ai trouvé celui là qui pourrait m’être utile mais il ne semble pas exister en 1.11 : PlayerUseItemEvent

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

                    @‘Sebenf0rce’:

                    @‘robin4002’:

                    Faudrait passer par un event alors.

                    Ah d’accord 😞
                    J’ai essayé de voir la liste des event. J’ai trouvé celui là qui pourrait m’être utile mais il ne semble pas exister en 1.11 : PlayerUseItemEvent

                    Celui là :

                    
                    PlayerInteractEvent.RightClickBlock
                    
                    

                    Il suffit de cancel l’event et d’afficher ton Gui.

                    1 réponse Dernière réponse Répondre Citer 1
                    • S Hors-ligne
                      Sebenf0rce
                      dernière édition par

                      @Alexandre1156:

                      @‘Sebenf0rce’:

                      @‘robin4002’:

                      Faudrait passer par un event alors.

                      Ah d’accord 😞
                      J’ai essayé de voir la liste des event. J’ai trouvé celui là qui pourrait m’être utile mais il ne semble pas exister en 1.11 : PlayerUseItemEvent

                      Celui là :

                      
                      PlayerInteractEvent.RightClickBlock
                      
                      

                      Il suffit de cancel l’event et d’afficher ton Gui.

                      Merci, par contre comment je peux vérifier que le block a été right click avec mon item ?

                      1 réponse Dernière réponse Répondre Citer 0
                      • BrokenSwingB Hors-ligne
                        BrokenSwing Moddeurs confirmés Rédacteurs
                        dernière édition par

                        Avec l’instance du joueur tu peux vérifier si l’item qu’il tient quand la main est ton item

                        1 réponse Dernière réponse Répondre Citer 1
                        • S Hors-ligne
                          Sebenf0rce
                          dernière édition par

                          @‘BrokenSwing’:

                          Avec l’instance du joueur tu peux vérifier si l’item qu’il tient quand la main est ton item

                          J’ai réussis à faire ça (est-ce que je suis sur la bonne piste ?)

                          public class EventPlayerUseItem {
                          
                          @SubscribeEvent
                          public void onRightClick(PlayerInteractEvent.RightClickBlock event) {
                          if (event.getItemStack() != null) {
                          Item item = event.getItemStack().getItem();
                          
                          if (item == Items.chestExplorer) {
                          event.setCanceled(true);
                          player.openGui(Main.instance, 0, world, pos.getX(), pos.getY(), pos.getZ());
                          }
                          }
                          }
                          }
                          

                          Seulement je ne sais pas comment récupérer l’instance du player du coup la ligne suivante ne fonctionne pas : player.openGui(Main.instance, 0, world, pos.getX(), pos.getY(), pos.getZ());

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

                            event.getPlayer() ?

                            1 réponse Dernière réponse Répondre Citer 1
                            • S Hors-ligne
                              Sebenf0rce
                              dernière édition par

                              Alors j’ai du nouveau !

                              Voici ma classe maintenant :

                              public class EventPlayerUseItem {
                              
                              @SubscribeEvent
                              public void onRightClick(PlayerInteractEvent.RightClickBlock event) {
                              System.out.println("on rentre dans l'event");
                              if (event.getItemStack() != null) {
                              Item item = event.getItemStack().getItem();
                              
                              if (item == Items.chestExplorer) {
                              System.out.println("cliqué par un chest explorer");
                              event.setCanceled(true);
                              event.getEntityPlayer().openGui(Main.instance, 0, event.getWorld(), event.getPos().getX(), event.getPos().getY(), event.getPos().getZ());
                              }
                              }
                              }
                              }
                              

                              On voit apparaître mon gui cependant tout de suite après le gui du coffre apparait et je ne vois pas pourquoi.
                              C’est bien event.setCanceled(true); ?

                              Edit :

                              J’ai trouvé ça :

                              @SubscribeEvent
                              public void onGuiOpen(GuiOpenEvent event) {
                              System.out.println("A gui is open !");
                              if(event.) { //si je tiens l'objet
                              
                              }
                              }
                              

                              Je peux peut être utilisé ça pour cancel l’event ? Cependant je ne peux pas faire de event.getItemStack() comme avec l’event RightClickBlock  pour vérifier que mon item est utilisé. Y a t’il une autre solution pour vérifier si mon item est utilisé ?

                              1 réponse Dernière réponse Répondre Citer 0
                              • Benjamin LoisonB Hors-ligne
                                Benjamin Loison
                                dernière édition par

                                Tu sembles être côté client, regardes la liste des évents sur ce forum si tu peux cancer ou non ces évents.
                                Pour vérifier l’item penses à Minecraft.getMinecraft().thePlayer.itemInHand ou je ne sais plus très bien et tu check comme ça 😉

                                >! Développeur de Altis-Life (Arma III) sur Minecraft !
                                >! Site web     : https://lemnoslife.com

                                1 réponse Dernière réponse Répondre Citer 0
                                • S Hors-ligne
                                  Sebenf0rce
                                  dernière édition par

                                  J’ai donc modifier la classe qui est comme ceci maintenant :

                                  public class EventPlayerUseItem {
                                  
                                  @SubscribeEvent
                                  public void onRightClick(PlayerInteractEvent.RightClickBlock event) {
                                  System.out.println("on rentre dans l'event");
                                  if (event.getItemStack() != null) {
                                  Item item = event.getItemStack().getItem();
                                  
                                  if (item == Items.chestExplorer) {
                                  System.out.println("cliqué par un chest explorer");
                                  event.setCanceled(true);
                                  event.getEntityPlayer().openGui(Main.instance, 0, event.getWorld(), event.getPos().getX(), event.getPos().getY(), event.getPos().getZ());
                                  }
                                  }
                                  }
                                  
                                  @SubscribeEvent
                                  public void onGuiOpen(GuiOpenEvent event) {
                                  if(event.getGui() instanceof GuiChest && Minecraft.getMinecraft().player.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND).getItem() == Items.chestExplorer) {
                                  event.setCanceled(true);
                                  }
                                  }
                                  }
                                  

                                  Il y a un petit problème, en effet lors de la première ouverture du coffre il ne se passe rien, mon inventaire disparaît et il y a une erreur dans la console.
                                  Lorsque je reclick sur le coffre cette fois mon gui s’ouvre bien.

                                  Voici l’erreur obtenu :

                                  [13:13:58] [Client thread/FATAL]: Error executing task
                                  java.util.concurrent.ExecutionException: java.lang.IndexOutOfBoundsException: Index: 46, Size: 46
                                  at java.util.concurrent.FutureTask.report(Unknown Source) ~[?:1.8.0_141]
                                  at java.util.concurrent.FutureTask.get(Unknown Source) ~[?:1.8.0_141]
                                  at net.minecraft.util.Util.runTask(Util.java:30) [Util.class:?]
                                  at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1117) [Minecraft.class:?]
                                  at net.minecraft.client.Minecraft.run(Minecraft.java:407) [Minecraft.class:?]
                                  at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
                                  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_141]
                                  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141]
                                  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141]
                                  at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_141]
                                  at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
                                  at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
                                  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_141]
                                  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141]
                                  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141]
                                  at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_141]
                                  at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
                                  at GradleStart.main(GradleStart.java:26) [start/:?]
                                  Caused by: java.lang.IndexOutOfBoundsException: Index: 46, Size: 46
                                  at java.util.ArrayList.rangeCheck(Unknown Source) ~[?:1.8.0_141]
                                  at java.util.ArrayList.get(Unknown Source) ~[?:1.8.0_141]
                                  at net.minecraft.inventory.Container.getSlot(Container.java:135) ~[Container.class:?]
                                  at net.minecraft.inventory.Container.setAll(Container.java:559) ~[Container.class:?]
                                  at net.minecraft.client.network.NetHandlerPlayClient.handleWindowItems(NetHandlerPlayClient.java:1306) ~[NetHandlerPlayClient.class:?]
                                  at net.minecraft.network.play.server.SPacketWindowItems.processPacket(SPacketWindowItems.java:72) ~[SPacketWindowItems.class:?]
                                  at net.minecraft.network.play.server.SPacketWindowItems.processPacket(SPacketWindowItems.java:13) ~[SPacketWindowItems.class:?]
                                  at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:21) ~[PacketThreadUtil$1.class:?]
                                  at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_141]
                                  at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_141]
                                  at net.minecraft.util.Util.runTask(Util.java:29) ~[Util.class:?]
                                  … 15 more
                                  [13:13:58] [Client thread/FATAL]: Error executing task
                                  java.util.concurrent.ExecutionException: java.lang.IndexOutOfBoundsException: Index: 54, Size: 46
                                  at java.util.concurrent.FutureTask.report(Unknown Source) ~[?:1.8.0_141]
                                  at java.util.concurrent.FutureTask.get(Unknown Source) ~[?:1.8.0_141]
                                  at net.minecraft.util.Util.runTask(Util.java:30) [Util.class:?]
                                  at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1117) [Minecraft.class:?]
                                  at net.minecraft.client.Minecraft.run(Minecraft.java:407) [Minecraft.class:?]
                                  at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
                                  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_141]
                                  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141]
                                  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141]
                                  at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_141]
                                  at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
                                  at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
                                  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_141]
                                  at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141]
                                  at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141]
                                  at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_141]
                                  at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
                                  at GradleStart.main(GradleStart.java:26) [start/:?]
                                  Caused by: java.lang.IndexOutOfBoundsException: Index: 54, Size: 46
                                  at java.util.ArrayList.rangeCheck(Unknown Source) ~[?:1.8.0_141]
                                  at java.util.ArrayList.get(Unknown Source) ~[?:1.8.0_141]
                                  at net.minecraft.inventory.Container.getSlot(Container.java:135) ~[Container.class:?]
                                  at net.minecraft.inventory.Container.putStackInSlot(Container.java:551) ~[Container.class:?]
                                  at net.minecraft.client.network.NetHandlerPlayClient.handleSetSlot(NetHandlerPlayClient.java:1262) ~[NetHandlerPlayClient.class:?]
                                  at net.minecraft.network.play.server.SPacketSetSlot.processPacket(SPacketSetSlot.java:33) ~[SPacketSetSlot.class:?]
                                  at net.minecraft.network.play.server.SPacketSetSlot.processPacket(SPacketSetSlot.java:11) ~[SPacketSetSlot.class:?]
                                  at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:21) ~[PacketThreadUtil$1.class:?]
                                  at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_141]
                                  at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_141]
                                  at net.minecraft.util.Util.runTask(Util.java:29) ~[Util.class:?]
                                  … 15 more
                                  
                                  1 réponse Dernière réponse Répondre Citer 0
                                  • Benjamin LoisonB Hors-ligne
                                    Benjamin Loison
                                    dernière édition par

                                    Mhh je ne vois pas désolé, sinon penses à la valise Java pour ton code 😉

                                    >! Développeur de Altis-Life (Arma III) sur Minecraft !
                                    >! Site web     : https://lemnoslife.com

                                    1 réponse Dernière réponse Répondre Citer 0
                                    • S Hors-ligne
                                      Sebenf0rce
                                      dernière édition par

                                      Ah mince merci quand même 😞
                                      Quelqu’un d’autre a une idée ?

                                      Edit :

                                      ```java

                                      SubscribeEvent
                                         public void onGuiOpen(GuiOpenEvent event) {
                                             if(event.getGui() instanceof GuiChest && Minecraft.getMinecraft().player.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND).getItem() == Items.chestExplorer) {
                                                 event.setCanceled(true);
                                                 //Minecraft.getMinecraft().player.openGui(Main.instance, 0, Minecraft.getMinecraft().world, event., event.getPos().getY(), event.getPos().getZ());
                                             }
                                         }

                                      
                                      c'est le cancel de cette méthode qui fait tout bugué en fait
                                      est ce que vous savez par hasard si il y a une autre manière de cancel l'ouverture du gui ?
                                      1 réponse Dernière réponse Répondre Citer 1
                                      • FlowF Hors-ligne
                                        Flow
                                        dernière édition par

                                        Quand Benjamin Loison te dis de penser aux Balises c’est pas pour rien ^^ C’est beaucoup plus lisible pour les personnes qui t’entourent elle sont à mettre,  au début de ton code tu mets :
                                        :::
                                        [.java]
                                        :::

                                        et à la fin

                                        :::
                                        [./java]
                                        :::

                                        SANS LE point bien évidemment…

                                        Oui ce gif est drôle.

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

                                        MINECRAFT FORGE FRANCE © 2024

                                        Powered by NodeBB