Navigation

    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    SOLVED BlockEvent.BreakEvent

    1.9.x et 1.10.x
    1.10.x
    2
    7
    1525
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Gabs
      Gabs last edited by

      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 Reply Last reply Reply Quote 0
      • robin4002
        robin4002 Administrateurs Rédacteurs Moddeurs confirmés last edited by

        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 Reply Last reply Reply Quote 0
        • Gabs
          Gabs last edited by

          @‘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 Reply Last reply Reply Quote 0
          • robin4002
            robin4002 Administrateurs Rédacteurs Moddeurs confirmés last edited by

            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 Reply Last reply Reply Quote 0
            • Gabs
              Gabs last edited by

              @‘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 Reply Last reply Reply Quote 0
              • robin4002
                robin4002 Administrateurs Rédacteurs Moddeurs confirmés last edited by

                @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 Reply Last reply Reply Quote 1
                • Gabs
                  Gabs last edited by

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

                  1 Reply Last reply Reply Quote 0
                  • 1 / 1
                  • First post
                    Last post
                  Design by Woryk
                  Contact / Mentions Légales / Faire un don

                  MINECRAFT FORGE FRANCE © 2018

                  Powered by NodeBB