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 | 1427 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 1,365 insertions(+), 62 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index c35a90c..09acf79 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -9722,6 +9722,66 @@
 
 
 #------------------------------------------------------
+# 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
+
+
+#------------------------------------------------------
 # B3 20 送礼物成功通知 #tagGCSendGiftsOKList
 
 class  tagGCSendGiftsOK(Structure):
@@ -13127,6 +13187,7 @@
     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
@@ -13146,6 +13207,7 @@
         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
@@ -13160,6 +13222,7 @@
         self.RealmLV = 0
         self.FightPower = 0
         self.FightPowerEx = 0
+        self.OfflineValue = 0
         self.Value1 = 0
         self.Value2 = 0
         return
@@ -13173,6 +13236,7 @@
         length += 2
         length += 1
         length += 2
+        length += 4
         length += 4
         length += 4
         length += 4
@@ -13191,6 +13255,7 @@
         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
@@ -13206,6 +13271,7 @@
                                 RealmLV:%d,
                                 FightPower:%d,
                                 FightPowerEx:%d,
+                                OfflineValue:%d,
                                 Value1:%d,
                                 Value2:%d
                                 '''\
@@ -13219,6 +13285,7 @@
                                 self.RealmLV,
                                 self.FightPower,
                                 self.FightPowerEx,
+                                self.OfflineValue,
                                 self.Value1,
                                 self.Value2
                                 )
@@ -32973,12 +33040,72 @@
         return DumpString
 
 
+class  tagMCActBossTrialAwardEx(Structure):
+    NeedScore = 0    #(DWORD NeedScore)// 额外奖励所需积分
+    Count = 0    #(BYTE Count)// 额外奖励物品数
+    AwardItemList = list()    #(vector<tagMCActBossTrialItem> 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 = tagMCActBossTrialItem()
+            _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  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):
@@ -32998,6 +33125,12 @@
             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):
@@ -33006,6 +33139,9 @@
         self.AwardItemList = list()
         self.MemCount = 0
         self.MemAwardItemList = list()
+        self.NeedScore = 0
+        self.CountEx = 0
+        self.AwardItemExList = list()
         return
 
     def GetLength(self):
@@ -33017,6 +33153,10 @@
         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
 
@@ -33029,6 +33169,10 @@
         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):
@@ -33037,13 +33181,19 @@
                                 Count:%d,
                                 AwardItemList:%s,
                                 MemCount:%d,
-                                MemAwardItemList:%s
+                                MemAwardItemList:%s,
+                                NeedScore:%d,
+                                CountEx:%d,
+                                AwardItemExList:%s
                                 '''\
                                 %(
                                 self.Rank,
                                 self.Count,
                                 "...",
                                 self.MemCount,
+                                "...",
+                                self.NeedScore,
+                                self.CountEx,
                                 "..."
                                 )
         return DumpString
@@ -35588,10 +35738,10 @@
         return DumpString
 
 
-class  tagMCActGubaoBillard(Structure):
-    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
-    Count = 0    #(BYTE Count)// 奖励物品数
-    AwardItemList = list()    #(vector<tagMCActGubaoItem> AwardItemList)// 奖励物品列表
+class  tagMCActGubaoAwardEx(Structure):
+    NeedScore = 0    #(DWORD NeedScore)// 额外奖励所需积分
+    Count = 0    #(BYTE Count)// 额外奖励物品数
+    AwardItemList = list()    #(vector<tagMCActGubaoItem> AwardItemList)// 额外奖励物品列表
     data = None
 
     def __init__(self):
@@ -35600,7 +35750,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 = tagMCActGubaoItem()
@@ -35609,7 +35759,7 @@
         return _pos
 
     def Clear(self):
-        self.Rank = 0
+        self.NeedScore = 0
         self.Count = 0
         self.AwardItemList = list()
         return
@@ -35625,7 +35775,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())
@@ -35633,13 +35783,96 @@
 
     def OutputString(self):
         DumpString = '''
-                                Rank:%d,
+                                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
@@ -35949,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
 
 
 #------------------------------------------------------
@@ -39544,10 +40134,10 @@
         return DumpString
 
 
-class  tagMCActXianXiaMJBillard(Structure):
-    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
-    Count = 0    #(BYTE Count)// 奖励物品数
-    AwardItemList = list()    #(vector<tagMCActXianXiaMJItem> AwardItemList)// 奖励物品列表
+class  tagMCActXianXiaMJAwardEx(Structure):
+    NeedScore = 0    #(DWORD NeedScore)// 额外奖励所需积分
+    Count = 0    #(BYTE Count)// 额外奖励物品数
+    AwardItemList = list()    #(vector<tagMCActXianXiaMJItem> AwardItemList)// 额外奖励物品列表
     data = None
 
     def __init__(self):
@@ -39556,7 +40146,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 = tagMCActXianXiaMJItem()
@@ -39565,7 +40155,7 @@
         return _pos
 
     def Clear(self):
-        self.Rank = 0
+        self.NeedScore = 0
         self.Count = 0
         self.AwardItemList = list()
         return
@@ -39581,7 +40171,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())
@@ -39589,13 +40179,96 @@
 
     def OutputString(self):
         DumpString = '''
-                                Rank:%d,
+                                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
@@ -40892,12 +41565,72 @@
         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):
@@ -40917,6 +41650,12 @@
             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):
@@ -40925,6 +41664,9 @@
         self.AwardItemList = list()
         self.MemCount = 0
         self.MemAwardItemList = list()
+        self.NeedScore = 0
+        self.CountEx = 0
+        self.AwardItemExList = list()
         return
 
     def GetLength(self):
@@ -40936,6 +41678,10 @@
         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
 
@@ -40948,6 +41694,10 @@
         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):
@@ -40956,13 +41706,19 @@
                                 Count:%d,
                                 AwardItemList:%s,
                                 MemCount:%d,
-                                MemAwardItemList:%s
+                                MemAwardItemList:%s,
+                                NeedScore:%d,
+                                CountEx:%d,
+                                AwardItemExList:%s
                                 '''\
                                 %(
                                 self.Rank,
                                 self.Count,
                                 "...",
                                 self.MemCount,
+                                "...",
+                                self.NeedScore,
+                                self.CountEx,
                                 "..."
                                 )
         return DumpString
@@ -40979,8 +41735,6 @@
     JoinEndTime = ""    #(char JoinEndTime[5])// 参与结束时间点 mm:ss
     IsDayReset = 0    #(BYTE IsDayReset)// 是否每天重置
     ResetType = 0    #(BYTE ResetType)// 重置类型,0-0点重置;1-5点重置
-    RankLimitPersonal = 0    #(WORD RankLimitPersonal)// 个人榜上榜个数保底限制;
-    RankLimitFamily = 0    #(WORD RankLimitFamily)// 仙盟榜上榜个数保底限制;
     PersonalBillCount = 0    #(BYTE PersonalBillCount)
     PersonalBillboardInfoList = list()    #(vector<tagMCCrossActBossTrialBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
     FamilyBillCount = 0    #(BYTE FamilyBillCount)
@@ -41005,8 +41759,6 @@
         self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
         self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.ResetType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.RankLimitPersonal,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.RankLimitFamily,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.PersonalBillCount):
             temPersonalBillboardInfoList = tagMCCrossActBossTrialBillard()
@@ -41033,8 +41785,6 @@
         self.JoinEndTime = ""
         self.IsDayReset = 0
         self.ResetType = 0
-        self.RankLimitPersonal = 0
-        self.RankLimitFamily = 0
         self.PersonalBillCount = 0
         self.PersonalBillboardInfoList = list()
         self.FamilyBillCount = 0
@@ -41053,8 +41803,6 @@
         length += 5
         length += 1
         length += 1
-        length += 2
-        length += 2
         length += 1
         for i in range(self.PersonalBillCount):
             length += self.PersonalBillboardInfoList[i].GetLength()
@@ -41076,8 +41824,6 @@
         data = CommFunc.WriteString(data, 5, self.JoinEndTime)
         data = CommFunc.WriteBYTE(data, self.IsDayReset)
         data = CommFunc.WriteBYTE(data, self.ResetType)
-        data = CommFunc.WriteWORD(data, self.RankLimitPersonal)
-        data = CommFunc.WriteWORD(data, self.RankLimitFamily)
         data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
         for i in range(self.PersonalBillCount):
             data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
@@ -41098,8 +41844,6 @@
                                 JoinEndTime:%s,
                                 IsDayReset:%d,
                                 ResetType:%d,
-                                RankLimitPersonal:%d,
-                                RankLimitFamily:%d,
                                 PersonalBillCount:%d,
                                 PersonalBillboardInfoList:%s,
                                 FamilyBillCount:%d,
@@ -41116,8 +41860,6 @@
                                 self.JoinEndTime,
                                 self.IsDayReset,
                                 self.ResetType,
-                                self.RankLimitPersonal,
-                                self.RankLimitFamily,
                                 self.PersonalBillCount,
                                 "...",
                                 self.FamilyBillCount,
@@ -41176,10 +41918,10 @@
         return DumpString
 
 
-class  tagMCCrossActGubaoBillard(Structure):
-    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
-    Count = 0    #(BYTE Count)// 奖励物品数
-    AwardItemList = list()    #(vector<tagMCCrossActGubaoItem> AwardItemList)// 奖励物品列表
+class  tagMCCrossActGubaoAwardEx(Structure):
+    NeedScore = 0    #(DWORD NeedScore)// 额外奖励所需积分
+    Count = 0    #(BYTE Count)// 额外奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActGubaoItem> AwardItemList)// 额外奖励物品列表
     data = None
 
     def __init__(self):
@@ -41188,7 +41930,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 = tagMCCrossActGubaoItem()
@@ -41197,7 +41939,7 @@
         return _pos
 
     def Clear(self):
-        self.Rank = 0
+        self.NeedScore = 0
         self.Count = 0
         self.AwardItemList = list()
         return
@@ -41213,7 +41955,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())
@@ -41221,13 +41963,96 @@
 
     def OutputString(self):
         DumpString = '''
-                                Rank:%d,
+                                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
@@ -41242,7 +42067,6 @@
     EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
     JoinStartTime = ""    #(char JoinStartTime[5])// 参与开始时间点 mm:ss
     JoinEndTime = ""    #(char JoinEndTime[5])// 参与结束时间点 mm:ss
-    RankLimitPersonal = 0    #(WORD RankLimitPersonal)// 个人榜上榜积分保底限制;
     PersonalBillCount = 0    #(BYTE PersonalBillCount)
     PersonalBillboardInfoList = list()    #(vector<tagMCCrossActGubaoBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
     data = None
@@ -41263,7 +42087,6 @@
         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.RankLimitPersonal,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.PersonalBillCount):
             temPersonalBillboardInfoList = tagMCCrossActGubaoBillard()
@@ -41283,7 +42106,6 @@
         self.EndtDate = ""
         self.JoinStartTime = ""
         self.JoinEndTime = ""
-        self.RankLimitPersonal = 0
         self.PersonalBillCount = 0
         self.PersonalBillboardInfoList = list()
         return
@@ -41298,7 +42120,6 @@
         length += 10
         length += 5
         length += 5
-        length += 2
         length += 1
         for i in range(self.PersonalBillCount):
             length += self.PersonalBillboardInfoList[i].GetLength()
@@ -41315,7 +42136,6 @@
         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.RankLimitPersonal)
         data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
         for i in range(self.PersonalBillCount):
             data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
@@ -41331,7 +42151,6 @@
                                 EndtDate:%s,
                                 JoinStartTime:%s,
                                 JoinEndTime:%s,
-                                RankLimitPersonal:%d,
                                 PersonalBillCount:%d,
                                 PersonalBillboardInfoList:%s
                                 '''\
@@ -41344,7 +42163,6 @@
                                 self.EndtDate,
                                 self.JoinStartTime,
                                 self.JoinEndTime,
-                                self.RankLimitPersonal,
                                 self.PersonalBillCount,
                                 "..."
                                 )
@@ -41353,6 +42171,307 @@
 
 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
 
 
 #------------------------------------------------------
@@ -41401,10 +42520,10 @@
         return DumpString
 
 
-class  tagMCCrossActXianXiaMJBillard(Structure):
-    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
-    Count = 0    #(BYTE Count)// 奖励物品数
-    AwardItemList = list()    #(vector<tagMCCrossActXianXiaMJItem> AwardItemList)// 奖励物品列表
+class  tagMCCrossActXianXiaMJAwardEx(Structure):
+    NeedScore = 0    #(DWORD NeedScore)// 额外奖励所需积分
+    Count = 0    #(BYTE Count)// 额外奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActXianXiaMJItem> AwardItemList)// 额外奖励物品列表
     data = None
 
     def __init__(self):
@@ -41413,7 +42532,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 = tagMCCrossActXianXiaMJItem()
@@ -41422,7 +42541,7 @@
         return _pos
 
     def Clear(self):
-        self.Rank = 0
+        self.NeedScore = 0
         self.Count = 0
         self.AwardItemList = list()
         return
@@ -41438,7 +42557,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())
@@ -41446,13 +42565,96 @@
 
     def OutputString(self):
         DumpString = '''
-                                Rank:%d,
+                                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
@@ -41468,7 +42670,6 @@
     JoinStartTime = ""    #(char JoinStartTime[5])// 参与开始时间点 mm:ss
     JoinEndTime = ""    #(char JoinEndTime[5])// 参与结束时间点 mm:ss
     IsDayReset = 0    #(BYTE IsDayReset)// 是否每天重置
-    RankLimitPersonal = 0    #(WORD RankLimitPersonal)// 个人榜上榜积分保底限制;
     PersonalBillCount = 0    #(BYTE PersonalBillCount)
     PersonalBillboardInfoList = list()    #(vector<tagMCCrossActXianXiaMJBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
     data = None
@@ -41490,7 +42691,6 @@
         self.JoinStartTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
         self.JoinEndTime,_pos = CommFunc.ReadString(_lpData, _pos,5)
         self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.RankLimitPersonal,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.PersonalBillCount):
             temPersonalBillboardInfoList = tagMCCrossActXianXiaMJBillard()
@@ -41511,7 +42711,6 @@
         self.JoinStartTime = ""
         self.JoinEndTime = ""
         self.IsDayReset = 0
-        self.RankLimitPersonal = 0
         self.PersonalBillCount = 0
         self.PersonalBillboardInfoList = list()
         return
@@ -41527,7 +42726,6 @@
         length += 5
         length += 5
         length += 1
-        length += 2
         length += 1
         for i in range(self.PersonalBillCount):
             length += self.PersonalBillboardInfoList[i].GetLength()
@@ -41545,7 +42743,6 @@
         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.RankLimitPersonal)
         data = CommFunc.WriteBYTE(data, self.PersonalBillCount)
         for i in range(self.PersonalBillCount):
             data = CommFunc.WriteString(data, self.PersonalBillboardInfoList[i].GetLength(), self.PersonalBillboardInfoList[i].GetBuffer())
@@ -41562,7 +42759,6 @@
                                 JoinStartTime:%s,
                                 JoinEndTime:%s,
                                 IsDayReset:%d,
-                                RankLimitPersonal:%d,
                                 PersonalBillCount:%d,
                                 PersonalBillboardInfoList:%s
                                 '''\
@@ -41576,7 +42772,6 @@
                                 self.JoinStartTime,
                                 self.JoinEndTime,
                                 self.IsDayReset,
-                                self.RankLimitPersonal,
                                 self.PersonalBillCount,
                                 "..."
                                 )
@@ -48982,6 +50177,114 @@
 
 
 #------------------------------------------------------
+# 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):

--
Gitblit v1.8.0