From 6a9883b425e53e714b9a930ec70b7544999611a6 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 08 五月 2025 12:01:45 +0800
Subject: [PATCH] 16 卡牌服务端(db数据备档、加载;仙盟基础转到MapServer;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py |  832 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 787 insertions(+), 45 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 53a6757..693db8a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -32149,6 +32149,58 @@
 
 
 #------------------------------------------------------
+# A5 21 家族变更 #tagMCFamilyChange
+
+class  tagMCFamilyChange(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("Type", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xA5
+        self.SubCmd = 0x21
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xA5
+        self.SubCmd = 0x21
+        self.Type = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCFamilyChange)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A5 21 家族变更 //tagMCFamilyChange:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                Type:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.Type
+                                )
+        return DumpString
+
+
+m_NAtagMCFamilyChange=tagMCFamilyChange()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyChange.Cmd,m_NAtagMCFamilyChange.SubCmd))] = m_NAtagMCFamilyChange
+
+
+#------------------------------------------------------
 # A5 06 仙盟每日福利领取状态 #tagMCFamilyDayAward
 
 class  tagMCFamilyDayAward(Structure):
@@ -32313,6 +32365,197 @@
 
 
 #------------------------------------------------------
+# A5 22 家族申请加入的玩家信息 #tagMCFamilyReqJoinInfo
+
+class  tagMCFamilyReqJoinPlayer(Structure):
+    PlayerID = 0    #(DWORD PlayerID)
+    NameLen = 0    #(BYTE NameLen)
+    Name = ""    #(String Name)//size = NameLen
+    ReqTime = 0    #(DWORD ReqTime)//申请时间戳
+    LV = 0    #(WORD LV)//等级
+    Job = 0    #(BYTE Job)//职业
+    RealmLV = 0    #(BYTE RealmLV)//境界
+    Face = 0    #(DWORD Face)//基本脸型
+    FacePic = 0    #(DWORD FacePic)//头像框
+    FightPower = 0    #(DWORD FightPower)//战力,求余亿部分
+    FightPowerEx = 0    #(DWORD FightPowerEx)//战力,整除亿部分
+    ServerID = 0    #(DWORD ServerID)//所属区服ID
+    IsOnLine = 0    #(BYTE IsOnLine)//是否在线
+    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.ReqTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RealmLV,_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.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.IsOnLine,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.PlayerID = 0
+        self.NameLen = 0
+        self.Name = ""
+        self.ReqTime = 0
+        self.LV = 0
+        self.Job = 0
+        self.RealmLV = 0
+        self.Face = 0
+        self.FacePic = 0
+        self.FightPower = 0
+        self.FightPowerEx = 0
+        self.ServerID = 0
+        self.IsOnLine = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        length += len(self.Name)
+        length += 4
+        length += 2
+        length += 1
+        length += 1
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 1
+
+        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.WriteDWORD(data, self.ReqTime)
+        data = CommFunc.WriteWORD(data, self.LV)
+        data = CommFunc.WriteBYTE(data, self.Job)
+        data = CommFunc.WriteBYTE(data, self.RealmLV)
+        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.ServerID)
+        data = CommFunc.WriteBYTE(data, self.IsOnLine)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                PlayerID:%d,
+                                NameLen:%d,
+                                Name:%s,
+                                ReqTime:%d,
+                                LV:%d,
+                                Job:%d,
+                                RealmLV:%d,
+                                Face:%d,
+                                FacePic:%d,
+                                FightPower:%d,
+                                FightPowerEx:%d,
+                                ServerID:%d,
+                                IsOnLine:%d
+                                '''\
+                                %(
+                                self.PlayerID,
+                                self.NameLen,
+                                self.Name,
+                                self.ReqTime,
+                                self.LV,
+                                self.Job,
+                                self.RealmLV,
+                                self.Face,
+                                self.FacePic,
+                                self.FightPower,
+                                self.FightPowerEx,
+                                self.ServerID,
+                                self.IsOnLine
+                                )
+        return DumpString
+
+
+class  tagMCFamilyReqJoinInfo(Structure):
+    Head = tagHead()
+    ReqCnt = 0    #(BYTE ReqCnt)
+    ReqJoinList = list()    #(vector<tagMCFamilyReqJoinPlayer> ReqJoinList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA5
+        self.Head.SubCmd = 0x22
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ReqCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.ReqCnt):
+            temReqJoinList = tagMCFamilyReqJoinPlayer()
+            _pos = temReqJoinList.ReadData(_lpData, _pos)
+            self.ReqJoinList.append(temReqJoinList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA5
+        self.Head.SubCmd = 0x22
+        self.ReqCnt = 0
+        self.ReqJoinList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.ReqCnt):
+            length += self.ReqJoinList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ReqCnt)
+        for i in range(self.ReqCnt):
+            data = CommFunc.WriteString(data, self.ReqJoinList[i].GetLength(), self.ReqJoinList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ReqCnt:%d,
+                                ReqJoinList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ReqCnt,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCFamilyReqJoinInfo=tagMCFamilyReqJoinInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyReqJoinInfo.Head.Cmd,m_NAtagMCFamilyReqJoinInfo.Head.SubCmd))] = m_NAtagMCFamilyReqJoinInfo
+
+
+#------------------------------------------------------
 # A5 11 打坐信息 #tagMCFamilySitInfo
 
 class  tagMCFamilySitInfo(Structure):
@@ -32370,6 +32613,239 @@
 
 m_NAtagMCFamilySitInfo=tagMCFamilySitInfo()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilySitInfo.Cmd,m_NAtagMCFamilySitInfo.SubCmd))] = m_NAtagMCFamilySitInfo
+
+
+#------------------------------------------------------
+# A5 23 搜索家族返回列表 #tagMCFamilyViewList
+
+class  tagMCFamilyView(Structure):
+    FamilyID = 0    #(DWORD FamilyID)//家族ID
+    FamilyNameLen = 0    #(BYTE FamilyNameLen)
+    FamilyName = ""    #(String FamilyName)//size = FamilyNameLen
+    LeaderID = 0    #(DWORD LeaderID)//族长ID
+    LeaderNameLen = 0    #(BYTE LeaderNameLen)
+    LeaderName = ""    #(String LeaderName)//size = LeaderNameLen
+    FamilyLV = 0    #(BYTE FamilyLV)//家族等级
+    JoinReview = 0    #(BYTE JoinReview)//成员加入是否需要审核,默认0自动加入
+    JoinLVMin = 0    #(WORD JoinLVMin)//限制最低可加入的玩家等级
+    ServerID = 0    #(DWORD ServerID)//区服ID
+    EmblemID = 0    #(DWORD EmblemID)//徽章ID
+    FightPower = 0    #(DWORD FightPower)//总战力,求余亿部分
+    FightPowerEx = 0    #(DWORD FightPowerEx)//总战力,整除亿部分
+    MemberCount = 0    #(BYTE MemberCount)//成员人数
+    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.FamilyNameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.FamilyName,_pos = CommFunc.ReadString(_lpData, _pos,self.FamilyNameLen)
+        self.LeaderID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.LeaderNameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.LeaderName,_pos = CommFunc.ReadString(_lpData, _pos,self.LeaderNameLen)
+        self.FamilyLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.JoinReview,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.JoinLVMin,_pos = CommFunc.ReadWORD(_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.MemberCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.FamilyID = 0
+        self.FamilyNameLen = 0
+        self.FamilyName = ""
+        self.LeaderID = 0
+        self.LeaderNameLen = 0
+        self.LeaderName = ""
+        self.FamilyLV = 0
+        self.JoinReview = 0
+        self.JoinLVMin = 0
+        self.ServerID = 0
+        self.EmblemID = 0
+        self.FightPower = 0
+        self.FightPowerEx = 0
+        self.MemberCount = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        length += len(self.FamilyName)
+        length += 4
+        length += 1
+        length += len(self.LeaderName)
+        length += 1
+        length += 1
+        length += 2
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 1
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.FamilyID)
+        data = CommFunc.WriteBYTE(data, self.FamilyNameLen)
+        data = CommFunc.WriteString(data, self.FamilyNameLen, self.FamilyName)
+        data = CommFunc.WriteDWORD(data, self.LeaderID)
+        data = CommFunc.WriteBYTE(data, self.LeaderNameLen)
+        data = CommFunc.WriteString(data, self.LeaderNameLen, self.LeaderName)
+        data = CommFunc.WriteBYTE(data, self.FamilyLV)
+        data = CommFunc.WriteBYTE(data, self.JoinReview)
+        data = CommFunc.WriteWORD(data, self.JoinLVMin)
+        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.WriteBYTE(data, self.MemberCount)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                FamilyID:%d,
+                                FamilyNameLen:%d,
+                                FamilyName:%s,
+                                LeaderID:%d,
+                                LeaderNameLen:%d,
+                                LeaderName:%s,
+                                FamilyLV:%d,
+                                JoinReview:%d,
+                                JoinLVMin:%d,
+                                ServerID:%d,
+                                EmblemID:%d,
+                                FightPower:%d,
+                                FightPowerEx:%d,
+                                MemberCount:%d
+                                '''\
+                                %(
+                                self.FamilyID,
+                                self.FamilyNameLen,
+                                self.FamilyName,
+                                self.LeaderID,
+                                self.LeaderNameLen,
+                                self.LeaderName,
+                                self.FamilyLV,
+                                self.JoinReview,
+                                self.JoinLVMin,
+                                self.ServerID,
+                                self.EmblemID,
+                                self.FightPower,
+                                self.FightPowerEx,
+                                self.MemberCount
+                                )
+        return DumpString
+
+
+class  tagMCFamilyViewList(Structure):
+    Head = tagHead()
+    MsgLen = 0    #(BYTE MsgLen)
+    Msg = ""    #(String Msg)//搜索条件原值返回
+    PageIndex = 0    #(BYTE PageIndex)//查询第X页索引,0~n
+    ShowCount = 0    #(BYTE ShowCount)//每页数量
+    TotalPage = 0    #(BYTE TotalPage)//一共有多少页
+    FamilyCount = 0    #(BYTE FamilyCount)
+    FamilyList = list()    #(vector<tagMCFamilyView> FamilyList)//本页家族信息列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA5
+        self.Head.SubCmd = 0x23
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.MsgLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Msg,_pos = CommFunc.ReadString(_lpData, _pos,self.MsgLen)
+        self.PageIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.ShowCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TotalPage,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.FamilyCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.FamilyCount):
+            temFamilyList = tagMCFamilyView()
+            _pos = temFamilyList.ReadData(_lpData, _pos)
+            self.FamilyList.append(temFamilyList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA5
+        self.Head.SubCmd = 0x23
+        self.MsgLen = 0
+        self.Msg = ""
+        self.PageIndex = 0
+        self.ShowCount = 0
+        self.TotalPage = 0
+        self.FamilyCount = 0
+        self.FamilyList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += len(self.Msg)
+        length += 1
+        length += 1
+        length += 1
+        length += 1
+        for i in range(self.FamilyCount):
+            length += self.FamilyList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.MsgLen)
+        data = CommFunc.WriteString(data, self.MsgLen, self.Msg)
+        data = CommFunc.WriteBYTE(data, self.PageIndex)
+        data = CommFunc.WriteBYTE(data, self.ShowCount)
+        data = CommFunc.WriteBYTE(data, self.TotalPage)
+        data = CommFunc.WriteBYTE(data, self.FamilyCount)
+        for i in range(self.FamilyCount):
+            data = CommFunc.WriteString(data, self.FamilyList[i].GetLength(), self.FamilyList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                MsgLen:%d,
+                                Msg:%s,
+                                PageIndex:%d,
+                                ShowCount:%d,
+                                TotalPage:%d,
+                                FamilyCount:%d,
+                                FamilyList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.MsgLen,
+                                self.Msg,
+                                self.PageIndex,
+                                self.ShowCount,
+                                self.TotalPage,
+                                self.FamilyCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCFamilyViewList=tagMCFamilyViewList()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFamilyViewList.Head.Cmd,m_NAtagMCFamilyViewList.Head.SubCmd))] = m_NAtagMCFamilyViewList
 
 
 #------------------------------------------------------
@@ -32548,47 +33024,12 @@
 
 
 #------------------------------------------------------
-#A5 01  查看已申请加入的家族信息  #tagMCNotifyRequestJoinFamilyInfo
-
-class  tagRequestJoinFamily(Structure):
-    _pack_ = 1
-    _fields_ = [
-                  ("RequestFamilyID", c_int),    #申请的加入ID
-                  ]
-
-    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.RequestFamilyID = 0
-        return
-
-    def GetLength(self):
-        return sizeof(tagRequestJoinFamily)
-
-    def GetBuffer(self):
-        return string_at(addressof(self), self.GetLength())
-
-    def OutputString(self):
-        DumpString = '''//A5 01  查看已申请加入的家族信息  //tagMCNotifyRequestJoinFamilyInfo:
-                                RequestFamilyID:%d
-                                '''\
-                                %(
-                                self.RequestFamilyID
-                                )
-        return DumpString
-
+#A5 01 已申请加入的家族信息 #tagMCNotifyRequestJoinFamilyInfo
 
 class  tagMCNotifyRequestJoinFamilyInfo(Structure):
     Head = tagHead()
     RequestCount = 0    #(BYTE RequestCount)//申请的数量
-    RequestAddFamilyInfo = list()    #(vector<tagRequestJoinFamily> RequestAddFamilyInfo)//size = RequestCount
+    RequestJoinFamilyIDList = list()    #(vector<DWORD> RequestJoinFamilyIDList)//size = RequestCount
     data = None
 
     def __init__(self):
@@ -32602,9 +33043,8 @@
         _pos = self.Head.ReadData(_lpData, _pos)
         self.RequestCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.RequestCount):
-            temRequestAddFamilyInfo = tagRequestJoinFamily()
-            _pos = temRequestAddFamilyInfo.ReadData(_lpData, _pos)
-            self.RequestAddFamilyInfo.append(temRequestAddFamilyInfo)
+            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
+            self.RequestJoinFamilyIDList.append(value)
         return _pos
 
     def Clear(self):
@@ -32613,15 +33053,14 @@
         self.Head.Cmd = 0xA5
         self.Head.SubCmd = 0x01
         self.RequestCount = 0
-        self.RequestAddFamilyInfo = list()
+        self.RequestJoinFamilyIDList = list()
         return
 
     def GetLength(self):
         length = 0
         length += self.Head.GetLength()
         length += 1
-        for i in range(self.RequestCount):
-            length += self.RequestAddFamilyInfo[i].GetLength()
+        length += 4 * self.RequestCount
 
         return length
 
@@ -32630,14 +33069,14 @@
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
         data = CommFunc.WriteBYTE(data, self.RequestCount)
         for i in range(self.RequestCount):
-            data = CommFunc.WriteString(data, self.RequestAddFamilyInfo[i].GetLength(), self.RequestAddFamilyInfo[i].GetBuffer())
+            data = CommFunc.WriteDWORD(data, self.RequestJoinFamilyIDList[i])
         return data
 
     def OutputString(self):
         DumpString = '''
                                 Head:%s,
                                 RequestCount:%d,
-                                RequestAddFamilyInfo:%s
+                                RequestJoinFamilyIDList:%s
                                 '''\
                                 %(
                                 self.Head.OutputString(),
@@ -32760,6 +33199,309 @@
 
 
 #------------------------------------------------------
+# A5 20 玩家家族信息 #tagMCRoleFamilyInfo
+
+class  tagMCRoleFamilyMember(Structure):
+    PlayerID = 0    #(DWORD PlayerID)
+    NameLen = 0    #(BYTE NameLen)
+    Name = ""    #(String Name)//size = NameLen
+    JoinTime = 0    #(DWORD JoinTime)//加入家族时时间戳
+    FmLV = 0    #(BYTE FmLV)//家族职位: 0-成员;1-精英;2-副族长;3-族长
+    LV = 0    #(WORD LV)//等级
+    Job = 0    #(BYTE Job)//职业
+    RealmLV = 0    #(BYTE RealmLV)//境界
+    Face = 0    #(DWORD Face)//基本脸型
+    FacePic = 0    #(DWORD FacePic)//头像框
+    FightPower = 0    #(DWORD FightPower)//战力,求余亿部分
+    FightPowerEx = 0    #(DWORD FightPowerEx)//战力,整除亿部分
+    ServerID = 0    #(DWORD ServerID)//所属区服ID
+    ContribTotal = 0    #(DWORD ContribTotal)//总贡献度
+    ContribWeek = 0    #(DWORD ContribWeek)//周贡献度
+    OffTime = 0    #(DWORD OffTime)// 0-在线; >0-/离线时间戳
+    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.JoinTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.FmLV,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.LV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Job,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.RealmLV,_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.ServerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ContribTotal,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.ContribWeek,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.OffTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.PlayerID = 0
+        self.NameLen = 0
+        self.Name = ""
+        self.JoinTime = 0
+        self.FmLV = 0
+        self.LV = 0
+        self.Job = 0
+        self.RealmLV = 0
+        self.Face = 0
+        self.FacePic = 0
+        self.FightPower = 0
+        self.FightPowerEx = 0
+        self.ServerID = 0
+        self.ContribTotal = 0
+        self.ContribWeek = 0
+        self.OffTime = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 1
+        length += len(self.Name)
+        length += 4
+        length += 1
+        length += 2
+        length += 1
+        length += 1
+        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.WriteBYTE(data, self.NameLen)
+        data = CommFunc.WriteString(data, self.NameLen, self.Name)
+        data = CommFunc.WriteDWORD(data, self.JoinTime)
+        data = CommFunc.WriteBYTE(data, self.FmLV)
+        data = CommFunc.WriteWORD(data, self.LV)
+        data = CommFunc.WriteBYTE(data, self.Job)
+        data = CommFunc.WriteBYTE(data, self.RealmLV)
+        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.ServerID)
+        data = CommFunc.WriteDWORD(data, self.ContribTotal)
+        data = CommFunc.WriteDWORD(data, self.ContribWeek)
+        data = CommFunc.WriteDWORD(data, self.OffTime)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                PlayerID:%d,
+                                NameLen:%d,
+                                Name:%s,
+                                JoinTime:%d,
+                                FmLV:%d,
+                                LV:%d,
+                                Job:%d,
+                                RealmLV:%d,
+                                Face:%d,
+                                FacePic:%d,
+                                FightPower:%d,
+                                FightPowerEx:%d,
+                                ServerID:%d,
+                                ContribTotal:%d,
+                                ContribWeek:%d,
+                                OffTime:%d
+                                '''\
+                                %(
+                                self.PlayerID,
+                                self.NameLen,
+                                self.Name,
+                                self.JoinTime,
+                                self.FmLV,
+                                self.LV,
+                                self.Job,
+                                self.RealmLV,
+                                self.Face,
+                                self.FacePic,
+                                self.FightPower,
+                                self.FightPowerEx,
+                                self.ServerID,
+                                self.ContribTotal,
+                                self.ContribWeek,
+                                self.OffTime
+                                )
+        return DumpString
+
+
+class  tagMCRoleFamilyInfo(Structure):
+    Head = tagHead()
+    FamilyID = 0    #(DWORD FamilyID)
+    FamilyName = ""    #(char FamilyName[33])//家族名称
+    FamilyLV = 0    #(BYTE FamilyLV)//家族等级
+    FamilyLVExp = 0    #(DWORD FamilyLVExp)//家族等级经验
+    JoinReview = 0    #(BYTE JoinReview)//成员加入是否需要审核,默认0自动加入
+    JoinLVMin = 0    #(WORD JoinLVMin)//限制最低可加入的玩家等级
+    ServerID = 0    #(DWORD ServerID)//区服ID,创建时以族长的区服ID赋值
+    EmblemID = 0    #(DWORD EmblemID)//徽章ID
+    FightPower = 0    #(DWORD FightPower)//总战力,求余亿部分
+    FightPowerEx = 0    #(DWORD FightPowerEx)//总战力,整除亿部分
+    BroadcastLen = 0    #(WORD BroadcastLen)//公告
+    Broadcast = ""    #(String Broadcast)//size = BroadcastLen
+    LeaderID = 0    #(DWORD LeaderID)//族长玩家ID
+    MemberCount = 0    #(BYTE MemberCount)//人数
+    MemberList = list()    #(vector<tagMCRoleFamilyMember> MemberList)//size = MemberCount
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA5
+        self.Head.SubCmd = 0x20
+        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.ReadBYTE(_lpData, _pos)
+        self.FamilyLVExp,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.JoinReview,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.JoinLVMin,_pos = CommFunc.ReadWORD(_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.BroadcastLen,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.Broadcast,_pos = CommFunc.ReadString(_lpData, _pos,self.BroadcastLen)
+        self.LeaderID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.MemberCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.MemberCount):
+            temMemberList = tagMCRoleFamilyMember()
+            _pos = temMemberList.ReadData(_lpData, _pos)
+            self.MemberList.append(temMemberList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA5
+        self.Head.SubCmd = 0x20
+        self.FamilyID = 0
+        self.FamilyName = ""
+        self.FamilyLV = 0
+        self.FamilyLVExp = 0
+        self.JoinReview = 0
+        self.JoinLVMin = 0
+        self.ServerID = 0
+        self.EmblemID = 0
+        self.FightPower = 0
+        self.FightPowerEx = 0
+        self.BroadcastLen = 0
+        self.Broadcast = ""
+        self.LeaderID = 0
+        self.MemberCount = 0
+        self.MemberList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 4
+        length += 33
+        length += 1
+        length += 4
+        length += 1
+        length += 2
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 2
+        length += len(self.Broadcast)
+        length += 4
+        length += 1
+        for i in range(self.MemberCount):
+            length += self.MemberList[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.WriteString(data, 33, self.FamilyName)
+        data = CommFunc.WriteBYTE(data, self.FamilyLV)
+        data = CommFunc.WriteDWORD(data, self.FamilyLVExp)
+        data = CommFunc.WriteBYTE(data, self.JoinReview)
+        data = CommFunc.WriteWORD(data, self.JoinLVMin)
+        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.WriteWORD(data, self.BroadcastLen)
+        data = CommFunc.WriteString(data, self.BroadcastLen, self.Broadcast)
+        data = CommFunc.WriteDWORD(data, self.LeaderID)
+        data = CommFunc.WriteBYTE(data, self.MemberCount)
+        for i in range(self.MemberCount):
+            data = CommFunc.WriteString(data, self.MemberList[i].GetLength(), self.MemberList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                FamilyID:%d,
+                                FamilyName:%s,
+                                FamilyLV:%d,
+                                FamilyLVExp:%d,
+                                JoinReview:%d,
+                                JoinLVMin:%d,
+                                ServerID:%d,
+                                EmblemID:%d,
+                                FightPower:%d,
+                                FightPowerEx:%d,
+                                BroadcastLen:%d,
+                                Broadcast:%s,
+                                LeaderID:%d,
+                                MemberCount:%d,
+                                MemberList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.FamilyID,
+                                self.FamilyName,
+                                self.FamilyLV,
+                                self.FamilyLVExp,
+                                self.JoinReview,
+                                self.JoinLVMin,
+                                self.ServerID,
+                                self.EmblemID,
+                                self.FightPower,
+                                self.FightPowerEx,
+                                self.BroadcastLen,
+                                self.Broadcast,
+                                self.LeaderID,
+                                self.MemberCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCRoleFamilyInfo=tagMCRoleFamilyInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCRoleFamilyInfo.Head.Cmd,m_NAtagMCRoleFamilyInfo.Head.SubCmd))] = m_NAtagMCRoleFamilyInfo
+
+
+#------------------------------------------------------
 # A6 05 VIP礼包购买记录 #tagMCVIPAwardMsg
 
 class  tagMCVIPAwardMsg(Structure):

--
Gitblit v1.8.0