From cd4a46e215f74295382f8f1d78d9b4ae095387f1 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 22 四月 2025 15:14:42 +0800
Subject: [PATCH] 10367 【越南】【英语】【BT】【砍树】仙盟攻城战-服务端(修复参与仙盟数不足竞猜仙盟数时生成竞猜报错;)

---
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 2976 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 2,931 insertions(+), 45 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 9920d4d..e92c8ce 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -2712,6 +2712,246 @@
 
 
 #------------------------------------------------------
+# A4 13 查看目标仙盟返回信息 #tagGCTagFamilyInfo
+
+class  tagGCTagFamilyMember(Structure):
+    PlayerID = 0    #(DWORD PlayerID)
+    NameLen = 0    #(BYTE NameLen)
+    Name = ""    #(String Name)//size = NameLen
+    FamilyLV = 0    #(BYTE FamilyLV)//家族成员等级
+    LV = 0    #(WORD LV)
+    Job = 0    #(BYTE Job)//职业
+    Face = 0    #(DWORD Face)//头像
+    FacePic = 0    #(DWORD FacePic)//头像外框
+    OfficialRank = 0    #(BYTE OfficialRank)//境界
+    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.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.NameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,self.NameLen)
+        self.FamilyLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.OfficialRank,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.PlayerID = 0
+        self.NameLen = 0
+        self.Name = ""
+        self.FamilyLV = 0
+        self.LV = 0
+        self.Job = 0
+        self.Face = 0
+        self.FacePic = 0
+        self.OfficialRank = 0
+        self.FightPower = 0
+        self.FightPowerEx = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        length += len(self.Name)
+        length += 1
+        length += 2
+        length += 1
+        length += 4
+        length += 4
+        length += 1
+        length += 4
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.Name)
+        data = CommFunc.WriteBYTE(data, self.FamilyLV)
+        data = CommFunc.WriteWORD(data, self.LV)
+        data = CommFunc.WriteBYTE(data, self.Job)
+        data = CommFunc.WriteDWORD(data, self.Face)
+        data = CommFunc.WriteDWORD(data, self.FacePic)
+        data = CommFunc.WriteBYTE(data, self.OfficialRank)
+        data = CommFunc.WriteDWORD(data, self.FightPower)
+        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                PlayerID:%d,
+                                NameLen:%d,
+                                Name:%s,
+                                FamilyLV:%d,
+                                LV:%d,
+                                Job:%d,
+                                Face:%d,
+                                FacePic:%d,
+                                OfficialRank:%d,
+                                FightPower:%d,
+                                FightPowerEx:%d
+                                '''\
+                                %(
+                                self.PlayerID,
+                                self.NameLen,
+                                self.Name,
+                                self.FamilyLV,
+                                self.LV,
+                                self.Job,
+                                self.Face,
+                                self.FacePic,
+                                self.OfficialRank,
+                                self.FightPower,
+                                self.FightPowerEx
+                                )
+        return DumpString
+
+
+class  tagGCTagFamilyInfo(Structure):
+    Head = tagHead()
+    FamilyID = 0    #(DWORD FamilyID)
+    FamilyName = ""    #(char FamilyName[33])//家族名称
+    FamilyLV = 0    #(WORD FamilyLV)//家族等级
+    BroadcastLen = 0    #(WORD BroadcastLen)//公告
+    Broadcast = ""    #(String Broadcast)//size = BroadcastLen
+    MemberCount = 0    #(WORD MemberCount)//人数
+    Member = list()    #(vector<tagGCTagFamilyMember> Member)//size = MemberCount
+    FightPower = 0    #(DWORD FightPower)//仙盟总战力,求余亿部分
+    FightPowerEx = 0    #(DWORD FightPowerEx)//仙盟总战力,整除亿部分
+    EmblemID = 0    #(DWORD EmblemID)//徽章ID
+    ServerID = 0    #(DWORD ServerID)//仙盟区服ID
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA4
+        self.Head.SubCmd = 0x13
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FamilyName,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.FamilyLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.BroadcastLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Broadcast,_pos = CommFunc.ReadString(_lpData, _pos,self.BroadcastLen)
+        self.MemberCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        for i in range(self.MemberCount):
+            temMember = tagGCTagFamilyMember()
+            _pos = temMember.ReadData(_lpData, _pos)
+            self.Member.append(temMember)
+        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.EmblemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA4
+        self.Head.SubCmd = 0x13
+        self.FamilyID = 0
+        self.FamilyName = ""
+        self.FamilyLV = 0
+        self.BroadcastLen = 0
+        self.Broadcast = ""
+        self.MemberCount = 0
+        self.Member = list()
+        self.FightPower = 0
+        self.FightPowerEx = 0
+        self.EmblemID = 0
+        self.ServerID = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 33
+        length += 2
+        length += 2
+        length += len(self.Broadcast)
+        length += 2
+        for i in range(self.MemberCount):
+            length += self.Member[i].GetLength()
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.FamilyID)
+        data = CommFunc.WriteString(data, 33, self.FamilyName)
+        data = CommFunc.WriteWORD(data, self.FamilyLV)
+        data = CommFunc.WriteWORD(data, self.BroadcastLen)
+        data = CommFunc.WriteString(data, self.BroadcastLen, self.Broadcast)
+        data = CommFunc.WriteWORD(data, self.MemberCount)
+        for i in range(self.MemberCount):
+            data = CommFunc.WriteString(data, self.Member[i].GetLength(), self.Member[i].GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.FightPower)
+        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
+        data = CommFunc.WriteDWORD(data, self.EmblemID)
+        data = CommFunc.WriteDWORD(data, self.ServerID)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                FamilyID:%d,
+                                FamilyName:%s,
+                                FamilyLV:%d,
+                                BroadcastLen:%d,
+                                Broadcast:%s,
+                                MemberCount:%d,
+                                Member:%s,
+                                FightPower:%d,
+                                FightPowerEx:%d,
+                                EmblemID:%d,
+                                ServerID:%d
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.FamilyID,
+                                self.FamilyName,
+                                self.FamilyLV,
+                                self.BroadcastLen,
+                                self.Broadcast,
+                                self.MemberCount,
+                                "...",
+                                self.FightPower,
+                                self.FightPowerEx,
+                                self.EmblemID,
+                                self.ServerID
+                                )
+        return DumpString
+
+
+m_NAtagGCTagFamilyInfo=tagGCTagFamilyInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCTagFamilyInfo.Head.Cmd,m_NAtagGCTagFamilyInfo.Head.SubCmd))] = m_NAtagGCTagFamilyInfo
+
+
+#------------------------------------------------------
 #A4 01  查看申请入会的玩家信息 #tagGCViewFamilyRequestInfo
 
 class  tagtMemberInfo(Structure):
@@ -8695,6 +8935,7 @@
     Job = 0    #(BYTE Job)
     Face = 0    #(DWORD Face)
     FacePic = 0    #(DWORD FacePic)
+    RobValue = 0    #(DWORD RobValue)// 抢劫敌对值
     MineCount = 0    #(BYTE MineCount)
     MineItemList = list()    #(vector<tagGCMineItem> MineItemList)// 矿物列表
     data = None
@@ -8710,6 +8951,7 @@
         self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.RobValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.MineCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.MineCount):
             temMineItemList = tagGCMineItem()
@@ -8723,6 +8965,7 @@
         self.Job = 0
         self.Face = 0
         self.FacePic = 0
+        self.RobValue = 0
         self.MineCount = 0
         self.MineItemList = list()
         return
@@ -8732,6 +8975,7 @@
         length += 4
         length += 33
         length += 1
+        length += 4
         length += 4
         length += 4
         length += 1
@@ -8747,6 +8991,7 @@
         data = CommFunc.WriteBYTE(data, self.Job)
         data = CommFunc.WriteDWORD(data, self.Face)
         data = CommFunc.WriteDWORD(data, self.FacePic)
+        data = CommFunc.WriteDWORD(data, self.RobValue)
         data = CommFunc.WriteBYTE(data, self.MineCount)
         for i in range(self.MineCount):
             data = CommFunc.WriteString(data, self.MineItemList[i].GetLength(), self.MineItemList[i].GetBuffer())
@@ -8759,6 +9004,7 @@
                                 Job:%d,
                                 Face:%d,
                                 FacePic:%d,
+                                RobValue:%d,
                                 MineCount:%d,
                                 MineItemList:%s
                                 '''\
@@ -8768,6 +9014,7 @@
                                 self.Job,
                                 self.Face,
                                 self.FacePic,
+                                self.RobValue,
                                 self.MineCount,
                                 "..."
                                 )
@@ -17013,8 +17260,8 @@
 class  tagGCCrossBillboardInfo(Structure):
     Head = tagHead()
     Type = 0    #(BYTE Type)//榜单类型
-    GroupValue1 = 0    #(BYTE GroupValue1)// 分组值1
-    GroupValue2 = 0    #(BYTE GroupValue2)// 分组值2,与分组值1组合归为同组榜单数据
+    GroupValue1 = 0    #(DWORD GroupValue1)// 分组值1
+    GroupValue2 = 0    #(DWORD GroupValue2)// 分组值2,与分组值1组合归为同组榜单数据
     WatchID = 0    #(DWORD WatchID)//查看指定ID名次前后,如玩家ID、家族ID等
     BillboardCount = 0    #(BYTE BillboardCount)
     CrossBillboardDataList = list()    #(vector<tagGCCrossBillboardData> CrossBillboardDataList)
@@ -17030,8 +17277,8 @@
         self.Clear()
         _pos = self.Head.ReadData(_lpData, _pos)
         self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.GroupValue1,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.GroupValue2,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.GroupValue1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.GroupValue2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.WatchID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.BillboardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.BillboardCount):
@@ -17057,8 +17304,8 @@
         length = 0
         length += self.Head.GetLength()
         length += 1
-        length += 1
-        length += 1
+        length += 4
+        length += 4
         length += 4
         length += 1
         for i in range(self.BillboardCount):
@@ -17070,8 +17317,8 @@
         data = ''
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
         data = CommFunc.WriteBYTE(data, self.Type)
-        data = CommFunc.WriteBYTE(data, self.GroupValue1)
-        data = CommFunc.WriteBYTE(data, self.GroupValue2)
+        data = CommFunc.WriteDWORD(data, self.GroupValue1)
+        data = CommFunc.WriteDWORD(data, self.GroupValue2)
         data = CommFunc.WriteDWORD(data, self.WatchID)
         data = CommFunc.WriteBYTE(data, self.BillboardCount)
         for i in range(self.BillboardCount):
@@ -18504,6 +18751,1831 @@
 
 m_NAtagGCCrossZoneInfo=tagGCCrossZoneInfo()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCCrossZoneInfo.Cmd,m_NAtagGCCrossZoneInfo.SubCmd))] = m_NAtagGCCrossZoneInfo
+
+
+#------------------------------------------------------
+# C0 24 仙盟攻城战活动信息 #tagGCFamilyGCZActInfo
+
+class  tagGCFamilyGCZActFamily(Structure):
+    FamilyID = 0    #(DWORD FamilyID)
+    Name = ""    #(char Name[33])//参与仙盟名字
+    LV = 0    #(BYTE LV)//仙盟等级
+    ServerID = 0    #(DWORD ServerID)//仙盟所属区服ID
+    EmblemID = 0    #(DWORD EmblemID)//徽章ID
+    FightPower = 0    #(DWORD FightPower)//仙盟总战力,求余亿部分
+    FightPowerEx = 0    #(DWORD FightPowerEx)//仙盟总战力,整除亿部分
+    LeaderID = 0    #(DWORD LeaderID)//盟主ID
+    LeaderName = ""    #(char LeaderName[33])//盟主名
+    LeaderFace = 0    #(DWORD LeaderFace)
+    LeaderFacePic = 0    #(DWORD LeaderFacePic)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Name,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.LV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.EmblemID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.LeaderID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.LeaderName,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.LeaderFace,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.LeaderFacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.FamilyID = 0
+        self.Name = ""
+        self.LV = 0
+        self.ServerID = 0
+        self.EmblemID = 0
+        self.FightPower = 0
+        self.FightPowerEx = 0
+        self.LeaderID = 0
+        self.LeaderName = ""
+        self.LeaderFace = 0
+        self.LeaderFacePic = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 33
+        length += 1
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 33
+        length += 4
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.FamilyID)
+        data = CommFunc.WriteString(data, 33, self.Name)
+        data = CommFunc.WriteBYTE(data, self.LV)
+        data = CommFunc.WriteDWORD(data, self.ServerID)
+        data = CommFunc.WriteDWORD(data, self.EmblemID)
+        data = CommFunc.WriteDWORD(data, self.FightPower)
+        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
+        data = CommFunc.WriteDWORD(data, self.LeaderID)
+        data = CommFunc.WriteString(data, 33, self.LeaderName)
+        data = CommFunc.WriteDWORD(data, self.LeaderFace)
+        data = CommFunc.WriteDWORD(data, self.LeaderFacePic)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                FamilyID:%d,
+                                Name:%s,
+                                LV:%d,
+                                ServerID:%d,
+                                EmblemID:%d,
+                                FightPower:%d,
+                                FightPowerEx:%d,
+                                LeaderID:%d,
+                                LeaderName:%s,
+                                LeaderFace:%d,
+                                LeaderFacePic:%d
+                                '''\
+                                %(
+                                self.FamilyID,
+                                self.Name,
+                                self.LV,
+                                self.ServerID,
+                                self.EmblemID,
+                                self.FightPower,
+                                self.FightPowerEx,
+                                self.LeaderID,
+                                self.LeaderName,
+                                self.LeaderFace,
+                                self.LeaderFacePic
+                                )
+        return DumpString
+
+
+class  tagGCFamilyGCZActInfo(Structure):
+    Head = tagHead()
+    ServerInfoLen = 0    #(BYTE ServerInfoLen)
+    ServerIDRangeInfo = ""    #(String ServerIDRangeInfo)//开放该活动的服务器ID范围列表,json格式 [[IDA, IDB], ...], [] 为全服
+    ZoneID = 0    #(BYTE ZoneID)// 活动分区ID,公示期为0
+    ActID = 0    #(DWORD ActID)// 活动ID,代表某一次活动的唯一ID,前端如果有活动相关的本地记录可以通过验证此ID变更进行重置
+    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
+    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
+    JoinFamilyCnt = 0    #(BYTE JoinFamilyCnt)// 参与仙盟数
+    ActFlowID = 0    #(WORD ActFlowID)// 活动流程ID,对应H.活动时间流程表中的编号,前端根据跨服时间自行计算当前所处流程状态
+    GuessTemplateID = 0    #(WORD GuessTemplateID)// 竞猜奖励模版,对应H.活动竞猜表,前端自行读表展示
+    PersonalTemplateID = 0    #(WORD PersonalTemplateID)// 个人伤害排行奖励模版,对应H.活动榜单奖励模版表,前端自行读表展示
+    FamilyTemplateID = 0    #(WORD FamilyTemplateID)// 仙盟积分排行奖励模版,对应H.活动榜单奖励模版表,前端自行读表展示
+    StateError = 0    #(DWORD StateError)// 活动流程状态是否异常,如果不为0代表活动已异常,前端自行决定是不显示活动还是活动页面做提示
+    FamilyCount = 0    #(BYTE FamilyCount)
+    ActFamilyList = list()    #(vector<tagGCFamilyGCZActFamily> ActFamilyList)//本分区参与的仙盟名单
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x24
+        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.ZoneID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.ActID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
+        self.JoinFamilyCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.ActFlowID,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.GuessTemplateID,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PersonalTemplateID,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.FamilyTemplateID,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.StateError,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FamilyCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.FamilyCount):
+            temActFamilyList = tagGCFamilyGCZActFamily()
+            _pos = temActFamilyList.ReadData(_lpData, _pos)
+            self.ActFamilyList.append(temActFamilyList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x24
+        self.ServerInfoLen = 0
+        self.ServerIDRangeInfo = ""
+        self.ZoneID = 0
+        self.ActID = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.JoinFamilyCnt = 0
+        self.ActFlowID = 0
+        self.GuessTemplateID = 0
+        self.PersonalTemplateID = 0
+        self.FamilyTemplateID = 0
+        self.StateError = 0
+        self.FamilyCount = 0
+        self.ActFamilyList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += len(self.ServerIDRangeInfo)
+        length += 1
+        length += 4
+        length += 10
+        length += 10
+        length += 1
+        length += 2
+        length += 2
+        length += 2
+        length += 2
+        length += 4
+        length += 1
+        for i in range(self.FamilyCount):
+            length += self.ActFamilyList[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.ZoneID)
+        data = CommFunc.WriteDWORD(data, self.ActID)
+        data = CommFunc.WriteString(data, 10, self.StartDate)
+        data = CommFunc.WriteString(data, 10, self.EndtDate)
+        data = CommFunc.WriteBYTE(data, self.JoinFamilyCnt)
+        data = CommFunc.WriteWORD(data, self.ActFlowID)
+        data = CommFunc.WriteWORD(data, self.GuessTemplateID)
+        data = CommFunc.WriteWORD(data, self.PersonalTemplateID)
+        data = CommFunc.WriteWORD(data, self.FamilyTemplateID)
+        data = CommFunc.WriteDWORD(data, self.StateError)
+        data = CommFunc.WriteBYTE(data, self.FamilyCount)
+        for i in range(self.FamilyCount):
+            data = CommFunc.WriteString(data, self.ActFamilyList[i].GetLength(), self.ActFamilyList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ServerInfoLen:%d,
+                                ServerIDRangeInfo:%s,
+                                ZoneID:%d,
+                                ActID:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                JoinFamilyCnt:%d,
+                                ActFlowID:%d,
+                                GuessTemplateID:%d,
+                                PersonalTemplateID:%d,
+                                FamilyTemplateID:%d,
+                                StateError:%d,
+                                FamilyCount:%d,
+                                ActFamilyList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ServerInfoLen,
+                                self.ServerIDRangeInfo,
+                                self.ZoneID,
+                                self.ActID,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinFamilyCnt,
+                                self.ActFlowID,
+                                self.GuessTemplateID,
+                                self.PersonalTemplateID,
+                                self.FamilyTemplateID,
+                                self.StateError,
+                                self.FamilyCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCFamilyGCZActInfo=tagGCFamilyGCZActInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZActInfo.Head.Cmd,m_NAtagGCFamilyGCZActInfo.Head.SubCmd))] = m_NAtagGCFamilyGCZActInfo
+
+
+#------------------------------------------------------
+# C0 29 仙盟攻城战城池战斗信息 #tagGCFamilyGCZBatCityInfo
+
+class  tagGCFamilyGCZBatCityInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("CityID", c_int),    #城池ID
+                  ("CityLV", c_ubyte),    #城池等级
+                  ("FamilyID", c_int),    #所属仙盟ID,可能为0
+                  ("GuardID", c_int),    #当前防守成员ID,为0时表示没有防守成员了,城池已被击毁
+                  ("HP", c_int),    #防守成员剩余生命,求余亿部分,剩余生命为0时代表该防守成员被击败
+                  ("HPEx", c_int),    #防守成员剩余生命,整除亿部分
+                  ("HPMax", c_int),    #防守成员最大生命,求余亿部分
+                  ("HPMaxEx", c_int),    #防守成员最大生命,整除亿部分
+                  ("AtkPlayerID", c_int),    #发起攻击的玩家ID,可能为0,判断是否自己的ID进行相应的攻击表现
+                  ("AtkRet", c_ubyte),    #攻击结果,仅在攻击玩家ID不为0时有效,0--成功;1-目标已被击杀;2-城池已被摧毁;3-其他
+                  ("KillCnt", c_ubyte),    #本次攻击击杀防守人员数
+                  ("HurtValue", c_int),    #伤害飘血,求余亿部分
+                  ("HurtValueEx", c_int),    #伤害飘血,整除亿部分
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xC0
+        self.SubCmd = 0x29
+        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 = 0xC0
+        self.SubCmd = 0x29
+        self.CityID = 0
+        self.CityLV = 0
+        self.FamilyID = 0
+        self.GuardID = 0
+        self.HP = 0
+        self.HPEx = 0
+        self.HPMax = 0
+        self.HPMaxEx = 0
+        self.AtkPlayerID = 0
+        self.AtkRet = 0
+        self.KillCnt = 0
+        self.HurtValue = 0
+        self.HurtValueEx = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagGCFamilyGCZBatCityInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// C0 29 仙盟攻城战城池战斗信息 //tagGCFamilyGCZBatCityInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                CityID:%d,
+                                CityLV:%d,
+                                FamilyID:%d,
+                                GuardID:%d,
+                                HP:%d,
+                                HPEx:%d,
+                                HPMax:%d,
+                                HPMaxEx:%d,
+                                AtkPlayerID:%d,
+                                AtkRet:%d,
+                                KillCnt:%d,
+                                HurtValue:%d,
+                                HurtValueEx:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.CityID,
+                                self.CityLV,
+                                self.FamilyID,
+                                self.GuardID,
+                                self.HP,
+                                self.HPEx,
+                                self.HPMax,
+                                self.HPMaxEx,
+                                self.AtkPlayerID,
+                                self.AtkRet,
+                                self.KillCnt,
+                                self.HurtValue,
+                                self.HurtValueEx
+                                )
+        return DumpString
+
+
+m_NAtagGCFamilyGCZBatCityInfo=tagGCFamilyGCZBatCityInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZBatCityInfo.Cmd,m_NAtagGCFamilyGCZBatCityInfo.SubCmd))] = m_NAtagGCFamilyGCZBatCityInfo
+
+
+#------------------------------------------------------
+# C0 25 仙盟攻城战轮次分组信息 #tagGCFamilyGCZBatGroupInfo
+
+class  tagGCFamilyGCZBatGroup(Structure):
+    GroupNum = 0    #(BYTE GroupNum)// 分组编号,从1开始,对应A
+    FamilyIDCnt = 0    #(BYTE FamilyIDCnt)
+    FamilyIDList = list()    #(vector<DWORD> FamilyIDList)// 仙盟ID列表,前端可以通过判断参与的仙盟ID是否在某个分组里面验证有没有战场参赛资格
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.GroupNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.FamilyIDCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.FamilyIDCnt):
+            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+            self.FamilyIDList.append(value)
+        return _pos
+
+    def Clear(self):
+        self.GroupNum = 0
+        self.FamilyIDCnt = 0
+        self.FamilyIDList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 1
+        length += 1
+        length += 4 * self.FamilyIDCnt
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteBYTE(data, self.GroupNum)
+        data = CommFunc.WriteBYTE(data, self.FamilyIDCnt)
+        for i in range(self.FamilyIDCnt):
+            data = CommFunc.WriteDWORD(data, self.FamilyIDList[i])
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                GroupNum:%d,
+                                FamilyIDCnt:%d,
+                                FamilyIDList:%s
+                                '''\
+                                %(
+                                self.GroupNum,
+                                self.FamilyIDCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagGCFamilyGCZBat(Structure):
+    BatType = 0    #(BYTE BatType)// 战场类型 1-初级;2-中级;3-高级;
+    GroupCnt = 0    #(BYTE GroupCnt)// 分组数
+    GroupList = list()    #(vector<tagGCFamilyGCZBatGroup> GroupList)// 分组列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.BatType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.GroupCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.GroupCnt):
+            temGroupList = tagGCFamilyGCZBatGroup()
+            _pos = temGroupList.ReadData(_lpData, _pos)
+            self.GroupList.append(temGroupList)
+        return _pos
+
+    def Clear(self):
+        self.BatType = 0
+        self.GroupCnt = 0
+        self.GroupList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 1
+        length += 1
+        for i in range(self.GroupCnt):
+            length += self.GroupList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteBYTE(data, self.BatType)
+        data = CommFunc.WriteBYTE(data, self.GroupCnt)
+        for i in range(self.GroupCnt):
+            data = CommFunc.WriteString(data, self.GroupList[i].GetLength(), self.GroupList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                BatType:%d,
+                                GroupCnt:%d,
+                                GroupList:%s
+                                '''\
+                                %(
+                                self.BatType,
+                                self.GroupCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagGCFamilyGCZBatGroupInfo(Structure):
+    Head = tagHead()
+    RoundNum = 0    #(BYTE RoundNum)// 第x轮的分组,从1开始,没有在对应轮次战场分组里的视为没有该轮次的参赛资格
+    BatTypeCnt = 0    #(BYTE BatTypeCnt)// 战场类型数
+    BatList = list()    #(vector<tagGCFamilyGCZBat> BatList)//战场列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x25
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.RoundNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.BatTypeCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.BatTypeCnt):
+            temBatList = tagGCFamilyGCZBat()
+            _pos = temBatList.ReadData(_lpData, _pos)
+            self.BatList.append(temBatList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x25
+        self.RoundNum = 0
+        self.BatTypeCnt = 0
+        self.BatList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 1
+        for i in range(self.BatTypeCnt):
+            length += self.BatList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.RoundNum)
+        data = CommFunc.WriteBYTE(data, self.BatTypeCnt)
+        for i in range(self.BatTypeCnt):
+            data = CommFunc.WriteString(data, self.BatList[i].GetLength(), self.BatList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                RoundNum:%d,
+                                BatTypeCnt:%d,
+                                BatList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.RoundNum,
+                                self.BatTypeCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCFamilyGCZBatGroupInfo=tagGCFamilyGCZBatGroupInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZBatGroupInfo.Head.Cmd,m_NAtagGCFamilyGCZBatGroupInfo.Head.SubCmd))] = m_NAtagGCFamilyGCZBatGroupInfo
+
+
+#------------------------------------------------------
+# C0 30 仙盟攻城战战斗战报 #tagGCFamilyGCZBatReport
+
+class  tagGCFamilyGCZBatRepHurt(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("TagFamilyID", c_int),    #目标仙盟ID
+                  ("HurtValue", c_int),    #输出伤害,求余亿部分
+                  ("HurtValueEx", 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.TagFamilyID = 0
+        self.HurtValue = 0
+        self.HurtValueEx = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagGCFamilyGCZBatRepHurt)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// C0 30 仙盟攻城战战斗战报 //tagGCFamilyGCZBatReport:
+                                TagFamilyID:%d,
+                                HurtValue:%d,
+                                HurtValueEx:%d
+                                '''\
+                                %(
+                                self.TagFamilyID,
+                                self.HurtValue,
+                                self.HurtValueEx
+                                )
+        return DumpString
+
+
+class  tagGCFamilyGCZBatReport(Structure):
+    Head = tagHead()
+    FamilyID = 0    #(DWORD FamilyID)// 战报仙盟ID
+    DefRepCnt = 0    #(BYTE DefRepCnt)
+    DefRepList = list()    #(vector<tagGCFamilyGCZBatRepHurt> DefRepList)// 防守战报
+    AtkRepCnt = 0    #(BYTE AtkRepCnt)
+    AtkRepList = list()    #(vector<tagGCFamilyGCZBatRepHurt> AtkRepList)// 进攻战报
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x30
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.DefRepCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.DefRepCnt):
+            temDefRepList = tagGCFamilyGCZBatRepHurt()
+            _pos = temDefRepList.ReadData(_lpData, _pos)
+            self.DefRepList.append(temDefRepList)
+        self.AtkRepCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.AtkRepCnt):
+            temAtkRepList = tagGCFamilyGCZBatRepHurt()
+            _pos = temAtkRepList.ReadData(_lpData, _pos)
+            self.AtkRepList.append(temAtkRepList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x30
+        self.FamilyID = 0
+        self.DefRepCnt = 0
+        self.DefRepList = list()
+        self.AtkRepCnt = 0
+        self.AtkRepList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        for i in range(self.DefRepCnt):
+            length += self.DefRepList[i].GetLength()
+        length += 1
+        for i in range(self.AtkRepCnt):
+            length += self.AtkRepList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.FamilyID)
+        data = CommFunc.WriteBYTE(data, self.DefRepCnt)
+        for i in range(self.DefRepCnt):
+            data = CommFunc.WriteString(data, self.DefRepList[i].GetLength(), self.DefRepList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.AtkRepCnt)
+        for i in range(self.AtkRepCnt):
+            data = CommFunc.WriteString(data, self.AtkRepList[i].GetLength(), self.AtkRepList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                FamilyID:%d,
+                                DefRepCnt:%d,
+                                DefRepList:%s,
+                                AtkRepCnt:%d,
+                                AtkRepList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.FamilyID,
+                                self.DefRepCnt,
+                                "...",
+                                self.AtkRepCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCFamilyGCZBatReport=tagGCFamilyGCZBatReport()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZBatReport.Head.Cmd,m_NAtagGCFamilyGCZBatReport.Head.SubCmd))] = m_NAtagGCFamilyGCZBatReport
+
+
+#------------------------------------------------------
+# C0 28 仙盟攻城战城池场景信息 #tagGCFamilyGCZBatSceneInfo
+
+class  tagGCFamilyGCZBatScenePlayer(Structure):
+    PlayerID = 0    #(DWORD PlayerID)
+    Name = ""    #(char Name[33])
+    Job = 0    #(BYTE Job)
+    Face = 0    #(DWORD Face)
+    FacePic = 0    #(DWORD FacePic)
+    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.Name,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.PlayerID = 0
+        self.Name = ""
+        self.Job = 0
+        self.Face = 0
+        self.FacePic = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 33
+        length += 1
+        length += 4
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteString(data, 33, self.Name)
+        data = CommFunc.WriteBYTE(data, self.Job)
+        data = CommFunc.WriteDWORD(data, self.Face)
+        data = CommFunc.WriteDWORD(data, self.FacePic)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                PlayerID:%d,
+                                Name:%s,
+                                Job:%d,
+                                Face:%d,
+                                FacePic:%d
+                                '''\
+                                %(
+                                self.PlayerID,
+                                self.Name,
+                                self.Job,
+                                self.Face,
+                                self.FacePic
+                                )
+        return DumpString
+
+
+class  tagGCFamilyGCZBatSceneHurt(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("CityID", c_int),    #被攻击的城池ID
+                  ("HurtValue", c_int),    #伤害飘血,求余亿部分
+                  ("HurtValueEx", 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.CityID = 0
+        self.HurtValue = 0
+        self.HurtValueEx = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagGCFamilyGCZBatSceneHurt)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// C0 28 仙盟攻城战城池场景信息 //tagGCFamilyGCZBatSceneInfo:
+                                CityID:%d,
+                                HurtValue:%d,
+                                HurtValueEx:%d
+                                '''\
+                                %(
+                                self.CityID,
+                                self.HurtValue,
+                                self.HurtValueEx
+                                )
+        return DumpString
+
+
+class  tagGCFamilyGCZBatSceneCity(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("CityID", c_int),    #城池ID
+                  ("CityLV", c_ubyte),    #城池等级
+                  ("FamilyID", c_int),    #所属仙盟ID,可能为0
+                  ("Rank", c_ubyte),    #当前名次,从1开始
+                  ("HP", c_int),    #剩余生命,求余亿部分,剩余生命为0时代表被摧毁
+                  ("HPEx", c_int),    #剩余生命,整除亿部分
+                  ("HPMax", c_int),    #最大生命,求余亿部分
+                  ("HPMaxEx", c_int),    #最大生命,整除亿部分
+                  ("LastAtkedTime", c_int),    #最后一次被攻击时间戳,可能为0
+                  ]
+
+    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.CityID = 0
+        self.CityLV = 0
+        self.FamilyID = 0
+        self.Rank = 0
+        self.HP = 0
+        self.HPEx = 0
+        self.HPMax = 0
+        self.HPMaxEx = 0
+        self.LastAtkedTime = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagGCFamilyGCZBatSceneCity)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// C0 28 仙盟攻城战城池场景信息 //tagGCFamilyGCZBatSceneInfo:
+                                CityID:%d,
+                                CityLV:%d,
+                                FamilyID:%d,
+                                Rank:%d,
+                                HP:%d,
+                                HPEx:%d,
+                                HPMax:%d,
+                                HPMaxEx:%d,
+                                LastAtkedTime:%d
+                                '''\
+                                %(
+                                self.CityID,
+                                self.CityLV,
+                                self.FamilyID,
+                                self.Rank,
+                                self.HP,
+                                self.HPEx,
+                                self.HPMax,
+                                self.HPMaxEx,
+                                self.LastAtkedTime
+                                )
+        return DumpString
+
+
+class  tagGCFamilyGCZBatSceneInfo(Structure):
+    Head = tagHead()
+    BatType = 0    #(BYTE BatType)// 战场类型 1-初级;2-中级;3-高级;
+    GroupNum = 0    #(BYTE GroupNum)// 分组编号,从1开始,对应A
+    TopFamilyID = 0    #(DWORD TopFamilyID)// 伤害第一仙盟ID
+    TopLeaderID = 0    #(DWORD TopLeaderID)// 伤害第一盟主ID
+    TopPlayerID = 0    #(DWORD TopPlayerID)// 伤害第一玩家ID
+    TopPlayerFamilyID = 0    #(DWORD TopPlayerFamilyID)// 伤害第一玩家仙盟ID
+    AtkPlayerID = 0    #(DWORD AtkPlayerID)// 发起攻击的玩家,可能为0,仅技能攻击时通知,普攻时仅通知血量等信息
+    AtkType = 0    #(BYTE AtkType)// 攻击类型,有发起攻击的玩家时有效
+    KillCnt = 0    #(BYTE KillCnt)// 本次攻击累计击杀数,有发起攻击的玩家时有效
+    HurtCnt = 0    #(BYTE HurtCnt)
+    HurtList = list()    #(vector<tagGCFamilyGCZBatSceneHurt> HurtList)//本次攻击伤血信息,有发起攻击的玩家时有效
+    CityCnt = 0    #(BYTE CityCnt)
+    CityList = list()    #(vector<tagGCFamilyGCZBatSceneCity> CityList)// 城池信息,仅通知变化的城池
+    PlayerCnt = 0    #(BYTE PlayerCnt)
+    PlayerInfoList = list()    #(vector<tagGCFamilyGCZBatScenePlayer> PlayerInfoList)// 场景展示所需要用到的玩家信息,如第一玩家、使用技能玩家
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x28
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.BatType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.GroupNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TopFamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TopLeaderID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TopPlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TopPlayerFamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.AtkPlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.AtkType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.KillCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.HurtCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.HurtCnt):
+            temHurtList = tagGCFamilyGCZBatSceneHurt()
+            _pos = temHurtList.ReadData(_lpData, _pos)
+            self.HurtList.append(temHurtList)
+        self.CityCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.CityCnt):
+            temCityList = tagGCFamilyGCZBatSceneCity()
+            _pos = temCityList.ReadData(_lpData, _pos)
+            self.CityList.append(temCityList)
+        self.PlayerCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PlayerCnt):
+            temPlayerInfoList = tagGCFamilyGCZBatScenePlayer()
+            _pos = temPlayerInfoList.ReadData(_lpData, _pos)
+            self.PlayerInfoList.append(temPlayerInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x28
+        self.BatType = 0
+        self.GroupNum = 0
+        self.TopFamilyID = 0
+        self.TopLeaderID = 0
+        self.TopPlayerID = 0
+        self.TopPlayerFamilyID = 0
+        self.AtkPlayerID = 0
+        self.AtkType = 0
+        self.KillCnt = 0
+        self.HurtCnt = 0
+        self.HurtList = list()
+        self.CityCnt = 0
+        self.CityList = list()
+        self.PlayerCnt = 0
+        self.PlayerInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 1
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 1
+        length += 1
+        length += 1
+        for i in range(self.HurtCnt):
+            length += self.HurtList[i].GetLength()
+        length += 1
+        for i in range(self.CityCnt):
+            length += self.CityList[i].GetLength()
+        length += 1
+        for i in range(self.PlayerCnt):
+            length += self.PlayerInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.BatType)
+        data = CommFunc.WriteBYTE(data, self.GroupNum)
+        data = CommFunc.WriteDWORD(data, self.TopFamilyID)
+        data = CommFunc.WriteDWORD(data, self.TopLeaderID)
+        data = CommFunc.WriteDWORD(data, self.TopPlayerID)
+        data = CommFunc.WriteDWORD(data, self.TopPlayerFamilyID)
+        data = CommFunc.WriteDWORD(data, self.AtkPlayerID)
+        data = CommFunc.WriteBYTE(data, self.AtkType)
+        data = CommFunc.WriteBYTE(data, self.KillCnt)
+        data = CommFunc.WriteBYTE(data, self.HurtCnt)
+        for i in range(self.HurtCnt):
+            data = CommFunc.WriteString(data, self.HurtList[i].GetLength(), self.HurtList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.CityCnt)
+        for i in range(self.CityCnt):
+            data = CommFunc.WriteString(data, self.CityList[i].GetLength(), self.CityList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.PlayerCnt)
+        for i in range(self.PlayerCnt):
+            data = CommFunc.WriteString(data, self.PlayerInfoList[i].GetLength(), self.PlayerInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                BatType:%d,
+                                GroupNum:%d,
+                                TopFamilyID:%d,
+                                TopLeaderID:%d,
+                                TopPlayerID:%d,
+                                TopPlayerFamilyID:%d,
+                                AtkPlayerID:%d,
+                                AtkType:%d,
+                                KillCnt:%d,
+                                HurtCnt:%d,
+                                HurtList:%s,
+                                CityCnt:%d,
+                                CityList:%s,
+                                PlayerCnt:%d,
+                                PlayerInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.BatType,
+                                self.GroupNum,
+                                self.TopFamilyID,
+                                self.TopLeaderID,
+                                self.TopPlayerID,
+                                self.TopPlayerFamilyID,
+                                self.AtkPlayerID,
+                                self.AtkType,
+                                self.KillCnt,
+                                self.HurtCnt,
+                                "...",
+                                self.CityCnt,
+                                "...",
+                                self.PlayerCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCFamilyGCZBatSceneInfo=tagGCFamilyGCZBatSceneInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZBatSceneInfo.Head.Cmd,m_NAtagGCFamilyGCZBatSceneInfo.Head.SubCmd))] = m_NAtagGCFamilyGCZBatSceneInfo
+
+
+#------------------------------------------------------
+# C0 26 仙盟攻城战大本营信息 #tagGCFamilyGCZCampInfo
+
+class  tagGCFamilyGCZCampMem(Structure):
+    PlayerID = 0    #(DWORD PlayerID)
+    Name = ""    #(char Name[33])//参与玩家名字
+    FamilyLV = 0    #(BYTE FamilyLV)//参与时的家族职位
+    Job = 0    #(BYTE Job)
+    Face = 0    #(DWORD Face)//基本脸型
+    FacePic = 0    #(DWORD FacePic)//头像框
+    FightPower = 0    #(DWORD FightPower)//战力,求余亿部分
+    FightPowerEx = 0    #(DWORD FightPowerEx)//战力,整除亿部分
+    HP = 0    #(DWORD HP)//剩余生命,求余亿部分
+    HPEx = 0    #(DWORD HPEx)//剩余生命,整除亿部分
+    HPMax = 0    #(DWORD HPMax)//最大生命,求余亿部分
+    HPMaxEx = 0    #(DWORD HPMaxEx)//最大生命,整除亿部分
+    TotalHurt = 0    #(DWORD TotalHurt)//活动总伤害,求余亿部分,如果不在榜上则读该值
+    TotalHurtEx = 0    #(DWORD TotalHurtEx)//活动总伤害,整除亿部分
+    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.Name,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.FamilyLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Face,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FacePic,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FightPower,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FightPowerEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HP,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HPEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HPMax,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HPMaxEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TotalHurt,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TotalHurtEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.PlayerID = 0
+        self.Name = ""
+        self.FamilyLV = 0
+        self.Job = 0
+        self.Face = 0
+        self.FacePic = 0
+        self.FightPower = 0
+        self.FightPowerEx = 0
+        self.HP = 0
+        self.HPEx = 0
+        self.HPMax = 0
+        self.HPMaxEx = 0
+        self.TotalHurt = 0
+        self.TotalHurtEx = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 33
+        length += 1
+        length += 1
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteString(data, 33, self.Name)
+        data = CommFunc.WriteBYTE(data, self.FamilyLV)
+        data = CommFunc.WriteBYTE(data, self.Job)
+        data = CommFunc.WriteDWORD(data, self.Face)
+        data = CommFunc.WriteDWORD(data, self.FacePic)
+        data = CommFunc.WriteDWORD(data, self.FightPower)
+        data = CommFunc.WriteDWORD(data, self.FightPowerEx)
+        data = CommFunc.WriteDWORD(data, self.HP)
+        data = CommFunc.WriteDWORD(data, self.HPEx)
+        data = CommFunc.WriteDWORD(data, self.HPMax)
+        data = CommFunc.WriteDWORD(data, self.HPMaxEx)
+        data = CommFunc.WriteDWORD(data, self.TotalHurt)
+        data = CommFunc.WriteDWORD(data, self.TotalHurtEx)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                PlayerID:%d,
+                                Name:%s,
+                                FamilyLV:%d,
+                                Job:%d,
+                                Face:%d,
+                                FacePic:%d,
+                                FightPower:%d,
+                                FightPowerEx:%d,
+                                HP:%d,
+                                HPEx:%d,
+                                HPMax:%d,
+                                HPMaxEx:%d,
+                                TotalHurt:%d,
+                                TotalHurtEx:%d
+                                '''\
+                                %(
+                                self.PlayerID,
+                                self.Name,
+                                self.FamilyLV,
+                                self.Job,
+                                self.Face,
+                                self.FacePic,
+                                self.FightPower,
+                                self.FightPowerEx,
+                                self.HP,
+                                self.HPEx,
+                                self.HPMax,
+                                self.HPMaxEx,
+                                self.TotalHurt,
+                                self.TotalHurtEx
+                                )
+        return DumpString
+
+
+class  tagGCFamilyGCZCampRound(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("RoundNum", c_ubyte),    #轮次编号,从1开始
+                  ("BatType", c_ubyte),    #所在战场类型
+                  ("GroupNum", c_ubyte),    #所在分组编号
+                  ("Rank", c_ubyte),    #本轮排名
+                  ("Score", c_ushort),    #本轮积分,总积分为所有轮次累加
+                  ("UpdownState", c_ubyte),    #本轮结算晋级降级状态:0-未处理,1-降级;2-保级;3-晋级,即本轮的晋降级状态决定下一轮的战场类型
+                  ]
+
+    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.RoundNum = 0
+        self.BatType = 0
+        self.GroupNum = 0
+        self.Rank = 0
+        self.Score = 0
+        self.UpdownState = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagGCFamilyGCZCampRound)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// C0 26 仙盟攻城战大本营信息 //tagGCFamilyGCZCampInfo:
+                                RoundNum:%d,
+                                BatType:%d,
+                                GroupNum:%d,
+                                Rank:%d,
+                                Score:%d,
+                                UpdownState:%d
+                                '''\
+                                %(
+                                self.RoundNum,
+                                self.BatType,
+                                self.GroupNum,
+                                self.Rank,
+                                self.Score,
+                                self.UpdownState
+                                )
+        return DumpString
+
+
+class  tagGCFamilyGCZCampInfo(Structure):
+    Head = tagHead()
+    FamilyID = 0    #(DWORD FamilyID)//所在活动仙盟ID,可能不是玩家当前的仙盟ID,活动以该ID为准
+    CampLV = 0    #(WORD CampLV)//大本营当前等级
+    CampExp = 0    #(DWORD CampExp)//大本营当前经验
+    CityLV = 0    #(WORD CityLV)//城池属性等级,开战后可能与当前大本营等级不一样
+    HPBase = 0    #(DWORD HPBase)//基础生命,求余亿部分
+    HPBaseEx = 0    #(DWORD HPBaseEx)//基础生命,整除亿部分
+    HPMax = 0    #(DWORD HPMax)//总生命,求余亿部分
+    HPMaxEx = 0    #(DWORD HPMaxEx)//总大生命,整除亿部分
+    HP = 0    #(DWORD HP)//剩余生命,求余亿部分
+    HPEx = 0    #(DWORD HPEx)//剩余生命,整除亿部分
+    RoundCnt = 0    #(BYTE RoundCnt)
+    RoundInfoList = list()    #(vector<tagGCFamilyGCZCampRound> RoundInfoList)//仙盟轮次汇总信息
+    DefMemCnt = 0    #(BYTE DefMemCnt)
+    DefMemList = list()    #(vector<tagGCFamilyGCZCampMem> DefMemList)//防守成员列表,有同步则差异更新,没有在防守成员里的视为没有参与资格
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x26
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CampLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.CampExp,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CityLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.HPBase,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HPBaseEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HPMax,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HPMaxEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HP,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HPEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.RoundCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.RoundCnt):
+            temRoundInfoList = tagGCFamilyGCZCampRound()
+            _pos = temRoundInfoList.ReadData(_lpData, _pos)
+            self.RoundInfoList.append(temRoundInfoList)
+        self.DefMemCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.DefMemCnt):
+            temDefMemList = tagGCFamilyGCZCampMem()
+            _pos = temDefMemList.ReadData(_lpData, _pos)
+            self.DefMemList.append(temDefMemList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x26
+        self.FamilyID = 0
+        self.CampLV = 0
+        self.CampExp = 0
+        self.CityLV = 0
+        self.HPBase = 0
+        self.HPBaseEx = 0
+        self.HPMax = 0
+        self.HPMaxEx = 0
+        self.HP = 0
+        self.HPEx = 0
+        self.RoundCnt = 0
+        self.RoundInfoList = list()
+        self.DefMemCnt = 0
+        self.DefMemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 2
+        length += 4
+        length += 2
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 1
+        for i in range(self.RoundCnt):
+            length += self.RoundInfoList[i].GetLength()
+        length += 1
+        for i in range(self.DefMemCnt):
+            length += self.DefMemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.FamilyID)
+        data = CommFunc.WriteWORD(data, self.CampLV)
+        data = CommFunc.WriteDWORD(data, self.CampExp)
+        data = CommFunc.WriteWORD(data, self.CityLV)
+        data = CommFunc.WriteDWORD(data, self.HPBase)
+        data = CommFunc.WriteDWORD(data, self.HPBaseEx)
+        data = CommFunc.WriteDWORD(data, self.HPMax)
+        data = CommFunc.WriteDWORD(data, self.HPMaxEx)
+        data = CommFunc.WriteDWORD(data, self.HP)
+        data = CommFunc.WriteDWORD(data, self.HPEx)
+        data = CommFunc.WriteBYTE(data, self.RoundCnt)
+        for i in range(self.RoundCnt):
+            data = CommFunc.WriteString(data, self.RoundInfoList[i].GetLength(), self.RoundInfoList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.DefMemCnt)
+        for i in range(self.DefMemCnt):
+            data = CommFunc.WriteString(data, self.DefMemList[i].GetLength(), self.DefMemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                FamilyID:%d,
+                                CampLV:%d,
+                                CampExp:%d,
+                                CityLV:%d,
+                                HPBase:%d,
+                                HPBaseEx:%d,
+                                HPMax:%d,
+                                HPMaxEx:%d,
+                                HP:%d,
+                                HPEx:%d,
+                                RoundCnt:%d,
+                                RoundInfoList:%s,
+                                DefMemCnt:%d,
+                                DefMemList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.FamilyID,
+                                self.CampLV,
+                                self.CampExp,
+                                self.CityLV,
+                                self.HPBase,
+                                self.HPBaseEx,
+                                self.HPMax,
+                                self.HPMaxEx,
+                                self.HP,
+                                self.HPEx,
+                                self.RoundCnt,
+                                "...",
+                                self.DefMemCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCFamilyGCZCampInfo=tagGCFamilyGCZCampInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZCampInfo.Head.Cmd,m_NAtagGCFamilyGCZCampInfo.Head.SubCmd))] = m_NAtagGCFamilyGCZCampInfo
+
+
+#------------------------------------------------------
+# C0 27 仙盟攻城战成员贡献值信息 #tagGCFamilyGCZContributionInfo
+
+class  tagGCFamilyGCZContribution(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("PlayerID", c_int),    
+                  ("ContributionValue", 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.PlayerID = 0
+        self.ContributionValue = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagGCFamilyGCZContribution)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// C0 27 仙盟攻城战成员贡献值信息 //tagGCFamilyGCZContributionInfo:
+                                PlayerID:%d,
+                                ContributionValue:%d
+                                '''\
+                                %(
+                                self.PlayerID,
+                                self.ContributionValue
+                                )
+        return DumpString
+
+
+class  tagGCFamilyGCZContributionInfo(Structure):
+    Head = tagHead()
+    ContriCnt = 0    #(BYTE ContriCnt)
+    ContriList = list()    #(vector<tagGCFamilyGCZContribution> ContriList)//成员贡献值列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x27
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ContriCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.ContriCnt):
+            temContriList = tagGCFamilyGCZContribution()
+            _pos = temContriList.ReadData(_lpData, _pos)
+            self.ContriList.append(temContriList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x27
+        self.ContriCnt = 0
+        self.ContriList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.ContriCnt):
+            length += self.ContriList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ContriCnt)
+        for i in range(self.ContriCnt):
+            data = CommFunc.WriteString(data, self.ContriList[i].GetLength(), self.ContriList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ContriCnt:%d,
+                                ContriList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ContriCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCFamilyGCZContributionInfo=tagGCFamilyGCZContributionInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZContributionInfo.Head.Cmd,m_NAtagGCFamilyGCZContributionInfo.Head.SubCmd))] = m_NAtagGCFamilyGCZContributionInfo
+
+
+#------------------------------------------------------
+# C0 31 仙盟攻城战分组仙盟成员伤害明细 #tagGCFamilyGCZGroupFamilyMemHurtInfo
+
+class  tagGCFamilyGCZGroupFamilyMemHurt(Structure):
+    PlayerID = 0    #(DWORD PlayerID)
+    Name = ""    #(char Name[33])//参与玩家名字
+    HurtValue = 0    #(DWORD HurtValue)//伤害,求余亿部分
+    HurtValueEx = 0    #(DWORD HurtValueEx)//伤害,整除亿部分
+    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.Name,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.HurtValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HurtValueEx,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.PlayerID = 0
+        self.Name = ""
+        self.HurtValue = 0
+        self.HurtValueEx = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 33
+        length += 4
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteString(data, 33, self.Name)
+        data = CommFunc.WriteDWORD(data, self.HurtValue)
+        data = CommFunc.WriteDWORD(data, self.HurtValueEx)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                PlayerID:%d,
+                                Name:%s,
+                                HurtValue:%d,
+                                HurtValueEx:%d
+                                '''\
+                                %(
+                                self.PlayerID,
+                                self.Name,
+                                self.HurtValue,
+                                self.HurtValueEx
+                                )
+        return DumpString
+
+
+class  tagGCFamilyGCZGroupFamilyMemHurtInfo(Structure):
+    Head = tagHead()
+    FamilyID = 0    #(DWORD FamilyID)//查看的目标仙盟ID
+    HurtMemCnt = 0    #(BYTE HurtMemCnt)
+    HurtMemList = list()    #(vector<tagGCFamilyGCZGroupFamilyMemHurt> HurtMemList)//成员伤害明细列表,只算城池被摧毁前的伤害,未排序,前端自己排序
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x31
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.FamilyID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.HurtMemCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.HurtMemCnt):
+            temHurtMemList = tagGCFamilyGCZGroupFamilyMemHurt()
+            _pos = temHurtMemList.ReadData(_lpData, _pos)
+            self.HurtMemList.append(temHurtMemList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x31
+        self.FamilyID = 0
+        self.HurtMemCnt = 0
+        self.HurtMemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        for i in range(self.HurtMemCnt):
+            length += self.HurtMemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.FamilyID)
+        data = CommFunc.WriteBYTE(data, self.HurtMemCnt)
+        for i in range(self.HurtMemCnt):
+            data = CommFunc.WriteString(data, self.HurtMemList[i].GetLength(), self.HurtMemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                FamilyID:%d,
+                                HurtMemCnt:%d,
+                                HurtMemList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.FamilyID,
+                                self.HurtMemCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCFamilyGCZGroupFamilyMemHurtInfo=tagGCFamilyGCZGroupFamilyMemHurtInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZGroupFamilyMemHurtInfo.Head.Cmd,m_NAtagGCFamilyGCZGroupFamilyMemHurtInfo.Head.SubCmd))] = m_NAtagGCFamilyGCZGroupFamilyMemHurtInfo
+
+
+#------------------------------------------------------
+# C0 32 仙盟攻城战竞猜名单信息 #tagGCFamilyGCZGuessInfo
+
+class  tagGCFamilyGCZGuessFamily(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("FamilyID", c_int),    #备选仙盟ID
+                  ("GuessValue", c_ushort),    #竞猜热度值,玩家每次选择则加1,重复选择也算
+                  ]
+
+    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.FamilyID = 0
+        self.GuessValue = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagGCFamilyGCZGuessFamily)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// C0 32 仙盟攻城战竞猜名单信息 //tagGCFamilyGCZGuessInfo:
+                                FamilyID:%d,
+                                GuessValue:%d
+                                '''\
+                                %(
+                                self.FamilyID,
+                                self.GuessValue
+                                )
+        return DumpString
+
+
+class  tagGCFamilyGCZGuessRight(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("AwardID", c_ubyte),    #奖励ID
+                  ("RightPlayerCnt", 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.AwardID = 0
+        self.RightPlayerCnt = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagGCFamilyGCZGuessRight)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// C0 32 仙盟攻城战竞猜名单信息 //tagGCFamilyGCZGuessInfo:
+                                AwardID:%d,
+                                RightPlayerCnt:%d
+                                '''\
+                                %(
+                                self.AwardID,
+                                self.RightPlayerCnt
+                                )
+        return DumpString
+
+
+class  tagGCFamilyGCZGuessInfo(Structure):
+    Head = tagHead()
+    PlayerID = 0    #(DWORD PlayerID)//竞猜玩家ID,有玩家修改竞猜时会附带该信息,如果是自己ID,则更新自己的竞猜选项,否则无视
+    SelectCnt = 0    #(BYTE SelectCnt)
+    SelectFamilyIDList = list()    #(vector<DWORD> SelectFamilyIDList)//竞猜玩家选择的仙盟ID顺序
+    FinalCnt = 0    #(BYTE FinalCnt)
+    FinalFamilyIDList = list()    #(vector<DWORD> FinalFamilyIDList)//最终排名顺序,仅活动排名出来后才有值
+    RightCnt = 0    #(BYTE RightCnt)
+    RightInfoList = list()    #(vector<tagGCFamilyGCZGuessRight> RightInfoList)//猜中个数明细列表
+    FamilyCnt = 0    #(BYTE FamilyCnt)
+    GuessFamilyList = list()    #(vector<tagGCFamilyGCZGuessFamily> GuessFamilyList)//备选仙盟名单列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x32
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.SelectCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.SelectCnt):
+            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+            self.SelectFamilyIDList.append(value)
+        self.FinalCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.FinalCnt):
+            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+            self.FinalFamilyIDList.append(value)
+        self.RightCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.RightCnt):
+            temRightInfoList = tagGCFamilyGCZGuessRight()
+            _pos = temRightInfoList.ReadData(_lpData, _pos)
+            self.RightInfoList.append(temRightInfoList)
+        self.FamilyCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.FamilyCnt):
+            temGuessFamilyList = tagGCFamilyGCZGuessFamily()
+            _pos = temGuessFamilyList.ReadData(_lpData, _pos)
+            self.GuessFamilyList.append(temGuessFamilyList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x32
+        self.PlayerID = 0
+        self.SelectCnt = 0
+        self.SelectFamilyIDList = list()
+        self.FinalCnt = 0
+        self.FinalFamilyIDList = list()
+        self.RightCnt = 0
+        self.RightInfoList = list()
+        self.FamilyCnt = 0
+        self.GuessFamilyList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        length += 4 * self.SelectCnt
+        length += 1
+        length += 4 * self.FinalCnt
+        length += 1
+        for i in range(self.RightCnt):
+            length += self.RightInfoList[i].GetLength()
+        length += 1
+        for i in range(self.FamilyCnt):
+            length += self.GuessFamilyList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.SelectCnt)
+        for i in range(self.SelectCnt):
+            data = CommFunc.WriteDWORD(data, self.SelectFamilyIDList[i])
+        data = CommFunc.WriteBYTE(data, self.FinalCnt)
+        for i in range(self.FinalCnt):
+            data = CommFunc.WriteDWORD(data, self.FinalFamilyIDList[i])
+        data = CommFunc.WriteBYTE(data, self.RightCnt)
+        for i in range(self.RightCnt):
+            data = CommFunc.WriteString(data, self.RightInfoList[i].GetLength(), self.RightInfoList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.FamilyCnt)
+        for i in range(self.FamilyCnt):
+            data = CommFunc.WriteString(data, self.GuessFamilyList[i].GetLength(), self.GuessFamilyList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                PlayerID:%d,
+                                SelectCnt:%d,
+                                SelectFamilyIDList:%s,
+                                FinalCnt:%d,
+                                FinalFamilyIDList:%s,
+                                RightCnt:%d,
+                                RightInfoList:%s,
+                                FamilyCnt:%d,
+                                GuessFamilyList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.PlayerID,
+                                self.SelectCnt,
+                                "...",
+                                self.FinalCnt,
+                                "...",
+                                self.RightCnt,
+                                "...",
+                                self.FamilyCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCFamilyGCZGuessInfo=tagGCFamilyGCZGuessInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCFamilyGCZGuessInfo.Head.Cmd,m_NAtagGCFamilyGCZGuessInfo.Head.SubCmd))] = m_NAtagGCFamilyGCZGuessInfo
 
 
 #------------------------------------------------------
@@ -20418,6 +22490,7 @@
                   ("SubCmd", c_ubyte),
                   ("MapID", c_ushort),    
                   ("FuncLineID", c_ushort),    #功能线路ID
+                  ("FuncMapID", c_ushort),    #功能地图ID
                   ]
 
     def __init__(self):
@@ -20436,6 +22509,7 @@
         self.SubCmd = 0x26
         self.MapID = 0
         self.FuncLineID = 0
+        self.FuncMapID = 0
         return
 
     def GetLength(self):
@@ -20449,13 +22523,15 @@
                                 Cmd:%s,
                                 SubCmd:%s,
                                 MapID:%d,
-                                FuncLineID:%d
+                                FuncLineID:%d,
+                                FuncMapID:%d
                                 '''\
                                 %(
                                 self.Cmd,
                                 self.SubCmd,
                                 self.MapID,
-                                self.FuncLineID
+                                self.FuncLineID,
+                                self.FuncMapID
                                 )
         return DumpString
 
@@ -20474,6 +22550,7 @@
                   ("SubCmd", c_ubyte),
                   ("MapID", c_int),    
                   ("FuncLineID", c_ushort),    #功能线路ID
+                  ("FuncMapID", c_ushort),    #功能地图ID
                   ]
 
     def __init__(self):
@@ -20492,6 +22569,7 @@
         self.SubCmd = 0x27
         self.MapID = 0
         self.FuncLineID = 0
+        self.FuncMapID = 0
         return
 
     def GetLength(self):
@@ -20505,13 +22583,15 @@
                                 Cmd:%s,
                                 SubCmd:%s,
                                 MapID:%d,
-                                FuncLineID:%d
+                                FuncLineID:%d,
+                                FuncMapID:%d
                                 '''\
                                 %(
                                 self.Cmd,
                                 self.SubCmd,
                                 self.MapID,
-                                self.FuncLineID
+                                self.FuncLineID,
+                                self.FuncMapID
                                 )
         return DumpString
 
@@ -21416,7 +23496,7 @@
     _pack_ = 1
     _fields_ = [
                   ("ItemID", c_int),    #果实物品ID
-                  ("EatCnt", c_ushort),    #已使用个数
+                  ("EatCnt", c_int),    #已使用个数
                   ("ItemAddCnt", c_int),    #增幅丹增加上限
                   ("ItemBreakCnt", c_int),    #增幅丹突破次数
                   ]
@@ -25929,7 +28009,8 @@
     _pack_ = 1
     _fields_ = [
                   ("MfpType", c_ubyte),    #模块编号类型
-                  ("FightPower", c_int),    #本模块战斗力
+                  ("FightPower", c_int),    #本模块战斗力,求余亿部分
+                  ("FightPowerEx", c_int),    #本模块战斗力,整除亿部分,1代表1亿
                   ]
 
     def __init__(self):
@@ -25944,6 +28025,7 @@
     def Clear(self):
         self.MfpType = 0
         self.FightPower = 0
+        self.FightPowerEx = 0
         return
 
     def GetLength(self):
@@ -25955,11 +28037,13 @@
     def OutputString(self):
         DumpString = '''//A3 A1 各功能模块战斗力信息 //tagMCModuleFightPowerInfo:
                                 MfpType:%d,
-                                FightPower:%d
+                                FightPower:%d,
+                                FightPowerEx:%d
                                 '''\
                                 %(
                                 self.MfpType,
-                                self.FightPower
+                                self.FightPower,
+                                self.FightPowerEx
                                 )
         return DumpString
 
@@ -28328,19 +30412,15 @@
 #------------------------------------------------------
 # A3 11 通知玩家境界信息 #tagMCSyncRealmInfo
 
-class  tagMCSyncRealmInfo(Structure):
+class  tagMCSyncRealmTask(Structure):
     _pack_ = 1
     _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("IsPass", c_ubyte),    #是否通关副本
-                  ("XXZLAwardState", c_int),    #修仙之路领奖状态;按二进制位存储每个任务ID是否已领取
+                  ("TaskID", c_ubyte),    
+                  ("TaskValue", c_int),    
                   ]
 
     def __init__(self):
         self.Clear()
-        self.Cmd = 0xA3
-        self.SubCmd = 0x11
         return
 
     def ReadData(self, stringData, _pos=0, _len=0):
@@ -28349,36 +30429,99 @@
         return _pos + self.GetLength()
 
     def Clear(self):
-        self.Cmd = 0xA3
-        self.SubCmd = 0x11
-        self.IsPass = 0
-        self.XXZLAwardState = 0
+        self.TaskID = 0
+        self.TaskValue = 0
         return
 
     def GetLength(self):
-        return sizeof(tagMCSyncRealmInfo)
+        return sizeof(tagMCSyncRealmTask)
 
     def GetBuffer(self):
         return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
         DumpString = '''// A3 11 通知玩家境界信息 //tagMCSyncRealmInfo:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                IsPass:%d,
-                                XXZLAwardState:%d
+                                TaskID:%d,
+                                TaskValue:%d
                                 '''\
                                 %(
-                                self.Cmd,
-                                self.SubCmd,
-                                self.IsPass,
-                                self.XXZLAwardState
+                                self.TaskID,
+                                self.TaskValue
+                                )
+        return DumpString
+
+
+class  tagMCSyncRealmInfo(Structure):
+    Head = tagHead()
+    TaskAwardState = 0    #(DWORD TaskAwardState)//进阶任务领奖状态;按任务ID二进制位存储是否已领取
+    TaskValueCount = 0    #(BYTE TaskValueCount)
+    TaskValueList = list()    #(vector<tagMCSyncRealmTask> TaskValueList)//进阶任务值列表,仅有需要记录的任务才会通知
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA3
+        self.Head.SubCmd = 0x11
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.TaskAwardState,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TaskValueCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TaskValueCount):
+            temTaskValueList = tagMCSyncRealmTask()
+            _pos = temTaskValueList.ReadData(_lpData, _pos)
+            self.TaskValueList.append(temTaskValueList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA3
+        self.Head.SubCmd = 0x11
+        self.TaskAwardState = 0
+        self.TaskValueCount = 0
+        self.TaskValueList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 1
+        for i in range(self.TaskValueCount):
+            length += self.TaskValueList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.TaskAwardState)
+        data = CommFunc.WriteBYTE(data, self.TaskValueCount)
+        for i in range(self.TaskValueCount):
+            data = CommFunc.WriteString(data, self.TaskValueList[i].GetLength(), self.TaskValueList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                TaskAwardState:%d,
+                                TaskValueCount:%d,
+                                TaskValueList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.TaskAwardState,
+                                self.TaskValueCount,
+                                "..."
                                 )
         return DumpString
 
 
 m_NAtagMCSyncRealmInfo=tagMCSyncRealmInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSyncRealmInfo.Cmd,m_NAtagMCSyncRealmInfo.SubCmd))] = m_NAtagMCSyncRealmInfo
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCSyncRealmInfo.Head.Cmd,m_NAtagMCSyncRealmInfo.Head.SubCmd))] = m_NAtagMCSyncRealmInfo
 
 
 #------------------------------------------------------
@@ -28934,6 +31077,7 @@
     TreasureType = 0    #(BYTE TreasureType)//寻宝类型
     LuckValue = 0    #(WORD LuckValue)//当前幸运值
     TreasureCount = 0    #(DWORD TreasureCount)//已寻宝总次数
+    TreasureCountToday = 0    #(DWORD TreasureCountToday)//今日已寻宝总次数
     FreeCountToday = 0    #(WORD FreeCountToday)//今日已免费寻宝次数
     TreasureCntAward = 0    #(DWORD TreasureCntAward)//累计寻宝次数对应奖励领奖状态,按奖励记录索引二进制记录是否已领取
     GridLimitCnt = 0    #(BYTE GridLimitCnt)
@@ -28949,6 +31093,7 @@
         self.TreasureType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.LuckValue,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.TreasureCount,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TreasureCountToday,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FreeCountToday,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.TreasureCntAward,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.GridLimitCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
@@ -28962,6 +31107,7 @@
         self.TreasureType = 0
         self.LuckValue = 0
         self.TreasureCount = 0
+        self.TreasureCountToday = 0
         self.FreeCountToday = 0
         self.TreasureCntAward = 0
         self.GridLimitCnt = 0
@@ -28972,6 +31118,7 @@
         length = 0
         length += 1
         length += 2
+        length += 4
         length += 4
         length += 2
         length += 4
@@ -28986,6 +31133,7 @@
         data = CommFunc.WriteBYTE(data, self.TreasureType)
         data = CommFunc.WriteWORD(data, self.LuckValue)
         data = CommFunc.WriteDWORD(data, self.TreasureCount)
+        data = CommFunc.WriteDWORD(data, self.TreasureCountToday)
         data = CommFunc.WriteWORD(data, self.FreeCountToday)
         data = CommFunc.WriteDWORD(data, self.TreasureCntAward)
         data = CommFunc.WriteBYTE(data, self.GridLimitCnt)
@@ -28998,6 +31146,7 @@
                                 TreasureType:%d,
                                 LuckValue:%d,
                                 TreasureCount:%d,
+                                TreasureCountToday:%d,
                                 FreeCountToday:%d,
                                 TreasureCntAward:%d,
                                 GridLimitCnt:%d,
@@ -29007,6 +31156,7 @@
                                 self.TreasureType,
                                 self.LuckValue,
                                 self.TreasureCount,
+                                self.TreasureCountToday,
                                 self.FreeCountToday,
                                 self.TreasureCntAward,
                                 self.GridLimitCnt,
@@ -34093,7 +36243,7 @@
     _pack_ = 1
     _fields_ = [
                   ("ItemIndex", c_int),    
-                  ("BuyCnt", c_ushort),    # 今日已购买次数
+                  ("BuyCnt", c_int),    # 今日已购买次数
                   ("IsReset", c_ubyte),    #是否重置
                   ]
 
@@ -35889,6 +38039,9 @@
     LimitLV = 0    #(WORD LimitLV)// 限制等级
     AwardCount = 0    #(BYTE AwardCount)
     AwardInfoList = list()    #(vector<tagMCActFamilyCTGAssistAward> AwardInfoList)// 互助奖励列表
+    CTGIDCount = 0    #(BYTE CTGIDCount)
+    CTGIDList = list()    #(vector<WORD> CTGIDList)// CTGID列表;总购买次数前端自己统计,直接取CTGID对应的累计购买次数累加
+    ShopType = 0    #(WORD ShopType)// 开放商店类型
     data = None
 
     def __init__(self):
@@ -35910,6 +38063,11 @@
             temAwardInfoList = tagMCActFamilyCTGAssistAward()
             _pos = temAwardInfoList.ReadData(_lpData, _pos)
             self.AwardInfoList.append(temAwardInfoList)
+        self.CTGIDCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.CTGIDCount):
+            value,_pos=CommFunc.ReadWORD(_lpData,_pos)
+            self.CTGIDList.append(value)
+        self.ShopType,_pos = CommFunc.ReadWORD(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -35924,6 +38082,9 @@
         self.LimitLV = 0
         self.AwardCount = 0
         self.AwardInfoList = list()
+        self.CTGIDCount = 0
+        self.CTGIDList = list()
+        self.ShopType = 0
         return
 
     def GetLength(self):
@@ -35937,6 +38098,9 @@
         length += 1
         for i in range(self.AwardCount):
             length += self.AwardInfoList[i].GetLength()
+        length += 1
+        length += 2 * self.CTGIDCount
+        length += 2
 
         return length
 
@@ -35951,6 +38115,10 @@
         data = CommFunc.WriteBYTE(data, self.AwardCount)
         for i in range(self.AwardCount):
             data = CommFunc.WriteString(data, self.AwardInfoList[i].GetLength(), self.AwardInfoList[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.CTGIDCount)
+        for i in range(self.CTGIDCount):
+            data = CommFunc.WriteWORD(data, self.CTGIDList[i])
+        data = CommFunc.WriteWORD(data, self.ShopType)
         return data
 
     def OutputString(self):
@@ -35962,7 +38130,10 @@
                                 IsDayReset:%d,
                                 LimitLV:%d,
                                 AwardCount:%d,
-                                AwardInfoList:%s
+                                AwardInfoList:%s,
+                                CTGIDCount:%d,
+                                CTGIDList:%s,
+                                ShopType:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
@@ -35972,7 +38143,10 @@
                                 self.IsDayReset,
                                 self.LimitLV,
                                 self.AwardCount,
-                                "..."
+                                "...",
+                                self.CTGIDCount,
+                                "...",
+                                self.ShopType
                                 )
         return DumpString
 
@@ -44274,6 +46448,510 @@
 
 
 #------------------------------------------------------
+# AA 90 炼器跨服活动信息 #tagMCCrossActLianqiInfo
+
+class  tagMCCrossActLianqiItem(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(tagMCCrossActLianqiItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 90 炼器跨服活动信息 //tagMCCrossActLianqiInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCCrossActLianqiAwardEx(Structure):
+    NeedScore = 0    #(DWORD NeedScore)// 额外奖励所需积分
+    Count = 0    #(BYTE Count)// 额外奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActLianqiItem> 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 = tagMCCrossActLianqiItem()
+            _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  tagMCCrossActLianqiBillard(Structure):
+    Rank = 0    #(DWORD Rank)// 名次,1-代表第一名;支持夸段,如1,3 代表第1名,第2~3名
+    Count = 0    #(BYTE Count)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCCrossActLianqiItem> AwardItemList)// 奖励物品列表
+    NeedScore = 0    #(DWORD NeedScore)// 上榜所需积分
+    CountEx = 0    #(BYTE CountEx)// 额外奖励数
+    AwardItemExList = list()    #(vector<tagMCCrossActLianqiAwardEx> 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 = tagMCCrossActLianqiItem()
+            _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 = tagMCCrossActLianqiAwardEx()
+            _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  tagMCCrossActLianqiInfo(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
+    LimitLV = 0    #(WORD LimitLV)// 限制等级
+    PersonalBillCount = 0    #(BYTE PersonalBillCount)
+    PersonalBillboardInfoList = list()    #(vector<tagMCCrossActLianqiBillard> PersonalBillboardInfoList)// 个人榜单奖励信息列表,如果没有代表本次活动没有该榜奖励
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x90
+        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.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PersonalBillCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.PersonalBillCount):
+            temPersonalBillboardInfoList = tagMCCrossActLianqiBillard()
+            _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 = 0x90
+        self.ServerInfoLen = 0
+        self.ServerIDRangeInfo = ""
+        self.GroupValue1 = 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 += len(self.ServerIDRangeInfo)
+        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.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.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,
+                                ServerInfoLen:%d,
+                                ServerIDRangeInfo:%s,
+                                GroupValue1:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                JoinStartTime:%s,
+                                JoinEndTime:%s,
+                                LimitLV:%d,
+                                PersonalBillCount:%d,
+                                PersonalBillboardInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ServerInfoLen,
+                                self.ServerIDRangeInfo,
+                                self.GroupValue1,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.JoinStartTime,
+                                self.JoinEndTime,
+                                self.LimitLV,
+                                self.PersonalBillCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCCrossActLianqiInfo=tagMCCrossActLianqiInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCrossActLianqiInfo.Head.Cmd,m_NAtagMCCrossActLianqiInfo.Head.SubCmd))] = m_NAtagMCCrossActLianqiInfo
+
+
+#------------------------------------------------------
+# AA 91 炼器活动玩家信息 #tagMCActLianqiPlayerInfo
+
+class  tagMCActLianqiTileMove(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Row", c_ubyte),    # 行,0为第1行
+                  ("Col", c_ubyte),    # 列,0为第1列
+                  ("ToRow", c_ubyte),    # 移动到目标行
+                  ("ToCol", 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.Row = 0
+        self.Col = 0
+        self.ToRow = 0
+        self.ToCol = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCActLianqiTileMove)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 91 炼器活动玩家信息 //tagMCActLianqiPlayerInfo:
+                                Row:%d,
+                                Col:%d,
+                                ToRow:%d,
+                                ToCol:%d
+                                '''\
+                                %(
+                                self.Row,
+                                self.Col,
+                                self.ToRow,
+                                self.ToCol
+                                )
+        return DumpString
+
+
+class  tagMCActLianqiPlayerInfo(Structure):
+    Head = tagHead()
+    Score = 0    #(DWORD Score)// 当前活动积分
+    ScoreHighest = 0    #(DWORD ScoreHighest)// 当前活动最高积分,即上榜积分
+    Energy = 0    #(WORD Energy)// 当前体力
+    EnergyTime = 0    #(DWORD EnergyTime)// 上次恢复体力时间戳,为0时不用处理倒计时
+    LVAwardMax = 0    #(DWORD LVAwardMax)// 已激活的最大合成奖励等级
+    LVAwardState = 0    #(DWORD LVAwardState)// 最大合成等级奖励领取记录,按等级二进制位存储是否已领取
+    UseItemLen = 0    #(BYTE UseItemLen)
+    UseItemCntList = list()    #(vector<WORD> UseItemCntList)// 本局已使用辅助道具次数 [辅助道具1使用次数, ...]
+    GridDataLen = 0    #(BYTE GridDataLen)// 格子数据长度
+    GridData = ""    #(String GridData)// 格子二维行列数据,一定会同步,直接替换,行从上往下排 [[第1行格子1,格子2, ...], ...]
+    OPType = 0    #(BYTE OPType)// 0-无(如初始化,GM等后端直接设置);1-移动;2-使用道具;3-重新开始;如果是因为操作引起的格子数据变化,则在相关操作表现完毕后再展示最新行列数据,否则直接变更
+    MoveCount = 0    #(BYTE MoveCount)
+    MoveList = list()    #(vector<tagMCActLianqiTileMove> MoveList)// 图块移动列表,可能没有数据,有的话先表现移动
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x91
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.Score,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ScoreHighest,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Energy,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.EnergyTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.LVAwardMax,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.LVAwardState,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.UseItemLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.UseItemLen):
+            value,_pos=CommFunc.ReadWORD(_lpData,_pos)
+            self.UseItemCntList.append(value)
+        self.GridDataLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.GridData,_pos = CommFunc.ReadString(_lpData, _pos,self.GridDataLen)
+        self.OPType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.MoveCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.MoveCount):
+            temMoveList = tagMCActLianqiTileMove()
+            _pos = temMoveList.ReadData(_lpData, _pos)
+            self.MoveList.append(temMoveList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x91
+        self.Score = 0
+        self.ScoreHighest = 0
+        self.Energy = 0
+        self.EnergyTime = 0
+        self.LVAwardMax = 0
+        self.LVAwardState = 0
+        self.UseItemLen = 0
+        self.UseItemCntList = list()
+        self.GridDataLen = 0
+        self.GridData = ""
+        self.OPType = 0
+        self.MoveCount = 0
+        self.MoveList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 4
+        length += 2
+        length += 4
+        length += 4
+        length += 4
+        length += 1
+        length += 2 * self.UseItemLen
+        length += 1
+        length += len(self.GridData)
+        length += 1
+        length += 1
+        for i in range(self.MoveCount):
+            length += self.MoveList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteDWORD(data, self.Score)
+        data = CommFunc.WriteDWORD(data, self.ScoreHighest)
+        data = CommFunc.WriteWORD(data, self.Energy)
+        data = CommFunc.WriteDWORD(data, self.EnergyTime)
+        data = CommFunc.WriteDWORD(data, self.LVAwardMax)
+        data = CommFunc.WriteDWORD(data, self.LVAwardState)
+        data = CommFunc.WriteBYTE(data, self.UseItemLen)
+        for i in range(self.UseItemLen):
+            data = CommFunc.WriteWORD(data, self.UseItemCntList[i])
+        data = CommFunc.WriteBYTE(data, self.GridDataLen)
+        data = CommFunc.WriteString(data, self.GridDataLen, self.GridData)
+        data = CommFunc.WriteBYTE(data, self.OPType)
+        data = CommFunc.WriteBYTE(data, self.MoveCount)
+        for i in range(self.MoveCount):
+            data = CommFunc.WriteString(data, self.MoveList[i].GetLength(), self.MoveList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                Score:%d,
+                                ScoreHighest:%d,
+                                Energy:%d,
+                                EnergyTime:%d,
+                                LVAwardMax:%d,
+                                LVAwardState:%d,
+                                UseItemLen:%d,
+                                UseItemCntList:%s,
+                                GridDataLen:%d,
+                                GridData:%s,
+                                OPType:%d,
+                                MoveCount:%d,
+                                MoveList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.Score,
+                                self.ScoreHighest,
+                                self.Energy,
+                                self.EnergyTime,
+                                self.LVAwardMax,
+                                self.LVAwardState,
+                                self.UseItemLen,
+                                "...",
+                                self.GridDataLen,
+                                self.GridData,
+                                self.OPType,
+                                self.MoveCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCActLianqiPlayerInfo=tagMCActLianqiPlayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActLianqiPlayerInfo.Head.Cmd,m_NAtagMCActLianqiPlayerInfo.Head.SubCmd))] = m_NAtagMCActLianqiPlayerInfo
+
+
+#------------------------------------------------------
 # AA 80 仙匣秘境跨服活动信息 #tagMCCrossActXianXiaMJInfo
 
 class  tagMCCrossActXianXiaMJItem(Structure):
@@ -50019,7 +52697,8 @@
                   ("CampaignType", c_ubyte),    #奖励类型
                   ("BillAwardRecord", c_ubyte),    #排行奖励是否已领取
                   ("TagAwardRecord", c_int),    #目标奖励索引位领取记录:0-未领;1-已领
-                  ("RecordData", c_int),    #活动时的记录值
+                  ("RecordData", c_int),    #活动时的记录值,求余亿部分,为了统一逻辑,其他非战力榜的也使用此规则
+                  ("RecordDataEx", c_int),    #活动时的记录值,整除亿部分,1代表1亿
                   ]
 
     def __init__(self):
@@ -50036,6 +52715,7 @@
         self.BillAwardRecord = 0
         self.TagAwardRecord = 0
         self.RecordData = 0
+        self.RecordDataEx = 0
         return
 
     def GetLength(self):
@@ -50049,13 +52729,15 @@
                                 CampaignType:%d,
                                 BillAwardRecord:%d,
                                 TagAwardRecord:%d,
-                                RecordData:%d
+                                RecordData:%d,
+                                RecordDataEx:%d
                                 '''\
                                 %(
                                 self.CampaignType,
                                 self.BillAwardRecord,
                                 self.TagAwardRecord,
-                                self.RecordData
+                                self.RecordData,
+                                self.RecordDataEx
                                 )
         return DumpString
 
@@ -50955,11 +53637,13 @@
     EnergyUsed = 0    #(WORD EnergyUsed)// 今日已消耗体力
     RefreshCount = 0    #(DWORD RefreshCount)// 今日福地刷新物品次数 - 普通刷新
     RefreshCountSuper = 0    #(BYTE RefreshCountSuper)// 今日福地刷新物品次数 - 超级刷新
+    RefreshCountRob = 0    #(WORD RefreshCountRob)// 今日福地刷新周围玩家次数
     TreasureCount = 0    #(BYTE TreasureCount)// 聚宝盆类型个数,对应类型 0~n
     TreasureState = list()    #(vector<BYTE> TreasureState)// 聚宝盆是否已激活列表,[类型0是否已激活, ...]
     TreasureAward = list()    #(vector<BYTE> TreasureAward)// 聚宝盆奖励是否已领取列表,[类型0是否已领取, ...]
     TreasureProgress = list()    #(vector<BYTE> TreasureProgress)// 聚宝盆进度值列表,[类型0进度值, ...],满进度100
     HelpAwardCount = 0    #(BYTE HelpAwardCount)// 今日已帮助别人奖励次数
+    HousekeeperEndTime = 0    #(DWORD HousekeeperEndTime)// 自动管家到期时间戳,有值同时也代表免费试用已使用
     data = None
 
     def __init__(self):
@@ -50975,6 +53659,7 @@
         self.EnergyUsed,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.RefreshCount,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.RefreshCountSuper,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RefreshCountRob,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.TreasureCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.TreasureCount):
             value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
@@ -50986,6 +53671,7 @@
             value,_pos=CommFunc.ReadBYTE(_lpData,_pos)
             self.TreasureProgress.append(value)
         self.HelpAwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.HousekeeperEndTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         return _pos
 
     def Clear(self):
@@ -50997,11 +53683,13 @@
         self.EnergyUsed = 0
         self.RefreshCount = 0
         self.RefreshCountSuper = 0
+        self.RefreshCountRob = 0
         self.TreasureCount = 0
         self.TreasureState = list()
         self.TreasureAward = list()
         self.TreasureProgress = list()
         self.HelpAwardCount = 0
+        self.HousekeeperEndTime = 0
         return
 
     def GetLength(self):
@@ -51011,11 +53699,13 @@
         length += 2
         length += 4
         length += 1
+        length += 2
         length += 1
         length += 1 * self.TreasureCount
         length += 1 * self.TreasureCount
         length += 1 * self.TreasureCount
         length += 1
+        length += 4
 
         return length
 
@@ -51026,6 +53716,7 @@
         data = CommFunc.WriteWORD(data, self.EnergyUsed)
         data = CommFunc.WriteDWORD(data, self.RefreshCount)
         data = CommFunc.WriteBYTE(data, self.RefreshCountSuper)
+        data = CommFunc.WriteWORD(data, self.RefreshCountRob)
         data = CommFunc.WriteBYTE(data, self.TreasureCount)
         for i in range(self.TreasureCount):
             data = CommFunc.WriteBYTE(data, self.TreasureState[i])
@@ -51034,6 +53725,7 @@
         for i in range(self.TreasureCount):
             data = CommFunc.WriteBYTE(data, self.TreasureProgress[i])
         data = CommFunc.WriteBYTE(data, self.HelpAwardCount)
+        data = CommFunc.WriteDWORD(data, self.HousekeeperEndTime)
         return data
 
     def OutputString(self):
@@ -51043,11 +53735,13 @@
                                 EnergyUsed:%d,
                                 RefreshCount:%d,
                                 RefreshCountSuper:%d,
+                                RefreshCountRob:%d,
                                 TreasureCount:%d,
                                 TreasureState:%s,
                                 TreasureAward:%s,
                                 TreasureProgress:%s,
-                                HelpAwardCount:%d
+                                HelpAwardCount:%d,
+                                HousekeeperEndTime:%d
                                 '''\
                                 %(
                                 self.Head.OutputString(),
@@ -51055,11 +53749,13 @@
                                 self.EnergyUsed,
                                 self.RefreshCount,
                                 self.RefreshCountSuper,
+                                self.RefreshCountRob,
                                 self.TreasureCount,
                                 "...",
                                 "...",
                                 "...",
-                                self.HelpAwardCount
+                                self.HelpAwardCount,
+                                self.HousekeeperEndTime
                                 )
         return DumpString
 
@@ -52782,6 +55478,7 @@
     ZhanlingType = 0    #(BYTE ZhanlingType)// 战令类型
     IsActivite = 0    #(BYTE IsActivite)// 普通战令是否已激活
     IsActiviteH = 0    #(BYTE IsActiviteH)// 高级战令是否已激活
+    AllFinishTime = 0    #(DWORD AllFinishTime)// 全部奖励领取完毕的时间戳,未完毕时该值为0,后端会在0点过天时检查可否重置,前端自行做倒计时表现即可
     Value1 = 0    #(DWORD Value1)// 战令对应的自定义值,可选,如登录战令代表开始计算日期时间戳
     RewardCount = 0    #(WORD RewardCount)
     RewardList = list()    #(vector<tagMCZhanling> RewardList)
@@ -52799,6 +55496,7 @@
         self.ZhanlingType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.IsActivite,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.IsActiviteH,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.AllFinishTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.RewardCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
         for i in range(self.RewardCount):
@@ -52815,6 +55513,7 @@
         self.ZhanlingType = 0
         self.IsActivite = 0
         self.IsActiviteH = 0
+        self.AllFinishTime = 0
         self.Value1 = 0
         self.RewardCount = 0
         self.RewardList = list()
@@ -52826,6 +55525,7 @@
         length += 1
         length += 1
         length += 1
+        length += 4
         length += 4
         length += 2
         for i in range(self.RewardCount):
@@ -52839,6 +55539,7 @@
         data = CommFunc.WriteBYTE(data, self.ZhanlingType)
         data = CommFunc.WriteBYTE(data, self.IsActivite)
         data = CommFunc.WriteBYTE(data, self.IsActiviteH)
+        data = CommFunc.WriteDWORD(data, self.AllFinishTime)
         data = CommFunc.WriteDWORD(data, self.Value1)
         data = CommFunc.WriteWORD(data, self.RewardCount)
         for i in range(self.RewardCount):
@@ -52851,6 +55552,7 @@
                                 ZhanlingType:%d,
                                 IsActivite:%d,
                                 IsActiviteH:%d,
+                                AllFinishTime:%d,
                                 Value1:%d,
                                 RewardCount:%d,
                                 RewardList:%s
@@ -52860,6 +55562,7 @@
                                 self.ZhanlingType,
                                 self.IsActivite,
                                 self.IsActiviteH,
+                                self.AllFinishTime,
                                 self.Value1,
                                 self.RewardCount,
                                 "..."
@@ -56741,6 +59444,189 @@
 
 
 #------------------------------------------------------
+# C1 10 仙盟攻城战玩家信息 #tagMCFamilyGCZPlayerInfo
+
+class  tagMCFamilyGCZPlayerInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("ContributionCnt", c_ubyte),    # 轮次低级捐献已捐献次数,轮次变更时会重置
+                  ("Energy", c_ubyte),    # 当前可用免费体力
+                  ("EnergyTime", c_int),    # 上次恢复免费体力时间戳,为0时不再恢复
+                  ("AwardState", c_int),    # 活动奖励领取状态,按二进制位判断是否已领取,0-竞猜奖励;1-个人排行奖励;2-仙盟排名奖励;
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xC1
+        self.SubCmd = 0x10
+        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 = 0xC1
+        self.SubCmd = 0x10
+        self.ContributionCnt = 0
+        self.Energy = 0
+        self.EnergyTime = 0
+        self.AwardState = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFamilyGCZPlayerInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// C1 10 仙盟攻城战玩家信息 //tagMCFamilyGCZPlayerInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                ContributionCnt:%d,
+                                Energy:%d,
+                                EnergyTime:%d,
+                                AwardState:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.ContributionCnt,
+                                self.Energy,
+                                self.EnergyTime,
+                                self.AwardState
+                                )
+        return DumpString
+
+
+m_NAtagMCFamilyGCZPlayerInfo=tagMCFamilyGCZPlayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyGCZPlayerInfo.Cmd,m_NAtagMCFamilyGCZPlayerInfo.SubCmd))] = m_NAtagMCFamilyGCZPlayerInfo
+
+
+#------------------------------------------------------
+# C1 11 仙盟攻城战圣泉信息 #tagMCFamilyGCZSQInfo
+
+class  tagMCFamilyGCZSQGrid(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("GridNum", c_ubyte),    # 格子编号,1~n	
+                  ("ItemID", c_int),    # 抽中的物品ID,20亿时为过关标记
+                  ("ItemCount", 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.GridNum = 0
+        self.ItemID = 0
+        self.ItemCount = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFamilyGCZSQGrid)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// C1 11 仙盟攻城战圣泉信息 //tagMCFamilyGCZSQInfo:
+                                GridNum:%d,
+                                ItemID:%d,
+                                ItemCount:%d
+                                '''\
+                                %(
+                                self.GridNum,
+                                self.ItemID,
+                                self.ItemCount
+                                )
+        return DumpString
+
+
+class  tagMCFamilyGCZSQInfo(Structure):
+    Head = tagHead()
+    SQLayer = 0    #(BYTE SQLayer)// 当前所在圣泉层,从1开始
+    SQGirdCnt = 0    #(BYTE SQGirdCnt)
+    SQGridList = list()    #(vector<tagMCFamilyGCZSQGrid> SQGridList)//圣泉当前层已抽格子信息,仅同步全部或变更的格子,前端进行差异更新,层数变更时重置本地记录
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xC1
+        self.Head.SubCmd = 0x11
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.SQLayer,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.SQGirdCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.SQGirdCnt):
+            temSQGridList = tagMCFamilyGCZSQGrid()
+            _pos = temSQGridList.ReadData(_lpData, _pos)
+            self.SQGridList.append(temSQGridList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xC1
+        self.Head.SubCmd = 0x11
+        self.SQLayer = 0
+        self.SQGirdCnt = 0
+        self.SQGridList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 1
+        for i in range(self.SQGirdCnt):
+            length += self.SQGridList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.SQLayer)
+        data = CommFunc.WriteBYTE(data, self.SQGirdCnt)
+        for i in range(self.SQGirdCnt):
+            data = CommFunc.WriteString(data, self.SQGridList[i].GetLength(), self.SQGridList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                SQLayer:%d,
+                                SQGirdCnt:%d,
+                                SQGridList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.SQLayer,
+                                self.SQGirdCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCFamilyGCZSQInfo=tagMCFamilyGCZSQInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyGCZSQInfo.Head.Cmd,m_NAtagMCFamilyGCZSQInfo.Head.SubCmd))] = m_NAtagMCFamilyGCZSQInfo
+
+
+#------------------------------------------------------
 # C1 08 幸运云购玩家信息 #tagMCLuckyCloudBuyPlayerInfo
 
 class  tagMCLuckyCloudBuyPlayerInfo(Structure):

--
Gitblit v1.8.0