Inventaire et réduction de slot



  • Salut Salut !

    Alors voilà… J'ai fait en sorte que l'inventaire du joueur (pour un container pour le moment, mais même principe pour le futur inventaire custom), qui augmente ou diminue celons le sac que l'on a d'équipé.  Tout marche impec' 😉

    Le soucis c'est que ce n'est que de l'affichage, même s'il n'y a que 6 slot d'inventaire afficher, les 21 autre sont quand même présent... C'est... Embettant...

    J'aimerai donc savoir comment pallier se soucis ou réduire l'inventaire du joueur (ses slots), mais d'après ce que j'ai lue, il faut patcher (je m'y attendait un peu...) Donc, c'est mort ^^'

    Sinon, j'avais penser utilisé donc un inventaire custom, avec mes propre slot d'inventaire custom. Mais là il y aura aussi un soucis, c'est que les item ramasser au sol irons dans l'inventaire du joueur et non dans mes slots custom... Y'a t'il moyen de modifier le chemin des items ramasser pour qu'ils aillent dans MON inventaire et non celui de MC ?

    Pour ce projet, il n'y aura aucun item lâcher par les mobs ou autre (je pense même coupé la fonction "jeter", alors pourquoi vouloir modifier la taille si aucun item n'est ramasser et qu'on dois juste les faire glisser du container a l'inventaire ? Le sac a dos... Car, si tu n'a pas de sac a dos, ton inventaire se retrouve a terre, et donc rammassable... Sauf s'il on peu empêcher de déséquipé l'item d'un slot t'en que l'inventaire est plein, mais je n'y crois pas trop.

    Donc pour résume :

    • Modifier la taille de l'inventaire du joueur ?
    • Modifier le chemin de drope des ressources ?
    • Bloquer l'item dans un slot si d'autre slot ne sont pas vide ?

    Il me faut pas les trois, mais une des trois.

    Merci,
    Cordialement.




  • Administrateurs

    Avec PlayerOpenContainerEvent tu peux détecter quand le container est ouvert.
    Puis tu peux récupérer l'instance de ce dernier avec player.openContainer
    La liste des slots est stocké dans inventorySlots qui est une liste public, donc tu peux la clear et remettre les slots que tu veux dedans.
    Ce qui te permet donc de faire ce que tu voulais sans patcher de classe.



  • Hum, la méthode de Robin a l'air plus simple et moins galère…

    Je ne pensais pas que l'on pouvais modifier directement le nombre de slot car je croyais que MC y bloquait l'accès ^^"

    Je vais tester ça.



  • Sauf que robin ne répond pas à la même question que moi. Moi je te parle d'ajoute les items que tu as par-terre dans tes nouveaux slots. Et l'event est une solution très facile, à moins que tu ne préfères te servir de l'ASM….



  • Il ne répond pas a la même question, certes

    Mais comme dit dans mon premier poste : Il me faut pas les trois, mais une des trois.

    Une des 3 me suffit 😃

    Celle de Robin m'arrange bien, car, il n'y aura aucun drope, sauf ceux lâcher si le joueur enlève sont sac a dos où sont stocker ses items ^^

    @'robin4002':

    Avec PlayerOpenContainerEvent tu peux détecter quand le container est ouvert.
    Puis tu peux récupérer l'instance de ce dernier avec player.openContainer
    La liste des slots est stocké dans inventorySlots qui est une liste public, donc tu peux la clear et remettre les slots que tu veux dedans.
    Ce qui te permet donc de faire ce que tu voulais sans patcher de classe.

    Mais si le Container est fermé ? Où n'a jamais été ouvert, la liste ne sera pas remplacer ? Non ?

    Au final je ne veux utilisé que les 9 slots de la barre en main et complétement supprimer les 27 slots l'inventaire.



  • @'robin4002':

    Avec PlayerOpenContainerEvent tu peux détecter quand le container est ouvert.
    Puis tu peux récupérer l'instance de ce dernier avec player.openContainer
    La liste des slots est stocké dans inventorySlots qui est une liste public, donc tu peux la clear et remettre les slots que tu veux dedans.
    Ce qui te permet donc de faire ce que tu voulais sans patcher de classe.

    Mais si le Container est fermé ? Où n'a jamais été ouvert, la liste ne sera pas remplacer ? Non ?

    Au final je ne veux utilisé que les 9 slots de la barre en main et complétement supprimer l'inventaire.


  • Administrateurs

    Ah oui en effet. Dans ce cas il faudrait le modifier une première fois à la connexion. Normalement c'est possible.



  • Et Ouai 😕

    Du coup je présume que c'est un peu pareil, sauf dans l'event PlayerLoggedInEvent ?

    
       @SubscribeEvent
       public void onJoin(PlayerLoggedInEvent event)
       {
           if(event.player instanceof EntityPlayer)
           {
               event.player.inventoryContainer.inventorySlots.clear();
           }
    
    }
    
    

    Mais je ne suis pas sur du . clear(), et aucune idée de comment y mettre la new list 😕


  • Administrateurs

    Là tu les as seulement clear, il faudrait aussi remettre quelque chose dedans ^^



  • Oui, je sais, comme dit ci haut, je ne sais pas vraiment comment recréer une new liste, avec quel fonction, y'en a pas mal et je ne les comprend pas toute ^^"

    Sinon, je présume que c'est un truc du genre ?

    
       private ItemStack[] inventory = new ItemStack[9];
    ////////////////////////////////////////////////////
               event.player.inventoryContainer.inventorySlots.clear();
               event.player.inventoryContainer.inventorySlots.toArray(inventory);
    
    

    A mon avis, ça dois être qqch comme ça car quand j’ouvre l'inventaire du player en créative ça crash du au java.lang.IndexOutOfBoundsException 😉


  • Administrateurs

    inventorySlots contient une liste de slot.
    Donc c'est des slot qu'il faut mettre dedans.



  • private Slot[] inventory = new Slot[9]
    

    Si c'est le cas, le

    System.out.println( event.player.inventoryContainer.inventorySlots.size());
    

    reste sur 45 ^^'


  • Administrateurs

    Car il est set sur 45 à chaque ouverture du container. C'est pour ça que je t'ai dit d'utiliser aussi l'event pour l'ouverture du container.



  • Mais même sans ouvrir le Container ni rien, elle est égale a 45.

    
    public Slot[] inventory = new Slot[9];
    
    
    
     @SubscribeEvent
       public void onJoin(PlayerLoggedInEvent event)
       {
           EntityPlayerMP playerMP = (EntityPlayerMP)event.player;
           boolean flag = playerMP.theItemInWorldManager.isCreative();
    
           if(event.player instanceof EntityPlayer)
           {
    
               if(flag == false)
               {
                   event.player.inventoryContainer.inventorySlots.clear();
                   event.player.inventoryContainer.inventorySlots.toArray(inventory);
    
               }
    
           }
    
       }
    
    
    
     @SubscribeEvent
       public void playerOpenContainerEvent(PlayerOpenContainerEvent event)
       {
           EntityPlayer player = (EntityPlayer)event.entity;
           int test = player.openContainer.windowId;
           EntityPlayerMP playerMP = (EntityPlayerMP)event.entityPlayer;
           boolean flag = playerMP.theItemInWorldManager.isCreative();
    
           if(event.entityPlayer instanceof EntityPlayer)
           {
    
               if(flag == false)
               {
                   event.entityPlayer.inventoryContainer.inventorySlots.clear();
                   event.entityPlayer.inventoryContainer.inventorySlots.toArray(inventory);
    
               }
    
           }
    
       }
    
    
    
    [15:43:32] [Server thread/INFO] [STDOUT]: [kujaroth.common.EventHandlerTuto:PlayerTickEvent:101]: taille : 0
    [15:43:32] [Client thread/INFO] [STDOUT]: [kujaroth.common.EventHandlerTuto:PlayerTickEvent:101]: taille : 45
    
    

    J'ai surement foiré quelque part 😕


  • Administrateurs

    C'est peut-être remit sur 45 ailleurs alors. Mais je ne sais pas où 😕
    Par contre ton "public Slot[] inventory = new Slot[9];" c'est une très bonne idée pour causé des npe x)



  • Bon, dans PlayerTickEvent  la liste est bien clear, mais impossible de lui affecter l'autre 😕

    Je crois que le plus simple serait :

    
        @Override
        private int storeItemStack(ItemStack itemstack)
        {
            for (int i = 0; i < neufPourLaBarreEnMain; ++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;
        }
    
    

    Non ? Bon, bien évidement, il ne veux pas   @Override 😕 Patch ? 😕

    EDIT : Hum… Sinon... Il ne serais pas plus simple de remplir ses slots avec un objet pour les rendre inaccessible ? Remplir le surplus d'inventaire avec un item quelconque 😉

    Par contre, aucune idée de comment ajouter un item dans un slot spécifique... (ni enlever un item d'un slot spécifique)

    Est il possible aussi d'actualisé l'image d'un GUI sans le fermé ouvrir ? Ou Mettre deux texture sur un GUI ?


  • Administrateurs

    @'Kujaroth':

    Est il possible aussi d'actualisé l'image d'un GUI sans le fermé ouvrir ? Ou Mettre deux texture sur un GUI ?

    GuiScreenEvent, il y a un event pour le rendu. Suffit de le cancel et de faire ton propre rendu.

    Par contre je n'ai pas comprit l'intérêt de ta fonction storeItemStack.



  • Merci 😉

    storeItemStack pour n'utilisé que la barre en main pour stocker.

    Mais ducoup je vais "tricher" en remplissant le surplus d'inventaire avec des items, mais je ne sais pas comment ajouter automatiquement un item dans un slot 😕


  • Administrateurs

    Comment ça automatiquement ?