MFF

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

    BlockEvent.BreakEvent

    Planifier Épinglé Verrouillé Déplacé Résolu 1.9.x et 1.10.x
    1.10.x
    7 Messages 2 Publieurs 1.8k 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.
    • GabsG Hors-ligne
      Gabs
      dernière édition par

      Bonsoir,

      J’ai fais en sorte que quand le joueur casse une porte en fer ça lui supprime un item et lui re give juste après.

      J’ai un soucis c’est que event.getPlayer().inventory.getSlotFor(new ItemStack(CSCItems.clef)) pour récupére le slot ou se situe l’item me return tout le temps -1 meme quand je déplace l’item de mon inventaire il me r’envoie tout le temps -1 et donc une érreur dans la console.

      J’ai essayer deleteStack ça marche pas…

      Je vous passe mon code et le crash qui va avec:

      
          @SubscribeEvent
          public void onBlockBreak(BlockEvent.BreakEvent event)
          {
          System.out.println(event.getWorld().isRemote);
              if(event.getState().getBlock() == Blocks.IRON_DOOR)
              {
                  if(event.getPlayer().inventory.hasItemStack(new ItemStack(CSCItems.clef)))
                  {
                  System.out.println("");
                  event.getPlayer().inventory.removeStackFromSlot(event.getPlayer().inventory.getSlotFor(new ItemStack(CSCItems.clef)));
                  event.getPlayer().inventory.addItemStackToInventory(new ItemStack(CSCItems.clef));
                  }
              }
          }
      
      
      
      false
      [18:02:00] [Server thread/INFO] [STDOUT]: [com.CSC.net.Events.Events:onBlockBreak:222]: 
      [18:02:00] [Server thread/ERROR] [FML]: Exception caught during firing event net.minecraftforge.event.world.BlockEvent$BreakEvent@5a7a26:
      java.lang.ArrayIndexOutOfBoundsException: -1
      at net.minecraft.entity.player.InventoryPlayer.removeStackFromSlot(InventoryPlayer.java:537) ~[InventoryPlayer.class:?]
      at com.CSC.net.Events.Events.onBlockBreak(Events.java:223) ~[Events.class:?]
      at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_11_Events_onBlockBreak_BreakEvent.invoke(.dynamic) ~[?:?]
      at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:68) ~[ASMEventHandler.class:?]
      at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:159) [EventBus.class:?]
      at net.minecraftforge.common.ForgeHooks.onBlockBreakEvent(ForgeHooks.java:708) [ForgeHooks.class:?]
      at net.minecraft.server.management.PlayerInteractionManager.tryHarvestBlock(PlayerInteractionManager.java:313) [PlayerInteractionManager.class:?]
      at net.minecraft.server.management.PlayerInteractionManager.onBlockClicked(PlayerInteractionManager.java:175) [PlayerInteractionManager.class:?]
      at net.minecraft.network.NetHandlerPlayServer.processPlayerDigging(NetHandlerPlayServer.java:658) [NetHandlerPlayServer.class:?]
      at net.minecraft.network.play.client.CPacketPlayerDigging.processPacket(CPacketPlayerDigging.java:56) [CPacketPlayerDigging.class:?]
      at net.minecraft.network.play.client.CPacketPlayerDigging.processPacket(CPacketPlayerDigging.java:12) [CPacketPlayerDigging.class:?]
      at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:15) [PacketThreadUtil$1.class:?]
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_45]
      at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_45]
      at net.minecraft.util.Util.runTask(Util.java:25) [Util.class:?]
      at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:742) [MinecraftServer.class:?]
      at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:687) [MinecraftServer.class:?]
      at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:156) [IntegratedServer.class:?]
      at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:536) [MinecraftServer.class:?]
      at java.lang.Thread.run(Thread.java:745) [?:1.8.0_45]
      [18:02:00] [Server thread/ERROR] [FML]: Index: 1 Listeners:
      [18:02:00] [Server thread/ERROR] [FML]: 0: NORMAL
      [18:02:00] [Server thread/ERROR] [FML]: 1: ASM: com.CSC.net.Events.Events@855523 onBlockBreak(Lnet/minecraftforge/event/world/BlockEvent$BreakEvent;)V
      [18:02:00] [Server thread/FATAL]: Error executing task
      
      

      Merci d’avance.

      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

        Salut,
        getSlotFor cherche un item stack identique (donc même quantité, même metadata et même tag nbt).
        Il y en a au moins un des trois qui n’est pas bon.

        Mais dans ton cas il serait mieux d’utiliser event.getPlayer().inventory.deleteStack(new ItemStack(CSCItems.clef));

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

          @‘robin4002’:

          Salut,
          getSlotFor cherche un item stack identique (donc même quantité, même metadata et même tag nbt).
          Il y en a au moins un des trois qui n’est pas bon.

          Mais dans ton cas il serait mieux d’utiliser event.getPlayer().inventory.deleteStack(new ItemStack(CSCItems.clef));

          Ah d’accord, mais je sais pour quelle raison mais deleteStack marche pas il ne me supprime pas l’item.
          addItemStacktoInventory marche bien mais deleteStack marche pas je sais pas du tout pourquoi.

          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

            Heu en effet ce n’est pas mieux car deleteStack vérifies directement l’instance de l’itemstack.
            Il n’y a pas de fonction prenant en argument un item, donc il faut que tu fasses un boucle sur l’inventaire jusqu’à le trouver pour le supprimer.

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

              @‘robin4002’:

              Heu en effet ce n’est pas mieux car deleteStack vérifies directement l’instance de l’itemstack.
              Il n’y a pas de fonction prenant en argument un item, donc il faut que tu fasses un boucle sur l’inventaire jusqu’à le trouver pour le supprimer.

              Je fais une boucle donc de l’inventaire ça ok mais pour trouver l’item comment je fais ? car c’est le bordel… je me m’enbrouille complètement.

              j’ai fais ça:

              @SubscribeEvent
                  public void onBlockBreak(BlockEvent.BreakEvent event)
                  {
                      if(event.getState().getBlock() == Blocks.IRON_DOOR)
                      {
                          if(event.getPlayer().inventory.hasItemStack(new ItemStack(CSCItems.clef)))
                          {
                          for(int i = 0; i < event.getPlayer().inventory.getSizeInventory(); i++)
                          {
                          System.out.println(i);
                          event.getPlayer().inventory.deleteStack(new ItemStack(CSCItems.clef));
                          event.getPlayer().inventory.addItemStackToInventory(new ItemStack(CSCItems.clef));
                          }
                          }
                      }
                  }
              

              Donc la je parcoure l’inventaire mais pour trouver l’item je dois utiliser quoi ? je sais même pas si c’est ça qu’il faut faire x)

              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

                @SubscribeEvent
                   public void onBlockBreak(BlockEvent.BreakEvent event)
                   {
                       if(event.getState().getBlock() == Blocks.IRON_DOOR)
                       {
                           if(event.getPlayer().inventory.hasItemStack(new ItemStack(CSCItems.clef)))
                           {
                               for(int i = 0; i < event.getPlayer().inventory.getSizeInventory(); i++)
                               {
                                   if(event.getPlayer().inventory.getStackInSlot(i) != null && event.getPlayer().inventory.getStackInSlot(i).getItem() == CSCItems.clef)
                                   {
                                       event.getPlayer().inventory.setInventorySlotContents(i, null); // retire l'item
                                       break; // sort de la boucle pour éviter que plusieurs item soit retiré
                                   }
                               }
                               event.getPlayer().inventory.addItemStackToInventory(new ItemStack(CSCItems.clef));
                           }
                       }
                   }
                

                Franchement après plus de 1 an sur le forum et 806 messages à travers 62 sujet qui sont presque tous des demandes d’aide je ne comprend pas pourquoi tu bloque toujours pour faire des choses que je considère plutôt simple 😕

                C’est juste parcourir un tableau à l’aide d’une boucle for pour cherche quelque chose dans son contenu et faire une petite action une fois le contenu trouvé.

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

                  c’est vrai que c’est considérablement simple mais je sais j’ai bloqué… merci en tout cas

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

                  MINECRAFT FORGE FRANCE © 2024

                  Powered by NodeBB