Petit problème Syncro ExtProp HashSet
-
Salut,
Le problème vient de ton paquet, la boucle qui fait la lecture ne fait rien car handicaps est null.
Il faudrait plutôt faire comme ça :@Override public void fromBytes(ByteBuf buf) { int size = buf.readInt() handicaps = new HashSet<string>(); for(int i = 0; i < size; i++) { this.handicaps.add(ByteBufUtils.readUTF8String(buf)); } } @Override public void toBytes(ByteBuf buf) { buf.writeInt(handicaps.size()); for(String current : handicaps) { ByteBufUtils.writeUTF8String(buf, current); } } ```</string> -
Ce que je ne comprends pas, c’est que la variable handicaps est initialisée dans le constructeur, pourquoi faut-il le refaire encore une fois dans fromBytes() ??
-
Elle est initialisé dans le constructeur public PacketUpdateHandicap(Set <string>handicaps), ce constructeur est utilisé pour l’envoie du paquet.
à la réception du paquet c’est le constructeur public PacketUpdateHandicap() qui est utilisé (d’où la nécessité d’avoir toujours un constructeur vide).
Lors de la réception les données n’ont pas encore été lu, donc forcement il ne connait pas encore les variables.
Les variables prennent leurs valeurs lorsque la méthode fromBytes est lu.</string> -
Merci je comprends mieux. Pour le moment ça fixe le bug des valeurs non changeantes, mais désormais le client a toujours une valeur opposée à celle du serveur. Genre quand mon client est à true, le serveur est à false, et le coup prochain, c’est le contraire

C’est à croire que la méthode sync() fait mal son boulot, ou encore que le packet a des handlers buggués ?
Dans chaque handler, je redéfinis à la fin le set de l’ExtProp avec celui reçu dans mon message, est-ce le bon moyen ou aurais-je dû faire autrement ?? -
Peux-tu envoyer le paquet qui gère les booleans ? Car dans le paquet tu as envoyé il n’y a que le set qui est synchronisé.
-
En fait il n’y a pas de packet boolean, si tu regardes bien mon println dans mon EventHandler, LivingUpdateEvent. Je fais juste un petit if(props.hasSpecificHandicap(maEnumValue)).
Du coup si le packet avec la HashSet avait bien fonctionné, le client et le serveur seraient censés avoir tous les deux cet objet dans handicaps, ce qui n’est le cas que 1 fois sur 2
-
Ah oui d’accord.
Je croyais que tu parlais des boolean agilityState, strengthState etc …Faudrait afficher le contenu de ta liste à différent endroit (à la fin de l’handler après avoir reçu le paquet, avant d’envoyer le paquet, etc …) pour trouver vers où est le souci.
-
Okay je vais bien debug cet aprèm, et je te renverrai les logs.
-
Rebonjour, le problème a l’air corrigé car si je rightclick avec un custom item changeant à chaque fois le contenu de HashSet, eh bien la console m’indique de bons résultats.
Bref je passe en résolue, mais j’en profite également pour poser 2 petites questions à part, histoire de ne pas recréer 2 topics différents de 3 messages chacun ^^’1)Pourquoi la variable EntityPlayer#iteminUseCount, n’est-elle pas enregistrée dans les tags du joueur, alors qu’elle est bien unique pour chacun d’entres-eux ?
2)Je viens de créer un projectile possédant un delay de 3 sec’s avant d’exploser, je l’ai bien enregistré via EntityRegistry.registerModEntity, idem pour son rendu, mais quand je le lance et que je déco/reco de la map, il disparaît comme si il n’avait jamais été lancé
Sauriez-vous par hasard d’où cela peut venir ??
Merci d’avance
-
-
Car ça serait inutile ? Enregistrer une variable dans un tag nbt permet de l’enregistrer sur le disque et donc de ne pas la perdre lorsqu’elle est supprimé de la ram (principalement quand le serveur / client est coupé). Aucun intérêt à rendre iteminUseCount persistant.
-
tu le lances bien côté serveur ?
-