From 0d24ae9f78e7a6314fe79e285566e6ad82dd1622 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 04 九月 2024 11:38:23 +0800
Subject: [PATCH] 10258 【越南】【砍树】新增古宝特殊效果(增加法器每X阶+xx属性)

---
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 4998 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 4,792 insertions(+), 206 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index ee24a33..09acf79 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -424,6 +424,190 @@
 
 
 #------------------------------------------------------
+# A0 08 玩家记录信息 #tagGCPlayerRecInfo
+
+class  tagGCPlayerRec(Structure):
+    Time = 0    #(DWORD Time)//时间
+    Value1 = 0    #(DWORD Value1)//值1
+    Value2 = 0    #(DWORD Value2)//值2
+    Value3 = 0    #(DWORD Value3)//值3
+    Value4 = 0    #(DWORD Value4)//值4
+    Value5 = 0    #(DWORD Value5)//值5
+    Value6 = 0    #(DWORD Value6)//值6
+    Value7 = 0    #(DWORD Value7)//值7
+    Value8 = 0    #(DWORD Value8)//值8
+    UserDataLen = 0    #(WORD UserDataLen)//扩展数据长度
+    UserData = ""    #(String UserData)//扩展数据
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.Time,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value3,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value4,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value5,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value6,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value7,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value8,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.UserDataLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.UserData,_pos = CommFunc.ReadString(_lpData, _pos,self.UserDataLen)
+        return _pos
+
+    def Clear(self):
+        self.Time = 0
+        self.Value1 = 0
+        self.Value2 = 0
+        self.Value3 = 0
+        self.Value4 = 0
+        self.Value5 = 0
+        self.Value6 = 0
+        self.Value7 = 0
+        self.Value8 = 0
+        self.UserDataLen = 0
+        self.UserData = ""
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 2
+        length += len(self.UserData)
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.Time)
+        data = CommFunc.WriteDWORD(data, self.Value1)
+        data = CommFunc.WriteDWORD(data, self.Value2)
+        data = CommFunc.WriteDWORD(data, self.Value3)
+        data = CommFunc.WriteDWORD(data, self.Value4)
+        data = CommFunc.WriteDWORD(data, self.Value5)
+        data = CommFunc.WriteDWORD(data, self.Value6)
+        data = CommFunc.WriteDWORD(data, self.Value7)
+        data = CommFunc.WriteDWORD(data, self.Value8)
+        data = CommFunc.WriteWORD(data, self.UserDataLen)
+        data = CommFunc.WriteString(data, self.UserDataLen, self.UserData)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Time:%d,
+                                Value1:%d,
+                                Value2:%d,
+                                Value3:%d,
+                                Value4:%d,
+                                Value5:%d,
+                                Value6:%d,
+                                Value7:%d,
+                                Value8:%d,
+                                UserDataLen:%d,
+                                UserData:%s
+                                '''\
+                                %(
+                                self.Time,
+                                self.Value1,
+                                self.Value2,
+                                self.Value3,
+                                self.Value4,
+                                self.Value5,
+                                self.Value6,
+                                self.Value7,
+                                self.Value8,
+                                self.UserDataLen,
+                                self.UserData
+                                )
+        return DumpString
+
+
+class  tagGCPlayerRecInfo(Structure):
+    Head = tagHead()
+    Type = 0    #(BYTE Type)//类型
+    Count = 0    #(WORD Count)//数量
+    PlayerRecList = list()    #(vector<tagGCPlayerRec> PlayerRecList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA0
+        self.Head.SubCmd = 0x08
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        for i in range(self.Count):
+            temPlayerRecList = tagGCPlayerRec()
+            _pos = temPlayerRecList.ReadData(_lpData, _pos)
+            self.PlayerRecList.append(temPlayerRecList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA0
+        self.Head.SubCmd = 0x08
+        self.Type = 0
+        self.Count = 0
+        self.PlayerRecList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 2
+        for i in range(self.Count):
+            length += self.PlayerRecList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.Type)
+        data = CommFunc.WriteWORD(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.PlayerRecList[i].GetLength(), self.PlayerRecList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                Type:%d,
+                                Count:%d,
+                                PlayerRecList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.Type,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCPlayerRecInfo=tagGCPlayerRecInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCPlayerRecInfo.Head.Cmd,m_NAtagGCPlayerRecInfo.Head.SubCmd))] = m_NAtagGCPlayerRecInfo
+
+
+#------------------------------------------------------
 # A0 06 服务器地图线路人数状态 #tagGCPyServerMapState
 
 class  tagGCPyServerMapLineState(Structure):
@@ -4451,9 +4635,17 @@
     Type2 = 0    #(BYTE Type2)//附加类型,用来表示排序对象的类型,比如,玩家所属职业门派,宠物类型等
     Value1 = 0    #(DWORD Value1)//排序依赖的值,比如,等级
     Value2 = 0    #(DWORD Value2)//排序依赖的值,比如,战斗力
+    Value3 = 0    #(DWORD Value3)//附加值
+    Value4 = 0    #(DWORD Value4)//附加值
+    Value5 = 0    #(DWORD Value5)//附加值
+    Value6 = 0    #(DWORD Value6)//附加值
+    Value7 = 0    #(DWORD Value7)//附加值
+    Value8 = 0    #(DWORD Value8)//附加值
     CmpValue = 0    #(DWORD CmpValue)// 比较权值
     CmpValue2 = 0    #(DWORD CmpValue2)// 比较权值
     CmpValue3 = 0    #(DWORD CmpValue3)// 比较权值
+    DataLen = 0    #(WORD DataLen)
+    UserData = ""    #(String UserData)//附加
     data = None
 
     def __init__(self):
@@ -4470,9 +4662,17 @@
         self.Type2,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.Value2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value3,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value4,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value5,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value6,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value7,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value8,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.CmpValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.CmpValue2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.CmpValue3,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.DataLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.UserData,_pos = CommFunc.ReadString(_lpData, _pos,self.DataLen)
         return _pos
 
     def Clear(self):
@@ -4484,9 +4684,17 @@
         self.Type2 = 0
         self.Value1 = 0
         self.Value2 = 0
+        self.Value3 = 0
+        self.Value4 = 0
+        self.Value5 = 0
+        self.Value6 = 0
+        self.Value7 = 0
+        self.Value8 = 0
         self.CmpValue = 0
         self.CmpValue2 = 0
         self.CmpValue3 = 0
+        self.DataLen = 0
+        self.UserData = ""
         return
 
     def GetLength(self):
@@ -4502,6 +4710,14 @@
         length += 4
         length += 4
         length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 2
+        length += len(self.UserData)
 
         return length
 
@@ -4515,9 +4731,17 @@
         data = CommFunc.WriteBYTE(data, self.Type2)
         data = CommFunc.WriteDWORD(data, self.Value1)
         data = CommFunc.WriteDWORD(data, self.Value2)
+        data = CommFunc.WriteDWORD(data, self.Value3)
+        data = CommFunc.WriteDWORD(data, self.Value4)
+        data = CommFunc.WriteDWORD(data, self.Value5)
+        data = CommFunc.WriteDWORD(data, self.Value6)
+        data = CommFunc.WriteDWORD(data, self.Value7)
+        data = CommFunc.WriteDWORD(data, self.Value8)
         data = CommFunc.WriteDWORD(data, self.CmpValue)
         data = CommFunc.WriteDWORD(data, self.CmpValue2)
         data = CommFunc.WriteDWORD(data, self.CmpValue3)
+        data = CommFunc.WriteWORD(data, self.DataLen)
+        data = CommFunc.WriteString(data, self.DataLen, self.UserData)
         return data
 
     def OutputString(self):
@@ -4530,9 +4754,17 @@
                                 Type2:%d,
                                 Value1:%d,
                                 Value2:%d,
+                                Value3:%d,
+                                Value4:%d,
+                                Value5:%d,
+                                Value6:%d,
+                                Value7:%d,
+                                Value8:%d,
                                 CmpValue:%d,
                                 CmpValue2:%d,
-                                CmpValue3:%d
+                                CmpValue3:%d,
+                                DataLen:%d,
+                                UserData:%s
                                 '''\
                                 %(
                                 self.OrderIndex,
@@ -4543,16 +4775,24 @@
                                 self.Type2,
                                 self.Value1,
                                 self.Value2,
+                                self.Value3,
+                                self.Value4,
+                                self.Value5,
+                                self.Value6,
+                                self.Value7,
+                                self.Value8,
                                 self.CmpValue,
                                 self.CmpValue2,
-                                self.CmpValue3
+                                self.CmpValue3,
+                                self.DataLen,
+                                self.UserData
                                 )
         return DumpString
 
 
 class  tagPYBillboardData(Structure):
     Head = tagHead()
-    IsWatchSelf = 0    #(BYTE IsWatchSelf)
+    WatchID = 0    #(DWORD WatchID)//查看指定ID名次前后,如玩家ID、家族ID等
     BillboardCount = 0    #(BYTE BillboardCount)
     Type = 0    #(BYTE Type)//排行榜类型
     Billboard = list()    #(vector<tagPYBillboardInfo> Billboard)//size = BillboardCount
@@ -4567,7 +4807,7 @@
     def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
         _pos = self.Head.ReadData(_lpData, _pos)
-        self.IsWatchSelf,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.WatchID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.BillboardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.BillboardCount):
@@ -4581,7 +4821,7 @@
         self.Head.Clear()
         self.Head.Cmd = 0xA9
         self.Head.SubCmd = 0xA2
-        self.IsWatchSelf = 0
+        self.WatchID = 0
         self.BillboardCount = 0
         self.Type = 0
         self.Billboard = list()
@@ -4590,7 +4830,7 @@
     def GetLength(self):
         length = 0
         length += self.Head.GetLength()
-        length += 1
+        length += 4
         length += 1
         length += 1
         for i in range(self.BillboardCount):
@@ -4601,7 +4841,7 @@
     def GetBuffer(self):
         data = ''
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.IsWatchSelf)
+        data = CommFunc.WriteDWORD(data, self.WatchID)
         data = CommFunc.WriteBYTE(data, self.BillboardCount)
         data = CommFunc.WriteBYTE(data, self.Type)
         for i in range(self.BillboardCount):
@@ -4611,14 +4851,14 @@
     def OutputString(self):
         DumpString = '''
                                 Head:%s,
-                                IsWatchSelf:%d,
+                                WatchID:%d,
                                 BillboardCount:%d,
                                 Type:%d,
                                 Billboard:%s
                                 '''\
                                 %(
                                 self.Head.OutputString(),
-                                self.IsWatchSelf,
+                                self.WatchID,
                                 self.BillboardCount,
                                 self.Type,
                                 "..."
@@ -8459,6 +8699,213 @@
 
 
 #------------------------------------------------------
+# B0 20 膜拜信息列表 #tagGCWorshipInfoList
+
+class  tagGCWorshipInfo(Structure):
+    PlayerID = 0    #(DWORD PlayerID)// 目标玩家ID
+    WorshipType = 0    #(BYTE WorshipType)// 膜拜类型
+    WorshipValue = 0    #(DWORD WorshipValue)// 膜拜类型对应的功能值,如名次或其他,由具体膜拜类型定义对应值含义
+    InfoLen = 0    #(WORD InfoLen)
+    PlayerInfo = ""    #(String PlayerInfo)// 玩家信息{k:v, ...}
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.WorshipType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.WorshipValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.InfoLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PlayerInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.InfoLen)
+        return _pos
+
+    def Clear(self):
+        self.PlayerID = 0
+        self.WorshipType = 0
+        self.WorshipValue = 0
+        self.InfoLen = 0
+        self.PlayerInfo = ""
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        length += 4
+        length += 2
+        length += len(self.PlayerInfo)
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.WorshipType)
+        data = CommFunc.WriteDWORD(data, self.WorshipValue)
+        data = CommFunc.WriteWORD(data, self.InfoLen)
+        data = CommFunc.WriteString(data, self.InfoLen, self.PlayerInfo)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                PlayerID:%d,
+                                WorshipType:%d,
+                                WorshipValue:%d,
+                                InfoLen:%d,
+                                PlayerInfo:%s
+                                '''\
+                                %(
+                                self.PlayerID,
+                                self.WorshipType,
+                                self.WorshipValue,
+                                self.InfoLen,
+                                self.PlayerInfo
+                                )
+        return DumpString
+
+
+class  tagGCWorshipInfoList(Structure):
+    Head = tagHead()
+    WorshipCount = 0    #(BYTE WorshipCount)
+    WorshipInfoList = list()    #(vector<tagGCWorshipInfo> WorshipInfoList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB0
+        self.Head.SubCmd = 0x20
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.WorshipCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.WorshipCount):
+            temWorshipInfoList = tagGCWorshipInfo()
+            _pos = temWorshipInfoList.ReadData(_lpData, _pos)
+            self.WorshipInfoList.append(temWorshipInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB0
+        self.Head.SubCmd = 0x20
+        self.WorshipCount = 0
+        self.WorshipInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.WorshipCount):
+            length += self.WorshipInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.WorshipCount)
+        for i in range(self.WorshipCount):
+            data = CommFunc.WriteString(data, self.WorshipInfoList[i].GetLength(), self.WorshipInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                WorshipCount:%d,
+                                WorshipInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.WorshipCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCWorshipInfoList=tagGCWorshipInfoList()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCWorshipInfoList.Head.Cmd,m_NAtagGCWorshipInfoList.Head.SubCmd))] = m_NAtagGCWorshipInfoList
+
+
+#------------------------------------------------------
+# B0 21 膜拜结果 #tagGCWorshipResult
+
+class  tagGCWorshipResult(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("PlayerID", c_int),    # 目标玩家ID
+                  ("WorshipType", c_ubyte),    # 膜拜类型
+                  ("WorshipValue", c_int),    # 膜拜类型对应的功能值,如名次或其他,由具体膜拜类型定义对应值含义
+                  ("Result", c_ubyte),    # 膜拜结果:0-成功;1-不存在该膜拜类型;2-不存在该目标膜拜;3-不能膜拜该目标;
+                  ("MoneyType", c_ubyte),    # 货币类型
+                  ("MoneyValue", c_int),    # 货币奖励
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB0
+        self.SubCmd = 0x21
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB0
+        self.SubCmd = 0x21
+        self.PlayerID = 0
+        self.WorshipType = 0
+        self.WorshipValue = 0
+        self.Result = 0
+        self.MoneyType = 0
+        self.MoneyValue = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagGCWorshipResult)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B0 21 膜拜结果 //tagGCWorshipResult:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                PlayerID:%d,
+                                WorshipType:%d,
+                                WorshipValue:%d,
+                                Result:%d,
+                                MoneyType:%d,
+                                MoneyValue:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.PlayerID,
+                                self.WorshipType,
+                                self.WorshipValue,
+                                self.Result,
+                                self.MoneyType,
+                                self.MoneyValue
+                                )
+        return DumpString
+
+
+m_NAtagGCWorshipResult=tagGCWorshipResult()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCWorshipResult.Cmd,m_NAtagGCWorshipResult.SubCmd))] = m_NAtagGCWorshipResult
+
+
+#------------------------------------------------------
 #B3 03 询问是否允许添加好友#tagGCFriendAskIfJoin
 
 class  tagGCFriendAskIfJoin(Structure):
@@ -9272,6 +9719,66 @@
 
 m_NAtagGCPlayerCharmValueInfo=tagGCPlayerCharmValueInfo()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCPlayerCharmValueInfo.Cmd,m_NAtagGCPlayerCharmValueInfo.SubCmd))] = m_NAtagGCPlayerCharmValueInfo
+
+
+#------------------------------------------------------
+# B3 15 相关玩家在线状态变更同步 #tagGCRelatedPlayerOnlineState
+
+class  tagGCRelatedPlayerOnlineState(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("PlayerID", c_int),    # 相关玩家ID
+                  ("OfflineValue", c_int),    # 离线值:0-在线;1-离线;>1-上次离线时间戳,可用于计算离线多久了;当取不到玩家信息时用1代表已离线;
+                  ("IsCross", c_ubyte),    # 是否跨服同步的,如果是跨服则离线时间计算时要取跨服服务器时间
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB3
+        self.SubCmd = 0x15
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB3
+        self.SubCmd = 0x15
+        self.PlayerID = 0
+        self.OfflineValue = 0
+        self.IsCross = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagGCRelatedPlayerOnlineState)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B3 15 相关玩家在线状态变更同步 //tagGCRelatedPlayerOnlineState:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                PlayerID:%d,
+                                OfflineValue:%d,
+                                IsCross:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.PlayerID,
+                                self.OfflineValue,
+                                self.IsCross
+                                )
+        return DumpString
+
+
+m_NAtagGCRelatedPlayerOnlineState=tagGCRelatedPlayerOnlineState()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCRelatedPlayerOnlineState.Cmd,m_NAtagGCRelatedPlayerOnlineState.SubCmd))] = m_NAtagGCRelatedPlayerOnlineState
 
 
 #------------------------------------------------------
@@ -12124,6 +12631,861 @@
 
 
 #------------------------------------------------------
+# B9 23 功能队伍解散 #tagGCFuncTeamDissolve
+
+class  tagGCFuncTeamDissolve(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("TeamID", c_int),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB9
+        self.SubCmd = 0x23
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB9
+        self.SubCmd = 0x23
+        self.TeamID = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagGCFuncTeamDissolve)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B9 23 功能队伍解散 //tagGCFuncTeamDissolve:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                TeamID:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.TeamID
+                                )
+        return DumpString
+
+
+m_NAtagGCFuncTeamDissolve=tagGCFuncTeamDissolve()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFuncTeamDissolve.Cmd,m_NAtagGCFuncTeamDissolve.SubCmd))] = m_NAtagGCFuncTeamDissolve
+
+
+#------------------------------------------------------
+# B9 22 功能队伍列表 #tagGCFuncTeamList
+
+class  tagGCFuncTeamMem(Structure):
+    ServerID = 0    #(DWORD ServerID)
+    PlayerID = 0    #(DWORD PlayerID)
+    NameLen = 0    #(BYTE NameLen)
+    Name = ""    #(String Name)// 玩家名,size = NameLen
+    LV = 0    #(WORD LV)// 玩家等级
+    Job = 0    #(BYTE Job)// 玩家职业
+    RealmLV = 0    #(WORD RealmLV)// 玩家境界
+    FightPower = 0    #(DWORD FightPower)// 战力,求余亿
+    FightPowerEx = 0    #(DWORD FightPowerEx)// 战力,整除亿
+    Value1 = 0    #(DWORD Value1)//值1
+    Value2 = 0    #(DWORD Value2)//值2
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.ServerID = 0
+        self.PlayerID = 0
+        self.NameLen = 0
+        self.Name = ""
+        self.LV = 0
+        self.Job = 0
+        self.RealmLV = 0
+        self.FightPower = 0
+        self.FightPowerEx = 0
+        self.Value1 = 0
+        self.Value2 = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 4
+        length += 1
+        length += len(self.Name)
+        length += 2
+        length += 1
+        length += 2
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.ServerID)
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.Name)
+        data = CommFunc.WriteWORD(data, self.LV)
+        data = CommFunc.WriteBYTE(data, self.Job)
+        data = CommFunc.WriteWORD(data, self.RealmLV)
+        data = CommFunc.WriteDWORD(data, self.FightPower)
+        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
+        data = CommFunc.WriteDWORD(data, self.Value1)
+        data = CommFunc.WriteDWORD(data, self.Value2)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                ServerID:%d,
+                                PlayerID:%d,
+                                NameLen:%d,
+                                Name:%s,
+                                LV:%d,
+                                Job:%d,
+                                RealmLV:%d,
+                                FightPower:%d,
+                                FightPowerEx:%d,
+                                Value1:%d,
+                                Value2:%d
+                                '''\
+                                %(
+                                self.ServerID,
+                                self.PlayerID,
+                                self.NameLen,
+                                self.Name,
+                                self.LV,
+                                self.Job,
+                                self.RealmLV,
+                                self.FightPower,
+                                self.FightPowerEx,
+                                self.Value1,
+                                self.Value2
+                                )
+        return DumpString
+
+
+class  tagGCFuncTeam(Structure):
+    TeamID = 0    #(DWORD TeamID)
+    CreateTime = 0    #(DWORD CreateTime)//创建队伍时间戳
+    FuncMapEx = 0    #(DWORD FuncMapEx)//功能地图扩展,如不同的层级
+    NameLen = 0    #(BYTE NameLen)
+    TeamName = ""    #(String TeamName)//队伍名称
+    CaptainID = 0    #(DWORD CaptainID)//队长ID,队伍ServerID直接取队长的ServerID
+    MinLV = 0    #(WORD MinLV)//最低等级限制
+    MinFightPower = 0    #(DWORD MinFightPower)//最低战力限制,求余亿
+    MinFightPowerEx = 0    #(DWORD MinFightPowerEx)//最低战力限制,整除亿
+    ServerOnly = 0    #(BYTE ServerOnly)//是否仅本服玩家可加入,0-否,1-是
+    NeedCheck = 0    #(BYTE NeedCheck)//是否需要审核
+    Value1 = 0    #(DWORD Value1)//值1
+    Value2 = 0    #(DWORD Value2)//值2
+    MemberCount = 0    #(BYTE MemberCount)
+    MemberList = list()    #(vector<tagGCFuncTeamMem> MemberList)// 成员列表
+    ApplyCount = 0    #(WORD ApplyCount)
+    ApplyIDList = list()    #(vector<DWORD> ApplyIDList)// 申请玩家ID列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.TeamID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CreateTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FuncMapEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TeamName,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.CaptainID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MinLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.MinFightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MinFightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ServerOnly,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.NeedCheck,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MemberCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.MemberCount):
+            temMemberList = tagGCFuncTeamMem()
+            _pos = temMemberList.ReadData(_lpData, _pos)
+            self.MemberList.append(temMemberList)
+        self.ApplyCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        for i in range(self.ApplyCount):
+            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+            self.ApplyIDList.append(value)
+        return _pos
+
+    def Clear(self):
+        self.TeamID = 0
+        self.CreateTime = 0
+        self.FuncMapEx = 0
+        self.NameLen = 0
+        self.TeamName = ""
+        self.CaptainID = 0
+        self.MinLV = 0
+        self.MinFightPower = 0
+        self.MinFightPowerEx = 0
+        self.ServerOnly = 0
+        self.NeedCheck = 0
+        self.Value1 = 0
+        self.Value2 = 0
+        self.MemberCount = 0
+        self.MemberList = list()
+        self.ApplyCount = 0
+        self.ApplyIDList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 4
+        length += 4
+        length += 1
+        length += len(self.TeamName)
+        length += 4
+        length += 2
+        length += 4
+        length += 4
+        length += 1
+        length += 1
+        length += 4
+        length += 4
+        length += 1
+        for i in range(self.MemberCount):
+            length += self.MemberList[i].GetLength()
+        length += 2
+        length += 4 * self.ApplyCount
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.TeamID)
+        data = CommFunc.WriteDWORD(data, self.CreateTime)
+        data = CommFunc.WriteDWORD(data, self.FuncMapEx)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.TeamName)
+        data = CommFunc.WriteDWORD(data, self.CaptainID)
+        data = CommFunc.WriteWORD(data, self.MinLV)
+        data = CommFunc.WriteDWORD(data, self.MinFightPower)
+        data = CommFunc.WriteDWORD(data, self.MinFightPowerEx)
+        data = CommFunc.WriteBYTE(data, self.ServerOnly)
+        data = CommFunc.WriteBYTE(data, self.NeedCheck)
+        data = CommFunc.WriteDWORD(data, self.Value1)
+        data = CommFunc.WriteDWORD(data, self.Value2)
+        data = CommFunc.WriteBYTE(data, self.MemberCount)
+        for i in range(self.MemberCount):
+            data = CommFunc.WriteString(data, self.MemberList[i].GetLength(), self.MemberList[i].GetBuffer())
+        data = CommFunc.WriteWORD(data, self.ApplyCount)
+        for i in range(self.ApplyCount):
+            data = CommFunc.WriteDWORD(data, self.ApplyIDList[i])
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                TeamID:%d,
+                                CreateTime:%d,
+                                FuncMapEx:%d,
+                                NameLen:%d,
+                                TeamName:%s,
+                                CaptainID:%d,
+                                MinLV:%d,
+                                MinFightPower:%d,
+                                MinFightPowerEx:%d,
+                                ServerOnly:%d,
+                                NeedCheck:%d,
+                                Value1:%d,
+                                Value2:%d,
+                                MemberCount:%d,
+                                MemberList:%s,
+                                ApplyCount:%d,
+                                ApplyIDList:%s
+                                '''\
+                                %(
+                                self.TeamID,
+                                self.CreateTime,
+                                self.FuncMapEx,
+                                self.NameLen,
+                                self.TeamName,
+                                self.CaptainID,
+                                self.MinLV,
+                                self.MinFightPower,
+                                self.MinFightPowerEx,
+                                self.ServerOnly,
+                                self.NeedCheck,
+                                self.Value1,
+                                self.Value2,
+                                self.MemberCount,
+                                "...",
+                                self.ApplyCount,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagGCFuncTeamList(Structure):
+    Head = tagHead()
+    FuncMapID = 0    #(DWORD FuncMapID)// 功能地图ID或自定义的活动功能ID
+    FuncMapEx = 0    #(DWORD FuncMapEx)// 功能地图扩展,如不同的层级,0代表所有
+    StartIndex = 0    #(DWORD StartIndex)// 查看的起始索引, 默认0
+    QueryCnt = 0    #(BYTE QueryCnt)// 查看条数,默认20,最大不超过100
+    HaveSpace = 0    #(BYTE HaveSpace)// 是否只查看有空位置的队伍
+    IDLimitType = 0    #(BYTE IDLimitType)// ID限制类型:1-同仙盟队长;2-同ServerGroupID队长;3-同ServerID队长
+    SearchLen = 0    #(BYTE SearchLen)
+    SearchMsg = ""    #(String SearchMsg)// 指定搜索时有用,可搜索指定队伍ID或模糊搜索队伍名称,搜索时返回最多QueryCnt个数的队伍
+    LoopIndex = 0    #(DWORD LoopIndex)// 服务器检索到的索引,列表下拉时下一个查询包的StartIndex从这个LoopIndex开始
+    TeamCount = 0    #(BYTE TeamCount)// 如果返回的队伍数小于QueryCnt,代表服务器已经没有满足条件的队伍了,列表再下拉时不再发查询包
+    TeamList = list()    #(vector<tagGCFuncTeam> TeamList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB9
+        self.Head.SubCmd = 0x22
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.FuncMapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FuncMapEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.StartIndex,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.QueryCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.HaveSpace,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.IDLimitType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.SearchLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.SearchMsg,_pos = CommFunc.ReadString(_lpData, _pos,self.SearchLen)
+        self.LoopIndex,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TeamCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TeamCount):
+            temTeamList = tagGCFuncTeam()
+            _pos = temTeamList.ReadData(_lpData, _pos)
+            self.TeamList.append(temTeamList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB9
+        self.Head.SubCmd = 0x22
+        self.FuncMapID = 0
+        self.FuncMapEx = 0
+        self.StartIndex = 0
+        self.QueryCnt = 0
+        self.HaveSpace = 0
+        self.IDLimitType = 0
+        self.SearchLen = 0
+        self.SearchMsg = ""
+        self.LoopIndex = 0
+        self.TeamCount = 0
+        self.TeamList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 4
+        length += 4
+        length += 1
+        length += 1
+        length += 1
+        length += 1
+        length += len(self.SearchMsg)
+        length += 4
+        length += 1
+        for i in range(self.TeamCount):
+            length += self.TeamList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.FuncMapID)
+        data = CommFunc.WriteDWORD(data, self.FuncMapEx)
+        data = CommFunc.WriteDWORD(data, self.StartIndex)
+        data = CommFunc.WriteBYTE(data, self.QueryCnt)
+        data = CommFunc.WriteBYTE(data, self.HaveSpace)
+        data = CommFunc.WriteBYTE(data, self.IDLimitType)
+        data = CommFunc.WriteBYTE(data, self.SearchLen)
+        data = CommFunc.WriteString(data, self.SearchLen, self.SearchMsg)
+        data = CommFunc.WriteDWORD(data, self.LoopIndex)
+        data = CommFunc.WriteBYTE(data, self.TeamCount)
+        for i in range(self.TeamCount):
+            data = CommFunc.WriteString(data, self.TeamList[i].GetLength(), self.TeamList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                FuncMapID:%d,
+                                FuncMapEx:%d,
+                                StartIndex:%d,
+                                QueryCnt:%d,
+                                HaveSpace:%d,
+                                IDLimitType:%d,
+                                SearchLen:%d,
+                                SearchMsg:%s,
+                                LoopIndex:%d,
+                                TeamCount:%d,
+                                TeamList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.FuncMapID,
+                                self.FuncMapEx,
+                                self.StartIndex,
+                                self.QueryCnt,
+                                self.HaveSpace,
+                                self.IDLimitType,
+                                self.SearchLen,
+                                self.SearchMsg,
+                                self.LoopIndex,
+                                self.TeamCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCFuncTeamList=tagGCFuncTeamList()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFuncTeamList.Head.Cmd,m_NAtagGCFuncTeamList.Head.SubCmd))] = m_NAtagGCFuncTeamList
+
+
+#------------------------------------------------------
+# B9 20 功能队伍刷新 #tagGCFuncTeamRefresh
+
+class  tagGCFuncTeamRefreshApply(Structure):
+    ServerID = 0    #(DWORD ServerID)
+    PlayerID = 0    #(DWORD PlayerID)
+    NameLen = 0    #(BYTE NameLen)
+    Name = ""    #(String Name)// 玩家名,size = NameLen
+    LV = 0    #(WORD LV)// 玩家等级
+    Job = 0    #(BYTE Job)// 玩家职业
+    RealmLV = 0    #(WORD RealmLV)// 玩家境界
+    FightPower = 0    #(DWORD FightPower)// 战力,求余亿
+    FightPowerEx = 0    #(DWORD FightPowerEx)// 战力,整除亿
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.ServerID = 0
+        self.PlayerID = 0
+        self.NameLen = 0
+        self.Name = ""
+        self.LV = 0
+        self.Job = 0
+        self.RealmLV = 0
+        self.FightPower = 0
+        self.FightPowerEx = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 4
+        length += 1
+        length += len(self.Name)
+        length += 2
+        length += 1
+        length += 2
+        length += 4
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.ServerID)
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.Name)
+        data = CommFunc.WriteWORD(data, self.LV)
+        data = CommFunc.WriteBYTE(data, self.Job)
+        data = CommFunc.WriteWORD(data, self.RealmLV)
+        data = CommFunc.WriteDWORD(data, self.FightPower)
+        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                ServerID:%d,
+                                PlayerID:%d,
+                                NameLen:%d,
+                                Name:%s,
+                                LV:%d,
+                                Job:%d,
+                                RealmLV:%d,
+                                FightPower:%d,
+                                FightPowerEx:%d
+                                '''\
+                                %(
+                                self.ServerID,
+                                self.PlayerID,
+                                self.NameLen,
+                                self.Name,
+                                self.LV,
+                                self.Job,
+                                self.RealmLV,
+                                self.FightPower,
+                                self.FightPowerEx
+                                )
+        return DumpString
+
+
+class  tagGCFuncTeamRefreshMem(Structure):
+    ServerID = 0    #(DWORD ServerID)
+    PlayerID = 0    #(DWORD PlayerID)
+    NameLen = 0    #(BYTE NameLen)
+    Name = ""    #(String Name)// 玩家名,size = NameLen
+    LV = 0    #(WORD LV)// 玩家等级
+    Job = 0    #(BYTE Job)// 玩家职业
+    RealmLV = 0    #(WORD RealmLV)// 玩家境界
+    FightPower = 0    #(DWORD FightPower)// 战力,求余亿
+    FightPowerEx = 0    #(DWORD FightPowerEx)// 战力,整除亿
+    OfflineValue = 0    #(DWORD OfflineValue)// 离线值:0-在线;1-离线;>1-上次离线时间戳,可用于计算离线多久了;当取不到玩家信息时用1代表已离线;
+    Value1 = 0    #(DWORD Value1)//值1
+    Value2 = 0    #(DWORD Value2)//值2
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RealmLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.OfflineValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.ServerID = 0
+        self.PlayerID = 0
+        self.NameLen = 0
+        self.Name = ""
+        self.LV = 0
+        self.Job = 0
+        self.RealmLV = 0
+        self.FightPower = 0
+        self.FightPowerEx = 0
+        self.OfflineValue = 0
+        self.Value1 = 0
+        self.Value2 = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 4
+        length += 1
+        length += len(self.Name)
+        length += 2
+        length += 1
+        length += 2
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.ServerID)
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.Name)
+        data = CommFunc.WriteWORD(data, self.LV)
+        data = CommFunc.WriteBYTE(data, self.Job)
+        data = CommFunc.WriteWORD(data, self.RealmLV)
+        data = CommFunc.WriteDWORD(data, self.FightPower)
+        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
+        data = CommFunc.WriteDWORD(data, self.OfflineValue)
+        data = CommFunc.WriteDWORD(data, self.Value1)
+        data = CommFunc.WriteDWORD(data, self.Value2)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                ServerID:%d,
+                                PlayerID:%d,
+                                NameLen:%d,
+                                Name:%s,
+                                LV:%d,
+                                Job:%d,
+                                RealmLV:%d,
+                                FightPower:%d,
+                                FightPowerEx:%d,
+                                OfflineValue:%d,
+                                Value1:%d,
+                                Value2:%d
+                                '''\
+                                %(
+                                self.ServerID,
+                                self.PlayerID,
+                                self.NameLen,
+                                self.Name,
+                                self.LV,
+                                self.Job,
+                                self.RealmLV,
+                                self.FightPower,
+                                self.FightPowerEx,
+                                self.OfflineValue,
+                                self.Value1,
+                                self.Value2
+                                )
+        return DumpString
+
+
+class  tagGCFuncTeamRefresh(Structure):
+    Head = tagHead()
+    TeamID = 0    #(DWORD TeamID)
+    CreateTime = 0    #(DWORD CreateTime)//创建队伍时间戳
+    FuncMapID = 0    #(DWORD FuncMapID)// 功能地图ID或自定义的活动功能ID
+    FuncMapEx = 0    #(DWORD FuncMapEx)// 功能地图扩展,如不同的层级
+    NameLen = 0    #(BYTE NameLen)
+    TeamName = ""    #(String TeamName)// 队伍名称
+    CaptainID = 0    #(DWORD CaptainID)//队长ID,队伍ServerID直接取队长的ServerID
+    MinLV = 0    #(WORD MinLV)//最低等级限制
+    MinFightPower = 0    #(DWORD MinFightPower)//最低战力限制,求余亿
+    MinFightPowerEx = 0    #(DWORD MinFightPowerEx)//最低战力限制,整除亿
+    ServerOnly = 0    #(BYTE ServerOnly)//是否仅本服玩家可加入,0-否,1-是
+    NeedCheck = 0    #(BYTE NeedCheck)//是否需要审核
+    Value1 = 0    #(DWORD Value1)//值1
+    Value2 = 0    #(DWORD Value2)//值2
+    MemberCount = 0    #(BYTE MemberCount)
+    MemberList = list()    #(vector<tagGCFuncTeamRefreshMem> MemberList)// 成员列表
+    ApplyCount = 0    #(WORD ApplyCount)
+    ApplyIDList = list()    #(vector<DWORD> ApplyIDList)// 申请玩家ID列表
+    ApplyInfoList = list()    #(vector<tagGCFuncTeamRefreshApply> ApplyInfoList)// 申请玩家明细列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB9
+        self.Head.SubCmd = 0x20
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.TeamID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CreateTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FuncMapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FuncMapEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TeamName,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.CaptainID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MinLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.MinFightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MinFightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ServerOnly,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.NeedCheck,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MemberCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.MemberCount):
+            temMemberList = tagGCFuncTeamRefreshMem()
+            _pos = temMemberList.ReadData(_lpData, _pos)
+            self.MemberList.append(temMemberList)
+        self.ApplyCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        for i in range(self.ApplyCount):
+            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+            self.ApplyIDList.append(value)
+        for i in range(self.ApplyCount):
+            temApplyInfoList = tagGCFuncTeamRefreshApply()
+            _pos = temApplyInfoList.ReadData(_lpData, _pos)
+            self.ApplyInfoList.append(temApplyInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB9
+        self.Head.SubCmd = 0x20
+        self.TeamID = 0
+        self.CreateTime = 0
+        self.FuncMapID = 0
+        self.FuncMapEx = 0
+        self.NameLen = 0
+        self.TeamName = ""
+        self.CaptainID = 0
+        self.MinLV = 0
+        self.MinFightPower = 0
+        self.MinFightPowerEx = 0
+        self.ServerOnly = 0
+        self.NeedCheck = 0
+        self.Value1 = 0
+        self.Value2 = 0
+        self.MemberCount = 0
+        self.MemberList = list()
+        self.ApplyCount = 0
+        self.ApplyIDList = list()
+        self.ApplyInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 1
+        length += len(self.TeamName)
+        length += 4
+        length += 2
+        length += 4
+        length += 4
+        length += 1
+        length += 1
+        length += 4
+        length += 4
+        length += 1
+        for i in range(self.MemberCount):
+            length += self.MemberList[i].GetLength()
+        length += 2
+        length += 4 * self.ApplyCount
+        for i in range(self.ApplyCount):
+            length += self.ApplyInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.TeamID)
+        data = CommFunc.WriteDWORD(data, self.CreateTime)
+        data = CommFunc.WriteDWORD(data, self.FuncMapID)
+        data = CommFunc.WriteDWORD(data, self.FuncMapEx)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.TeamName)
+        data = CommFunc.WriteDWORD(data, self.CaptainID)
+        data = CommFunc.WriteWORD(data, self.MinLV)
+        data = CommFunc.WriteDWORD(data, self.MinFightPower)
+        data = CommFunc.WriteDWORD(data, self.MinFightPowerEx)
+        data = CommFunc.WriteBYTE(data, self.ServerOnly)
+        data = CommFunc.WriteBYTE(data, self.NeedCheck)
+        data = CommFunc.WriteDWORD(data, self.Value1)
+        data = CommFunc.WriteDWORD(data, self.Value2)
+        data = CommFunc.WriteBYTE(data, self.MemberCount)
+        for i in range(self.MemberCount):
+            data = CommFunc.WriteString(data, self.MemberList[i].GetLength(), self.MemberList[i].GetBuffer())
+        data = CommFunc.WriteWORD(data, self.ApplyCount)
+        for i in range(self.ApplyCount):
+            data = CommFunc.WriteDWORD(data, self.ApplyIDList[i])
+        for i in range(self.ApplyCount):
+            data = CommFunc.WriteString(data, self.ApplyInfoList[i].GetLength(), self.ApplyInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                TeamID:%d,
+                                CreateTime:%d,
+                                FuncMapID:%d,
+                                FuncMapEx:%d,
+                                NameLen:%d,
+                                TeamName:%s,
+                                CaptainID:%d,
+                                MinLV:%d,
+                                MinFightPower:%d,
+                                MinFightPowerEx:%d,
+                                ServerOnly:%d,
+                                NeedCheck:%d,
+                                Value1:%d,
+                                Value2:%d,
+                                MemberCount:%d,
+                                MemberList:%s,
+                                ApplyCount:%d,
+                                ApplyIDList:%s,
+                                ApplyInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.TeamID,
+                                self.CreateTime,
+                                self.FuncMapID,
+                                self.FuncMapEx,
+                                self.NameLen,
+                                self.TeamName,
+                                self.CaptainID,
+                                self.MinLV,
+                                self.MinFightPower,
+                                self.MinFightPowerEx,
+                                self.ServerOnly,
+                                self.NeedCheck,
+                                self.Value1,
+                                self.Value2,
+                                self.MemberCount,
+                                "...",
+                                self.ApplyCount,
+                                "...",
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCFuncTeamRefresh=tagGCFuncTeamRefresh()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFuncTeamRefresh.Head.Cmd,m_NAtagGCFuncTeamRefresh.Head.SubCmd))] = m_NAtagGCFuncTeamRefresh
+
+
+#------------------------------------------------------
 # B9 01 收到邀请加入队伍信息 #tagGCInviteJoinTeamInfo
 
 class  tagGCInviteJoinTeamInfo(Structure):
@@ -12432,6 +13794,62 @@
 
 m_NAtagGCTagMapTeamList=tagGCTagMapTeamList()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCTagMapTeamList.Head.Cmd,m_NAtagGCTagMapTeamList.Head.SubCmd))] = m_NAtagGCTagMapTeamList
+
+
+#------------------------------------------------------
+# B9 21 查找玩家功能队伍结果 #tagGCQueryPlayerFuncTeamRet
+
+class  tagGCQueryPlayerFuncTeamRet(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("FuncMapID", c_int),    # 功能地图ID或自定义的活动功能ID
+                  ("TeamID", c_int),    # 玩家所属队伍ID,目前只同步0的情况,如果玩家有队伍统一B920封包同步处理
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB9
+        self.SubCmd = 0x21
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB9
+        self.SubCmd = 0x21
+        self.FuncMapID = 0
+        self.TeamID = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagGCQueryPlayerFuncTeamRet)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B9 21 查找玩家功能队伍结果 //tagGCQueryPlayerFuncTeamRet:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                FuncMapID:%d,
+                                TeamID:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.FuncMapID,
+                                self.TeamID
+                                )
+        return DumpString
+
+
+m_NAtagGCQueryPlayerFuncTeamRet=tagGCQueryPlayerFuncTeamRet()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCQueryPlayerFuncTeamRet.Cmd,m_NAtagGCQueryPlayerFuncTeamRet.SubCmd))] = m_NAtagGCQueryPlayerFuncTeamRet
 
 
 #------------------------------------------------------
@@ -14722,15 +16140,25 @@
 # C0 07 跨服排行榜信息 #tagGCCrossBillboardInfo
 
 class  tagGCCrossBillboardData(Structure):
+    OrderIndex = 0    #(WORD OrderIndex)//名次索引,0代表第一名
     ID = 0    #(DWORD ID)
+    ID2 = 0    #(DWORD ID2)
     Name1 = ""    #(char Name1[33])//名字1,用来显示排序对象名字 
     Name2 = ""    #(char Name2[33])//名字2
     Type2 = 0    #(BYTE Type2)//附加类型,用来表示排序对象的类型,比如,玩家所属职业门派,宠物类型等
     Value1 = 0    #(DWORD Value1)//自定义值1
     Value2 = 0    #(DWORD Value2)//自定义值2
+    Value3 = 0    #(DWORD Value3)//附加值
+    Value4 = 0    #(DWORD Value4)//附加值
+    Value5 = 0    #(DWORD Value5)//附加值
+    Value6 = 0    #(DWORD Value6)//附加值
+    Value7 = 0    #(DWORD Value7)//附加值
+    Value8 = 0    #(DWORD Value8)//附加值
     CmpValue = 0    #(DWORD CmpValue)// 比较权值
     CmpValue2 = 0    #(DWORD CmpValue2)// 比较权值
     CmpValue3 = 0    #(DWORD CmpValue3)// 比较权值
+    DataLen = 0    #(WORD DataLen)
+    UserData = ""    #(String UserData)//附加
     data = None
 
     def __init__(self):
@@ -14739,31 +16167,53 @@
 
     def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
+        self.OrderIndex,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.ID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ID2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.Name1,_pos = CommFunc.ReadString(_lpData, _pos,33)
         self.Name2,_pos = CommFunc.ReadString(_lpData, _pos,33)
         self.Type2,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.Value2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value3,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value4,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value5,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value6,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value7,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value8,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.CmpValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.CmpValue2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.CmpValue3,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.DataLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.UserData,_pos = CommFunc.ReadString(_lpData, _pos,self.DataLen)
         return _pos
 
     def Clear(self):
+        self.OrderIndex = 0
         self.ID = 0
+        self.ID2 = 0
         self.Name1 = ""
         self.Name2 = ""
         self.Type2 = 0
         self.Value1 = 0
         self.Value2 = 0
+        self.Value3 = 0
+        self.Value4 = 0
+        self.Value5 = 0
+        self.Value6 = 0
+        self.Value7 = 0
+        self.Value8 = 0
         self.CmpValue = 0
         self.CmpValue2 = 0
         self.CmpValue3 = 0
+        self.DataLen = 0
+        self.UserData = ""
         return
 
     def GetLength(self):
         length = 0
+        length += 2
+        length += 4
         length += 4
         length += 33
         length += 33
@@ -14773,44 +16223,82 @@
         length += 4
         length += 4
         length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 2
+        length += len(self.UserData)
 
         return length
 
     def GetBuffer(self):
         data = ''
+        data = CommFunc.WriteWORD(data, self.OrderIndex)
         data = CommFunc.WriteDWORD(data, self.ID)
+        data = CommFunc.WriteDWORD(data, self.ID2)
         data = CommFunc.WriteString(data, 33, self.Name1)
         data = CommFunc.WriteString(data, 33, self.Name2)
         data = CommFunc.WriteBYTE(data, self.Type2)
         data = CommFunc.WriteDWORD(data, self.Value1)
         data = CommFunc.WriteDWORD(data, self.Value2)
+        data = CommFunc.WriteDWORD(data, self.Value3)
+        data = CommFunc.WriteDWORD(data, self.Value4)
+        data = CommFunc.WriteDWORD(data, self.Value5)
+        data = CommFunc.WriteDWORD(data, self.Value6)
+        data = CommFunc.WriteDWORD(data, self.Value7)
+        data = CommFunc.WriteDWORD(data, self.Value8)
         data = CommFunc.WriteDWORD(data, self.CmpValue)
         data = CommFunc.WriteDWORD(data, self.CmpValue2)
         data = CommFunc.WriteDWORD(data, self.CmpValue3)
+        data = CommFunc.WriteWORD(data, self.DataLen)
+        data = CommFunc.WriteString(data, self.DataLen, self.UserData)
         return data
 
     def OutputString(self):
         DumpString = '''
+                                OrderIndex:%d,
                                 ID:%d,
+                                ID2:%d,
                                 Name1:%s,
                                 Name2:%s,
                                 Type2:%d,
                                 Value1:%d,
                                 Value2:%d,
+                                Value3:%d,
+                                Value4:%d,
+                                Value5:%d,
+                                Value6:%d,
+                                Value7:%d,
+                                Value8:%d,
                                 CmpValue:%d,
                                 CmpValue2:%d,
-                                CmpValue3:%d
+                                CmpValue3:%d,
+                                DataLen:%d,
+                                UserData:%s
                                 '''\
                                 %(
+                                self.OrderIndex,
                                 self.ID,
+                                self.ID2,
                                 self.Name1,
                                 self.Name2,
                                 self.Type2,
                                 self.Value1,
                                 self.Value2,
+                                self.Value3,
+                                self.Value4,
+                                self.Value5,
+                                self.Value6,
+                                self.Value7,
+                                self.Value8,
                                 self.CmpValue,
                                 self.CmpValue2,
-                                self.CmpValue3
+                                self.CmpValue3,
+                                self.DataLen,
+                                self.UserData
                                 )
         return DumpString
 
@@ -14820,6 +16308,7 @@
     Type = 0    #(BYTE Type)//榜单类型
     GroupValue1 = 0    #(BYTE GroupValue1)// 分组值1
     GroupValue2 = 0    #(BYTE GroupValue2)// 分组值2,与分组值1组合归为同组榜单数据
+    WatchID = 0    #(DWORD WatchID)//查看指定ID名次前后,如玩家ID、家族ID等
     BillboardCount = 0    #(BYTE BillboardCount)
     CrossBillboardDataList = list()    #(vector<tagGCCrossBillboardData> CrossBillboardDataList)
     data = None
@@ -14836,6 +16325,7 @@
         self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.GroupValue1,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.GroupValue2,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.WatchID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.BillboardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.BillboardCount):
             temCrossBillboardDataList = tagGCCrossBillboardData()
@@ -14851,6 +16341,7 @@
         self.Type = 0
         self.GroupValue1 = 0
         self.GroupValue2 = 0
+        self.WatchID = 0
         self.BillboardCount = 0
         self.CrossBillboardDataList = list()
         return
@@ -14861,6 +16352,7 @@
         length += 1
         length += 1
         length += 1
+        length += 4
         length += 1
         for i in range(self.BillboardCount):
             length += self.CrossBillboardDataList[i].GetLength()
@@ -14873,6 +16365,7 @@
         data = CommFunc.WriteBYTE(data, self.Type)
         data = CommFunc.WriteBYTE(data, self.GroupValue1)
         data = CommFunc.WriteBYTE(data, self.GroupValue2)
+        data = CommFunc.WriteDWORD(data, self.WatchID)
         data = CommFunc.WriteBYTE(data, self.BillboardCount)
         for i in range(self.BillboardCount):
             data = CommFunc.WriteString(data, self.CrossBillboardDataList[i].GetLength(), self.CrossBillboardDataList[i].GetBuffer())
@@ -14884,6 +16377,7 @@
                                 Type:%d,
                                 GroupValue1:%d,
                                 GroupValue2:%d,
+                                WatchID:%d,
                                 BillboardCount:%d,
                                 CrossBillboardDataList:%s
                                 '''\
@@ -14892,6 +16386,7 @@
                                 self.Type,
                                 self.GroupValue1,
                                 self.GroupValue2,
+                                self.WatchID,
                                 self.BillboardCount,
                                 "..."
                                 )
@@ -16889,6 +18384,7 @@
                   ("TotalPayCount", c_int),    # 累计总购买次数
                   ("WeekPayCount", c_ushort),    # 周总购买次数
                   ("MonthPayCount", c_ushort),    # 月总购买次数
+                  ("SelectItemValue", c_int),    # 自选物品索引值,每两位存储每个自选索引对应选择的物品索引+1,存储位值为0代表未选择,最多支持选择4种物品
                   ]
 
     def __init__(self):
@@ -16906,6 +18402,7 @@
         self.TotalPayCount = 0
         self.WeekPayCount = 0
         self.MonthPayCount = 0
+        self.SelectItemValue = 0
         return
 
     def GetLength(self):
@@ -16920,14 +18417,16 @@
                                 TodayPayCount:%d,
                                 TotalPayCount:%d,
                                 WeekPayCount:%d,
-                                MonthPayCount:%d
+                                MonthPayCount:%d,
+                                SelectItemValue:%d
                                 '''\
                                 %(
                                 self.RecordID,
                                 self.TodayPayCount,
                                 self.TotalPayCount,
                                 self.WeekPayCount,
-                                self.MonthPayCount
+                                self.MonthPayCount,
+                                self.SelectItemValue
                                 )
         return DumpString
 
@@ -18355,6 +19854,114 @@
 
 m_NAtagMCAttackMode=tagMCAttackMode()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCAttackMode.Cmd,m_NAtagMCAttackMode.SubCmd))] = m_NAtagMCAttackMode
+
+
+#------------------------------------------------------
+# A2 06 自动转化为对应物品ID个数刷新 #tagMCAutoItemCountRefresh
+
+class  tagMCAutoItemCount(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_int),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.ItemID = 0
+        self.ItemCount = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCAutoItemCount)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A2 06 自动转化为对应物品ID个数刷新 //tagMCAutoItemCountRefresh:
+                                ItemID:%d,
+                                ItemCount:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount
+                                )
+        return DumpString
+
+
+class  tagMCAutoItemCountRefresh(Structure):
+    Head = tagHead()
+    Count = 0    #(WORD Count)// 刷新个数
+    ItemCountList = list()    #(vector<tagMCAutoItemCount> ItemCountList)// 物品信息列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA2
+        self.Head.SubCmd = 0x06
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        for i in range(self.Count):
+            temItemCountList = tagMCAutoItemCount()
+            _pos = temItemCountList.ReadData(_lpData, _pos)
+            self.ItemCountList.append(temItemCountList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA2
+        self.Head.SubCmd = 0x06
+        self.Count = 0
+        self.ItemCountList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 2
+        for i in range(self.Count):
+            length += self.ItemCountList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteWORD(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.ItemCountList[i].GetLength(), self.ItemCountList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                Count:%d,
+                                ItemCountList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCAutoItemCountRefresh=tagMCAutoItemCountRefresh()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCAutoItemCountRefresh.Head.Cmd,m_NAtagMCAutoItemCountRefresh.Head.SubCmd))] = m_NAtagMCAutoItemCountRefresh
 
 
 #------------------------------------------------------
@@ -21681,6 +23288,181 @@
 
 
 #------------------------------------------------------
+# A3 61 新聚魂孔信息 #tagMCGatherTheSoulHoleInfo
+
+class  tagMCGatherTheSoulHoleInfo(Structure):
+    Head = tagHead()
+    Count = 0    #(BYTE Count)// 孔数
+    HoleSoulList = list()    #(vector<DWORD> HoleSoulList)// 孔聚魂ID列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA3
+        self.Head.SubCmd = 0x61
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+            self.HoleSoulList.append(value)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA3
+        self.Head.SubCmd = 0x61
+        self.Count = 0
+        self.HoleSoulList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 4 * self.Count
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteDWORD(data, self.HoleSoulList[i])
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                Count:%d,
+                                HoleSoulList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCGatherTheSoulHoleInfo=tagMCGatherTheSoulHoleInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCGatherTheSoulHoleInfo.Head.Cmd,m_NAtagMCGatherTheSoulHoleInfo.Head.SubCmd))] = m_NAtagMCGatherTheSoulHoleInfo
+
+
+#------------------------------------------------------
+# A3 60 新聚魂信息 #tagMCGatherTheSoulInfo
+
+class  tagMCGatherTheSoul(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("SoulID", c_int),    
+                  ("LV", c_ushort),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.SoulID = 0
+        self.LV = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCGatherTheSoul)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A3 60 新聚魂信息 //tagMCGatherTheSoulInfo:
+                                SoulID:%d,
+                                LV:%d
+                                '''\
+                                %(
+                                self.SoulID,
+                                self.LV
+                                )
+        return DumpString
+
+
+class  tagMCGatherTheSoulInfo(Structure):
+    Head = tagHead()
+    Count = 0    #(BYTE Count)// 信息个数
+    SoulList = list()    #(vector<tagMCGatherTheSoul> SoulList)// 信息列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA3
+        self.Head.SubCmd = 0x60
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temSoulList = tagMCGatherTheSoul()
+            _pos = temSoulList.ReadData(_lpData, _pos)
+            self.SoulList.append(temSoulList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA3
+        self.Head.SubCmd = 0x60
+        self.Count = 0
+        self.SoulList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.Count):
+            length += self.SoulList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.SoulList[i].GetLength(), self.SoulList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                Count:%d,
+                                SoulList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCGatherTheSoulInfo=tagMCGatherTheSoulInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCGatherTheSoulInfo.Head.Cmd,m_NAtagMCGatherTheSoulInfo.Head.SubCmd))] = m_NAtagMCGatherTheSoulInfo
+
+
+#------------------------------------------------------
 # A3 1D 神兵等级信息 #tagMCGodWeaponLVList
 
 class  tagMCGodWeaponLVInfo(Structure):
@@ -23847,6 +25629,7 @@
     PassGradeCnt = 0    #(BYTE PassGradeCnt)//星级值对应个数, 每个key存9个lineID
     PassGrade = list()    #(vector<DWORD> PassGrade)//副本线路对应星级值列表
     EnterCntTotal = 0    #(DWORD EnterCntTotal)//累计进入次数
+    PassLineID = 0    #(DWORD PassLineID)//已过关到的lineID
     data = None
 
     def __init__(self):
@@ -23864,6 +25647,7 @@
             value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
             self.PassGrade.append(value)
         self.EnterCntTotal,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PassLineID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -23874,6 +25658,7 @@
         self.PassGradeCnt = 0
         self.PassGrade = list()
         self.EnterCntTotal = 0
+        self.PassLineID = 0
         return
 
     def GetLength(self):
@@ -23884,6 +25669,7 @@
         length += 2
         length += 1
         length += 4 * self.PassGradeCnt
+        length += 4
         length += 4
 
         return length
@@ -23898,6 +25684,7 @@
         for i in range(self.PassGradeCnt):
             data = CommFunc.WriteDWORD(data, self.PassGrade[i])
         data = CommFunc.WriteDWORD(data, self.EnterCntTotal)
+        data = CommFunc.WriteDWORD(data, self.PassLineID)
         return data
 
     def OutputString(self):
@@ -23908,7 +25695,8 @@
                                 ItemAddCnt:%d,
                                 PassGradeCnt:%d,
                                 PassGrade:%s,
-                                EnterCntTotal:%d
+                                EnterCntTotal:%d,
+                                PassLineID:%d
                                 '''\
                                 %(
                                 self.FBID,
@@ -23917,7 +25705,8 @@
                                 self.ItemAddCnt,
                                 self.PassGradeCnt,
                                 "...",
-                                self.EnterCntTotal
+                                self.EnterCntTotal,
+                                self.PassLineID
                                 )
         return DumpString
 
@@ -26335,63 +28124,48 @@
 # A3 51 寻宝功能信息 #tagMCTreasureInfo
 
 class  tagMCTreasureTypeInfo(Structure):
-    TreasureType = 0    #(BYTE TreasureType)//寻宝类型
-    LuckValue = 0    #(WORD LuckValue)//当前幸运值
-    IndexCount = 0    #(BYTE IndexCount)//索引个数
-    FreeCountTime = list()    #(vector<DWORD> FreeCountTime)// 模式对应开始计算免费次数时间time值
-    data = None
+    _pack_ = 1
+    _fields_ = [
+                  ("TreasureType", c_ubyte),    #寻宝类型
+                  ("LuckValue", c_ushort),    #当前幸运值
+                  ("TreasureCount", c_int),    #已寻宝总次数
+                  ("FreeCountToday", c_ushort),    #今日已免费寻宝次数
+                  ]
 
     def __init__(self):
         self.Clear()
         return
 
-    def ReadData(self, _lpData, _pos=0, _Len=0):
+    def ReadData(self, stringData, _pos=0, _len=0):
         self.Clear()
-        self.TreasureType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.LuckValue,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.IndexCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.IndexCount):
-            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
-            self.FreeCountTime.append(value)
-        return _pos
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
 
     def Clear(self):
         self.TreasureType = 0
         self.LuckValue = 0
-        self.IndexCount = 0
-        self.FreeCountTime = list()
+        self.TreasureCount = 0
+        self.FreeCountToday = 0
         return
 
     def GetLength(self):
-        length = 0
-        length += 1
-        length += 2
-        length += 1
-        length += 4 * self.IndexCount
-
-        return length
+        return sizeof(tagMCTreasureTypeInfo)
 
     def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteBYTE(data, self.TreasureType)
-        data = CommFunc.WriteWORD(data, self.LuckValue)
-        data = CommFunc.WriteBYTE(data, self.IndexCount)
-        for i in range(self.IndexCount):
-            data = CommFunc.WriteDWORD(data, self.FreeCountTime[i])
-        return data
+        return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
-        DumpString = '''
+        DumpString = '''// A3 51 寻宝功能信息 //tagMCTreasureInfo:
                                 TreasureType:%d,
                                 LuckValue:%d,
-                                IndexCount:%d,
-                                FreeCountTime:%s
+                                TreasureCount:%d,
+                                FreeCountToday:%d
                                 '''\
                                 %(
                                 self.TreasureType,
                                 self.LuckValue,
-                                self.IndexCount,
-                                "..."
+                                self.TreasureCount,
+                                self.FreeCountToday
                                 )
         return DumpString
 
@@ -26467,7 +28241,8 @@
 
 class  tagMCTreasureResult(Structure):
     Head = tagHead()
-    AddTreasureScore = 0    #(WORD AddTreasureScore)// 本次寻宝增加的寻宝积分
+    AddMoneyType = 0    #(BYTE AddMoneyType)// 本次寻宝增加的积分货币类型,可能为0
+    AddMoneyValue = 0    #(WORD AddMoneyValue)// 本次寻宝增加的积分货币值,可能为0
     AddTreasureLuck = 0    #(WORD AddTreasureLuck)// 本次寻宝增加的幸运值
     TreasureResultLen = 0    #(WORD TreasureResultLen)
     TreasureResult = ""    #(String TreasureResult)//  获得物品结果[[格子编号, 物品ID,个数,是否绑定], ...]
@@ -26482,7 +28257,8 @@
     def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
         _pos = self.Head.ReadData(_lpData, _pos)
-        self.AddTreasureScore,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.AddMoneyType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.AddMoneyValue,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.AddTreasureLuck,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.TreasureResultLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.TreasureResult,_pos = CommFunc.ReadString(_lpData, _pos,self.TreasureResultLen)
@@ -26493,7 +28269,8 @@
         self.Head.Clear()
         self.Head.Cmd = 0xA3
         self.Head.SubCmd = 0x50
-        self.AddTreasureScore = 0
+        self.AddMoneyType = 0
+        self.AddMoneyValue = 0
         self.AddTreasureLuck = 0
         self.TreasureResultLen = 0
         self.TreasureResult = ""
@@ -26502,6 +28279,7 @@
     def GetLength(self):
         length = 0
         length += self.Head.GetLength()
+        length += 1
         length += 2
         length += 2
         length += 2
@@ -26512,7 +28290,8 @@
     def GetBuffer(self):
         data = ''
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteWORD(data, self.AddTreasureScore)
+        data = CommFunc.WriteBYTE(data, self.AddMoneyType)
+        data = CommFunc.WriteWORD(data, self.AddMoneyValue)
         data = CommFunc.WriteWORD(data, self.AddTreasureLuck)
         data = CommFunc.WriteWORD(data, self.TreasureResultLen)
         data = CommFunc.WriteString(data, self.TreasureResultLen, self.TreasureResult)
@@ -26521,14 +28300,16 @@
     def OutputString(self):
         DumpString = '''
                                 Head:%s,
-                                AddTreasureScore:%d,
+                                AddMoneyType:%d,
+                                AddMoneyValue:%d,
                                 AddTreasureLuck:%d,
                                 TreasureResultLen:%d,
                                 TreasureResult:%s
                                 '''\
                                 %(
                                 self.Head.OutputString(),
-                                self.AddTreasureScore,
+                                self.AddMoneyType,
+                                self.AddMoneyValue,
                                 self.AddTreasureLuck,
                                 self.TreasureResultLen,
                                 self.TreasureResult
@@ -30081,7 +31862,7 @@
 class  tagRefreshType(Structure):
     _pack_ = 1
     _fields_ = [
-                  ("RefreshType", c_ubyte),    
+                  ("RefreshType", c_ushort),    
                   ("Value", c_int),    
                   ("ValueEx", c_int),    
                   ]
@@ -31259,10 +33040,10 @@
         return DumpString
 
 
-class  tagMCActBossTrialBillard(Structure):
-    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
-    Count = 0    #(BYTE Count)// 奖励物品数
-    AwardItemList = list()    #(vector<tagMCActBossTrialItem> AwardItemList)// 奖励物品列表
+class  tagMCActBossTrialAwardEx(Structure):
+    NeedScore = 0    #(DWORD NeedScore)// 额外奖励所需积分
+    Count = 0    #(BYTE Count)// 额外奖励物品数
+    AwardItemList = list()    #(vector<tagMCActBossTrialItem> AwardItemList)// 额外奖励物品列表
     data = None
 
     def __init__(self):
@@ -31271,7 +33052,7 @@
 
     def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
-        self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.Count):
             temAwardItemList = tagMCActBossTrialItem()
@@ -31280,7 +33061,7 @@
         return _pos
 
     def Clear(self):
-        self.Rank = 0
+        self.NeedScore = 0
         self.Count = 0
         self.AwardItemList = list()
         return
@@ -31296,7 +33077,7 @@
 
     def GetBuffer(self):
         data = ''
-        data = CommFunc.WriteDWORD(data, self.Rank)
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
         data = CommFunc.WriteBYTE(data, self.Count)
         for i in range(self.Count):
             data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
@@ -31304,13 +33085,115 @@
 
     def OutputString(self):
         DumpString = '''
-                                Rank:%d,
+                                NeedScore:%d,
                                 Count:%d,
                                 AwardItemList:%s
                                 '''\
                                 %(
+                                self.NeedScore,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCActBossTrialBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCActBossTrialItem> AwardItemList)// 奖励物品列表,当仙盟榜时,如果有该奖励则代表盟主奖励,否则默认均为成员奖励
+    MemCount = 0    #(BYTE MemCount)// 成员奖励物品数
+    MemAwardItemList = list()    #(vector<tagMCActBossTrialItem> MemAwardItemList)// 成员奖励物品列表,仅仙盟榜时有效
+    NeedScore = 0    #(DWORD NeedScore)// 上榜所需积分
+    CountEx = 0    #(BYTE CountEx)// 额外奖励数
+    AwardItemExList = list()    #(vector<tagMCActBossTrialAwardEx> AwardItemExList)// 额外奖励列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCActBossTrialItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        self.MemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.MemCount):
+            temMemAwardItemList = tagMCActBossTrialItem()
+            _pos = temMemAwardItemList.ReadData(_lpData, _pos)
+            self.MemAwardItemList.append(temMemAwardItemList)
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CountEx,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.CountEx):
+            temAwardItemExList = tagMCActBossTrialAwardEx()
+            _pos = temAwardItemExList.ReadData(_lpData, _pos)
+            self.AwardItemExList.append(temAwardItemExList)
+        return _pos
+
+    def Clear(self):
+        self.Rank = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        self.MemCount = 0
+        self.MemAwardItemList = list()
+        self.NeedScore = 0
+        self.CountEx = 0
+        self.AwardItemExList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+        length += 1
+        for i in range(self.MemCount):
+            length += self.MemAwardItemList[i].GetLength()
+        length += 4
+        length += 1
+        for i in range(self.CountEx):
+            length += self.AwardItemExList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.Rank)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.MemCount)
+        for i in range(self.MemCount):
+            data = CommFunc.WriteString(data, self.MemAwardItemList[i].GetLength(), self.MemAwardItemList[i].GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
+        data = CommFunc.WriteBYTE(data, self.CountEx)
+        for i in range(self.CountEx):
+            data = CommFunc.WriteString(data, self.AwardItemExList[i].GetLength(), self.AwardItemExList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Rank:%d,
+                                Count:%d,
+                                AwardItemList:%s,
+                                MemCount:%d,
+                                MemAwardItemList:%s,
+                                NeedScore:%d,
+                                CountEx:%d,
+                                AwardItemExList:%s
+                                '''\
+                                %(
                                 self.Rank,
                                 self.Count,
+                                "...",
+                                self.MemCount,
+                                "...",
+                                self.NeedScore,
+                                self.CountEx,
                                 "..."
                                 )
         return DumpString
@@ -31385,13 +33268,19 @@
     ActNum = 0    #(BYTE ActNum)// 活动编号
     StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
     EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    JoinStartTime = ""    #(char JoinStartTime[5])// 参与开始时间点 mm:ss
+    JoinEndTime = ""    #(char JoinEndTime[5])// 参与结束时间点 mm:ss
     IsDayReset = 0    #(BYTE IsDayReset)// 是否每天重置
     ResetType = 0    #(BYTE ResetType)// 重置类型,0-0点重置;1-5点重置
     LimitLV = 0    #(WORD LimitLV)// 限制等级
+    ShopType = 0    #(WORD ShopType)// 开放商店类型,可能为0不开放
+    SubResetType = 0    #(BYTE SubResetType)// 提交凭证奖励重置类型,0-跟随活动; 1-0点重置;2-5点重置
     SubmitCount = 0    #(BYTE SubmitCount)
     SubmitInfoList = list()    #(vector<tagMCActBossTrialSubmitInfo> SubmitInfoList)// 提交凭证信息列表
-    BillardCount = 0    #(BYTE BillardCount)
-    BillboardInfoList = list()    #(vector<tagMCActBossTrialBillard> BillboardInfoList)// 榜单信息列表
+    PersonalBillCount = 0    #(BYTE PersonalBillCount)
+    PersonalBillboardInfoList = list()    #(vector<tagMCActBossTrialBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    FamilyBillCount = 0    #(BYTE FamilyBillCount)
+    FamilyBillboardInfoList = list()    #(vector<tagMCActBossTrialBillard> FamilyBillboardInfoList)// 仙盟榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
     data = None
 
     def __init__(self):
@@ -31406,19 +33295,28 @@
         self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
         self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.JoinStartTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
         self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ShopType,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.SubResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.SubmitCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.SubmitCount):
             temSubmitInfoList = tagMCActBossTrialSubmitInfo()
             _pos = temSubmitInfoList.ReadData(_lpData, _pos)
             self.SubmitInfoList.append(temSubmitInfoList)
-        self.BillardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        for i in range(self.BillardCount):
-            temBillboardInfoList = tagMCActBossTrialBillard()
-            _pos = temBillboardInfoList.ReadData(_lpData, _pos)
-            self.BillboardInfoList.append(temBillboardInfoList)
+        self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PersonalBillCount):
+            temPersonalBillboardInfoList = tagMCActBossTrialBillard()
+            _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+            self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+        self.FamilyBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.FamilyBillCount):
+            temFamilyBillboardInfoList = tagMCActBossTrialBillard()
+            _pos = temFamilyBillboardInfoList.ReadData(_lpData, _pos)
+            self.FamilyBillboardInfoList.append(temFamilyBillboardInfoList)
         return _pos
 
     def Clear(self):
@@ -31429,13 +33327,19 @@
         self.ActNum = 0
         self.StartDate = ""
         self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
         self.IsDayReset = 0
         self.ResetType = 0
         self.LimitLV = 0
+        self.ShopType = 0
+        self.SubResetType = 0
         self.SubmitCount = 0
         self.SubmitInfoList = list()
-        self.BillardCount = 0
-        self.BillboardInfoList = list()
+        self.PersonalBillCount = 0
+        self.PersonalBillboardInfoList = list()
+        self.FamilyBillCount = 0
+        self.FamilyBillboardInfoList = list()
         return
 
     def GetLength(self):
@@ -31444,15 +33348,22 @@
         length += 1
         length += 10
         length += 10
+        length += 5
+        length += 5
         length += 1
         length += 1
         length += 2
+        length += 2
+        length += 1
         length += 1
         for i in range(self.SubmitCount):
             length += self.SubmitInfoList[i].GetLength()
         length += 1
-        for i in range(self.BillardCount):
-            length += self.BillboardInfoList[i].GetLength()
+        for i in range(self.PersonalBillCount):
+            length += self.PersonalBillboardInfoList[i].GetLength()
+        length += 1
+        for i in range(self.FamilyBillCount):
+            length += self.FamilyBillboardInfoList[i].GetLength()
 
         return length
 
@@ -31462,15 +33373,22 @@
         data = CommFunc.WriteBYTE(data, self.ActNum)
         data = CommFunc.WriteString(data, 10, self.StartDate)
         data = CommFunc.WriteString(data, 10, self.EndtDate)
+        data = CommFunc.WriteString(data, 5, self.JoinStartTime)
+        data = CommFunc.WriteString(data, 5, self.JoinEndTime)
         data = CommFunc.WriteBYTE(data, self.IsDayReset)
         data = CommFunc.WriteBYTE(data, self.ResetType)
         data = CommFunc.WriteWORD(data, self.LimitLV)
+        data = CommFunc.WriteWORD(data, self.ShopType)
+        data = CommFunc.WriteBYTE(data, self.SubResetType)
         data = CommFunc.WriteBYTE(data, self.SubmitCount)
         for i in range(self.SubmitCount):
             data = CommFunc.WriteString(data, self.SubmitInfoList[i].GetLength(), self.SubmitInfoList[i].GetBuffer())
-        data = CommFunc.WriteBYTE(data, self.BillardCount)
-        for i in range(self.BillardCount):
-            data = CommFunc.WriteString(data, self.BillboardInfoList[i].GetLength(), self.BillboardInfoList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
+        for i in range(self.PersonalBillCount):
+            data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.FamilyBillCount)
+        for i in range(self.FamilyBillCount):
+            data = CommFunc.WriteString(data, self.FamilyBillboardInfoList[i].GetLength(), self.FamilyBillboardInfoList[i].GetBuffer())
         return data
 
     def OutputString(self):
@@ -31479,25 +33397,37 @@
                                 ActNum:%d,
                                 StartDate:%s,
                                 EndtDate:%s,
+                                JoinStartTime:%s,
+                                JoinEndTime:%s,
                                 IsDayReset:%d,
                                 ResetType:%d,
                                 LimitLV:%d,
+                                ShopType:%d,
+                                SubResetType:%d,
                                 SubmitCount:%d,
                                 SubmitInfoList:%s,
-                                BillardCount:%d,
-                                BillboardInfoList:%s
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s,
+                                FamilyBillCount:%d,
+                                FamilyBillboardInfoList:%s
                                 '''\
                                 %(
                                 self.Head.OutputString(),
                                 self.ActNum,
                                 self.StartDate,
                                 self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
                                 self.IsDayReset,
                                 self.ResetType,
                                 self.LimitLV,
+                                self.ShopType,
+                                self.SubResetType,
                                 self.SubmitCount,
                                 "...",
-                                self.BillardCount,
+                                self.PersonalBillCount,
+                                "...",
+                                self.FamilyBillCount,
                                 "..."
                                 )
         return DumpString
@@ -31516,8 +33446,9 @@
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
                   ("ActNum", c_ubyte),    # 活动编号
-                  ("SubmitCount", c_ushort),    # 已提交凭证个数
-                  ("SubmitCountAward", c_int),    # 提交凭证奖励领奖状态
+                  ("SubmitCount", c_int),    # 已提交凭证个数,总个数
+                  ("SubmitAwardCount", c_int),    # 已提交凭证个数,关联提交奖励的个数,领奖使用该个数判断
+                  ("SubmitAwardState", c_int),    # 提交凭证奖励领奖状态
                   ]
 
     def __init__(self):
@@ -31536,7 +33467,8 @@
         self.SubCmd = 0x68
         self.ActNum = 0
         self.SubmitCount = 0
-        self.SubmitCountAward = 0
+        self.SubmitAwardCount = 0
+        self.SubmitAwardState = 0
         return
 
     def GetLength(self):
@@ -31551,14 +33483,16 @@
                                 SubCmd:%s,
                                 ActNum:%d,
                                 SubmitCount:%d,
-                                SubmitCountAward:%d
+                                SubmitAwardCount:%d,
+                                SubmitAwardState:%d
                                 '''\
                                 %(
                                 self.Cmd,
                                 self.SubCmd,
                                 self.ActNum,
                                 self.SubmitCount,
-                                self.SubmitCountAward
+                                self.SubmitAwardCount,
+                                self.SubmitAwardState
                                 )
         return DumpString
 
@@ -31670,45 +33604,6 @@
         return DumpString
 
 
-class  tagMCActBuyCountCTGID(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("CTGID", c_ushort),    # 充值表ID
-                  ("Discount", c_ushort),    # 折扣力度百分比
-                  ]
-
-    def __init__(self):
-        self.Clear()
-        return
-
-    def ReadData(self, stringData, _pos=0, _len=0):
-        self.Clear()
-        memmove(addressof(self), stringData[_pos:], self.GetLength())
-        return _pos + self.GetLength()
-
-    def Clear(self):
-        self.CTGID = 0
-        self.Discount = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagMCActBuyCountCTGID)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''// AA 74 购买次数礼包活动信息 //tagMCActBuyCountGiftInfo:
-                                CTGID:%d,
-                                Discount:%d
-                                '''\
-                                %(
-                                self.CTGID,
-                                self.Discount
-                                )
-        return DumpString
-
-
 class  tagMCActBuyCountGiftInfo(Structure):
     Head = tagHead()
     ActNum = 0    #(BYTE ActNum)// 活动编号
@@ -31718,9 +33613,10 @@
     ResetType = 0    #(BYTE ResetType)// 重置类型,0-0点重置;1-5点重置
     LimitLV = 0    #(WORD LimitLV)// 限制等级
     CTGIDCount = 0    #(BYTE CTGIDCount)
-    CTGIDInfoList = list()    #(vector<tagMCActBuyCountCTGID> CTGIDInfoList)// CTGID信息列表;总购买次数前端自己统计,直接取CTGID对应的累计购买次数累加
+    CTGIDList = list()    #(vector<WORD> CTGIDList)// CTGID列表;总购买次数前端自己统计,直接取CTGID对应的累计购买次数累加
     GiftCount = 0    #(BYTE GiftCount)
     BuyCountGiftList = list()    #(vector<tagMCActBuyCountGift> BuyCountGiftList)// 购买次数礼包列表
+    ShopType = 0    #(WORD ShopType)// 开放商店类型,可能为0不开放
     data = None
 
     def __init__(self):
@@ -31740,14 +33636,14 @@
         self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.CTGIDCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.CTGIDCount):
-            temCTGIDInfoList = tagMCActBuyCountCTGID()
-            _pos = temCTGIDInfoList.ReadData(_lpData, _pos)
-            self.CTGIDInfoList.append(temCTGIDInfoList)
+            value,_pos=CommFunc.ReadWORD(_lpData,_pos)
+            self.CTGIDList.append(value)
         self.GiftCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.GiftCount):
             temBuyCountGiftList = tagMCActBuyCountGift()
             _pos = temBuyCountGiftList.ReadData(_lpData, _pos)
             self.BuyCountGiftList.append(temBuyCountGiftList)
+        self.ShopType,_pos = CommFunc.ReadWORD(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -31762,9 +33658,10 @@
         self.ResetType = 0
         self.LimitLV = 0
         self.CTGIDCount = 0
-        self.CTGIDInfoList = list()
+        self.CTGIDList = list()
         self.GiftCount = 0
         self.BuyCountGiftList = list()
+        self.ShopType = 0
         return
 
     def GetLength(self):
@@ -31777,11 +33674,11 @@
         length += 1
         length += 2
         length += 1
-        for i in range(self.CTGIDCount):
-            length += self.CTGIDInfoList[i].GetLength()
+        length += 2 * self.CTGIDCount
         length += 1
         for i in range(self.GiftCount):
             length += self.BuyCountGiftList[i].GetLength()
+        length += 2
 
         return length
 
@@ -31796,10 +33693,11 @@
         data = CommFunc.WriteWORD(data, self.LimitLV)
         data = CommFunc.WriteBYTE(data, self.CTGIDCount)
         for i in range(self.CTGIDCount):
-            data = CommFunc.WriteString(data, self.CTGIDInfoList[i].GetLength(), self.CTGIDInfoList[i].GetBuffer())
+            data = CommFunc.WriteWORD(data, self.CTGIDList[i])
         data = CommFunc.WriteBYTE(data, self.GiftCount)
         for i in range(self.GiftCount):
             data = CommFunc.WriteString(data, self.BuyCountGiftList[i].GetLength(), self.BuyCountGiftList[i].GetBuffer())
+        data = CommFunc.WriteWORD(data, self.ShopType)
         return data
 
     def OutputString(self):
@@ -31812,9 +33710,10 @@
                                 ResetType:%d,
                                 LimitLV:%d,
                                 CTGIDCount:%d,
-                                CTGIDInfoList:%s,
+                                CTGIDList:%s,
                                 GiftCount:%d,
-                                BuyCountGiftList:%s
+                                BuyCountGiftList:%s,
+                                ShopType:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
@@ -31827,7 +33726,8 @@
                                 self.CTGIDCount,
                                 "...",
                                 self.GiftCount,
-                                "..."
+                                "...",
+                                self.ShopType
                                 )
         return DumpString
 
@@ -32579,6 +34479,273 @@
 
 m_NAtagMCActCollectWordsPlayerInfo=tagMCActCollectWordsPlayerInfo()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActCollectWordsPlayerInfo.Head.Cmd,m_NAtagMCActCollectWordsPlayerInfo.Head.SubCmd))] = m_NAtagMCActCollectWordsPlayerInfo
+
+
+#------------------------------------------------------
+# AA 77 仙盟充值互助活动信息 #tagMCActFamilyCTGAssistInfo
+
+class  tagMCActFamilyCTGAssistItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ("IsBind", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.ItemID = 0
+        self.ItemCount = 0
+        self.IsBind = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCActFamilyCTGAssistItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 77 仙盟充值互助活动信息 //tagMCActFamilyCTGAssistInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCActFamilyCTGAssistAward(Structure):
+    NeedCTGPlayers = 0    #(BYTE NeedCTGPlayers)//所需充值人数
+    RecordIndex = 0    #(BYTE RecordIndex)//对应领奖记录索引
+    Count = 0    #(BYTE Count)
+    AwardItemList = list()    #(vector<tagMCActFamilyCTGAssistItem> AwardItemList)// 奖励物品列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.NeedCTGPlayers,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RecordIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCActFamilyCTGAssistItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.NeedCTGPlayers = 0
+        self.RecordIndex = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 1
+        length += 1
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteBYTE(data, self.NeedCTGPlayers)
+        data = CommFunc.WriteBYTE(data, self.RecordIndex)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                NeedCTGPlayers:%d,
+                                RecordIndex:%d,
+                                Count:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.NeedCTGPlayers,
+                                self.RecordIndex,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCActFamilyCTGAssistInfo(Structure):
+    Head = tagHead()
+    ActNum = 0    #(BYTE ActNum)//活动编号
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    IsDayReset = 0    #(BYTE IsDayReset)//是否每天重置
+    LimitLV = 0    #(WORD LimitLV)// 限制等级
+    AwardCount = 0    #(BYTE AwardCount)
+    AwardInfoList = list()    #(vector<tagMCActFamilyCTGAssistAward> AwardInfoList)// 互助奖励列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x77
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.AwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.AwardCount):
+            temAwardInfoList = tagMCActFamilyCTGAssistAward()
+            _pos = temAwardInfoList.ReadData(_lpData, _pos)
+            self.AwardInfoList.append(temAwardInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x77
+        self.ActNum = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.IsDayReset = 0
+        self.LimitLV = 0
+        self.AwardCount = 0
+        self.AwardInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 10
+        length += 10
+        length += 1
+        length += 2
+        length += 1
+        for i in range(self.AwardCount):
+            length += self.AwardInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ActNum)
+        data = CommFunc.WriteString(data, 10, self.StartDate)
+        data = CommFunc.WriteString(data, 10, self.EndtDate)
+        data = CommFunc.WriteBYTE(data, self.IsDayReset)
+        data = CommFunc.WriteWORD(data, self.LimitLV)
+        data = CommFunc.WriteBYTE(data, self.AwardCount)
+        for i in range(self.AwardCount):
+            data = CommFunc.WriteString(data, self.AwardInfoList[i].GetLength(), self.AwardInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ActNum:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                IsDayReset:%d,
+                                LimitLV:%d,
+                                AwardCount:%d,
+                                AwardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ActNum,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.IsDayReset,
+                                self.LimitLV,
+                                self.AwardCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCActFamilyCTGAssistInfo=tagMCActFamilyCTGAssistInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActFamilyCTGAssistInfo.Head.Cmd,m_NAtagMCActFamilyCTGAssistInfo.Head.SubCmd))] = m_NAtagMCActFamilyCTGAssistInfo
+
+
+#------------------------------------------------------
+# AA 78 仙盟充值互助活动玩家信息 #tagMCActFamilyCTGAssistPlayerInfo
+
+class  tagMCActFamilyCTGAssistPlayerInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("ActNum", c_ubyte),    # 活动编号
+                  ("AwardRecord", c_int),    # 奖励记录,按奖励记录索引位运算判断是否已领取
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xAA
+        self.SubCmd = 0x78
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xAA
+        self.SubCmd = 0x78
+        self.ActNum = 0
+        self.AwardRecord = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCActFamilyCTGAssistPlayerInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 78 仙盟充值互助活动玩家信息 //tagMCActFamilyCTGAssistPlayerInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                ActNum:%d,
+                                AwardRecord:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.ActNum,
+                                self.AwardRecord
+                                )
+        return DumpString
+
+
+m_NAtagMCActFamilyCTGAssistPlayerInfo=tagMCActFamilyCTGAssistPlayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActFamilyCTGAssistPlayerInfo.Cmd,m_NAtagMCActFamilyCTGAssistPlayerInfo.SubCmd))] = m_NAtagMCActFamilyCTGAssistPlayerInfo
 
 
 #------------------------------------------------------
@@ -33526,6 +35693,356 @@
 
 
 #------------------------------------------------------
+# AA 81 古宝养成活动信息 #tagMCActGubaoInfo
+
+class  tagMCActGubaoItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ("IsBind", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.ItemID = 0
+        self.ItemCount = 0
+        self.IsBind = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCActGubaoItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 81 古宝养成活动信息 //tagMCActGubaoInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCActGubaoAwardEx(Structure):
+    NeedScore = 0    #(DWORD NeedScore)// 额外奖励所需积分
+    Count = 0    #(BYTE Count)// 额外奖励物品数
+    AwardItemList = list()    #(vector<tagMCActGubaoItem> AwardItemList)// 额外奖励物品列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCActGubaoItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.NeedScore = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                NeedScore:%d,
+                                Count:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.NeedScore,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCActGubaoBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCActGubaoItem> AwardItemList)// 奖励物品列表
+    NeedScore = 0    #(DWORD NeedScore)// 上榜所需积分
+    CountEx = 0    #(BYTE CountEx)// 额外奖励数
+    AwardItemExList = list()    #(vector<tagMCActGubaoAwardEx> AwardItemExList)// 额外奖励列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCActGubaoItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CountEx,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.CountEx):
+            temAwardItemExList = tagMCActGubaoAwardEx()
+            _pos = temAwardItemExList.ReadData(_lpData, _pos)
+            self.AwardItemExList.append(temAwardItemExList)
+        return _pos
+
+    def Clear(self):
+        self.Rank = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        self.NeedScore = 0
+        self.CountEx = 0
+        self.AwardItemExList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+        length += 4
+        length += 1
+        for i in range(self.CountEx):
+            length += self.AwardItemExList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.Rank)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
+        data = CommFunc.WriteBYTE(data, self.CountEx)
+        for i in range(self.CountEx):
+            data = CommFunc.WriteString(data, self.AwardItemExList[i].GetLength(), self.AwardItemExList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Rank:%d,
+                                Count:%d,
+                                AwardItemList:%s,
+                                NeedScore:%d,
+                                CountEx:%d,
+                                AwardItemExList:%s
+                                '''\
+                                %(
+                                self.Rank,
+                                self.Count,
+                                "...",
+                                self.NeedScore,
+                                self.CountEx,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCActGubaoInfo(Structure):
+    Head = tagHead()
+    ActNum = 0    #(BYTE ActNum)// 活动编号
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    JoinStartTime = ""    #(char JoinStartTime[5])// 参与开始时间点 mm:ss
+    JoinEndTime = ""    #(char JoinEndTime[5])// 参与结束时间点 mm:ss
+    LimitLV = 0    #(WORD LimitLV)// 限制等级
+    PersonalBillCount = 0    #(BYTE PersonalBillCount)
+    PersonalBillboardInfoList = list()    #(vector<tagMCActGubaoBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x81
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.JoinStartTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PersonalBillCount):
+            temPersonalBillboardInfoList = tagMCActGubaoBillard()
+            _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+            self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x81
+        self.ActNum = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
+        self.LimitLV = 0
+        self.PersonalBillCount = 0
+        self.PersonalBillboardInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 10
+        length += 10
+        length += 5
+        length += 5
+        length += 2
+        length += 1
+        for i in range(self.PersonalBillCount):
+            length += self.PersonalBillboardInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ActNum)
+        data = CommFunc.WriteString(data, 10, self.StartDate)
+        data = CommFunc.WriteString(data, 10, self.EndtDate)
+        data = CommFunc.WriteString(data, 5, self.JoinStartTime)
+        data = CommFunc.WriteString(data, 5, self.JoinEndTime)
+        data = CommFunc.WriteWORD(data, self.LimitLV)
+        data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
+        for i in range(self.PersonalBillCount):
+            data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ActNum:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                JoinStartTime:%s,
+                                JoinEndTime:%s,
+                                LimitLV:%d,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ActNum,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.LimitLV,
+                                self.PersonalBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCActGubaoInfo=tagMCActGubaoInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActGubaoInfo.Head.Cmd,m_NAtagMCActGubaoInfo.Head.SubCmd))] = m_NAtagMCActGubaoInfo
+
+
+#------------------------------------------------------
+# AA 82 古宝养成活动玩家信息 #tagMCActGubaoPlayerInfo
+
+class  tagMCActGubaoPlayerInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("ActNum", c_ubyte),    # 活动编号
+                  ("Score", c_int),    # 当前积分
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xAA
+        self.SubCmd = 0x82
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xAA
+        self.SubCmd = 0x82
+        self.ActNum = 0
+        self.Score = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCActGubaoPlayerInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 82 古宝养成活动玩家信息 //tagMCActGubaoPlayerInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                ActNum:%d,
+                                Score:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.ActNum,
+                                self.Score
+                                )
+        return DumpString
+
+
+m_NAtagMCActGubaoPlayerInfo=tagMCActGubaoPlayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActGubaoPlayerInfo.Cmd,m_NAtagMCActGubaoPlayerInfo.SubCmd))] = m_NAtagMCActGubaoPlayerInfo
+
+
+#------------------------------------------------------
 # AA 54 骑宠盛宴活动信息 #tagMCActHorsePetFeastInfo
 
 class  tagMCActHorsePetFeastTime(Structure):
@@ -33665,6 +36182,363 @@
 
 m_NAtagMCActHorsePetFeastInfo=tagMCActHorsePetFeastInfo()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActHorsePetFeastInfo.Head.Cmd,m_NAtagMCActHorsePetFeastInfo.Head.SubCmd))] = m_NAtagMCActHorsePetFeastInfo
+
+
+#------------------------------------------------------
+# AA 84 骑宠养成活动信息 #tagMCActHorsePetTrainInfo
+
+class  tagMCActHorsePetTrainItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ("IsBind", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.ItemID = 0
+        self.ItemCount = 0
+        self.IsBind = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCActHorsePetTrainItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 84 骑宠养成活动信息 //tagMCActHorsePetTrainInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCActHorsePetTrainAwardEx(Structure):
+    NeedScore = 0    #(DWORD NeedScore)// 额外奖励所需积分
+    Count = 0    #(BYTE Count)// 额外奖励物品数
+    AwardItemList = list()    #(vector<tagMCActHorsePetTrainItem> AwardItemList)// 额外奖励物品列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCActHorsePetTrainItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.NeedScore = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                NeedScore:%d,
+                                Count:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.NeedScore,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCActHorsePetTrainBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCActHorsePetTrainItem> AwardItemList)// 奖励物品列表
+    NeedScore = 0    #(DWORD NeedScore)// 上榜所需积分
+    CountEx = 0    #(BYTE CountEx)// 额外奖励数
+    AwardItemExList = list()    #(vector<tagMCActHorsePetTrainAwardEx> AwardItemExList)// 额外奖励列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCActHorsePetTrainItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CountEx,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.CountEx):
+            temAwardItemExList = tagMCActHorsePetTrainAwardEx()
+            _pos = temAwardItemExList.ReadData(_lpData, _pos)
+            self.AwardItemExList.append(temAwardItemExList)
+        return _pos
+
+    def Clear(self):
+        self.Rank = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        self.NeedScore = 0
+        self.CountEx = 0
+        self.AwardItemExList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+        length += 4
+        length += 1
+        for i in range(self.CountEx):
+            length += self.AwardItemExList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.Rank)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
+        data = CommFunc.WriteBYTE(data, self.CountEx)
+        for i in range(self.CountEx):
+            data = CommFunc.WriteString(data, self.AwardItemExList[i].GetLength(), self.AwardItemExList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Rank:%d,
+                                Count:%d,
+                                AwardItemList:%s,
+                                NeedScore:%d,
+                                CountEx:%d,
+                                AwardItemExList:%s
+                                '''\
+                                %(
+                                self.Rank,
+                                self.Count,
+                                "...",
+                                self.NeedScore,
+                                self.CountEx,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCActHorsePetTrainInfo(Structure):
+    Head = tagHead()
+    ActNum = 0    #(BYTE ActNum)// 活动编号
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    JoinStartTime = ""    #(char JoinStartTime[5])// 参与开始时间点 mm:ss
+    JoinEndTime = ""    #(char JoinEndTime[5])// 参与结束时间点 mm:ss
+    LimitLV = 0    #(WORD LimitLV)// 限制等级
+    ShopType = 0    #(WORD ShopType)// 开放商店类型,可能为0不开放
+    PersonalBillCount = 0    #(BYTE PersonalBillCount)
+    PersonalBillboardInfoList = list()    #(vector<tagMCActHorsePetTrainBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x84
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.JoinStartTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ShopType,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PersonalBillCount):
+            temPersonalBillboardInfoList = tagMCActHorsePetTrainBillard()
+            _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+            self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x84
+        self.ActNum = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
+        self.LimitLV = 0
+        self.ShopType = 0
+        self.PersonalBillCount = 0
+        self.PersonalBillboardInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 10
+        length += 10
+        length += 5
+        length += 5
+        length += 2
+        length += 2
+        length += 1
+        for i in range(self.PersonalBillCount):
+            length += self.PersonalBillboardInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ActNum)
+        data = CommFunc.WriteString(data, 10, self.StartDate)
+        data = CommFunc.WriteString(data, 10, self.EndtDate)
+        data = CommFunc.WriteString(data, 5, self.JoinStartTime)
+        data = CommFunc.WriteString(data, 5, self.JoinEndTime)
+        data = CommFunc.WriteWORD(data, self.LimitLV)
+        data = CommFunc.WriteWORD(data, self.ShopType)
+        data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
+        for i in range(self.PersonalBillCount):
+            data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ActNum:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                JoinStartTime:%s,
+                                JoinEndTime:%s,
+                                LimitLV:%d,
+                                ShopType:%d,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ActNum,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.LimitLV,
+                                self.ShopType,
+                                self.PersonalBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCActHorsePetTrainInfo=tagMCActHorsePetTrainInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActHorsePetTrainInfo.Head.Cmd,m_NAtagMCActHorsePetTrainInfo.Head.SubCmd))] = m_NAtagMCActHorsePetTrainInfo
+
+
+#------------------------------------------------------
+# AA 85 骑宠养成活动玩家信息 #tagMCActHorsePetTrainPlayerInfo
+
+class  tagMCActHorsePetTrainPlayerInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("ActNum", c_ubyte),    # 活动编号
+                  ("Score", c_int),    # 当前活动积分
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xAA
+        self.SubCmd = 0x85
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xAA
+        self.SubCmd = 0x85
+        self.ActNum = 0
+        self.Score = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCActHorsePetTrainPlayerInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 85 骑宠养成活动玩家信息 //tagMCActHorsePetTrainPlayerInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                ActNum:%d,
+                                Score:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.ActNum,
+                                self.Score
+                                )
+        return DumpString
+
+
+m_NAtagMCActHorsePetTrainPlayerInfo=tagMCActHorsePetTrainPlayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActHorsePetTrainPlayerInfo.Cmd,m_NAtagMCActHorsePetTrainPlayerInfo.SubCmd))] = m_NAtagMCActHorsePetTrainPlayerInfo
 
 
 #------------------------------------------------------
@@ -35813,6 +38687,7 @@
     LimitLV = 0    #(WORD LimitLV)// 限制等级
     TaskCount = 0    #(BYTE TaskCount)
     TaskList = list()    #(vector<tagMCActTask> TaskList)// 任务列表
+    RoundMax = 0    #(BYTE RoundMax)// 最大可循环轮次,当小于等于1时代表不循环
     data = None
 
     def __init__(self):
@@ -35835,6 +38710,7 @@
             temTaskList = tagMCActTask()
             _pos = temTaskList.ReadData(_lpData, _pos)
             self.TaskList.append(temTaskList)
+        self.RoundMax,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -35850,6 +38726,7 @@
         self.LimitLV = 0
         self.TaskCount = 0
         self.TaskList = list()
+        self.RoundMax = 0
         return
 
     def GetLength(self):
@@ -35864,6 +38741,7 @@
         length += 1
         for i in range(self.TaskCount):
             length += self.TaskList[i].GetLength()
+        length += 1
 
         return length
 
@@ -35879,6 +38757,7 @@
         data = CommFunc.WriteBYTE(data, self.TaskCount)
         for i in range(self.TaskCount):
             data = CommFunc.WriteString(data, self.TaskList[i].GetLength(), self.TaskList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.RoundMax)
         return data
 
     def OutputString(self):
@@ -35891,7 +38770,8 @@
                                 ResetType:%d,
                                 LimitLV:%d,
                                 TaskCount:%d,
-                                TaskList:%s
+                                TaskList:%s,
+                                RoundMax:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
@@ -35902,7 +38782,8 @@
                                 self.ResetType,
                                 self.LimitLV,
                                 self.TaskCount,
-                                "..."
+                                "...",
+                                self.RoundMax
                                 )
         return DumpString
 
@@ -35919,6 +38800,7 @@
     ActNum = 0    #(BYTE ActNum)// 活动编号
     AwardCount = 0    #(BYTE AwardCount)
     AwardRecordList = list()    #(vector<DWORD> AwardRecordList)// 任务ID领奖记录值列表,根据任务ID位判断是否已领取,一个记录值存31位 [记录值0, 记录值1, ...]
+    RoundNum = 0    #(BYTE RoundNum)// 当前轮次,从1开始
     data = None
 
     def __init__(self):
@@ -35935,6 +38817,7 @@
         for i in range(self.AwardCount):
             value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
             self.AwardRecordList.append(value)
+        self.RoundNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -35945,6 +38828,7 @@
         self.ActNum = 0
         self.AwardCount = 0
         self.AwardRecordList = list()
+        self.RoundNum = 0
         return
 
     def GetLength(self):
@@ -35953,6 +38837,7 @@
         length += 1
         length += 1
         length += 4 * self.AwardCount
+        length += 1
 
         return length
 
@@ -35963,6 +38848,7 @@
         data = CommFunc.WriteBYTE(data, self.AwardCount)
         for i in range(self.AwardCount):
             data = CommFunc.WriteDWORD(data, self.AwardRecordList[i])
+        data = CommFunc.WriteBYTE(data, self.RoundNum)
         return data
 
     def OutputString(self):
@@ -35970,13 +38856,15 @@
                                 Head:%s,
                                 ActNum:%d,
                                 AwardCount:%d,
-                                AwardRecordList:%s
+                                AwardRecordList:%s,
+                                RoundNum:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
                                 self.ActNum,
                                 self.AwardCount,
-                                "..."
+                                "...",
+                                self.RoundNum
                                 )
         return DumpString
 
@@ -37138,6 +40026,7 @@
                   ("ItemCount", c_ushort),    
                   ("PosNum", c_ubyte),    # 被抽中时的位置编号,1~99,前端自定义展示位置编号,0代表未被抽中;
                   ("TotalTimesNow", c_ubyte),    #当前已产出次数,不限制次数时不记录,即同样为0
+                  ("LotteryScore", c_int),    #当前抽奖积分
                   ]
 
     def __init__(self):
@@ -37160,6 +40049,7 @@
         self.ItemCount = 0
         self.PosNum = 0
         self.TotalTimesNow = 0
+        self.LotteryScore = 0
         return
 
     def GetLength(self):
@@ -37177,7 +40067,8 @@
                                 ItemID:%d,
                                 ItemCount:%d,
                                 PosNum:%d,
-                                TotalTimesNow:%d
+                                TotalTimesNow:%d,
+                                LotteryScore:%d
                                 '''\
                                 %(
                                 self.Cmd,
@@ -37187,7 +40078,8 @@
                                 self.ItemID,
                                 self.ItemCount,
                                 self.PosNum,
-                                self.TotalTimesNow
+                                self.TotalTimesNow,
+                                self.LotteryScore
                                 )
         return DumpString
 
@@ -37199,7 +40091,343 @@
 #------------------------------------------------------
 # AA 58 仙匣秘境活动信息 #tagMCActXianXiaMJInfo
 
-class  tagMCActXianXiaMJAwardItem(Structure):
+class  tagMCActXianXiaMJItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ("IsBind", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.ItemID = 0
+        self.ItemCount = 0
+        self.IsBind = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCActXianXiaMJItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 58 仙匣秘境活动信息 //tagMCActXianXiaMJInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCActXianXiaMJAwardEx(Structure):
+    NeedScore = 0    #(DWORD NeedScore)// 额外奖励所需积分
+    Count = 0    #(BYTE Count)// 额外奖励物品数
+    AwardItemList = list()    #(vector<tagMCActXianXiaMJItem> AwardItemList)// 额外奖励物品列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCActXianXiaMJItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.NeedScore = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                NeedScore:%d,
+                                Count:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.NeedScore,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCActXianXiaMJBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCActXianXiaMJItem> AwardItemList)// 奖励物品列表
+    NeedScore = 0    #(DWORD NeedScore)// 上榜所需积分
+    CountEx = 0    #(BYTE CountEx)// 额外奖励数
+    AwardItemExList = list()    #(vector<tagMCActXianXiaMJAwardEx> AwardItemExList)// 额外奖励列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCActXianXiaMJItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CountEx,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.CountEx):
+            temAwardItemExList = tagMCActXianXiaMJAwardEx()
+            _pos = temAwardItemExList.ReadData(_lpData, _pos)
+            self.AwardItemExList.append(temAwardItemExList)
+        return _pos
+
+    def Clear(self):
+        self.Rank = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        self.NeedScore = 0
+        self.CountEx = 0
+        self.AwardItemExList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+        length += 4
+        length += 1
+        for i in range(self.CountEx):
+            length += self.AwardItemExList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.Rank)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
+        data = CommFunc.WriteBYTE(data, self.CountEx)
+        for i in range(self.CountEx):
+            data = CommFunc.WriteString(data, self.AwardItemExList[i].GetLength(), self.AwardItemExList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Rank:%d,
+                                Count:%d,
+                                AwardItemList:%s,
+                                NeedScore:%d,
+                                CountEx:%d,
+                                AwardItemExList:%s
+                                '''\
+                                %(
+                                self.Rank,
+                                self.Count,
+                                "...",
+                                self.NeedScore,
+                                self.CountEx,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCActXianXiaMJInfo(Structure):
+    Head = tagHead()
+    ActNum = 0    #(BYTE ActNum)// 活动编号
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    JoinStartTime = ""    #(char JoinStartTime[5])// 参与开始时间点 mm:ss
+    JoinEndTime = ""    #(char JoinEndTime[5])// 参与结束时间点 mm:ss
+    IsDayReset = 0    #(BYTE IsDayReset)// 是否每天重置
+    LimitLV = 0    #(WORD LimitLV)// 限制等级
+    UseItemID = 0    #(DWORD UseItemID)//消耗物品ID,默认1个;消耗物品或货币二选一即可,或都配则先消耗道具,不足则消耗货币
+    MoneyType = 0    #(BYTE MoneyType)//消耗货币类型
+    MoneyValue = 0    #(WORD MoneyValue)//消耗货币值
+    LotteryAddScore = 0    #(WORD LotteryAddScore)//每次抽奖加积分
+    LayerAddScore = 0    #(WORD LayerAddScore)//每次跨层加积分
+    PersonalBillCount = 0    #(BYTE PersonalBillCount)
+    PersonalBillboardInfoList = list()    #(vector<tagMCActXianXiaMJBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x58
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.JoinStartTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.UseItemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MoneyType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.MoneyValue,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.LotteryAddScore,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.LayerAddScore,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PersonalBillCount):
+            temPersonalBillboardInfoList = tagMCActXianXiaMJBillard()
+            _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+            self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x58
+        self.ActNum = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
+        self.IsDayReset = 0
+        self.LimitLV = 0
+        self.UseItemID = 0
+        self.MoneyType = 0
+        self.MoneyValue = 0
+        self.LotteryAddScore = 0
+        self.LayerAddScore = 0
+        self.PersonalBillCount = 0
+        self.PersonalBillboardInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 10
+        length += 10
+        length += 5
+        length += 5
+        length += 1
+        length += 2
+        length += 4
+        length += 1
+        length += 2
+        length += 2
+        length += 2
+        length += 1
+        for i in range(self.PersonalBillCount):
+            length += self.PersonalBillboardInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ActNum)
+        data = CommFunc.WriteString(data, 10, self.StartDate)
+        data = CommFunc.WriteString(data, 10, self.EndtDate)
+        data = CommFunc.WriteString(data, 5, self.JoinStartTime)
+        data = CommFunc.WriteString(data, 5, self.JoinEndTime)
+        data = CommFunc.WriteBYTE(data, self.IsDayReset)
+        data = CommFunc.WriteWORD(data, self.LimitLV)
+        data = CommFunc.WriteDWORD(data, self.UseItemID)
+        data = CommFunc.WriteBYTE(data, self.MoneyType)
+        data = CommFunc.WriteWORD(data, self.MoneyValue)
+        data = CommFunc.WriteWORD(data, self.LotteryAddScore)
+        data = CommFunc.WriteWORD(data, self.LayerAddScore)
+        data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
+        for i in range(self.PersonalBillCount):
+            data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ActNum:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                JoinStartTime:%s,
+                                JoinEndTime:%s,
+                                IsDayReset:%d,
+                                LimitLV:%d,
+                                UseItemID:%d,
+                                MoneyType:%d,
+                                MoneyValue:%d,
+                                LotteryAddScore:%d,
+                                LayerAddScore:%d,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ActNum,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.IsDayReset,
+                                self.LimitLV,
+                                self.UseItemID,
+                                self.MoneyType,
+                                self.MoneyValue,
+                                self.LotteryAddScore,
+                                self.LayerAddScore,
+                                self.PersonalBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCActXianXiaMJInfo=tagMCActXianXiaMJInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActXianXiaMJInfo.Head.Cmd,m_NAtagMCActXianXiaMJInfo.Head.SubCmd))] = m_NAtagMCActXianXiaMJInfo
+
+
+#------------------------------------------------------
+# AA 79 仙匣秘境层信息 #tagMCActXianXiaMJLayerInfo
+
+class  tagMCActXianXiaMJLayerItem(Structure):
     _pack_ = 1
     _fields_ = [
                   ("ItemLibType", c_ubyte),    #物品库类型;9-固定为大奖库,非9-策划自定义库
@@ -37231,13 +40459,13 @@
         return
 
     def GetLength(self):
-        return sizeof(tagMCActXianXiaMJAwardItem)
+        return sizeof(tagMCActXianXiaMJLayerItem)
 
     def GetBuffer(self):
         return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
-        DumpString = '''// AA 58 仙匣秘境活动信息 //tagMCActXianXiaMJInfo:
+        DumpString = '''// AA 79 仙匣秘境层信息 //tagMCActXianXiaMJLayerInfo:
                                 ItemLibType:%d,
                                 ItemID:%d,
                                 ItemCount:%d,
@@ -37258,48 +40486,38 @@
         return DumpString
 
 
-class  tagMCActXianXiaMJInfo(Structure):
+class  tagMCActXianXiaMJLayerInfo(Structure):
     Head = tagHead()
     ActNum = 0    #(BYTE ActNum)// 活动编号
-    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
-    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
-    LimitLV = 0    #(WORD LimitLV)// 限制等级
-    ResetType = 0    #(BYTE ResetType)// 重置类型,0-0点重置;1-5点开,5点重置;2-5点开,0点重置
-    MoneyType = 0    #(BYTE MoneyType)//消耗货币类型
-    MoneyValue = 0    #(WORD MoneyValue)//消耗货币值
-    LayerNum = 0    #(BYTE LayerNum)//当前奖池第几层
+    LayerNum = 0    #(WORD LayerNum)//当前奖池第几层
+    LotteryScore = 0    #(DWORD LotteryScore)//当前抽奖积分
     AwardItemCount = 0    #(BYTE AwardItemCount)
-    AwardItemList = list()    #(vector<tagMCActXianXiaMJAwardItem> AwardItemList)// 奖池物品列表,已生成的,包含已选择的大奖物品
+    AwardItemList = list()    #(vector<tagMCActXianXiaMJLayerItem> AwardItemList)// 奖池物品列表,已生成的,包含已选择的大奖物品
     SuperItemCount = 0    #(BYTE SuperItemCount)
-    SuperItemList = list()    #(vector<tagMCActXianXiaMJAwardItem> SuperItemList)// 大奖物品待选择库,由玩家从库中选择放入奖池的物品;
+    SuperItemList = list()    #(vector<tagMCActXianXiaMJLayerItem> SuperItemList)// 大奖物品待选择库,由玩家从库中选择放入奖池的物品;
     SuperItemCanChooseCount = 0    #(BYTE SuperItemCanChooseCount)// 大奖物品可选择个数
     data = None
 
     def __init__(self):
         self.Clear()
         self.Head.Cmd = 0xAA
-        self.Head.SubCmd = 0x58
+        self.Head.SubCmd = 0x79
         return
 
     def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
         _pos = self.Head.ReadData(_lpData, _pos)
         self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
-        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
-        self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.MoneyType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.MoneyValue,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.LayerNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.LayerNum,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.LotteryScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.AwardItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.AwardItemCount):
-            temAwardItemList = tagMCActXianXiaMJAwardItem()
+            temAwardItemList = tagMCActXianXiaMJLayerItem()
             _pos = temAwardItemList.ReadData(_lpData, _pos)
             self.AwardItemList.append(temAwardItemList)
         self.SuperItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.SuperItemCount):
-            temSuperItemList = tagMCActXianXiaMJAwardItem()
+            temSuperItemList = tagMCActXianXiaMJLayerItem()
             _pos = temSuperItemList.ReadData(_lpData, _pos)
             self.SuperItemList.append(temSuperItemList)
         self.SuperItemCanChooseCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
@@ -37309,15 +40527,10 @@
         self.Head = tagHead()
         self.Head.Clear()
         self.Head.Cmd = 0xAA
-        self.Head.SubCmd = 0x58
+        self.Head.SubCmd = 0x79
         self.ActNum = 0
-        self.StartDate = ""
-        self.EndtDate = ""
-        self.LimitLV = 0
-        self.ResetType = 0
-        self.MoneyType = 0
-        self.MoneyValue = 0
         self.LayerNum = 0
+        self.LotteryScore = 0
         self.AwardItemCount = 0
         self.AwardItemList = list()
         self.SuperItemCount = 0
@@ -37329,13 +40542,8 @@
         length = 0
         length += self.Head.GetLength()
         length += 1
-        length += 10
-        length += 10
         length += 2
-        length += 1
-        length += 1
-        length += 2
-        length += 1
+        length += 4
         length += 1
         for i in range(self.AwardItemCount):
             length += self.AwardItemList[i].GetLength()
@@ -37350,13 +40558,8 @@
         data = ''
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
         data = CommFunc.WriteBYTE(data, self.ActNum)
-        data = CommFunc.WriteString(data, 10, self.StartDate)
-        data = CommFunc.WriteString(data, 10, self.EndtDate)
-        data = CommFunc.WriteWORD(data, self.LimitLV)
-        data = CommFunc.WriteBYTE(data, self.ResetType)
-        data = CommFunc.WriteBYTE(data, self.MoneyType)
-        data = CommFunc.WriteWORD(data, self.MoneyValue)
-        data = CommFunc.WriteBYTE(data, self.LayerNum)
+        data = CommFunc.WriteWORD(data, self.LayerNum)
+        data = CommFunc.WriteDWORD(data, self.LotteryScore)
         data = CommFunc.WriteBYTE(data, self.AwardItemCount)
         for i in range(self.AwardItemCount):
             data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
@@ -37370,13 +40573,8 @@
         DumpString = '''
                                 Head:%s,
                                 ActNum:%d,
-                                StartDate:%s,
-                                EndtDate:%s,
-                                LimitLV:%d,
-                                ResetType:%d,
-                                MoneyType:%d,
-                                MoneyValue:%d,
                                 LayerNum:%d,
+                                LotteryScore:%d,
                                 AwardItemCount:%d,
                                 AwardItemList:%s,
                                 SuperItemCount:%d,
@@ -37386,13 +40584,8 @@
                                 %(
                                 self.Head.OutputString(),
                                 self.ActNum,
-                                self.StartDate,
-                                self.EndtDate,
-                                self.LimitLV,
-                                self.ResetType,
-                                self.MoneyType,
-                                self.MoneyValue,
                                 self.LayerNum,
+                                self.LotteryScore,
                                 self.AwardItemCount,
                                 "...",
                                 self.SuperItemCount,
@@ -37402,8 +40595,8 @@
         return DumpString
 
 
-m_NAtagMCActXianXiaMJInfo=tagMCActXianXiaMJInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActXianXiaMJInfo.Head.Cmd,m_NAtagMCActXianXiaMJInfo.Head.SubCmd))] = m_NAtagMCActXianXiaMJInfo
+m_NAtagMCActXianXiaMJLayerInfo=tagMCActXianXiaMJLayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActXianXiaMJLayerInfo.Head.Cmd,m_NAtagMCActXianXiaMJLayerInfo.Head.SubCmd))] = m_NAtagMCActXianXiaMJLayerInfo
 
 
 #------------------------------------------------------
@@ -38324,6 +41517,1269 @@
 
 m_NAtagMCCrossActAllRechargePlayerInfo=tagMCCrossActAllRechargePlayerInfo()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCrossActAllRechargePlayerInfo.Cmd,m_NAtagMCCrossActAllRechargePlayerInfo.SubCmd))] = m_NAtagMCCrossActAllRechargePlayerInfo
+
+
+#------------------------------------------------------
+# AA 76 Boss历练跨服活动信息 #tagMCCrossActBossTrialInfo
+
+class  tagMCCrossActBossTrialItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ("IsBind", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.ItemID = 0
+        self.ItemCount = 0
+        self.IsBind = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCCrossActBossTrialItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 76 Boss历练跨服活动信息 //tagMCCrossActBossTrialInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCCrossActBossTrialAwardEx(Structure):
+    NeedScore = 0    #(DWORD NeedScore)// 额外奖励所需积分
+    Count = 0    #(BYTE Count)// 额外奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActBossTrialItem> AwardItemList)// 额外奖励物品列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCCrossActBossTrialItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.NeedScore = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                NeedScore:%d,
+                                Count:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.NeedScore,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCCrossActBossTrialBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActBossTrialItem> AwardItemList)// 奖励物品列表,当仙盟榜时,如果有该奖励则代表盟主奖励,否则默认均为成员奖励
+    MemCount = 0    #(BYTE MemCount)// 成员奖励物品数
+    MemAwardItemList = list()    #(vector<tagMCCrossActBossTrialItem> MemAwardItemList)// 成员奖励物品列表,仅仙盟榜时有效
+    NeedScore = 0    #(DWORD NeedScore)// 上榜所需积分
+    CountEx = 0    #(BYTE CountEx)// 额外奖励数
+    AwardItemExList = list()    #(vector<tagMCCrossActBossTrialAwardEx> AwardItemExList)// 额外奖励列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCCrossActBossTrialItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        self.MemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.MemCount):
+            temMemAwardItemList = tagMCCrossActBossTrialItem()
+            _pos = temMemAwardItemList.ReadData(_lpData, _pos)
+            self.MemAwardItemList.append(temMemAwardItemList)
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CountEx,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.CountEx):
+            temAwardItemExList = tagMCCrossActBossTrialAwardEx()
+            _pos = temAwardItemExList.ReadData(_lpData, _pos)
+            self.AwardItemExList.append(temAwardItemExList)
+        return _pos
+
+    def Clear(self):
+        self.Rank = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        self.MemCount = 0
+        self.MemAwardItemList = list()
+        self.NeedScore = 0
+        self.CountEx = 0
+        self.AwardItemExList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+        length += 1
+        for i in range(self.MemCount):
+            length += self.MemAwardItemList[i].GetLength()
+        length += 4
+        length += 1
+        for i in range(self.CountEx):
+            length += self.AwardItemExList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.Rank)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.MemCount)
+        for i in range(self.MemCount):
+            data = CommFunc.WriteString(data, self.MemAwardItemList[i].GetLength(), self.MemAwardItemList[i].GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
+        data = CommFunc.WriteBYTE(data, self.CountEx)
+        for i in range(self.CountEx):
+            data = CommFunc.WriteString(data, self.AwardItemExList[i].GetLength(), self.AwardItemExList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Rank:%d,
+                                Count:%d,
+                                AwardItemList:%s,
+                                MemCount:%d,
+                                MemAwardItemList:%s,
+                                NeedScore:%d,
+                                CountEx:%d,
+                                AwardItemExList:%s
+                                '''\
+                                %(
+                                self.Rank,
+                                self.Count,
+                                "...",
+                                self.MemCount,
+                                "...",
+                                self.NeedScore,
+                                self.CountEx,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCCrossActBossTrialInfo(Structure):
+    Head = tagHead()
+    ServerInfoLen = 0    #(BYTE ServerInfoLen)
+    ServerIDRangeInfo = ""    #(String ServerIDRangeInfo)//开放该活动的服务器ID范围列表,json格式 [[IDA, IDB], ...], [] 为全服
+    GroupValue1 = 0    #(BYTE GroupValue1)// 活动榜单分组值1,用于查询对应榜单
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    JoinStartTime = ""    #(char JoinStartTime[5])// 参与开始时间点 mm:ss
+    JoinEndTime = ""    #(char JoinEndTime[5])// 参与结束时间点 mm:ss
+    IsDayReset = 0    #(BYTE IsDayReset)// 是否每天重置
+    ResetType = 0    #(BYTE ResetType)// 重置类型,0-0点重置;1-5点重置
+    PersonalBillCount = 0    #(BYTE PersonalBillCount)
+    PersonalBillboardInfoList = list()    #(vector<tagMCCrossActBossTrialBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    FamilyBillCount = 0    #(BYTE FamilyBillCount)
+    FamilyBillboardInfoList = list()    #(vector<tagMCCrossActBossTrialBillard> FamilyBillboardInfoList)// 仙盟榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x76
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ServerInfoLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.ServerIDRangeInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.ServerInfoLen)
+        self.GroupValue1,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.JoinStartTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PersonalBillCount):
+            temPersonalBillboardInfoList = tagMCCrossActBossTrialBillard()
+            _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+            self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+        self.FamilyBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.FamilyBillCount):
+            temFamilyBillboardInfoList = tagMCCrossActBossTrialBillard()
+            _pos = temFamilyBillboardInfoList.ReadData(_lpData, _pos)
+            self.FamilyBillboardInfoList.append(temFamilyBillboardInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x76
+        self.ServerInfoLen = 0
+        self.ServerIDRangeInfo = ""
+        self.GroupValue1 = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
+        self.IsDayReset = 0
+        self.ResetType = 0
+        self.PersonalBillCount = 0
+        self.PersonalBillboardInfoList = list()
+        self.FamilyBillCount = 0
+        self.FamilyBillboardInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += len(self.ServerIDRangeInfo)
+        length += 1
+        length += 10
+        length += 10
+        length += 5
+        length += 5
+        length += 1
+        length += 1
+        length += 1
+        for i in range(self.PersonalBillCount):
+            length += self.PersonalBillboardInfoList[i].GetLength()
+        length += 1
+        for i in range(self.FamilyBillCount):
+            length += self.FamilyBillboardInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ServerInfoLen)
+        data = CommFunc.WriteString(data, self.ServerInfoLen, self.ServerIDRangeInfo)
+        data = CommFunc.WriteBYTE(data, self.GroupValue1)
+        data = CommFunc.WriteString(data, 10, self.StartDate)
+        data = CommFunc.WriteString(data, 10, self.EndtDate)
+        data = CommFunc.WriteString(data, 5, self.JoinStartTime)
+        data = CommFunc.WriteString(data, 5, self.JoinEndTime)
+        data = CommFunc.WriteBYTE(data, self.IsDayReset)
+        data = CommFunc.WriteBYTE(data, self.ResetType)
+        data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
+        for i in range(self.PersonalBillCount):
+            data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.FamilyBillCount)
+        for i in range(self.FamilyBillCount):
+            data = CommFunc.WriteString(data, self.FamilyBillboardInfoList[i].GetLength(), self.FamilyBillboardInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ServerInfoLen:%d,
+                                ServerIDRangeInfo:%s,
+                                GroupValue1:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                JoinStartTime:%s,
+                                JoinEndTime:%s,
+                                IsDayReset:%d,
+                                ResetType:%d,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s,
+                                FamilyBillCount:%d,
+                                FamilyBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ServerInfoLen,
+                                self.ServerIDRangeInfo,
+                                self.GroupValue1,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.IsDayReset,
+                                self.ResetType,
+                                self.PersonalBillCount,
+                                "...",
+                                self.FamilyBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCCrossActBossTrialInfo=tagMCCrossActBossTrialInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCrossActBossTrialInfo.Head.Cmd,m_NAtagMCCrossActBossTrialInfo.Head.SubCmd))] = m_NAtagMCCrossActBossTrialInfo
+
+
+#------------------------------------------------------
+# AA 83 古宝养成跨服活动信息 #tagMCCrossActGubaoInfo
+
+class  tagMCCrossActGubaoItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ("IsBind", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.ItemID = 0
+        self.ItemCount = 0
+        self.IsBind = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCCrossActGubaoItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 83 古宝养成跨服活动信息 //tagMCCrossActGubaoInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCCrossActGubaoAwardEx(Structure):
+    NeedScore = 0    #(DWORD NeedScore)// 额外奖励所需积分
+    Count = 0    #(BYTE Count)// 额外奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActGubaoItem> AwardItemList)// 额外奖励物品列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCCrossActGubaoItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.NeedScore = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                NeedScore:%d,
+                                Count:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.NeedScore,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCCrossActGubaoBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActGubaoItem> AwardItemList)// 奖励物品列表
+    NeedScore = 0    #(DWORD NeedScore)// 上榜所需积分
+    CountEx = 0    #(BYTE CountEx)// 额外奖励数
+    AwardItemExList = list()    #(vector<tagMCCrossActGubaoAwardEx> AwardItemExList)// 额外奖励列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCCrossActGubaoItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CountEx,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.CountEx):
+            temAwardItemExList = tagMCCrossActGubaoAwardEx()
+            _pos = temAwardItemExList.ReadData(_lpData, _pos)
+            self.AwardItemExList.append(temAwardItemExList)
+        return _pos
+
+    def Clear(self):
+        self.Rank = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        self.NeedScore = 0
+        self.CountEx = 0
+        self.AwardItemExList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+        length += 4
+        length += 1
+        for i in range(self.CountEx):
+            length += self.AwardItemExList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.Rank)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
+        data = CommFunc.WriteBYTE(data, self.CountEx)
+        for i in range(self.CountEx):
+            data = CommFunc.WriteString(data, self.AwardItemExList[i].GetLength(), self.AwardItemExList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Rank:%d,
+                                Count:%d,
+                                AwardItemList:%s,
+                                NeedScore:%d,
+                                CountEx:%d,
+                                AwardItemExList:%s
+                                '''\
+                                %(
+                                self.Rank,
+                                self.Count,
+                                "...",
+                                self.NeedScore,
+                                self.CountEx,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCCrossActGubaoInfo(Structure):
+    Head = tagHead()
+    ServerInfoLen = 0    #(BYTE ServerInfoLen)
+    ServerIDRangeInfo = ""    #(String ServerIDRangeInfo)//开放该活动的服务器ID范围列表,json格式 [[IDA, IDB], ...], [] 为全服
+    GroupValue1 = 0    #(BYTE GroupValue1)// 活动榜单分组值1,用于查询对应榜单
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    JoinStartTime = ""    #(char JoinStartTime[5])// 参与开始时间点 mm:ss
+    JoinEndTime = ""    #(char JoinEndTime[5])// 参与结束时间点 mm:ss
+    PersonalBillCount = 0    #(BYTE PersonalBillCount)
+    PersonalBillboardInfoList = list()    #(vector<tagMCCrossActGubaoBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x83
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ServerInfoLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.ServerIDRangeInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.ServerInfoLen)
+        self.GroupValue1,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.JoinStartTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PersonalBillCount):
+            temPersonalBillboardInfoList = tagMCCrossActGubaoBillard()
+            _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+            self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x83
+        self.ServerInfoLen = 0
+        self.ServerIDRangeInfo = ""
+        self.GroupValue1 = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
+        self.PersonalBillCount = 0
+        self.PersonalBillboardInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += len(self.ServerIDRangeInfo)
+        length += 1
+        length += 10
+        length += 10
+        length += 5
+        length += 5
+        length += 1
+        for i in range(self.PersonalBillCount):
+            length += self.PersonalBillboardInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ServerInfoLen)
+        data = CommFunc.WriteString(data, self.ServerInfoLen, self.ServerIDRangeInfo)
+        data = CommFunc.WriteBYTE(data, self.GroupValue1)
+        data = CommFunc.WriteString(data, 10, self.StartDate)
+        data = CommFunc.WriteString(data, 10, self.EndtDate)
+        data = CommFunc.WriteString(data, 5, self.JoinStartTime)
+        data = CommFunc.WriteString(data, 5, self.JoinEndTime)
+        data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
+        for i in range(self.PersonalBillCount):
+            data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ServerInfoLen:%d,
+                                ServerIDRangeInfo:%s,
+                                GroupValue1:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                JoinStartTime:%s,
+                                JoinEndTime:%s,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ServerInfoLen,
+                                self.ServerIDRangeInfo,
+                                self.GroupValue1,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.PersonalBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCCrossActGubaoInfo=tagMCCrossActGubaoInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCrossActGubaoInfo.Head.Cmd,m_NAtagMCCrossActGubaoInfo.Head.SubCmd))] = m_NAtagMCCrossActGubaoInfo
+
+
+#------------------------------------------------------
+# AA 86 骑宠养成跨服活动信息 #tagMCCrossActHorsePetTrainInfo
+
+class  tagMCCrossActHorsePetTrainItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ("IsBind", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.ItemID = 0
+        self.ItemCount = 0
+        self.IsBind = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCCrossActHorsePetTrainItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 86 骑宠养成跨服活动信息 //tagMCCrossActHorsePetTrainInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCCrossActHorsePetTrainAwardEx(Structure):
+    NeedScore = 0    #(DWORD NeedScore)// 额外奖励所需积分
+    Count = 0    #(BYTE Count)// 额外奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActHorsePetTrainItem> AwardItemList)// 额外奖励物品列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCCrossActHorsePetTrainItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.NeedScore = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                NeedScore:%d,
+                                Count:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.NeedScore,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCCrossActHorsePetTrainBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActHorsePetTrainItem> AwardItemList)// 奖励物品列表
+    NeedScore = 0    #(DWORD NeedScore)// 上榜所需积分
+    CountEx = 0    #(BYTE CountEx)// 额外奖励数
+    AwardItemExList = list()    #(vector<tagMCCrossActHorsePetTrainAwardEx> AwardItemExList)// 额外奖励列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCCrossActHorsePetTrainItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CountEx,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.CountEx):
+            temAwardItemExList = tagMCCrossActHorsePetTrainAwardEx()
+            _pos = temAwardItemExList.ReadData(_lpData, _pos)
+            self.AwardItemExList.append(temAwardItemExList)
+        return _pos
+
+    def Clear(self):
+        self.Rank = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        self.NeedScore = 0
+        self.CountEx = 0
+        self.AwardItemExList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+        length += 4
+        length += 1
+        for i in range(self.CountEx):
+            length += self.AwardItemExList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.Rank)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
+        data = CommFunc.WriteBYTE(data, self.CountEx)
+        for i in range(self.CountEx):
+            data = CommFunc.WriteString(data, self.AwardItemExList[i].GetLength(), self.AwardItemExList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Rank:%d,
+                                Count:%d,
+                                AwardItemList:%s,
+                                NeedScore:%d,
+                                CountEx:%d,
+                                AwardItemExList:%s
+                                '''\
+                                %(
+                                self.Rank,
+                                self.Count,
+                                "...",
+                                self.NeedScore,
+                                self.CountEx,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCCrossActHorsePetTrainInfo(Structure):
+    Head = tagHead()
+    ServerInfoLen = 0    #(BYTE ServerInfoLen)
+    ServerIDRangeInfo = ""    #(String ServerIDRangeInfo)//开放该活动的服务器ID范围列表,json格式 [[IDA, IDB], ...], [] 为全服
+    GroupValue1 = 0    #(BYTE GroupValue1)// 活动榜单分组值1,用于查询对应榜单
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    JoinStartTime = ""    #(char JoinStartTime[5])// 参与开始时间点 mm:ss
+    JoinEndTime = ""    #(char JoinEndTime[5])// 参与结束时间点 mm:ss
+    PersonalBillCount = 0    #(BYTE PersonalBillCount)
+    PersonalBillboardInfoList = list()    #(vector<tagMCCrossActHorsePetTrainBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x86
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ServerInfoLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.ServerIDRangeInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.ServerInfoLen)
+        self.GroupValue1,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.JoinStartTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PersonalBillCount):
+            temPersonalBillboardInfoList = tagMCCrossActHorsePetTrainBillard()
+            _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+            self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x86
+        self.ServerInfoLen = 0
+        self.ServerIDRangeInfo = ""
+        self.GroupValue1 = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
+        self.PersonalBillCount = 0
+        self.PersonalBillboardInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += len(self.ServerIDRangeInfo)
+        length += 1
+        length += 10
+        length += 10
+        length += 5
+        length += 5
+        length += 1
+        for i in range(self.PersonalBillCount):
+            length += self.PersonalBillboardInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ServerInfoLen)
+        data = CommFunc.WriteString(data, self.ServerInfoLen, self.ServerIDRangeInfo)
+        data = CommFunc.WriteBYTE(data, self.GroupValue1)
+        data = CommFunc.WriteString(data, 10, self.StartDate)
+        data = CommFunc.WriteString(data, 10, self.EndtDate)
+        data = CommFunc.WriteString(data, 5, self.JoinStartTime)
+        data = CommFunc.WriteString(data, 5, self.JoinEndTime)
+        data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
+        for i in range(self.PersonalBillCount):
+            data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ServerInfoLen:%d,
+                                ServerIDRangeInfo:%s,
+                                GroupValue1:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                JoinStartTime:%s,
+                                JoinEndTime:%s,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ServerInfoLen,
+                                self.ServerIDRangeInfo,
+                                self.GroupValue1,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.PersonalBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCCrossActHorsePetTrainInfo=tagMCCrossActHorsePetTrainInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCrossActHorsePetTrainInfo.Head.Cmd,m_NAtagMCCrossActHorsePetTrainInfo.Head.SubCmd))] = m_NAtagMCCrossActHorsePetTrainInfo
+
+
+#------------------------------------------------------
+# AA 80 仙匣秘境跨服活动信息 #tagMCCrossActXianXiaMJInfo
+
+class  tagMCCrossActXianXiaMJItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("ItemID", c_int),    
+                  ("ItemCount", c_ushort),    
+                  ("IsBind", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.ItemID = 0
+        self.ItemCount = 0
+        self.IsBind = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCCrossActXianXiaMJItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 80 仙匣秘境跨服活动信息 //tagMCCrossActXianXiaMJInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCCrossActXianXiaMJAwardEx(Structure):
+    NeedScore = 0    #(DWORD NeedScore)// 额外奖励所需积分
+    Count = 0    #(BYTE Count)// 额外奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActXianXiaMJItem> AwardItemList)// 额外奖励物品列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCCrossActXianXiaMJItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.NeedScore = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                NeedScore:%d,
+                                Count:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.NeedScore,
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCCrossActXianXiaMJBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActXianXiaMJItem> AwardItemList)// 奖励物品列表
+    NeedScore = 0    #(DWORD NeedScore)// 上榜所需积分
+    CountEx = 0    #(BYTE CountEx)// 额外奖励数
+    AwardItemExList = list()    #(vector<tagMCCrossActXianXiaMJAwardEx> AwardItemExList)// 额外奖励列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.Rank,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temAwardItemList = tagMCCrossActXianXiaMJItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        self.NeedScore,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CountEx,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.CountEx):
+            temAwardItemExList = tagMCCrossActXianXiaMJAwardEx()
+            _pos = temAwardItemExList.ReadData(_lpData, _pos)
+            self.AwardItemExList.append(temAwardItemExList)
+        return _pos
+
+    def Clear(self):
+        self.Rank = 0
+        self.Count = 0
+        self.AwardItemList = list()
+        self.NeedScore = 0
+        self.CountEx = 0
+        self.AwardItemExList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        for i in range(self.Count):
+            length += self.AwardItemList[i].GetLength()
+        length += 4
+        length += 1
+        for i in range(self.CountEx):
+            length += self.AwardItemExList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.Rank)
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.NeedScore)
+        data = CommFunc.WriteBYTE(data, self.CountEx)
+        for i in range(self.CountEx):
+            data = CommFunc.WriteString(data, self.AwardItemExList[i].GetLength(), self.AwardItemExList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Rank:%d,
+                                Count:%d,
+                                AwardItemList:%s,
+                                NeedScore:%d,
+                                CountEx:%d,
+                                AwardItemExList:%s
+                                '''\
+                                %(
+                                self.Rank,
+                                self.Count,
+                                "...",
+                                self.NeedScore,
+                                self.CountEx,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCCrossActXianXiaMJInfo(Structure):
+    Head = tagHead()
+    ServerInfoLen = 0    #(BYTE ServerInfoLen)
+    ServerIDRangeInfo = ""    #(String ServerIDRangeInfo)//开放该活动的服务器ID范围列表,json格式 [[IDA, IDB], ...], [] 为全服
+    GroupValue1 = 0    #(BYTE GroupValue1)// 活动榜单分组值1,用于查询对应榜单
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    JoinStartTime = ""    #(char JoinStartTime[5])// 参与开始时间点 mm:ss
+    JoinEndTime = ""    #(char JoinEndTime[5])// 参与结束时间点 mm:ss
+    IsDayReset = 0    #(BYTE IsDayReset)// 是否每天重置
+    PersonalBillCount = 0    #(BYTE PersonalBillCount)
+    PersonalBillboardInfoList = list()    #(vector<tagMCCrossActXianXiaMJBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x80
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ServerInfoLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.ServerIDRangeInfo,_pos = CommFunc.ReadString(_lpData, _pos,self.ServerInfoLen)
+        self.GroupValue1,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.JoinStartTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
+        self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PersonalBillCount):
+            temPersonalBillboardInfoList = tagMCCrossActXianXiaMJBillard()
+            _pos = temPersonalBillboardInfoList.ReadData(_lpData, _pos)
+            self.PersonalBillboardInfoList.append(temPersonalBillboardInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x80
+        self.ServerInfoLen = 0
+        self.ServerIDRangeInfo = ""
+        self.GroupValue1 = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinStartTime = ""
+        self.JoinEndTime = ""
+        self.IsDayReset = 0
+        self.PersonalBillCount = 0
+        self.PersonalBillboardInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += len(self.ServerIDRangeInfo)
+        length += 1
+        length += 10
+        length += 10
+        length += 5
+        length += 5
+        length += 1
+        length += 1
+        for i in range(self.PersonalBillCount):
+            length += self.PersonalBillboardInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ServerInfoLen)
+        data = CommFunc.WriteString(data, self.ServerInfoLen, self.ServerIDRangeInfo)
+        data = CommFunc.WriteBYTE(data, self.GroupValue1)
+        data = CommFunc.WriteString(data, 10, self.StartDate)
+        data = CommFunc.WriteString(data, 10, self.EndtDate)
+        data = CommFunc.WriteString(data, 5, self.JoinStartTime)
+        data = CommFunc.WriteString(data, 5, self.JoinEndTime)
+        data = CommFunc.WriteBYTE(data, self.IsDayReset)
+        data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
+        for i in range(self.PersonalBillCount):
+            data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ServerInfoLen:%d,
+                                ServerIDRangeInfo:%s,
+                                GroupValue1:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                JoinStartTime:%s,
+                                JoinEndTime:%s,
+                                IsDayReset:%d,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ServerInfoLen,
+                                self.ServerIDRangeInfo,
+                                self.GroupValue1,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.IsDayReset,
+                                self.PersonalBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCCrossActXianXiaMJInfo=tagMCCrossActXianXiaMJInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCrossActXianXiaMJInfo.Head.Cmd,m_NAtagMCCrossActXianXiaMJInfo.Head.SubCmd))] = m_NAtagMCCrossActXianXiaMJInfo
 
 
 #------------------------------------------------------
@@ -45721,14 +50177,123 @@
 
 
 #------------------------------------------------------
+# B1 12 培养功能境界信息 #tagMCTrainRealmLVInfo
+
+class  tagMCTrainRealmLV(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("FuncType", c_ubyte),    # 功能类型:1-坐骑;2-灵宠;3-灵器
+                  ("TrainRealmLV", c_ushort),    # 境界培养卡境界等级,实际有效境界等级取自身境界与该值中的最大值;
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.FuncType = 0
+        self.TrainRealmLV = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCTrainRealmLV)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B1 12 培养功能境界信息 //tagMCTrainRealmLVInfo:
+                                FuncType:%d,
+                                TrainRealmLV:%d
+                                '''\
+                                %(
+                                self.FuncType,
+                                self.TrainRealmLV
+                                )
+        return DumpString
+
+
+class  tagMCTrainRealmLVInfo(Structure):
+    Head = tagHead()
+    Count = 0    #(BYTE Count)
+    InfoList = list()    #(vector<tagMCTrainRealmLV> InfoList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xB1
+        self.Head.SubCmd = 0x12
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temInfoList = tagMCTrainRealmLV()
+            _pos = temInfoList.ReadData(_lpData, _pos)
+            self.InfoList.append(temInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xB1
+        self.Head.SubCmd = 0x12
+        self.Count = 0
+        self.InfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.Count):
+            length += self.InfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                Count:%d,
+                                InfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCTrainRealmLVInfo=tagMCTrainRealmLVInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTrainRealmLVInfo.Head.Cmd,m_NAtagMCTrainRealmLVInfo.Head.SubCmd))] = m_NAtagMCTrainRealmLVInfo
+
+
+#------------------------------------------------------
 # B1 20 战令信息 #tagMCZhanlingInfo
 
 class  tagMCZhanling(Structure):
     _pack_ = 1
     _fields_ = [
                   ("NeedValue", c_int),    # 奖励所需值
-                  ("FreeRewardState", c_ubyte),    # 免费奖励是否已领取
-                  ("ZLRewardState", c_ubyte),    # 战令奖励是否已领取
+                  ("FreeRewardState", c_ubyte),    # 免费战令奖励是否已领取
+                  ("ZLRewardState", c_ubyte),    # 普通战令奖励是否已领取
+                  ("ZLRewardStateH", c_ubyte),    # 高级战令奖励是否已领取
                   ]
 
     def __init__(self):
@@ -45744,6 +50309,7 @@
         self.NeedValue = 0
         self.FreeRewardState = 0
         self.ZLRewardState = 0
+        self.ZLRewardStateH = 0
         return
 
     def GetLength(self):
@@ -45756,12 +50322,14 @@
         DumpString = '''// B1 20 战令信息 //tagMCZhanlingInfo:
                                 NeedValue:%d,
                                 FreeRewardState:%d,
-                                ZLRewardState:%d
+                                ZLRewardState:%d,
+                                ZLRewardStateH:%d
                                 '''\
                                 %(
                                 self.NeedValue,
                                 self.FreeRewardState,
-                                self.ZLRewardState
+                                self.ZLRewardState,
+                                self.ZLRewardStateH
                                 )
         return DumpString
 
@@ -45769,7 +50337,9 @@
 class  tagMCZhanlingInfo(Structure):
     Head = tagHead()
     ZhanlingType = 0    #(BYTE ZhanlingType)// 战令类型
-    IsActivite = 0    #(BYTE IsActivite)// 是否已激活
+    IsActivite = 0    #(BYTE IsActivite)// 普通战令是否已激活
+    IsActiviteH = 0    #(BYTE IsActiviteH)// 高级战令是否已激活
+    Value1 = 0    #(DWORD Value1)// 战令对应的自定义值,可选,如登录战令代表开始计算日期时间戳
     RewardCount = 0    #(WORD RewardCount)
     RewardList = list()    #(vector<tagMCZhanling> RewardList)
     data = None
@@ -45785,6 +50355,8 @@
         _pos = self.Head.ReadData(_lpData, _pos)
         self.ZhanlingType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.IsActivite,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.IsActiviteH,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.RewardCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
         for i in range(self.RewardCount):
             temRewardList = tagMCZhanling()
@@ -45799,6 +50371,8 @@
         self.Head.SubCmd = 0x20
         self.ZhanlingType = 0
         self.IsActivite = 0
+        self.IsActiviteH = 0
+        self.Value1 = 0
         self.RewardCount = 0
         self.RewardList = list()
         return
@@ -45808,6 +50382,8 @@
         length += self.Head.GetLength()
         length += 1
         length += 1
+        length += 1
+        length += 4
         length += 2
         for i in range(self.RewardCount):
             length += self.RewardList[i].GetLength()
@@ -45819,6 +50395,8 @@
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
         data = CommFunc.WriteBYTE(data, self.ZhanlingType)
         data = CommFunc.WriteBYTE(data, self.IsActivite)
+        data = CommFunc.WriteBYTE(data, self.IsActiviteH)
+        data = CommFunc.WriteDWORD(data, self.Value1)
         data = CommFunc.WriteWORD(data, self.RewardCount)
         for i in range(self.RewardCount):
             data = CommFunc.WriteString(data, self.RewardList[i].GetLength(), self.RewardList[i].GetBuffer())
@@ -45829,6 +50407,8 @@
                                 Head:%s,
                                 ZhanlingType:%d,
                                 IsActivite:%d,
+                                IsActiviteH:%d,
+                                Value1:%d,
                                 RewardCount:%d,
                                 RewardList:%s
                                 '''\
@@ -45836,6 +50416,8 @@
                                 self.Head.OutputString(),
                                 self.ZhanlingType,
                                 self.IsActivite,
+                                self.IsActiviteH,
+                                self.Value1,
                                 self.RewardCount,
                                 "..."
                                 )
@@ -49322,6 +53904,7 @@
                   ("EnterCountWeek", c_int),    # 本周总参与次数
                   ("BuyOpenCountWeek", c_int),    # 本周总购买召集次数
                   ("HighScoreTotalWeek", c_int),    # 本周每日最高分累加总分
+                  ("ZoneID", c_ubyte),    # 所属分区ID
                   ]
 
     def __init__(self):
@@ -49343,6 +53926,7 @@
         self.EnterCountWeek = 0
         self.BuyOpenCountWeek = 0
         self.HighScoreTotalWeek = 0
+        self.ZoneID = 0
         return
 
     def GetLength(self):
@@ -49359,7 +53943,8 @@
                                 HighScoreToday:%d,
                                 EnterCountWeek:%d,
                                 BuyOpenCountWeek:%d,
-                                HighScoreTotalWeek:%d
+                                HighScoreTotalWeek:%d,
+                                ZoneID:%d
                                 '''\
                                 %(
                                 self.Cmd,
@@ -49368,7 +53953,8 @@
                                 self.HighScoreToday,
                                 self.EnterCountWeek,
                                 self.BuyOpenCountWeek,
-                                self.HighScoreTotalWeek
+                                self.HighScoreTotalWeek,
+                                self.ZoneID
                                 )
         return DumpString
 

--
Gitblit v1.8.0