BlockEvent.BreakEvent



  • 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.


  • Administrateurs

    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));



  • @'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.


  • Administrateurs

    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.



  • @'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)


  • Administrateurs

    @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é.



  • c'est vrai que c'est considérablement simple mais je sais j'ai bloqué.. merci en tout cas