Changer le maxStackSize de minecraft (en général)



  • Bonjour,

    Le titre risque d'être un peu confus mais je ne savais pas quoi mettre plus explicitement.
    Pour la faire détailler, lorsqu'on créer un item il est possible de changer le stack de celui-ci, il est également possible de modifier cela sur les containers, c'est la ou surgit mon problème.

    Ayant des items pouvant se stacker jusqu'a 256, je souhaiterais que celui-ci puisse être de 256 également dans le slot du container associé. Cependant, après une recherche et une aide sur le discord, (Merci à LeBossMax2 pour les classes recherchés et Ourten pour une lib qui outrepasserai cela [j'en parlerais un peu plus tard]) il semblerait que la classe qui me pose soucis est : PacketBuffer {#writeItemStack, #readItemStack}, dans ces méthodes le stackSize de l'item est limité en byte, soit 127 max en Java. (Il doit y en avoir d'autres à modifier également mais celle-ci est, je pense prioritaire)

    Suite à la lib de Ourten, j'ai regardé le contenu et je dois dire que je me suis très viiiite perdu, après m'être renseigné, la lib fait du Hack + de la Reflection et c'est la ou je bloque, je comprend un petit peu la reflection mais avec le coup du hack je suis perdu.
    Le problème également de la lib, c'est que si je l'utilise en mod, en modifiant le stackSize à 256, tous les autres items pourront également être à ce compte là (ce que je ne veux surtout pas).

    En résumé :

    • Je veux pouvoir modifier le stackSize de seulement mes items jusqu'en 256 (voir plus).
    • Aucun item de minecraft ne doit être modifié.
    • Eviter le hack et la reflection (si possible)
    • Eviter d'utiliser un autre mod (mais plutot une lib)

    Du coup si vous avez des pistes un peu plus facile à comprendre, je prend !

    Lib/Mod de Ourten



  • J'ai une petite idée de comment faire. En gros ce qui se passe normalement, c'est que le container envoie à tous ces listeners le contenu de l'inventaire. Parmi ses listeners, il y a le joueur qui va envoyer le contenu du container par un Packet au client. Le client utilise alors la fonction PacketBuffer.readItemStackFromBuffer qui pose problème. Une solution possible est donc d'enlever le joueurs des listeners et de mettre ton propre listener à la place qui va envoyer un packet custom au client.



  • Ah ce serai une possibilité, mais en faisant cela j'aurais pas énormément de chose à refaire notamment sur la gestion des slots, des clicks etc... ?



  • Non, tu as juste à recoder un listener custom (qui fait juste envoyer des packets) et les packets qui font comme les packets originaux, donc tu peux sûrement ne pas recoder ça, mais juste appeler les fonctions que les packets originaux appellent.



  • D'accord merci, je verrais ça demain et je tiendrais ce post au courant



  • Ok alors j'ai réussi quelques trucs mais je sens que j'approche de la fin, cependant j'aurais besoin d'aide concernant la synchronisation du client au serveur.

    Donc j'ai recoder 2-3 méthodes (notamment le openGui) et ainsi j'ai pu modifier certains packets.

    Actuellement qu'est ce que j'ai fait ? :
    openGui -> au lieu d'ajouter le entityPlayer en listener j'ai ajouté mon propre joueur implémentant IContainerListener et ainsi pouvoir accéder aux méthodes #sendAllContent, etc...
    Depuis ces méthodes j'ai pu faire mes packets pour envoyer les données du contenu au client avec en prime la refonte du PacketBuffer pour augmenter la taille d'envoie des Items (donc jusqu'à la tout marche).

    Problème : Quand j'ouvre l'inventaire, je vois bien tous les items avec la bonne taille, cependant, quand je clique sur les Items supérieur à 127 de quantité, ils disparaissent et repop en cliquant et autre part, DE PLUS, j'ai beau changé les items de place, ils ne s'updatent pas, (donc surement un packet à envoyer au serveur mais cela risque de faire une faille et un ajout important d'item sur le serveur juste en hackant le client ?)

    Du coup est-ce que j'ai mal saisit un truc que tu m'avais dit plus haut ou j'ai fait des choses inutiles que j'aurais pu éviter ? Et je ne vois pas comment update le serveur lors du changement de slot avec une faille de ce packet.



  • Je ne comprends ps ce que tu veux dire par "j'ai beau changé les items de place, ils ne s'updatent pas".
    Pour ce que tu as dit avant, ça doit juste être un problème de rendu, minecraft doit sûrement vérifier que la quantité d'item est normal avant de l'afficher sur la souris.



  • En gros pour : "j'ai beau changé les items de place, ils ne s'updatent pas", quand je souhaite les changer de slot, ça ne marche (suite à un manque de packet côté client surement) ils restent à leur place d'origine.
    Concernant le rendu je vais vérifier cela, merci.



  • Donc j'ai réussi à sauvegarder le nouvel emplacements des items avec le client et serveur (y'avait pas besoin de packet, c'est juste moi qui ai oublié de sauvegarder l'inventaire ahah)
    Cependant j'ai toujours ce problème de disparation des items, voici un gif :
    https://gyazo.com/e66d0aefa0dc74f5076be6d2c2681162
    A la fin du gif bien évidemment quand je ferme l'inventaire, les items disparues réapparaissent et le changement de slot est effectif lui aussi.
    Concernant le problème de rendu je n'ai rien trouvé dans la classe ItemRenderer ou encore dans le GuiContainer, cependant j'ai une petite idée, dans le drawScreen l'inventaire de minecraft est utilisé, je me dis donc que cette limite peut être prise en compte, sauf que celui-ci est limité à 64 et pas à 127, donc tous les items supérieur à 64 devrait disparaitre, non ? enfin bon je suis un peu confus moi même, il ne me reste plus que le render et j'ai tout bon x). Si vous avez une idée de quelle classe gère ça je prend.



  • Ah, là le problème, c'est peut-être qu'il save les items et n'arrive pas à les load



  • Haaaan, ça expliquerait pourquoi quand je clique sur les items, il me fait comme un " reboot " de l'inventaire, du coup j'ai un problème dans le packet d'envoie ou juste dans le la lecture de l'inventaire/container ?



  • Plutôt un problème de saveToNBT et loadFromNBT de l'inventory (Enfin le nom des méthodes c'est probablement pas ça, mais tu vois ce que je veux dire)



  • Non j'ai essayé ça ne vient pas de là, tout est bon de ce côté :/, en revanche j'ai trouvé le " handleWindowClick " donc je pense que ça vient de là, car à un moment il renvoie du contenue et vu qu'il repasse par un packet ou y'a le byte je me dis que c'est ça. Donc je suis en train de refaire 2-3 packets ahahahah (tuez moi)



  • Bon j'ai enfin réussi ! Tout marche (enfin juste des problèmes style quand on double click pour tout ramener ou encore quand on split l'item en plusieurs slot)
    Je te remercie beaucoup LeBossMax2 (Le problème venait bien qu'il manquait un packet pour confirmer la transaction, a moi à le sécuriser maintenant).
    Merci beaucoup ahah!