From 8e9c92c5f336bde39a6b39b1adbc294679ec7ac9 Mon Sep 17 00:00:00 2001 From: AleaJactaEst Date: Thu, 30 Jul 2020 01:05:46 +0200 Subject: [PATCH] adding decoder PropVisual (VPA, VPB, VPC) --- spykhanat.py | 3 +- tools/CAction.py | 46 ++++++++- tools/PropVisual.py | 221 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 268 insertions(+), 2 deletions(-) create mode 100644 tools/PropVisual.py diff --git a/spykhanat.py b/spykhanat.py index 8118356..8589c83 100755 --- a/spykhanat.py +++ b/spykhanat.py @@ -879,7 +879,8 @@ class SpyPcap(): self.outyaml.write(" timestamp: %d\n" % (property['timestamp'])) for action in property['Actions']: try: - self.outyaml.write(" %s: %s\n" % (action.get_name(), str(action.value))) + action.print_yaml(self.outyaml, " ") + #self.outyaml.write(" %s: %s\n" % (action.get_name(), str(action.get_property()))) except AttributeError: # TODO - change print if CAtion is Position or other (and not CActionSint64) params = action.get_parameter() diff --git a/tools/CAction.py b/tools/CAction.py index 9f2b802..c334529 100644 --- a/tools/CAction.py +++ b/tools/CAction.py @@ -20,9 +20,12 @@ #from tools import Enum import logging +import struct +import math from tools import TPropIndex from tools import TPVPMode from tools import Enum +from tools import PropVisual LOGGER='CActionFactory' INVALID_SLOT = 0xff @@ -413,8 +416,9 @@ class CActionSint64(CAction): self.value = 0 self.NbBits = 64 self.NameProperty = 'None' + self.PropertyIndex = None self.PropertyToNbBit = { - TPropIndex.TPropIndex.PROPERTY_ORIENTATION: 32, + TPropIndex.TPropIndex.PROPERTY_ORIENTATION: 32, TPropIndex.TPropIndex.PROPERTY_SHEET: 52, TPropIndex.TPropIndex.PROPERTY_BEHAVIOUR: 48, TPropIndex.TPropIndex.PROPERTY_NAME_STRING_ID: 32, @@ -469,9 +473,49 @@ class CActionSint64(CAction): def setNbBits(self, propIndex, nameproperty): self.NbBits = PROPERTY_TO_NB_BIT[propIndex] self.NameProperty = nameproperty + self.PropertyIndex = propIndex self.set_name(nameproperty) logging.getLogger(LOGGER).debug("NameProperty:{1} NbBits:{0}".format(self.NbBits, self.NameProperty )) + def get_property(self): + ret = "" + if self.PropertyIndex == TPropIndex.TPropIndex.PROPERTY_ORIENTATION: + v1 = struct.pack('I', self.value) + angle = struct.unpack('. + +#from tools import Enum +#import logging +#import struct +#import math +#from tools import TPropIndex +#from tools import TPVPMode +#from tools import Enum + +LOGGER='PropVisual' + +# uint64 Sex : 1; // max: 2 current: 2 +# uint64 JacketModel : 8; // max: 256 current: 93 +# uint64 JacketColor : 3; // max: 8 current: 8 +# uint64 TrouserModel : 8; // max: 256 current: 104 +# uint64 TrouserColor : 3; // max: 8 current: 8 +# uint64 WeaponRightHand : 10; // max: 1024 current: 457 +# uint64 WeaponLeftHand : 8; // max: 256 current: 63 +# uint64 ArmModel : 8; // max: 256 current: 94 +# uint64 ArmColor : 3; // max: 8 current: 8 +# uint64 HatModel : 9; // max: 512 current: 192 +# uint64 HatColor : 3; // max: 8 current: 8 + +class PropVisualA: + # khanat-opennel-code/code/ryzom/common/src/game_share/player_visual_properties.h:32 struct SPropVisualA + def __init__(self): + self.Sex = 0 + self.JacketModel = 0 + self.JacketColor = 0 + self.TrouserModel = 0 + self.TrouserColor = 0 + self.WeaponRightHand = 0 + self.WeaponLeftHand = 0 + self.ArmModel = 0 + self.ArmColor = 0 + self.HatModel = 0 + self.HatColor = 0 + + def set_compress_data(self, value): + self.Sex = value & 1 + value >>= 1 + self.JacketModel = value & 0xff + value >>= 8 + self.JacketColor = value & 0x07 + value >>= 3 + self.TrouserModel = value & 0xff + value >>= 8 + self.TrouserColor = value & 0x07 + value >>= 3 + self.WeaponRightHand = value & 0x3ff + value >>= 10 + self.WeaponLeftHand = value & 0xff + value >>= 8 + self.ArmModel = value & 0xff + value >>= 8 + self.ArmColor = value & 0x07 + value >>= 3 + self.HatModel = value & 0x1ff + value >>= 9 + self.HatColor = value & 0x07 + value >>= 3 + + def print_yaml(self, outyaml, space): + outyaml.write("{0} sex: {1}\n".format(space, self.Sex)) + outyaml.write("{0} JacketModel: {1}\n".format(space, self.JacketModel)) + outyaml.write("{0} JacketColor: {1}\n".format(space, self.JacketColor)) + outyaml.write("{0} TrouserModel: {1}\n".format(space, self.TrouserModel)) + outyaml.write("{0} TrouserColor: {1}\n".format(space, self.TrouserColor)) + outyaml.write("{0} WeaponRightHand: {1}\n".format(space, self.WeaponRightHand)) + outyaml.write("{0} WeaponLeftHand: {1}\n".format(space, self.WeaponLeftHand)) + outyaml.write("{0} ArmModel: {1}\n".format(space, self.ArmModel)) + outyaml.write("{0} ArmColor: {1}\n".format(space, self.ArmColor)) + outyaml.write("{0} HatModel: {1}\n".format(space, self.HatModel)) + outyaml.write("{0} HatColor: {1}\n".format(space, self.HatColor)) + +# uint64 Name : 16; +# uint64 HandsModel : 9; // max: 512 current: 90 +# uint64 HandsColor : 3; // max: 8 current: 8 +# uint64 FeetModel : 9; // max: 512 current: 94 +# uint64 FeetColor : 3; // max: 8 current: 8 +# uint64 RTrail : 4; +# uint64 LTrail : 3; + +class PropVisualB: + # khanat-opennel-code/code/ryzom/common/src/game_share/player_visual_properties.h:105 struct SPropVisualB + def __init__(self): + self.Name = 0 + self.HandsModel = 0 + self.HandsColor = 0 + self.FeetModel = 0 + self.FeetColor = 0 + self.RTrail = 0 + self.LTrail = 0 + + def set_compress_data(self, value): + self.Name = value & 0xffff + value >>= 16 + self.HandsModel = value & 0x1ff + value >>= 9 + self.HandsColor = value & 0x07 + value >>= 3 + self.FeetModel = value & 0x1ff + value >>= 9 + self.FeetColor = value & 0x07 + value >>= 3 + self.RTrail = value & 0x0f + value >>= 4 + self.LTrail = value & 0x07 + value >>= 3 + + def print_yaml(self, outyaml, space): + outyaml.write("{0} Name: {1}\n".format(space, self.Name)) + outyaml.write("{0} HandsModel: {1}\n".format(space, self.HandsModel)) + outyaml.write("{0} HandsColor: {1}\n".format(space, self.HandsColor)) + outyaml.write("{0} FeetModel: {1}\n".format(space, self.FeetModel)) + outyaml.write("{0} FeetColor: {1}\n".format(space, self.FeetColor)) + outyaml.write("{0} RTrail: {1}\n".format(space, self.RTrail)) + outyaml.write("{0} LTrail: {1}\n".format(space, self.LTrail)) + +# uint64 MorphTarget1 : 3; // max: 8 current: 8 +# uint64 MorphTarget2 : 3; // max: 8 current: 8 +# uint64 MorphTarget3 : 3; // max: 8 current: 8 +# uint64 MorphTarget4 : 3; // max: 8 current: 8 +# uint64 MorphTarget5 : 3; // max: 8 current: 8 +# uint64 MorphTarget6 : 3; // max: 8 current: 8 +# uint64 MorphTarget7 : 3; // max: 8 current: 8 +# uint64 MorphTarget8 : 3; // max: 8 current: 8 +# uint64 EyesColor : 3; // max: 8 current: 8 +# uint64 Tattoo : 7; // max: 128 current: 64 +# uint64 CharacterHeight : 4; // max: 16 current: 16 +# uint64 TorsoWidth : 4; // max: 16 current: 16 +# uint64 ArmsWidth : 4; // max: 16 current: 16 +# uint64 LegsWidth : 4; // max: 16 current: 16 +# uint64 BreastSize : 4; // max: 16 current: 16 + +class PropVisualC: + # khanat-opennel-code/code/ryzom/common/src/game_share/player_visual_properties.h:163 struct SPropVisualC + def __init__(self): + self.MorphTarget1 = 0 + self.MorphTarget2 = 0 + self.MorphTarget3 = 0 + self.MorphTarget4 = 0 + self.MorphTarget5 = 0 + self.MorphTarget6 = 0 + self.MorphTarget7 = 0 + self.MorphTarget8 = 0 + self.EyesColor = 0 + self.Tattoo = 0 + self.CharacterHeight = 0 + self.TorsoWidth = 0 + self.ArmsWidth = 0 + self.LegsWidth = 0 + self.BreastSize = 0 + + def set_compress_data(self, value): + self.MorphTarget1 = value & 0x07 + value >>= 3 + self.MorphTarget2 = value & 0x07 + value >>= 3 + self.MorphTarget3 = value & 0x07 + value >>= 3 + self.MorphTarget4 = value & 0x07 + value >>= 3 + self.MorphTarget5 = value & 0x07 + value >>= 3 + self.MorphTarget6 = value & 0x07 + value >>= 3 + self.MorphTarget7 = value & 0x07 + value >>= 3 + self.MorphTarget8 = value & 0x07 + value >>= 3 + self.EyesColor = value & 0x07 + value >>= 3 + self.Tattoo = value & 0x7f + value >>= 7 + self.CharacterHeight = value & 0x0f + value >>= 4 + self.TorsoWidth = value & 0x0f + value >>= 4 + self.ArmsWidth = value & 0x0f + value >>= 4 + self.LegsWidth = value & 0x0f + value >>= 4 + self.BreastSize = value & 0x0f + value >>= 4 + + def print_yaml(self, outyaml, space): + outyaml.write("{0} MorphTarget1: {1}\n".format(space, self.MorphTarget1)) + outyaml.write("{0} MorphTarget2: {1}\n".format(space, self.MorphTarget2)) + outyaml.write("{0} MorphTarget3: {1}\n".format(space, self.MorphTarget3)) + outyaml.write("{0} MorphTarget4: {1}\n".format(space, self.MorphTarget4)) + outyaml.write("{0} MorphTarget5: {1}\n".format(space, self.MorphTarget5)) + outyaml.write("{0} MorphTarget6: {1}\n".format(space, self.MorphTarget6)) + outyaml.write("{0} MorphTarget7: {1}\n".format(space, self.MorphTarget7)) + outyaml.write("{0} MorphTarget8: {1}\n".format(space, self.MorphTarget8)) + outyaml.write("{0} EyesColor: {1}\n".format(space, self.EyesColor)) + outyaml.write("{0} Tattoo: {1}\n".format(space, self.Tattoo)) + outyaml.write("{0} CharacterHeight: {1}\n".format(space, self.CharacterHeight)) + outyaml.write("{0} TorsoWidth: {1}\n".format(space, self.TorsoWidth)) + outyaml.write("{0} ArmsWidth: {1}\n".format(space, self.ArmsWidth)) + outyaml.write("{0} LegsWidth: {1}\n".format(space, self.LegsWidth)) + outyaml.write("{0} BreastSize: {1}\n".format(space, self.BreastSize))