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

    Résolu Filtre : buffer slot

    1.8.x
    1.8
    3
    10
    1608
    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.
    • LeBossMax2
      LeBossMax2 dernière édition par

      Bonjour ! Je suis en trains d’améliorer mon détecteur de block : je lui ai mis une interface pour pouvoir choisir quel block, il vas pouvoir détecter (avec un slot). Le Problème c’est que je n’arrive pas à faire en sorte que lorsqu’on essaye de poser un item dedans, il soit enregistré dans le slot mais qu’il reste dans l’inventaire du joueur. J’ai essayé de plusieurs manières mais ça ne fonctionne pas.
      Aidez-moi, s’il vois plais.

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

        Soit tu modifie la fonction slotClick de ton container (qui est très longue), soit tu fais un slot custom et quand la fonction setSlotsContents est appelée, tu remet l’item dans l’inventaire du joueur.

        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
        • LeBossMax2
          LeBossMax2 dernière édition par

          J’ai réussi à remettre l’item dans l’inventaire du joueur grâce à un slot custom mais est-ce qu’il est possible de mettre l’item directement sur le curseur du joueur et non pas dans la première case vide du joueur ?

          Voici la fonction :

          public void putStack(ItemStack stack)
          {
          
              if (stack != null)
              {
                  ItemStack stack2 = stack.copy();
                  stack2.stackSize = 1;
                  this.inventory.setInventorySlotContents(0, stack2);;
                  this.player.inventory.setItemStack(stack);
          
              }
              this.onSlotChanged();
          
          }
          

          [edit] :
          C’est bon, j’ai trouvé comment faire : il fait this.player.inventory.setItemStack(stack);
          Voici la version modifiée :

          public void putStack(ItemStack stack)
          {
               if (stack != null)
              {
                  ItemStack stack2 = stack.copy();
                  stack2.stackSize = 1;
                  this.inventory.setInventorySlotContents(0, stack2);
                  if (player.inventory.getItemStack().getItem() == stack.getItem())
                  {
                      ItemStack stack3 = player.inventory.getItemStack();
                      if (stack3.stackSize + stack.stackSize > stack3.getItem().getItemStackLimit(stack3))
                      {
                          stack3.stackSize = stack3.getItem().getItemStackLimit(stack3);
                          stack.stackSize = stack3.stackSize + stack.stackSize - stack3.getItem().getItemStackLimit(stack3);
                          this.player.inventory.addItemStackToInventory(stack);
                      }
                      else
                          stack3.stackSize = stack3.stackSize + stack.stackSize;
                  }
                  else if (player.inventory.getItemStack().getItem() == null)
                      this.player.inventory.setItemStack(stack);
                  else
                      this.player.inventory.addItemStackToInventory(stack);
              }
              this.onSlotChanged();
          
          }
          

          Mais il y a toujours un problème : si je fait shit click pour mettre un item dans mon slot, l’item disparais.

          Et deuxième problème, si il y a un item dans le slot et que je tente de placer un item différent à la place, l’item du buffer arrive sur le curseur (ce que je ne veut pas) et l’item du curseur ce met dans le buffer.

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

            Pour le premier problème, regarde la fonction transfertStackInSlot de ton container

            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
            • LeBossMax2
              LeBossMax2 dernière édition par

              Merci !
              J’ai mis ça pour la fonction et ça à l’aire de marcher.

              public ItemStack transferStackInSlot(EntityPlayer player, int slotIndex)
              {
                  Slot slot = (Slot)this.inventorySlots.get(slotIndex);
              
                  if(slot != null && slot.getHasStack())
                  {            
                      ItemStack stack = slot.getStack();
                      ItemStack stack1 = stack.copy();
                      stack1.stackSize = 1;
              
                      this.tileEntity.setInventorySlotContents(0, stack1);
                  }
                  return null;
              }
              

              Pour le deuxième problème, la fonction putStack(ItemStack stack) de mon slot custom est bien appelée mais ne fonctionne pas comme il faut.

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

                Pour le deuxième problème, j’ai fini par trouver une solution :

                @Override
                public void putStack(ItemStack stack)
                {
                    if (stack != null)
                    {
                        ItemStack newStack = stack.copy();
                        ItemStack oldStack = this.inventory.getStackInSlot(0);
                        newStack.stackSize = 1;
                        if (oldStack != null)
                        {
                            oldStack.setItem(stack.getItem());
                            oldStack.stackSize = stack.stackSize;
                            oldStack.setItemDamage(stack.getItemDamage());
                        }
                        this.inventory.setInventorySlotContents(0, newStack);
                        ItemStack playerStack = player.inventory.getItemStack();
                        if (playerStack != null && playerStack.getItem() == stack.getItem())
                        {
                            if (playerStack.stackSize + stack.stackSize > playerStack.getItem().getItemStackLimit(playerStack))
                            {
                                playerStack.stackSize = playerStack.getItem().getItemStackLimit(playerStack);
                                stack.stackSize = playerStack.stackSize + stack.stackSize - playerStack.getItem().getItemStackLimit(playerStack);
                                this.player.inventory.addItemStackToInventory(stack);
                            }
                            else
                            {
                                playerStack.stackSize = playerStack.stackSize + stack.stackSize;
                            }
                        }
                        else if (playerStack != null && player.inventory.getItemStack().getItem() != null)
                        {
                            this.player.inventory.addItemStackToInventory(stack);
                        }
                    }
                    this.onSlotChanged();
                }
                

                Mais entre temps, j’ai trouvé deux autres bugs :

                1. Lorsqu’il y a un item dans le slot et que j’ai le même item dans l’inventaire, si je fait double-click sur celui de mon inventaire, ça essai de prendre celui qui est dans le slot et ça crash.
                2. Si je met un hopper/dropper (avec un item) en direction de mon block detector, l’item vas aller dans le slot buffer et donc est perdu. Comment faire pour désactiver l’interaction entre hopper/dropper et mon block ?
                3. Si je met ma souris sur le slot et que je click sur une touche de chiffre, de 1 à 9, le slot ce comporte comme un slot normal.

                [edit] :
                Pour le premier nouveau problème, j’ai trouvé, il suffit d’ajouter au container ça :

                @Override
                    public boolean canMergeSlot(ItemStack stack, Slot slot)
                    {
                        return !(slot instanceof BufferSlot);
                    }
                
                1 réponse Dernière réponse Répondre Citer 0
                • SCAREX
                  SCAREX dernière édition par

                  pour le 2 : tu dois implémenter ISidedInventory et modifier les fonctions canInsertItem, canExtractItem et getAccessibleSlotsFromSide

                  Site web contenant mes scripts : http://SCAREXgaming.github.io

                  Pas de demandes de support par MP ni par skype SVP.
                  Je n'accepte sur skype que l…

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

                    Merci, ça à bien corrigé le problème.
                    Pour le problème suivant, je crois que je vais être obligé de modifier la fonction “slotClick” de mon container.

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

                      Je pense, mais je crois qu’il y a une autre fonction qui s’occupe de ça, à vérifier.

                      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
                      • LeBossMax2
                        LeBossMax2 dernière édition par

                        C’est bon, j’ai trouvé une solution :
                        :::

                        @Override
                            public ItemStack slotClick(int slotId, int clickedButton, int mode, EntityPlayer playerIn)
                            {
                                if (mode == 2 && clickedButton >= 0 && clickedButton < 9) //Ici, c'est la partie intéressante
                                {
                                    Slot clickedSlot = (Slot)this.inventorySlots.get(slotId);
                                    if (clickedSlot.canTakeStack(playerIn))
                                    {
                                        InventoryPlayer inventoryPlayer = playerIn.inventory;
                                        ItemStack hotbarStack = inventoryPlayer.getStackInSlot(clickedButton);
                        
                                        if (clickedSlot.inventory != inventoryPlayer)
                                        {
                                            if (hotbarStack == null)
                                            {
                                                return null;
                                            }
                                            else
                                            {
                                                ItemStack newStack = hotbarStack.copy();
                                                newStack.stackSize = 1;
                                                clickedSlot.putStack(newStack);
                        
                                                return null;
                                            }
                                        }
                                    }
                                }
                                else if (mode == 1 && (clickedButton == 0 || clickedButton == 1)) //Ici, c'est pour fixer un autre petit problème avec le chift-click
                                {
                                    Slot clickedSlot = (Slot)this.inventorySlots.get(slotId);
                                    if (clickedSlot != null && clickedSlot.canTakeStack(playerIn) && clickedSlot.inventory != playerIn.inventory)
                                    {
                                        clickedSlot.decrStackSize(clickedSlot.getStack().stackSize);
                                        return null;
                                    }
                                }
                                return super.slotClick(slotId, clickedButton, mode, playerIn);
                            }
                        

                        :::

                        Je fait encore quelques essais pour voir si il n’y a plus de bug et ensuite, je met le poste en résolu. Merci à tous pour votre aide !

                        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