C# Message 226 et lootShare

Inscrit
4 Aout 2017
Messages
5
Reactions
0
#1
Bonjour à tous !

J'espère que je n'aurai pas le syndrome du "je viens d'envoyer le sujet et je résous le problème dans la minute qui suit" !

Je me suis récemment mis à parser les paquets et je m'intéresse actuellement au message 226 MapComplementaryInformationsDataMessage.
Plus précisément au moment d'extraire tout les GameRolePlayActorInformations. Si pour le personnage courant et le NPC sur la carte tout se passe bien, je bloque lorsqu'il s'agit d'un groupe de monstre (protocolId 160) : GameRolePlayGroupMonsterInformations.

Voici ma fonction qui déserialize :

C#:
        private void deserializeAs_GameRolePlayGroupMonsterInformations(BigEndianReader data) {
            base.deserialize(data);
            deserializeBytesBoxes(data);
            uint loc2 = data.ReadUShort();
            staticInfos = ProtocolTypeManager.getInstance<GroupMonsterStaticInformations>(loc2);
            staticInfos.deserialize(data);
            readCreationTime(data);
            readAgeBonusRate(data);
            readLootShare(data);
            readAlignmentSide(data);
        }

        private void readAlignmentSide(BigEndianReader data) {
            alignmentSide = data.ReadByte();
        }

        private void readLootShare(BigEndianReader data) {
            lootShare = data.ReadByte();
            if (lootShare < -1 || lootShare > 8)
                throw new Exception("GameRolePlayGroupMonsterInformations.lootShare :: Limit");
        }

        private void readAgeBonusRate(BigEndianReader data) {
            ageBonusRate = data.ReadInt();
            if (ageBonusRate < 0)
                throw new Exception("GameRolePlayGroupMonsterInformations.ageBonusRate :: Value can't be lower than 0");
        }

        private void readCreationTime(BigEndianReader data) {
            creationTime = data.ReadDouble();
            if (creationTime < 0 || creationTime > 9007199254740990)
                throw new Exception("GameRolePlayGroupMonsterInformations.creationTime :: Limit");
        }

        private void deserializeBytesBoxes(BigEndianReader data) {
            uint loc2 = data.ReadByte();
            keyRingBonus = BooleanByteWrapper.getFlag(loc2, 0);
            hasHardcoreDrop = BooleanByteWrapper.getFlag(loc2, 1);
            hasAVARewardToken = BooleanByteWrapper.getFlag(loc2, 2);
        }
Au niveau des monstres, je récupère l'ID du monstre principal et des secondaires (underlings) sans soucis, ils correspondent aux monstres dans le groupe.

readCreationTime(data) me renvoie 1502044055263.0 ce qui me semble correct après conversion.
readAgeBonusRate(data) me renvoie 1800000, sauf que j'ai pas trop trouvé d'information pour l’interprétation de cette valeur, si quelqu'un peut me donner une piste, je prends !
readLootShare(data) me renvoie... 255, donc l'exception est levée vu que cela doit être compris entre -1 et 8 inclus. D'ailleurs, à quoi sert cette variable et que peut-on en déduire lorsqu'elle renvoie une valeur juste ?

Je ne vois pas d'où ça peut venir, j'en déduis que l'erreur se localise après avoir déserializé les monstres (qui doit être juste après analyse des valeurs en débogage), mais en comparant avec les sources, je ne pige pas.

Merci à vous et bonne journée ! :)

Edit : j'ai essayé sur une map plus simple, sans NPC pour éviter de parse GameRolePlayNpcInformations et donc éliminer une source d'erreur de décalage, j'ai donc la même exception au même endroit pour la variable lootShare = 255...
 
Dernière édition:

neross

Membre Actif
Inscrit
20 Decembre 2014
Messages
150
Reactions
0
#2
Bonjour à tous !
readLootShare(data) me renvoie... 255, donc l'exception est levée vu que cela doit être compris entre -1 et 8 inclus. D'ailleurs, à quoi sert cette variable et que peut-on en
C'est ce qui te permet de calculer le nombre de pourcentage que te donne le groupe de monstre via ces étoiles, 10% = 1 étoile, que tu calcule grâce a :
C#:
Math.Min(200d, (DateTime.Now.DateTimeToUnixTimestamp() - CreationDate.DateTimeToUnixTimestamp()) / LootShare);
Apres pour ton décalage c'est bizarre voici ma méthode :

C#:
public override void Deserialize(IDataReader reader)
{

            base.Deserialize(reader);
            byte flag1 = reader.ReadByte();
            keyRingBonus = BooleanByteWrapper.GetFlag(flag1, 0);
            hasHardcoreDrop = BooleanByteWrapper.GetFlag(flag1, 1);
            hasAVARewardToken = BooleanByteWrapper.GetFlag(flag1, 2);
            staticInfos = ProtocolTypeManager.GetInstance<Types.GroupMonsterStaticInformations>(reader.ReadShort());
            staticInfos.Deserialize(reader);
            creationTime = reader.ReadDouble();
            if (creationTime < 0 || creationTime > 9.007199254740992E15)
                throw new System.Exception("Forbidden value on creationTime = " + creationTime + ", it doesn't respect the following condition : creationTime < 0 || creationTime > 9.007199254740992E15");
            ageBonusRate = reader.ReadInt();
            if (ageBonusRate < 0)
                throw new System.Exception("Forbidden value on ageBonusRate = " + ageBonusRate + ", it doesn't respect the following condition : ageBonusRate < 0");
            lootShare = reader.ReadSByte();
            if (lootShare < -1 || lootShare > 8)
                throw new System.Exception("Forbidden value on lootShare = " + lootShare + ", it doesn't respect the following condition : lootShare < -1 || lootShare > 8");
            alignmentSide = reader.ReadSByte();
          

}
 
Inscrit
4 Aout 2017
Messages
5
Reactions
0
#3
Salut !

Merci beaucoup ! L'erreur se situait au niveau de la fonction de lecture du byte, je faisais un ReadByte() alors qu'il s'agit d'un ReadSByte()... Ce qui est logique car on attend en effet éventuellement une valeur négative. Ça me renvoie -1 maintenant qui n'est pas considéré comme une erreur, je vais effectuer plusieurs tests par la suite.

Merci également pour les détails du lootShare. :D

Quelqu'un sait à quoi correspond ageBonusRate sinon ?
 

neross

Membre Actif
Inscrit
20 Decembre 2014
Messages
150
Reactions
0
#5
En faite hier soir je t'est dis de la merde. ^^'

Math.Min(200d, (DateTime.Now.DateTimeToUnixTimestamp() - CreationDate.DateTimeToUnixTimestamp()) / AgeBonusRate);

Le lootShare j'en est aucune idée. ^^
 

nowis13

Contributeur
Inscrit
11 Janvier 2015
Messages
22
Reactions
1
#6
Cela reste à tester mais lootShare c'est surement les butins des captures de boss modulaire.
 
Inscrit
4 Aout 2017
Messages
5
Reactions
0
#7
Yep ça doit bien correspondre à ça vu le -1 à 8.
 
Haut Bas