Inventaire Custom



  • Bonjour tout le monde j'ai crée un inventaire custom avec différents slot tout fonctionne parfaitement à part un petit soucis

    j'ai rajouté une ligne de slot de base à mon inventaire pour l'agrandir mais quand mon inventaire est plein et qu'il reste ma dernière ligne de slot custom le joueur ne peux plus droper de bloc ou d'item…

    J'ai trouvé ce code dans Inventory player mais je ne voie pas comment l'utiliser ....

    private int storeItemStack(ItemStack itemstack)
     {
         for (int i = 0; i < this.inventory.length; ++i)
         {
             if (this.inventory* != null && this.inventory*.getItem() == itemstack.getItem() && this.inventory*.isStackable() && this.inventory*.stackSize < this.inventory*.getMaxStackSize() && this.inventory*.stackSize < this.getInventoryStackLimit() && (!this.inventory*.getHasSubtypes() || this.inventory*.getItemDamage() == itemstack.getItemDamage()) && ItemStack.areItemStackTagsEqual(this.inventory*, itemstack))
             {
                 return i;
             }
         }
    
         return -1;
     }
    
     private int storePartialItemStack(ItemStack itemstack)
     {
         Item item = itemstack.getItem();
         int i = itemstack.stackSize;
         int j;
    
         if (itemstack.getMaxStackSize() == 1)
         {
             j = this.getFirstEmptyStack();
    
             if (j < 0)
             {
                 return i;
             }
             else
             {
                 if (this.inventory[j] == null)
                 {
                     this.inventory[j] = ItemStack.copyItemStack(itemstack);
                 }
    
                 return 0;
             }
         }
         else
         {
             j = this.storeItemStack(itemstack);
    
             if (j < 0)
             {
                 j = this.getFirstEmptyStack();
             }
    
             if (j < 0)
             {
                 return i;
             }
             else
             {
                 if (this.inventory[j] == null)
                 {
                     this.inventory[j] = new ItemStack(item, 0, itemstack.getItemDamage());
    
                     if (itemstack.hasTagCompound())
                     {
                         this.inventory[j].setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy());
                     }
                 }
    
                 int k = i;
    
                 if (i > this.inventory[j].getMaxStackSize() - this.inventory[j].stackSize)
                 {
                     k = this.inventory[j].getMaxStackSize() - this.inventory[j].stackSize;
                 }
    
                 if (k > this.getInventoryStackLimit() - this.inventory[j].stackSize)
                 {
                     k = this.getInventoryStackLimit() - this.inventory[j].stackSize;
                 }
    
                 if (k == 0)
                 {
                     return i;
                 }
                 else
                 {
                     i -= k;
                     this.inventory[j].stackSize += k;
                     this.inventory[j].animationsToGo = 5;
                     return i;
                 }
             }
         }
     }
    

    Merci d'avance



  • Je comprends pas trop le problème, pourrais-tu expliquer plus en détail ?



  • Merci de ton aide scarex

    Alors pour être clair un maximum

    L'inventaire est fait de 4 barres de 9 slots  donc 36 slots donc j'ai creer un inventaire custom rajoutant une 5 eme barre tout fonctionne sauf que lorsque que le joueur drop des items au sol seulement les 4 barre de base ce remplissent automatiquement.

    Donc si tu ramasse plein de bloc en masse arrivé à tes 4 barre pleine çà ne passe pas automatiquement sur la 5 eme …



  • Sers toi de l'event EntityItemPickupEvent (à enregistrer sur le BUS MinecraftForge), comme ça dès que le joueur récupère un nouvel item par-terre, tu codes une boucle for qui va parcourir la taille de son inventaire custom afin de voir si il est complet, au quel cas tu rajouteras dans ta 5ème barre. J'espère que c'est plus clair maintenant 😉



  • Merci j'ai essayé d'utiliser ton event mais ceci ne fonctionne pas parfaitement

    Voci mon code simple

    
    @SubscribeEvent
    public void Drop(EntityItemPickupEvent event)
    {
                   EntityPlayer player = (EntityPlayer)event.entity;
    ExtendedEntityPropCaracteristique ext = ExtendedEntityPropCaracteristique.get(player);
    ext.inventory.setInventorySlotContents(1, event.item.getEntityItem());
           }
    
    

    L'item s'ajoute bien dans mon inventaire mais il y a un problème de synchronisation car quand il est dans mon inventaire je le voie encore dans le monde…
    Il disparais que lorsque je touche à l'item dans mon inventaire...

    J'ai donc essayer de passer par un packet pour envoyer ma commande au server mais lorsque je passe par un packet mon item reste au sol et n'aparait dans l'inventaire que quand je suis dessus physiquement...

    Je ne comprend pas



  • Regarde si l'event est appelé côté serveur



  • Merci les gars,
    Scarex ,je suis tombé sur ton sujet 🙂

    http://www.minecraftforgefrance.fr/showthread.php?tid=2307

    Comme pour toi

    @'SCAREX':

    J'ai trouvé d'où vient le problème : en fait l'event PlayerInteractEvent est appelé côté client à chaque fois mais il est appelé côté serveur seulement lorsque l'on clique sur un block. Donc je pense que le seul moyen d'y arriver est un paquet. Et pour le markDirty : la méthode change un booléen mais celui-ci n'est jamais appelé.

    Donc je suis passé par un packet ça fonctionne.

    Je vais maintenant chercher la fonction pour clear l'item du monde car il reste encore sur la map (bizarre)

    Je te tient au courant



  • Essaie une fois ramassé de le setDead, nan ?



  • effectivement je passe en résolu merci