Perdu avec les paquets et NBT tags



  • Salut,

    J'essaye de faire un panneau avec un GUI pour configurer le signe visible dessus (avec une variable dans le tile), et je n'arrive plus à enregistrer les modifications dans le tileEntity.
    À un moment ça a marché à moitié, quand ma variable valait entre 0 et 2 ça sauvegardait bien, par contre à 3 ça mettait 2 et à 4 ça mettait 0, incompréhensible comme problème pour moi. Et là ça ne sauvegarde plus, ça revient à 0 quand je relance le monde. J'ai du changer quelque chose mais je ne vois pas quoi.
    Le GUI marche, la variable change bien quand je clique sur mes boutons. C'est un GUI sans inventory vu que le joueur n'a pas besoin d'utiliser de blocks ou items dedans.

    Voilà les classes concernées par le tileEntity, le GUI et le paquet:
    (note: le code n'est pas encore complet pour l'affichage du panneau en fonction des variables, j'essaye de régler ce problème avant)

    Je viens de passer ma journée entière dessus et là je suis vraiment à bout, à tous les coups c'est encore un truc tout con qui passe sous mes yeux mais je ne trouve pas... Du coup je m'en remets à vous.

    J'en profite au passage pour demander comment faire tourner un ISBRH avec la fonction glRotatef sans que ça ne tourne le chunk entier, mes tentatives ont pour l'instant été des échecs.

    Merci d'avance :)</packetsigntype,>


  • Administrateurs

    " ctx.getServerHandler().playerEntity.worldObj.markBlockForUpdate(message.tileX, message.tileY, message.tileZ);"
    Pourquoi faire un markBlockForUpdate ici alors que ta fonction setSignType en fait déjà un ?

    if(parButton == buttonQuit)
    ->
    if(parButton.id == 0)
    c'est plus optimisé comme ça.

    Par contre je ne comprends pas pourquoi ça ne fonctionne pas comme il faut. Car il n'y a aucune erreur. Faudrait ajouter des System.out.println(signType) aux différents endroit où tu modifies sa valeur.

    J'en profite au passage pour demander comment faire tourner un ISBRH avec la fonction glRotatef sans que ça ne tourne le chunk entier, mes tentatives ont pour l'instant été des échecs.

    Tu ne peux pas. L'ISBRH n'est pas conçu pour une utilisation directe d'openGL.


  • Modérateurs

    Il est possible de faire les rotations mais avant le rendu, il va falloir ajouter:

    GLStateManager.pushMatrix();
    

    puis effectuer la rotation ainsi:

    GLStateManager.rotate(tonAngleEnRadians, x, y, z);
    

    Et à la fin du rendu, ajoute:

    GLStateManager.popMatrix();
    

    pushMatrix() et popMatrix permettent de sauvegarder "l'état actuel" des transformations afin d'ajouter les siennes sans mettre en l'air le reste. (en gros)

    Voir ce lien pour plus d'infos (anglais)
    http://docs.gl/gl2/glPushMatrix


  • Administrateurs

    Ah oui j'avais complètement oublié qu'en ouvrant une nouvelle matrice on peut le faire.



  • Merci pour la rotation, je verrais ça une fois mon problème résolu.

    Oui bien vu pour le MarkBlock, j'avais oublié de l'enlever à cet endroit. Et si l'id est mieux pour les boutons, je change 😉

    J'ai mis un println un peu partout et j'ai remarqué que la fonction writeToNBT est appelée plein de fois d'un coup, de manière aléatoire quand je clique sur un panneau pour accéder au GUI. Parfois, ça l’appelle une dizaine de fois sans rien faire, juste en me déplaçant.

    Aaah j'ai surement trouvé pourquoi ça foire. J'avais posé des panneaux à un moment, qui avaient leur tileEntity associé, et en réorganisant mon code j'ai changé leur nom interne ce qui fait que Minecraft ne les a plus reconnu à un moment. Il les a donc supprimés… mais probablement pas retiré les entités associées... Et du coup le nombre de fois que writeToNBT est appelé correspond à toutes les entités, y compris celles des panneaux disparus. Et le tileEntity du panneau était raté en plus avant que je change mon code. Sur une nouvelle map, les panneaux ont l'air de fonctionner correctement.
    J'aurai pensé que Minecraft retirerai les entités en supprimant les blocs manquants... Je me demande si on peut avoir une liste des tileEntities d'une map tiens.

    Bon à confirmer mais ça a l'air de correspondre au problème donc je pense que c'est à cause de ça.


  • Administrateurs

    @'KillerMapper':

    Je me demande si on peut avoir une liste des tileEntities d'une map tiens.

    world.loadedTileEntityList



  • Bon ça a l'air de remarcher, bien que parfois ça ne sauvegarde pas les données (pourtant mes println apparaissent bien), visiblement c'est quand ma variable direction vaut autre chose que 0. Du coup je vais voir pour les rotations. GLStateManager n'existe pas en 1.7 il me semble, je crois que c'est depuis la 1.8 seulement…

    Edit: faut passer par GL11 au lieu de GLStateManager. Mais je n'arrive pas à faire tourner quoi que ce soif sauf le chunk entier si j'enlève le push et le pop.


  • Modérateurs

    Désolé je n'avais pas vu la version ^^'

    Peux-tu envoyer un extrait de ton code de rendu pour que l'on puisse voir le problème pour la rotation.



  • Le voici:

    J'ai aussi demandé sur le forum minecraftforge.net, on me dit que l'ISBRH ne peut pas être tourné avec glRotatef.
    Si vous n'avez pas d'idée de votre côté, je vais juste me faire les 3 rotations à la main, tant pis ^^


  • Modérateurs

    Désolé pour le retard de la réponse mais ça me parait bizarre que l'on puisse pas le tourner dans l'ISBRH…
    Mais si tu y arrives pas va effectivement tout faire à la main 😕

    Sent from my GT-I9000 using Tapatalk 2