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 :
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...