From 84ede803777ff10b5cbe93b1ec0168af08f55d5e Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 13 一月 2021 18:11:26 +0800
Subject: [PATCH] 8677 【BT】【后端】跨服冲榜活动; 新增跨服活动时间管理模块、跨服榜单;跨服邮件;跨服广播优化;相关GM命令、后台工具;

---
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py |  669 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 669 insertions(+), 0 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 054a382..f873f17 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -5067,6 +5067,70 @@
 
 
 #------------------------------------------------------
+# AC 12 跨服运营活动结束 # tagGCCrossActEnd
+
+class  tagGCCrossActEnd(Structure):
+    Head = tagHead()
+    ActNameLen = 0    #(BYTE ActNameLen)
+    ActName = ""    #(String ActName)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAC
+        self.Head.SubCmd = 0x12
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.ActNameLen,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.ActName,_pos = CommFunc.ReadString(_lpData, _pos,self.ActNameLen)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAC
+        self.Head.SubCmd = 0x12
+        self.ActNameLen = 0
+        self.ActName = ""
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += len(self.ActName)
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.ActNameLen)
+        data = CommFunc.WriteString(data, self.ActNameLen, self.ActName)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ActNameLen:%d,
+                                ActName:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ActNameLen,
+                                self.ActName
+                                )
+        return DumpString
+
+
+m_NAtagGCCrossActEnd=tagGCCrossActEnd()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCCrossActEnd.Head.Cmd,m_NAtagGCCrossActEnd.Head.SubCmd))] = m_NAtagGCCrossActEnd
+
+
+#------------------------------------------------------
 # AC 09 仙界盛典活动信息 #tagGCFairyCeremonyInfo
 
 class  tagGCFairyCeremonyInfo(Structure):
@@ -11037,6 +11101,190 @@
 
 m_NAtagGCTeamMemFuncDataList=tagGCTeamMemFuncDataList()
 ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCTeamMemFuncDataList.Head.Cmd,m_NAtagGCTeamMemFuncDataList.Head.SubCmd))] = m_NAtagGCTeamMemFuncDataList
+
+
+#------------------------------------------------------
+# C0 07 跨服排行榜信息 #tagGCCrossBillboardInfo
+
+class  tagGCCrossBillboardData(Structure):
+    ID = 0    #(DWORD ID)
+    Name1 = ""    #(char Name1[33])//名字1,用来显示排序对象名字 
+    Name2 = ""    #(char Name2[33])//名字2
+    Type2 = 0    #(BYTE Type2)//附加类型,用来表示排序对象的类型,比如,玩家所属职业门派,宠物类型等
+    Value1 = 0    #(DWORD Value1)//自定义值1
+    Value2 = 0    #(DWORD Value2)//自定义值2
+    CmpValue = 0    #(DWORD CmpValue)// 比较权值
+    CmpValue2 = 0    #(DWORD CmpValue2)// 比较权值
+    CmpValue3 = 0    #(DWORD CmpValue3)// 比较权值
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.ID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Name1,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.Name2,_pos = CommFunc.ReadString(_lpData, _pos,33)
+        self.Type2,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.Value1,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.Value2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CmpValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CmpValue2,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.CmpValue3,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        return _pos
+
+    def Clear(self):
+        self.ID = 0
+        self.Name1 = ""
+        self.Name2 = ""
+        self.Type2 = 0
+        self.Value1 = 0
+        self.Value2 = 0
+        self.CmpValue = 0
+        self.CmpValue2 = 0
+        self.CmpValue3 = 0
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 4
+        length += 33
+        length += 33
+        length += 1
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+        length += 4
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteDWORD(data, self.ID)
+        data = CommFunc.WriteString(data, 33, self.Name1)
+        data = CommFunc.WriteString(data, 33, self.Name2)
+        data = CommFunc.WriteBYTE(data, self.Type2)
+        data = CommFunc.WriteDWORD(data, self.Value1)
+        data = CommFunc.WriteDWORD(data, self.Value2)
+        data = CommFunc.WriteDWORD(data, self.CmpValue)
+        data = CommFunc.WriteDWORD(data, self.CmpValue2)
+        data = CommFunc.WriteDWORD(data, self.CmpValue3)
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                ID:%d,
+                                Name1:%s,
+                                Name2:%s,
+                                Type2:%d,
+                                Value1:%d,
+                                Value2:%d,
+                                CmpValue:%d,
+                                CmpValue2:%d,
+                                CmpValue3:%d
+                                '''\
+                                %(
+                                self.ID,
+                                self.Name1,
+                                self.Name2,
+                                self.Type2,
+                                self.Value1,
+                                self.Value2,
+                                self.CmpValue,
+                                self.CmpValue2,
+                                self.CmpValue3
+                                )
+        return DumpString
+
+
+class  tagGCCrossBillboardInfo(Structure):
+    Head = tagHead()
+    Type = 0    #(BYTE Type)//榜单类型
+    GroupValue1 = 0    #(BYTE GroupValue1)// 分组值1
+    GroupValue2 = 0    #(BYTE GroupValue2)// 分组值2,与分组值1组合归为同组榜单数据
+    BillboardCount = 0    #(BYTE BillboardCount)
+    CrossBillboardDataList = list()    #(vector<tagGCCrossBillboardData> CrossBillboardDataList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x07
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.Type,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.GroupValue1,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.GroupValue2,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.BillboardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.BillboardCount):
+            temCrossBillboardDataList = tagGCCrossBillboardData()
+            _pos = temCrossBillboardDataList.ReadData(_lpData, _pos)
+            self.CrossBillboardDataList.append(temCrossBillboardDataList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xC0
+        self.Head.SubCmd = 0x07
+        self.Type = 0
+        self.GroupValue1 = 0
+        self.GroupValue2 = 0
+        self.BillboardCount = 0
+        self.CrossBillboardDataList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 1
+        length += 1
+        length += 1
+        for i in range(self.BillboardCount):
+            length += self.CrossBillboardDataList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.Type)
+        data = CommFunc.WriteBYTE(data, self.GroupValue1)
+        data = CommFunc.WriteBYTE(data, self.GroupValue2)
+        data = CommFunc.WriteBYTE(data, self.BillboardCount)
+        for i in range(self.BillboardCount):
+            data = CommFunc.WriteString(data, self.CrossBillboardDataList[i].GetLength(), self.CrossBillboardDataList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                Type:%d,
+                                GroupValue1:%d,
+                                GroupValue2:%d,
+                                BillboardCount:%d,
+                                CrossBillboardDataList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.Type,
+                                self.GroupValue1,
+                                self.GroupValue2,
+                                self.BillboardCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagGCCrossBillboardInfo=tagGCCrossBillboardInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCCrossBillboardInfo.Head.Cmd,m_NAtagGCCrossBillboardInfo.Head.SubCmd))] = m_NAtagGCCrossBillboardInfo
 
 
 #------------------------------------------------------
@@ -25809,6 +26057,427 @@
 
 
 #------------------------------------------------------
+# AA 32 跨服充值排行活动信息 #tagMCCACTGBillboardInfo
+
+class  tagMCCACTGBillboardAwardItem(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(tagMCCACTGBillboardAwardItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 32 跨服充值排行活动信息 //tagMCCACTGBillboardInfo:
+                                ItemID:%d,
+                                ItemCount:%d,
+                                IsBind:%d
+                                '''\
+                                %(
+                                self.ItemID,
+                                self.ItemCount,
+                                self.IsBind
+                                )
+        return DumpString
+
+
+class  tagMCCACTGBillboardDabiao(Structure):
+    AwardIndex = 0    #(BYTE AwardIndex)// 奖励索引 0~31
+    NeedRMB = 0    #(DWORD NeedRMB)// 所需充值RMB
+    AwardItemCount = 0    #(BYTE AwardItemCount)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCCACTGBillboardAwardItem> AwardItemList)// 奖励物品信息
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.AwardIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.NeedRMB,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.AwardItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.AwardItemCount):
+            temAwardItemList = tagMCCACTGBillboardAwardItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.AwardIndex = 0
+        self.NeedRMB = 0
+        self.AwardItemCount = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 1
+        length += 4
+        length += 1
+        for i in range(self.AwardItemCount):
+            length += self.AwardItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteBYTE(data, self.AwardIndex)
+        data = CommFunc.WriteDWORD(data, self.NeedRMB)
+        data = CommFunc.WriteBYTE(data, self.AwardItemCount)
+        for i in range(self.AwardItemCount):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                AwardIndex:%d,
+                                NeedRMB:%d,
+                                AwardItemCount:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.AwardIndex,
+                                self.NeedRMB,
+                                self.AwardItemCount,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCCACTGBillboardOrder(Structure):
+    OrderA = 0    #(BYTE OrderA)// 名次A
+    OrderB = 0    #(BYTE OrderB)// 至名次B
+    NeedRMB = 0    #(DWORD NeedRMB)// 所需充值RMB,未达标的该名次空,排名后面的玩家向下顺延
+    AwardItemCount = 0    #(BYTE AwardItemCount)// 奖励物品数
+    AwardItemList = list()    #(vector<tagMCCACTGBillboardAwardItem> AwardItemList)// 奖励物品信息
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.OrderA,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.OrderB,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.NeedRMB,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.AwardItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.AwardItemCount):
+            temAwardItemList = tagMCCACTGBillboardAwardItem()
+            _pos = temAwardItemList.ReadData(_lpData, _pos)
+            self.AwardItemList.append(temAwardItemList)
+        return _pos
+
+    def Clear(self):
+        self.OrderA = 0
+        self.OrderB = 0
+        self.NeedRMB = 0
+        self.AwardItemCount = 0
+        self.AwardItemList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 1
+        length += 1
+        length += 4
+        length += 1
+        for i in range(self.AwardItemCount):
+            length += self.AwardItemList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteBYTE(data, self.OrderA)
+        data = CommFunc.WriteBYTE(data, self.OrderB)
+        data = CommFunc.WriteDWORD(data, self.NeedRMB)
+        data = CommFunc.WriteBYTE(data, self.AwardItemCount)
+        for i in range(self.AwardItemCount):
+            data = CommFunc.WriteString(data, self.AwardItemList[i].GetLength(), self.AwardItemList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                OrderA:%d,
+                                OrderB:%d,
+                                NeedRMB:%d,
+                                AwardItemCount:%d,
+                                AwardItemList:%s
+                                '''\
+                                %(
+                                self.OrderA,
+                                self.OrderB,
+                                self.NeedRMB,
+                                self.AwardItemCount,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCCACTGBillboardTempInfo(Structure):
+    TemplateID = 0    #(BYTE TemplateID)// 活动模板ID
+    DabiaoAwardCount = 0    #(BYTE DabiaoAwardCount)// 达标奖励档数
+    DabiaoAwardInfo = list()    #(vector<tagMCCACTGBillboardDabiao> DabiaoAwardInfo)// 达标奖励信息
+    OrderAwardCount = 0    #(BYTE OrderAwardCount)// 排行奖励档数
+    OrderAwardInfo = list()    #(vector<tagMCCACTGBillboardOrder> OrderAwardInfo)// 排行奖励信息
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        self.TemplateID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.DabiaoAwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.DabiaoAwardCount):
+            temDabiaoAwardInfo = tagMCCACTGBillboardDabiao()
+            _pos = temDabiaoAwardInfo.ReadData(_lpData, _pos)
+            self.DabiaoAwardInfo.append(temDabiaoAwardInfo)
+        self.OrderAwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.OrderAwardCount):
+            temOrderAwardInfo = tagMCCACTGBillboardOrder()
+            _pos = temOrderAwardInfo.ReadData(_lpData, _pos)
+            self.OrderAwardInfo.append(temOrderAwardInfo)
+        return _pos
+
+    def Clear(self):
+        self.TemplateID = 0
+        self.DabiaoAwardCount = 0
+        self.DabiaoAwardInfo = list()
+        self.OrderAwardCount = 0
+        self.OrderAwardInfo = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += 1
+        length += 1
+        for i in range(self.DabiaoAwardCount):
+            length += self.DabiaoAwardInfo[i].GetLength()
+        length += 1
+        for i in range(self.OrderAwardCount):
+            length += self.OrderAwardInfo[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteBYTE(data, self.TemplateID)
+        data = CommFunc.WriteBYTE(data, self.DabiaoAwardCount)
+        for i in range(self.DabiaoAwardCount):
+            data = CommFunc.WriteString(data, self.DabiaoAwardInfo[i].GetLength(), self.DabiaoAwardInfo[i].GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.OrderAwardCount)
+        for i in range(self.OrderAwardCount):
+            data = CommFunc.WriteString(data, self.OrderAwardInfo[i].GetLength(), self.OrderAwardInfo[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                TemplateID:%d,
+                                DabiaoAwardCount:%d,
+                                DabiaoAwardInfo:%s,
+                                OrderAwardCount:%d,
+                                OrderAwardInfo:%s
+                                '''\
+                                %(
+                                self.TemplateID,
+                                self.DabiaoAwardCount,
+                                "...",
+                                self.OrderAwardCount,
+                                "..."
+                                )
+        return DumpString
+
+
+class  tagMCCACTGBillboardInfo(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
+    TemplateID = 0    #(BYTE TemplateID)// 当前活动模板ID
+    TemplateCount = 0    #(BYTE TemplateCount)
+    TempInfo = list()    #(vector<tagMCCACTGBillboardTempInfo> TempInfo)// 模板信息
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x32
+        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.TemplateID,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TemplateCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.TemplateCount):
+            temTempInfo = tagMCCACTGBillboardTempInfo()
+            _pos = temTempInfo.ReadData(_lpData, _pos)
+            self.TempInfo.append(temTempInfo)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x32
+        self.ServerInfoLen = 0
+        self.ServerIDRangeInfo = ""
+        self.GroupValue1 = 0
+        self.StartDate = ""
+        self.EndtDate = ""
+        self.TemplateID = 0
+        self.TemplateCount = 0
+        self.TempInfo = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += len(self.ServerIDRangeInfo)
+        length += 1
+        length += 10
+        length += 10
+        length += 1
+        length += 1
+        for i in range(self.TemplateCount):
+            length += self.TempInfo[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.WriteBYTE(data, self.TemplateID)
+        data = CommFunc.WriteBYTE(data, self.TemplateCount)
+        for i in range(self.TemplateCount):
+            data = CommFunc.WriteString(data, self.TempInfo[i].GetLength(), self.TempInfo[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ServerInfoLen:%d,
+                                ServerIDRangeInfo:%s,
+                                GroupValue1:%d,
+                                StartDate:%s,
+                                EndtDate:%s,
+                                TemplateID:%d,
+                                TemplateCount:%d,
+                                TempInfo:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.ServerInfoLen,
+                                self.ServerIDRangeInfo,
+                                self.GroupValue1,
+                                self.StartDate,
+                                self.EndtDate,
+                                self.TemplateID,
+                                self.TemplateCount,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCCACTGBillboardInfo=tagMCCACTGBillboardInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCACTGBillboardInfo.Head.Cmd,m_NAtagMCCACTGBillboardInfo.Head.SubCmd))] = m_NAtagMCCACTGBillboardInfo
+
+
+#------------------------------------------------------
+# AA 33 跨服充值排行活动玩家信息 #tagMCCACTGBillboardPlayerInfo
+
+class  tagMCCACTGBillboardPlayerInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("CTGRMBTotal", c_int),    # 活动已累计充值RMB
+                  ("DabiaoAwardRecord", c_int),    # 达标奖励记录,与达标奖励索引位或运算判断是否已领取
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xAA
+        self.SubCmd = 0x33
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xAA
+        self.SubCmd = 0x33
+        self.CTGRMBTotal = 0
+        self.DabiaoAwardRecord = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCCACTGBillboardPlayerInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// AA 33 跨服充值排行活动玩家信息 //tagMCCACTGBillboardPlayerInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                CTGRMBTotal:%d,
+                                DabiaoAwardRecord:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.CTGRMBTotal,
+                                self.DabiaoAwardRecord
+                                )
+        return DumpString
+
+
+m_NAtagMCCACTGBillboardPlayerInfo=tagMCCACTGBillboardPlayerInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCACTGBillboardPlayerInfo.Cmd,m_NAtagMCCACTGBillboardPlayerInfo.SubCmd))] = m_NAtagMCCACTGBillboardPlayerInfo
+
+
+#------------------------------------------------------
 # AA 09 消费返利活动信息 #tagMCCostRebateInfo
 
 class  tagMCCostRebateAwardItem(Structure):

--
Gitblit v1.8.0