hxp
2022-10-11 c0c4a0880e9a0fc5d1482c1260e02ddd1b554bc9
9719 【越南】【BT7】【主干】跨服全民充值

# Conflicts:
# ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
# ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
13个文件已修改
3个文件已添加
1345 ■■■■■ 已修改文件
PySysDB/PySysDBG.h 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 274 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActAllRecharge.py 405 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 274 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossActAllRecharge.py 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossActAllRecharge.py 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBG.h
@@ -984,6 +984,33 @@
    list        SuperItemWeightInfo;    //大奖随机权重信息  [[权重,物品ID,个数,是否拍品,价值货币类型,货币值], ...]
};
//跨服全民充值时间表
struct tagCrossActAllRecharge
{
    DWORD        _CfgID;    //配置ID
    char        ActGroupName;    //活动组名(同组活动的名字需相同)
    BYTE        ZoneID;        //组内分组编号
    list        ServerIDRangeList;    //活动的账号服务器ID范围列表 [[serverIDA, serverIDB], ...]
    char        StartDate;    //开启日期
    char        EndDate;    //结束日期
    dict        NotifyInfoStart;    //全服提示信息 - 相对开始时间
    dict        NotifyInfoEnd;    //全服提示信息 - 相对结束时间
    list        NotifyInfoLoop;    //全服提示信息 - 循环广播[循环分钟, 广播key, [广播参数列表可选]]
    list        TemplateIDList;    //模板ID列表
};
//跨服全民充值模板表
struct tagCrossActAllRechargeTemplate
{
    DWORD        _TemplateID;    //模板ID
    DWORD        CTGNeed;    //全民充值RMB
    WORD        NeedPlayerCount;    //所需充值达到该档玩家数
    BYTE        AwardIndex;    //奖励记录索引,从0开始,同个模板不可重复,不可变更
    list        AwardItemList;    //奖励物品列表[[物品ID,个数,是否拍品], ...]
};
//跨服充值排行活动时间表
struct tagCrossActCTGBillboard
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -5263,6 +5263,224 @@
#------------------------------------------------------
# AC 13 跨服全民充值活动信息 #tagGCCrossActAllRechargeInfo
class  tagGCCrossActAllRechargeItem(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(tagGCCrossActAllRechargeItem)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// AC 13 跨服全民充值活动信息 //tagGCCrossActAllRechargeInfo:
                                ItemID:%d,
                                ItemCount:%d,
                                IsBind:%d
                                '''\
                                %(
                                self.ItemID,
                                self.ItemCount,
                                self.IsBind
                                )
        return DumpString
class  tagGCCrossActAllRechargeAward(Structure):
    AwardIndex = 0    #(BYTE AwardIndex)// 奖励索引 0~31
    NeedRMB = 0    #(DWORD NeedRMB)// 所需全民充值RMB
    NeedPlayerCount = 0    #(WORD NeedPlayerCount)// 所需充值达到该档玩家数
    NowPlayerCount = 0    #(WORD NowPlayerCount)// 当前充值达到该档玩家数
    AwardItemCount = 0    #(BYTE AwardItemCount)// 奖励物品数
    AwardItemList = list()    #(vector<tagGCCrossActAllRechargeItem> 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.NeedPlayerCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.NowPlayerCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.AwardItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.AwardItemCount):
            temAwardItemList = tagGCCrossActAllRechargeItem()
            _pos = temAwardItemList.ReadData(_lpData, _pos)
            self.AwardItemList.append(temAwardItemList)
        return _pos
    def Clear(self):
        self.AwardIndex = 0
        self.NeedRMB = 0
        self.NeedPlayerCount = 0
        self.NowPlayerCount = 0
        self.AwardItemCount = 0
        self.AwardItemList = list()
        return
    def GetLength(self):
        length = 0
        length += 1
        length += 4
        length += 2
        length += 2
        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.WriteWORD(data, self.NeedPlayerCount)
        data = CommFunc.WriteWORD(data, self.NowPlayerCount)
        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,
                                NeedPlayerCount:%d,
                                NowPlayerCount:%d,
                                AwardItemCount:%d,
                                AwardItemList:%s
                                '''\
                                %(
                                self.AwardIndex,
                                self.NeedRMB,
                                self.NeedPlayerCount,
                                self.NowPlayerCount,
                                self.AwardItemCount,
                                "..."
                                )
        return DumpString
class  tagGCCrossActAllRechargeInfo(Structure):
    Head = tagHead()
    ServerInfoLen = 0    #(BYTE ServerInfoLen)
    ServerIDRangeInfo = ""    #(String ServerIDRangeInfo)//开放该活动的服务器ID范围列表,json格式 [[IDA, IDB], ...], [] 为全服
    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
    AwardCount = 0    #(BYTE AwardCount)
    AwardList = list()    #(vector<tagGCCrossActAllRechargeAward> AwardList)// 奖励档次信息
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xAC
        self.Head.SubCmd = 0x13
        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.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
        self.AwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.AwardCount):
            temAwardList = tagGCCrossActAllRechargeAward()
            _pos = temAwardList.ReadData(_lpData, _pos)
            self.AwardList.append(temAwardList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xAC
        self.Head.SubCmd = 0x13
        self.ServerInfoLen = 0
        self.ServerIDRangeInfo = ""
        self.StartDate = ""
        self.EndtDate = ""
        self.AwardCount = 0
        self.AwardList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += len(self.ServerIDRangeInfo)
        length += 10
        length += 10
        length += 1
        for i in range(self.AwardCount):
            length += self.AwardList[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.WriteString(data, 10, self.StartDate)
        data = CommFunc.WriteString(data, 10, self.EndtDate)
        data = CommFunc.WriteBYTE(data, self.AwardCount)
        for i in range(self.AwardCount):
            data = CommFunc.WriteString(data, self.AwardList[i].GetLength(), self.AwardList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                ServerInfoLen:%d,
                                ServerIDRangeInfo:%s,
                                StartDate:%s,
                                EndtDate:%s,
                                AwardCount:%d,
                                AwardList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.ServerInfoLen,
                                self.ServerIDRangeInfo,
                                self.StartDate,
                                self.EndtDate,
                                self.AwardCount,
                                "..."
                                )
        return DumpString
m_NAtagGCCrossActAllRechargeInfo=tagGCCrossActAllRechargeInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCCrossActAllRechargeInfo.Head.Cmd,m_NAtagGCCrossActAllRechargeInfo.Head.SubCmd))] = m_NAtagGCCrossActAllRechargeInfo
#------------------------------------------------------
# AC 12 跨服运营活动结束 # tagGCCrossActEnd
class  tagGCCrossActEnd(Structure):
@@ -32802,6 +33020,62 @@
#------------------------------------------------------
# AA 34 跨服全民充值活动玩家信息 #tagMCCrossActAllRechargePlayerInfo
class  tagMCCrossActAllRechargePlayerInfo(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("CTGRMBTotal", c_int),    # 活动已累计充值RMB
                  ("AwardRecord", c_int),    # 奖励记录,根据奖励索引位或运算判断是否已领取
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xAA
        self.SubCmd = 0x34
        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 = 0x34
        self.CTGRMBTotal = 0
        self.AwardRecord = 0
        return
    def GetLength(self):
        return sizeof(tagMCCrossActAllRechargePlayerInfo)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// AA 34 跨服全民充值活动玩家信息 //tagMCCrossActAllRechargePlayerInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                CTGRMBTotal:%d,
                                AwardRecord:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.CTGRMBTotal,
                                self.AwardRecord
                                )
        return DumpString
m_NAtagMCCrossActAllRechargePlayerInfo=tagMCCrossActAllRechargePlayerInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCrossActAllRechargePlayerInfo.Cmd,m_NAtagMCCrossActAllRechargePlayerInfo.SubCmd))] = m_NAtagMCCrossActAllRechargePlayerInfo
#------------------------------------------------------
# AA 25 每日礼包活动信息 #tagMCDailyGiftbagInfo
class  tagMCDailyGiftbagItem(Structure):
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActAllRecharge.py
New file
@@ -0,0 +1,405 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package CrossActAllRecharge
#
# @todo:跨服全民充值
# @author hxp
# @date 2022-10-11
# @version 1.0
#
# 详细描述: 跨服全民充值
#
#-------------------------------------------------------------------------------
#"""Version = 2022-10-11 19:00"""
#-------------------------------------------------------------------------------
import PyGameData
import ShareDefine
import CrossRealmMsg
import DataRecordPack
import CrossActionControl
import ChPyNetSendPack
import NetPackCommon
import IpyGameDataPY
import GameWorld
Def_RecType_CrossActAllRecharge = ShareDefine.Def_UniversalGameRecType_CrossActAllRecharge
'''
跨服全民充值活动信息
ShareDefine.Def_UniversalGameRecType_CrossActAllRecharge
value1:zoneID            分区ID
value2:playerID         玩家ID
value3:totalRMB        总充值
value4:cfgID            cfgID
StrValue3:                账号
'''
def GetRecZoneID(recData): return recData.GetValue1()
def SetRecZoneID(recData, zoneID): return recData.SetValue1(zoneID)
def GetRecPlayerID(recData): return recData.GetValue2()
def SetRecPlayerID(recData, playerID): return recData.SetValue2(playerID)
def GetRecTotalRecharge(recData): return recData.GetValue3()
def SetRecTotalRecharge(recData, totalRMB): return recData.SetValue3(totalRMB)
def GetRecCfgID(recData): return recData.GetValue4()
def SetRecCfgID(recData, cfgID): return recData.SetValue4(cfgID)
def GetRecAccID(recData): return recData.GetStrValue3()
def SetRecAccID(recData, accID): return recData.SetStrValue3(accID)
def OnPlayerLogin(curPlayer):
    if GameWorld.IsCrossServer():
        return
    Sync_CrossActAllRechargeInfo(curPlayer)
    return
def Sync_AllRechargeDataToClientServer(serverGroupID=0):
    GameWorld.Log("同步给子服对应的跨服全民充值信息: syncServerGroupID=%s" % (serverGroupID))
    allRechargeInfo = {} # 全民充值信息
    universalRecMgr = GameWorld.GetUniversalRecMgr()
    recDataList = universalRecMgr.GetTypeList(Def_RecType_CrossActAllRecharge)
    for index in range(recDataList.Count()):
        recData = recDataList.At(index)
        cfgID = GetRecCfgID(recData)
        zoneID = GetRecZoneID(recData)
        playerID = GetRecPlayerID(recData)
        totalRecharge = GetRecTotalRecharge(recData)
        key = (cfgID, zoneID)
        if key not in allRechargeInfo:
            allRechargeInfo[key] = {}
        zoneInfo = allRechargeInfo[key]
        zoneInfo[playerID] = totalRecharge
    dataMsg = {"syncType":"All", "allRechargeInfo":allRechargeInfo}
    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ActAllRechargeInfo, dataMsg)
    return
def OnActIDChange(ipyData, state):
    ## 活动状态变更
    cfgID = ipyData.GetCfgID()
    zoneID = ipyData.GetZoneID()
    if not state:
        actDataInfo = {}
        universalRecMgr = GameWorld.GetUniversalRecMgr()
        recDataList = universalRecMgr.GetTypeList(Def_RecType_CrossActAllRecharge)
        for index in range(recDataList.Count()):
            recData = recDataList.At(index)
            recCfgID = GetRecCfgID(recData)
            recZoneID = GetRecZoneID(recData)
            if recCfgID != cfgID or recZoneID != zoneID:
                continue
            playerID = GetRecPlayerID(recData)
            totalRecharge = GetRecTotalRecharge(recData)
            accID = GetRecAccID(recData)
            key = (recCfgID, recZoneID)
            if key not in actDataInfo:
                actDataInfo[key] = []
            zoneDataList = actDataInfo[key]
            zoneDataList.append([totalRecharge, playerID, accID])
        # 输出流向
        for key, zoneDataList in actDataInfo.items():
            recCfgID, recZoneID = key
            zoneDataList.sort(reverse=True)
            GameWorld.Log("跨服全民充值活动结束! CfgID=%s,ZoneID=%s,DataCount=%s" % (recCfgID, recZoneID, len(zoneDataList)))
            for dataInfo in zoneDataList:
                totalRecharge, playerID, accID = dataInfo
                drDataDict = {"CfgID":recCfgID, "ZoneID":recZoneID, "TotalRecharge":totalRecharge, "PlayerID":playerID, "AccID":accID}
                DataRecordPack.SendEventPack("CrossActAllRecharge", drDataDict)
        return
    universalRecMgr = GameWorld.GetUniversalRecMgr()
    recDataList = universalRecMgr.GetTypeList(Def_RecType_CrossActAllRecharge)
    delDataCount = 0
    for index in range(recDataList.Count())[::-1]:
        recData = recDataList.At(index)
        recZoneID = GetRecZoneID(recData)
        if recZoneID != zoneID:
            continue
        recDataList.Delete(index)
        delDataCount += 1
    GameWorld.Log("重置跨服全民充值活动信息! cfgID=%s,ZoneID=%s,DataCount=%s" % (cfgID, zoneID, delDataCount))
    dataMsg = {"syncType":"New", "cfgID":cfgID, "zoneID":zoneID}
    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ActAllRechargeInfo, dataMsg)
    return
def ClientServerMsg_ActAllRechargeValue(serverGroupID, msgData):
    ## 收到子服同步信息  - 玩家充值额度
    cfgID = msgData["cfgID"]
    zoneID = msgData["zoneID"]
    playerID = msgData["playerID"]
    totalRMB = msgData["totalRMB"]
    accID = msgData["accID"]
    crossActInfoDict = CrossActionControl.GetCrossActInfoDict()
    curActInfoDict = crossActInfoDict.get(ShareDefine.CrossActName_AllRecharge, {})
    if cfgID not in curActInfoDict:
        return
    actInfo = curActInfoDict[cfgID]
    if not actInfo[ShareDefine.ActKey_State]:
        return
    ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {})
    if not ipyDataDict:
        return
    ipyZoneID = ipyDataDict.get("ZoneID", 0)
    if zoneID != ipyZoneID:
        return
    findRec = None
    universalRecMgr = GameWorld.GetUniversalRecMgr()
    recDataList = universalRecMgr.GetTypeList(Def_RecType_CrossActAllRecharge)
    for index in range(recDataList.Count()):
        recData = recDataList.At(index)
        recCfgID = GetRecCfgID(recData)
        recZoneID = GetRecZoneID(recData)
        recPlayerID = GetRecPlayerID(recData)
        if recCfgID != cfgID or recZoneID != zoneID or recPlayerID != playerID:
            continue
        findRec = recData
        totalRMBBefore = GetRecTotalRecharge(recData)
        SetRecTotalRecharge(recData, totalRMB)
        GameWorld.Log("跨服全民充值玩家充值额度更新: cfgID=%s,zoneID=%s,totalRMBBefore=%s,totalRMB=%s,accID=%s"
                      % (cfgID, zoneID, totalRMBBefore, totalRMB, accID), playerID)
        break
    if not findRec:
        recData = recDataList.AddRec()
        SetRecZoneID(recData, zoneID)
        SetRecPlayerID(recData, playerID)
        SetRecTotalRecharge(recData, totalRMB)
        SetRecCfgID(recData, cfgID)
        SetRecAccID(recData, accID)
        GameWorld.Log("跨服全民充值玩家充值额度新增: cfgID=%s,zoneID=%s,totalRMB=%s,accID=%s"
                      % (cfgID, zoneID, totalRMB, accID), playerID)
    dataMsg = {"syncType":"PlayerAllRechargeValue", "cfgID":cfgID, "zoneID":zoneID, "playerID":playerID,
               "totalRMB":totalRMB, "accID":accID}
    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ActAllRechargeInfo, dataMsg)
    return
def CrossServerMsg_ActAllRechargeInfo(msgData):
    syncType = msgData.get("syncType")
    # 所有数据同步
    if syncType == "All":
        allRechargeInfo = msgData["allRechargeInfo"]
        for key, zoneInfo in allRechargeInfo.items():
            PyGameData.g_crossActAllRechargeInfo[key] = zoneInfo
            Sync_CrossActAllRechargeInfo(syncKey=key)
        return
    # 新活动
    if syncType == "New":
        cfgID = msgData["cfgID"]
        zoneID = msgData["zoneID"]
        for key in PyGameData.g_crossActAllRechargeInfo.keys():
            if zoneID == key[1]:
                PyGameData.g_crossActAllRechargeInfo.pop(key)
        newKey = (cfgID, zoneID)
        PyGameData.g_crossActAllRechargeInfo[newKey] = {}
        Sync_CrossActAllRechargeInfo(syncKey=newKey)
        return
    # 玩家充值总额更新
    if syncType == "PlayerAllRechargeValue":
        cfgID = msgData["cfgID"]
        zoneID = msgData["zoneID"]
        playerID = msgData["playerID"]
        totalRMB = msgData["totalRMB"]
        #accID = msgData["accID"]
        key = (cfgID, zoneID)
        if key not in PyGameData.g_crossActAllRechargeInfo:
            PyGameData.g_crossActAllRechargeInfo[key] = {}
        zoneInfo = PyGameData.g_crossActAllRechargeInfo[key]
        playerRMB = zoneInfo.get(playerID, 0)
        zoneInfo[playerID] = totalRMB
        actInfoDict = PyGameData.g_crossActInfoDict.get(ShareDefine.CrossActName_AllRecharge, {})
        actInfo = actInfoDict.get(cfgID, {})
        state = actInfo.get(ShareDefine.ActKey_State, 0)
        ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {})
        if not state or zoneID != ipyDataDict.get("ZoneID"):
            return
        templateID = actInfo.get(ShareDefine.ActKey_TemplateID, 0)
        ipyDataList = IpyGameDataPY.GetIpyGameDataList("CrossActAllRechargeTemplate", templateID)
        if not ipyDataList:
            return
        isSync = False
        for ipyData in ipyDataList:
            needRMB = ipyData.GetCTGNeed()
            if playerRMB < needRMB and totalRMB >= needRMB:
                isSync = True
                break
        if isSync:
            Sync_CrossActAllRechargeInfo(syncKey=key)
        return
    return
def MapServer_CrossActAllRecharge(curPlayer, msgList):
    ##
    playerID = curPlayer.GetPlayerID()
    msgType = msgList[0]
    msgData = msgList[1]
    if msgType == "AllRechargeRMB":
        cfgID, zoneID, totalRMB = msgData
        actInfo = CrossActionControl.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_AllRecharge)
        if not actInfo.get(ShareDefine.ActKey_State):
            return
        key = (cfgID, zoneID)
        zoneInfo = PyGameData.g_crossActAllRechargeInfo.get(key, {})
        playerRMB = zoneInfo.get(playerID, 0)
        if playerRMB == totalRMB:
            return
        # 同步跨服服务器
        dataMsg = {"cfgID":cfgID, "zoneID":zoneID, "playerID":playerID, "totalRMB":totalRMB, "accID":curPlayer.GetAccID()}
        CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ActAllRechargeValue, dataMsg)
    if msgType == "AllRechargeAward":
        cfgID, zoneID, awardIndex = msgData
        GameWorld.Log("跨服全民充值玩家领奖: cfgID=%s,zoneID=%s,awardIndex=%s" % (cfgID, zoneID, awardIndex), playerID)
        actInfo = CrossActionControl.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_AllRecharge)
        if not actInfo.get(ShareDefine.ActKey_State):
            return
        templateID = actInfo.get(ShareDefine.ActKey_TemplateID, 0)
        ipyDataList = IpyGameDataPY.GetIpyGameDataList("CrossActAllRechargeTemplate", templateID)
        if not ipyDataList:
            return
        zoneInfo = PyGameData.g_crossActAllRechargeInfo.get((cfgID, zoneID), {})
        for ipyData in ipyDataList:
            if awardIndex != ipyData.GetAwardIndex():
                continue
            ctgNeed = ipyData.GetCTGNeed()
            needPlayerCount = ipyData.GetNeedPlayerCount()
            nowPlayerCount = 0
            for totalRMB in zoneInfo.values():
                if totalRMB >= ctgNeed:
                    nowPlayerCount += 1
            if nowPlayerCount < needPlayerCount:
                GameWorld.Log("所需全民充值玩家数不足,无法领奖: cfgID=%s,zoneID=%s,awardIndex=%s,ctgNeed=%s,nowPlayerCount=%s < %s"
                              % (cfgID, zoneID, awardIndex, ctgNeed, nowPlayerCount, needPlayerCount), playerID)
                return
            awardItemList = ipyData.GetAwardItemList()
            sysMsg = str([msgType, awardIndex, awardItemList])
            curPlayer.MapServer_QueryPlayerResult(0, 0, "CrossActAllRecharge", sysMsg, len(sysMsg))
            return
    return
def Sync_CrossActAllRechargeInfo(curPlayer=None, syncKey=None):
    ## 通知活动信息
    if curPlayer:
        actInfo = CrossActionControl.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_AllRecharge)
        # 活动中同步活动信息
        if not actInfo.get(ShareDefine.ActKey_State):
            return
        cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
        ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {})
        if not ipyDataDict:
            return
        zoneID = ipyDataDict.get("ZoneID")
        if not cfgID or not zoneID:
            return
    elif syncKey and len(syncKey) == 2:
        cfgID, zoneID = syncKey
        actInfoDict = PyGameData.g_crossActInfoDict.get(ShareDefine.CrossActName_AllRecharge, {})
        if not actInfoDict:
            return
        actInfo = actInfoDict.get(cfgID, {})
        if not actInfo:
            return
        if not actInfo.get(ShareDefine.ActKey_State, 0):
            return
        ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {})
        if not ipyDataDict:
            return
        if not cfgID or zoneID != ipyDataDict.get("ZoneID"):
            return
    else:
        return
    templateID = actInfo.get(ShareDefine.ActKey_TemplateID, 0)
    ipyDataList = IpyGameDataPY.GetIpyGameDataList("CrossActAllRechargeTemplate", templateID)
    if not ipyDataList:
        return
    zoneInfo = PyGameData.g_crossActAllRechargeInfo.get((cfgID, zoneID), {})
    actPack = ChPyNetSendPack.tagGCCrossActAllRechargeInfo()
    actPack.ServerIDRangeInfo = str(actInfo.get(ShareDefine.ActKey_ServerIDRangeList, []))
    actPack.ServerInfoLen = len(actPack.ServerIDRangeInfo)
    actPack.StartDate = ipyDataDict.get("StartDate", "")
    actPack.EndtDate = ipyDataDict.get("EndDate", "")
    actPack.AwardList = []
    for ipyData in ipyDataList:
        award = ChPyNetSendPack.tagGCCrossActAllRechargeAward()
        award.AwardIndex = ipyData.GetAwardIndex()
        award.NeedRMB = ipyData.GetCTGNeed()
        award.NeedPlayerCount = ipyData.GetNeedPlayerCount()
        award.AwardItemList = []
        for itemID, itemCount, isAuctionItem in ipyData.GetAwardItemList():
            item = ChPyNetSendPack.tagGCCrossActAllRechargeItem()
            item.ItemID = itemID
            item.ItemCount = itemCount
            item.IsBind = isAuctionItem
            award.AwardItemList.append(item)
        award.AwardItemCount = len(award.AwardItemList)
        nowPlayerCount = 0
        for totalRMB in zoneInfo.values():
            if totalRMB >= ipyData.GetCTGNeed():
                nowPlayerCount += 1
        award.NowPlayerCount = nowPlayerCount
        actPack.AwardList.append(award)
    actPack.AwardCount = len(actPack.AwardList)
    if curPlayer:
        NetPackCommon.SendFakePack(curPlayer, actPack)
    else:
        playerManager = GameWorld.GetPlayerManager()
        for i in xrange(playerManager.GetActivePlayerCount()):
            curPlayer = playerManager.GetActivePlayerAt(i)
            if curPlayer == None or not curPlayer.GetInitOK():
                continue
            actInfo = CrossActionControl.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_AllRecharge)
            state = actInfo.get(ShareDefine.ActKey_State)
            pCfgID = actInfo.get(ShareDefine.ActKey_CfgID)
            ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {})
            pZoneID = ipyDataDict.get("ZoneID")
            if not state or pCfgID != cfgID or pZoneID != zoneID:
                continue
            NetPackCommon.SendFakePack(curPlayer, actPack)
    return
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
@@ -585,6 +585,10 @@
        if actName == ShareDefine.CrossActName_LuckyCloudBuy:
            import CrossLuckyCloudBuy
            CrossLuckyCloudBuy.OnLuckyCloudBuyReset(ipyData, state)
        elif actName == ShareDefine.CrossActName_AllRecharge:
            import CrossActAllRecharge
            CrossActAllRecharge.OnActIDChange(ipyData, state)
    return
def Sync_CrossActInfoToClientServer(serverGroupID=0):
@@ -633,6 +637,26 @@
                
    return
def GetPlayerCrossActInfo(curPlayer, actName):
    ## 获取跨服玩家对应的跨服活动信息
    actInfoDict = PyGameData.g_crossActInfoDict.get(actName, {})
    if not actInfoDict:
        return {}
    playerServerID = GameWorld.GetPlayerServerID(curPlayer)
    for actInfo in actInfoDict.values():
        if not actInfo.get(ShareDefine.ActKey_State, 0):
            continue
        if ShareDefine.ActKey_ServerIDRangeList not in actInfo:
            continue
        serverIDRangeList = actInfo[ShareDefine.ActKey_ServerIDRangeList]
        if not serverIDRangeList:
            # 全服开启
            return actInfo
        for serverIDA, serverIDB in serverIDRangeList:
            if serverIDA <= playerServerID <= serverIDB:
                return actInfo
    return {}
def SendMapServerCrossActionState():
    # 地图启动成功时通知跨服活动相关状态  - 本服地图,跨服地图不需要通知
    
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
@@ -24,6 +24,7 @@
import CrossRealmPlayer
import PlayerCompensation
import CrossActionControl
import CrossActAllRecharge
import CrossChampionship
import CrossBattlefield
import CrossBillboard
@@ -159,6 +160,9 @@
        elif msgType == ShareDefine.ClientServerMsg_ChampionshipWorship:
            CrossChampionship.ClientServerMsg_ChampionshipWorship(serverGroupID, msgData)
            
        elif msgType == ShareDefine.ClientServerMsg_ActAllRechargeValue:
            CrossActAllRecharge.ClientServerMsg_ActAllRechargeValue(serverGroupID, msgData)
        # 需要发送到地图服务器处理的
        elif msgType in [ShareDefine.ClientServerMsg_Reborn, ShareDefine.ClientServerMsg_CollectNPC]:
            MapServer_CrossServerReceiveMsg(msgType, msgData, serverGroupID)
@@ -193,6 +197,7 @@
    CrossBoss.Sync_CrossBossInitDataToClientServer(serverGroupID)
    CrossActionControl.Sync_CrossActInfoToClientServer(serverGroupID)
    CrossLuckyCloudBuy.Sync_LuckyCloudBuyDataToClientServer(tick, serverGroupID)
    CrossActAllRecharge.Sync_AllRechargeDataToClientServer(serverGroupID)
    PlayerCompensation.Sync_CrossMailPlayerIDToClientServer(serverGroupID)
    return
@@ -359,6 +364,9 @@
        elif msgType == ShareDefine.CrossServerMsg_ChampionshipDailyOfficial:
            CrossChampionship.CrossServerMsg_ChampionshipDailyOfficial(msgData)
            
        elif msgType == ShareDefine.CrossServerMsg_ActAllRechargeInfo:
            CrossActAllRecharge.CrossServerMsg_ActAllRechargeInfo(msgData)
        elif msgType == ShareDefine.CrossServerMsg_SyncBillboard:
            CrossBillboard.CrossServerMsg_SyncBillboard(msgData, tick)
            
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -800,6 +800,27 @@
                        ("list", "SuperItemWeightInfo", 0),
                        ),
                "CrossActAllRecharge":(
                        ("DWORD", "CfgID", 1),
                        ("char", "ActGroupName", 0),
                        ("BYTE", "ZoneID", 0),
                        ("list", "ServerIDRangeList", 0),
                        ("char", "StartDate", 0),
                        ("char", "EndDate", 0),
                        ("dict", "NotifyInfoStart", 0),
                        ("dict", "NotifyInfoEnd", 0),
                        ("list", "NotifyInfoLoop", 0),
                        ("list", "TemplateIDList", 0),
                        ),
                "CrossActAllRechargeTemplate":(
                        ("DWORD", "TemplateID", 1),
                        ("DWORD", "CTGNeed", 0),
                        ("WORD", "NeedPlayerCount", 0),
                        ("BYTE", "AwardIndex", 0),
                        ("list", "AwardItemList", 0),
                        ),
                "CrossActCTGBillboard":(
                        ("DWORD", "CfgID", 1),
                        ("char", "ActGroupName", 0),
@@ -2459,6 +2480,50 @@
    def GetRandAwardWeightInfo(self): return self.RandAwardWeightInfo # 每次购买随机奖励权重信息 [[权重,物品ID,个数,是否拍品], ...]
    def GetSuperItemWeightInfo(self): return self.SuperItemWeightInfo # 大奖随机权重信息  [[权重,物品ID,个数,是否拍品,价值货币类型,货币值], ...]
# 跨服全民充值时间表
class IPY_CrossActAllRecharge():
    def __init__(self):
        self.CfgID = 0
        self.ActGroupName = ""
        self.ZoneID = 0
        self.ServerIDRangeList = []
        self.StartDate = ""
        self.EndDate = ""
        self.NotifyInfoStart = {}
        self.NotifyInfoEnd = {}
        self.NotifyInfoLoop = []
        self.TemplateIDList = []
        return
    def GetCfgID(self): return self.CfgID # 配置ID
    def GetActGroupName(self): return self.ActGroupName # 活动组名(同组活动的名字需相同)
    def GetZoneID(self): return self.ZoneID # 组内分组编号
    def GetServerIDRangeList(self): return self.ServerIDRangeList # 活动的账号服务器ID范围列表 [[serverIDA, serverIDB], ...]
    def GetStartDate(self): return self.StartDate # 开启日期
    def GetEndDate(self): return self.EndDate # 结束日期
    def GetNotifyInfoStart(self): return self.NotifyInfoStart # 全服提示信息 - 相对开始时间
    def GetNotifyInfoEnd(self): return self.NotifyInfoEnd # 全服提示信息 - 相对结束时间
    def GetNotifyInfoLoop(self): return self.NotifyInfoLoop # 全服提示信息 - 循环广播[循环分钟, 广播key, [广播参数列表可选]]
    def GetTemplateIDList(self): return self.TemplateIDList # 模板ID列表
# 跨服全民充值模板表
class IPY_CrossActAllRechargeTemplate():
    def __init__(self):
        self.TemplateID = 0
        self.CTGNeed = 0
        self.NeedPlayerCount = 0
        self.AwardIndex = 0
        self.AwardItemList = []
        return
    def GetTemplateID(self): return self.TemplateID # 模板ID
    def GetCTGNeed(self): return self.CTGNeed # 全民充值RMB
    def GetNeedPlayerCount(self): return self.NeedPlayerCount # 所需充值达到该档玩家数
    def GetAwardIndex(self): return self.AwardIndex # 奖励记录索引,从0开始,同个模板不可重复,不可变更
    def GetAwardItemList(self): return self.AwardItemList # 奖励物品列表[[物品ID,个数,是否拍品], ...]
# 跨服充值排行活动时间表
class IPY_CrossActCTGBillboard():
    
@@ -2731,6 +2796,10 @@
        self.ipyCrossActLuckyCloudBuyLen = len(self.ipyCrossActLuckyCloudBuyCache)
        self.ipyCrossActLuckyCloudBuyTemplateCache = self.__LoadFileData("CrossActLuckyCloudBuyTemplate", IPY_CrossActLuckyCloudBuyTemplate)
        self.ipyCrossActLuckyCloudBuyTemplateLen = len(self.ipyCrossActLuckyCloudBuyTemplateCache)
        self.ipyCrossActAllRechargeCache = self.__LoadFileData("CrossActAllRecharge", IPY_CrossActAllRecharge)
        self.ipyCrossActAllRechargeLen = len(self.ipyCrossActAllRechargeCache)
        self.ipyCrossActAllRechargeTemplateCache = self.__LoadFileData("CrossActAllRechargeTemplate", IPY_CrossActAllRechargeTemplate)
        self.ipyCrossActAllRechargeTemplateLen = len(self.ipyCrossActAllRechargeTemplateCache)
        self.ipyCrossActCTGBillboardCache = self.__LoadFileData("CrossActCTGBillboard", IPY_CrossActCTGBillboard)
        self.ipyCrossActCTGBillboardLen = len(self.ipyCrossActCTGBillboardCache)
        self.ipyCrossActCTGBillboardOrderCache = self.__LoadFileData("CrossActCTGBillboardOrder", IPY_CrossActCTGBillboardOrder)
@@ -3053,6 +3122,10 @@
    def GetCrossActLuckyCloudBuyByIndex(self, index): return self.ipyCrossActLuckyCloudBuyCache[index]
    def GetCrossActLuckyCloudBuyTemplateCount(self): return self.ipyCrossActLuckyCloudBuyTemplateLen
    def GetCrossActLuckyCloudBuyTemplateByIndex(self, index): return self.ipyCrossActLuckyCloudBuyTemplateCache[index]
    def GetCrossActAllRechargeCount(self): return self.ipyCrossActAllRechargeLen
    def GetCrossActAllRechargeByIndex(self, index): return self.ipyCrossActAllRechargeCache[index]
    def GetCrossActAllRechargeTemplateCount(self): return self.ipyCrossActAllRechargeTemplateLen
    def GetCrossActAllRechargeTemplateByIndex(self, index): return self.ipyCrossActAllRechargeTemplateCache[index]
    def GetCrossActCTGBillboardCount(self): return self.ipyCrossActCTGBillboardLen
    def GetCrossActCTGBillboardByIndex(self, index): return self.ipyCrossActCTGBillboardCache[index]
    def GetCrossActCTGBillboardOrderCount(self): return self.ipyCrossActCTGBillboardOrderLen
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -72,6 +72,7 @@
import CrossRealmPK
import CrossChampionship
import CrossBattlefield
import CrossActAllRecharge
import ChPyNetSendPack
import NetPackCommon
import AuctionHouse
@@ -668,6 +669,14 @@
        CrossBattlefield.MapServer_CrossBattlefieldOver(eval(resultName))
        return
    
    # 跨服全民充值
    if callName == "CrossActAllRecharge":
        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
        if not curPlayer:
            return
        CrossActAllRecharge.MapServer_CrossActAllRecharge(curPlayer, eval(resultName))
        return
    #py喇叭聊天
    if callName == 'PYSpeaker':
        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
@@ -147,6 +147,8 @@
g_championshipMgr = None # 跨服排位争霸赛管理
g_crossActAllRechargeInfo = {} # 跨服全民充值信息,本服用 {zoneID:{playerID:总充值, ...}, ...}
g_familyTalkCache = {} #{familyID:[[time,content,extras],..]}
g_worldTalkCache = [] #[[time,name, playerID, content,extras],..]
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -330,12 +330,13 @@
#跨服运营活动表名定义
CrossActName_CTGBillboard = "CrossActCTGBillboard" # 充值排行榜
CrossActName_AllRecharge = "CrossActAllRecharge" # 全民充值
CrossActName_LuckyCloudBuy = "CrossActLuckyCloudBuy" # 幸运云购
#跨服运营活动列表
CrossActNameList = [CrossActName_CTGBillboard, CrossActName_LuckyCloudBuy]
CrossActNameList = [CrossActName_CTGBillboard, CrossActName_AllRecharge, CrossActName_LuckyCloudBuy]
#需要锁定活动分区分配直到活动结束的跨服运营活动,即使热更分区配置,也不会改变正在活动中的分区设定,直到活动结束
CrossActLockServerGroupIDList = [CrossActName_CTGBillboard]
CrossActLockServerGroupIDList = [CrossActName_CTGBillboard, CrossActName_AllRecharge]
#活动信息字典key定义
ActKey_ID = "ID" # 活动ID,唯一标识的ID,一般是活动开启的time值
@@ -1250,7 +1251,7 @@
                                Def_UniversalGameRecType_CrossChampionshipGuess, # 跨服排位争霸赛竞猜记录信息 34
                                Def_UniversalGameRecType_CrossChampionshipOfficial, # 跨服排位争霸赛最终排名官职信息 35
                                Def_UniversalGameRecType_CrossChampionshipOffChallenge, # 跨服排位争霸赛官职挑战信息 36
                                Def_UniversalGameRecType_37,
                                Def_UniversalGameRecType_CrossActAllRecharge, # 跨服全服充值活动信息 37
                                Def_UniversalGameRecType_38,
                                Def_UniversalGameRecType_39,
                                Def_UniversalGameRecType_40,
@@ -1448,6 +1449,7 @@
CrossServerMsg_ChampionshipGuess = "ChampionshipGuess"  # 跨服排位争霸赛竞猜信息
CrossServerMsg_ChampionshipOfficial = "ChampionshipOfficial"  # 跨服排位争霸赛官职信息
CrossServerMsg_ChampionshipDailyOfficial = "ChampionshipDailyOfficial"  # 跨服排位争霸赛每日官职信息
CrossServerMsg_ActAllRechargeInfo = "ActAllRechargeInfo"# 跨服全民充值信息
# 子服发送跨服信息定义
ClientServerMsg_ServerInitOK = "ServerInitOK"           # 子服启动成功
@@ -1482,6 +1484,7 @@
ClientServerMsg_ChampionshipOfficialChallenge = "ChampionshipOfficialChallenge" # 跨服排位挑战仙官
ClientServerMsg_ChampionshipGuess = "ChampionshipGuess" # 跨服排位竞猜
ClientServerMsg_ChampionshipWorship = "ChampionshipWorship" # 跨服排位膜拜
ClientServerMsg_ActAllRechargeValue = "ActAllRechargeValue" # 跨服全民充值额度
#跨服广播类型定义
CrossNotify_CrossAct = "CrossAct"
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -5263,6 +5263,224 @@
#------------------------------------------------------
# AC 13 跨服全民充值活动信息 #tagGCCrossActAllRechargeInfo
class  tagGCCrossActAllRechargeItem(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(tagGCCrossActAllRechargeItem)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// AC 13 跨服全民充值活动信息 //tagGCCrossActAllRechargeInfo:
                                ItemID:%d,
                                ItemCount:%d,
                                IsBind:%d
                                '''\
                                %(
                                self.ItemID,
                                self.ItemCount,
                                self.IsBind
                                )
        return DumpString
class  tagGCCrossActAllRechargeAward(Structure):
    AwardIndex = 0    #(BYTE AwardIndex)// 奖励索引 0~31
    NeedRMB = 0    #(DWORD NeedRMB)// 所需全民充值RMB
    NeedPlayerCount = 0    #(WORD NeedPlayerCount)// 所需充值达到该档玩家数
    NowPlayerCount = 0    #(WORD NowPlayerCount)// 当前充值达到该档玩家数
    AwardItemCount = 0    #(BYTE AwardItemCount)// 奖励物品数
    AwardItemList = list()    #(vector<tagGCCrossActAllRechargeItem> 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.NeedPlayerCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.NowPlayerCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.AwardItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.AwardItemCount):
            temAwardItemList = tagGCCrossActAllRechargeItem()
            _pos = temAwardItemList.ReadData(_lpData, _pos)
            self.AwardItemList.append(temAwardItemList)
        return _pos
    def Clear(self):
        self.AwardIndex = 0
        self.NeedRMB = 0
        self.NeedPlayerCount = 0
        self.NowPlayerCount = 0
        self.AwardItemCount = 0
        self.AwardItemList = list()
        return
    def GetLength(self):
        length = 0
        length += 1
        length += 4
        length += 2
        length += 2
        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.WriteWORD(data, self.NeedPlayerCount)
        data = CommFunc.WriteWORD(data, self.NowPlayerCount)
        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,
                                NeedPlayerCount:%d,
                                NowPlayerCount:%d,
                                AwardItemCount:%d,
                                AwardItemList:%s
                                '''\
                                %(
                                self.AwardIndex,
                                self.NeedRMB,
                                self.NeedPlayerCount,
                                self.NowPlayerCount,
                                self.AwardItemCount,
                                "..."
                                )
        return DumpString
class  tagGCCrossActAllRechargeInfo(Structure):
    Head = tagHead()
    ServerInfoLen = 0    #(BYTE ServerInfoLen)
    ServerIDRangeInfo = ""    #(String ServerIDRangeInfo)//开放该活动的服务器ID范围列表,json格式 [[IDA, IDB], ...], [] 为全服
    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
    AwardCount = 0    #(BYTE AwardCount)
    AwardList = list()    #(vector<tagGCCrossActAllRechargeAward> AwardList)// 奖励档次信息
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xAC
        self.Head.SubCmd = 0x13
        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.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
        self.AwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.AwardCount):
            temAwardList = tagGCCrossActAllRechargeAward()
            _pos = temAwardList.ReadData(_lpData, _pos)
            self.AwardList.append(temAwardList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xAC
        self.Head.SubCmd = 0x13
        self.ServerInfoLen = 0
        self.ServerIDRangeInfo = ""
        self.StartDate = ""
        self.EndtDate = ""
        self.AwardCount = 0
        self.AwardList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += len(self.ServerIDRangeInfo)
        length += 10
        length += 10
        length += 1
        for i in range(self.AwardCount):
            length += self.AwardList[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.WriteString(data, 10, self.StartDate)
        data = CommFunc.WriteString(data, 10, self.EndtDate)
        data = CommFunc.WriteBYTE(data, self.AwardCount)
        for i in range(self.AwardCount):
            data = CommFunc.WriteString(data, self.AwardList[i].GetLength(), self.AwardList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                ServerInfoLen:%d,
                                ServerIDRangeInfo:%s,
                                StartDate:%s,
                                EndtDate:%s,
                                AwardCount:%d,
                                AwardList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.ServerInfoLen,
                                self.ServerIDRangeInfo,
                                self.StartDate,
                                self.EndtDate,
                                self.AwardCount,
                                "..."
                                )
        return DumpString
m_NAtagGCCrossActAllRechargeInfo=tagGCCrossActAllRechargeInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagGCCrossActAllRechargeInfo.Head.Cmd,m_NAtagGCCrossActAllRechargeInfo.Head.SubCmd))] = m_NAtagGCCrossActAllRechargeInfo
#------------------------------------------------------
# AC 12 跨服运营活动结束 # tagGCCrossActEnd
class  tagGCCrossActEnd(Structure):
@@ -32802,6 +33020,62 @@
#------------------------------------------------------
# AA 34 跨服全民充值活动玩家信息 #tagMCCrossActAllRechargePlayerInfo
class  tagMCCrossActAllRechargePlayerInfo(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("CTGRMBTotal", c_int),    # 活动已累计充值RMB
                  ("AwardRecord", c_int),    # 奖励记录,根据奖励索引位或运算判断是否已领取
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xAA
        self.SubCmd = 0x34
        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 = 0x34
        self.CTGRMBTotal = 0
        self.AwardRecord = 0
        return
    def GetLength(self):
        return sizeof(tagMCCrossActAllRechargePlayerInfo)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// AA 34 跨服全民充值活动玩家信息 //tagMCCrossActAllRechargePlayerInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                CTGRMBTotal:%d,
                                AwardRecord:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.CTGRMBTotal,
                                self.AwardRecord
                                )
        return DumpString
m_NAtagMCCrossActAllRechargePlayerInfo=tagMCCrossActAllRechargePlayerInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCCrossActAllRechargePlayerInfo.Cmd,m_NAtagMCCrossActAllRechargePlayerInfo.SubCmd))] = m_NAtagMCCrossActAllRechargePlayerInfo
#------------------------------------------------------
# AA 25 每日礼包活动信息 #tagMCDailyGiftbagInfo
class  tagMCDailyGiftbagItem(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -123,6 +123,7 @@
import PlayerLuckyTreasure
import Item_ResetAttrPoint
import CrossActCTGBillboard
import CrossActAllRecharge
import PlayerFuncSysPrivilege
import PlayerActTurntable
import PlayerTongTianLing
@@ -737,6 +738,8 @@
    
    #跨服充值排行
    CrossActCTGBillboard.OnPlayerLogin(curPlayer)
    #跨服全民充值
    CrossActAllRecharge.OnPlayerLogin(curPlayer)
    #消费返利
    PlayerCostRebate.OnPlayerLogin(curPlayer)
    #累计充值
@@ -5583,6 +5586,9 @@
    # 领取跨服充值排行活动达标奖励
    elif rewardType == ChConfig.Def_RewardType_CACTGBillboardDabiao:
        CrossActCTGBillboard.GetDabiaoAward(curPlayer, dataEx)
    # 跨服全民充值奖励
    elif rewardType == ChConfig.Def_RewardType_CAAllRecharge:
        CrossActAllRecharge.GetCrossActAllRechargeAward(curPlayer, dataEx)
    #缥缈奇遇领取
    elif rewardType == ChConfig.Def_RewardType_FairyAdventuresAward:
        PlayerFairyDomain.GetFairyAdventuresAward(curPlayer, dataEx, dataExStr)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossActAllRecharge.py
New file
@@ -0,0 +1,171 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Player.CrossActAllRecharge
#
# @todo:跨服全民充值
# @author hxp
# @date 2022-10-11
# @version 1.0
#
# 详细描述: 跨服全民充值
#
#-------------------------------------------------------------------------------
#"""Version = 2022-10-11 19:00"""
#-------------------------------------------------------------------------------
import ChConfig
import ShareDefine
import PlayerControl
import NetPackCommon
import CrossRealmPlayer
import ChPyNetSendPack
import ItemControler
import IPY_GameWorld
import GameWorld
def OnPlayerLogin(curPlayer):
    isReset = __CheckPlayerCrossActAllRecharge(curPlayer)
    if not isReset:
        actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_AllRecharge)
        # 活动中同步活动信息
        if actInfo.get(ShareDefine.ActKey_State):
            Sync_CrossActAllRechargePlayerInfo(curPlayer)
            if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_AllRechargeRMB):
                SendGameServerActRechargeRMB(curPlayer, actInfo)
    return
def RefreshCrossActAllRechargeInfo():
    ## 收到GameServer同步的活动信息,刷新活动信息
    playerManager = GameWorld.GetPlayerManager()
    for index in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(index)
        if curPlayer.GetID() == 0:
            continue
        __CheckPlayerCrossActAllRecharge(curPlayer)
    return
def __CheckPlayerCrossActAllRecharge(curPlayer):
    playerID = curPlayer.GetPlayerID()
    actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_AllRecharge)
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
    actID = actInfo.get(ShareDefine.ActKey_ID, 0)
    state = actInfo.get(ShareDefine.ActKey_State, 0)
    dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0)
    playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_AllRechargeID) # 玩家身上的活动ID
    # 活动ID 相同的话不处理
    if actID == playerActID:
        GameWorld.DebugLog("跨服全民充值活动ID不变,不处理!cfgID=%s,dayIndex=%s,actID=%s" % (cfgID, dayIndex, actID), playerID)
        return
    GameWorld.DebugLog("跨服全民充值活动重置! cfgID=%s,actID=%s,playerActID=%s,state=%s" % (cfgID, actID, playerActID, state), playerID)
    if not state:
        CrossRealmPlayer.NotifyCrossActEnd(curPlayer, ShareDefine.CrossActName_AllRecharge)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_AllRechargeID, actID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_AllRechargeRMB, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_AllRechargeAward, 0)
    Sync_CrossActAllRechargePlayerInfo(curPlayer)
    return True
def GetCrossActAllRechargeAward(curPlayer, awardIndex):
    ## 领奖
    actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_AllRecharge)
    state = actInfo.get(ShareDefine.ActKey_State, 0)
    if not state:
        GameWorld.DebugLog("非活动中")
        return
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
    ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {})
    if not ipyDataDict:
        return
    zoneID = ipyDataDict.get("ZoneID", 0)
    if not zoneID:
        return
    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_AllRechargeAward)
    if awardRecord & pow(2, awardIndex):
        GameWorld.DebugLog("已领取过该奖励! awardIndex=%s" % awardIndex, curPlayer.GetPlayerID())
        return
    sendMsg = str(["AllRechargeAward", [cfgID, zoneID, awardIndex]])
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "CrossActAllRecharge", sendMsg, len(sendMsg))
    return
def GameServer_CrossActAllRecharge(curPlayer, msgList):
    msgType = msgList[0]
    if msgType == "AllRechargeAward":
        awardIndex, awardItemList = msgList[1:]
        awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_AllRechargeAward)
        if awardRecord & pow(2, awardIndex):
            GameWorld.DebugLog("已领取过该奖励! awardIndex=%s" % awardIndex, curPlayer.GetPlayerID())
            return
        if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList):
            return
        updAwardRecord = awardRecord | pow(2, awardIndex)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_AllRechargeAward, updAwardRecord)
        GameWorld.Log("领取全民充值奖励: awardIndex=%s" % (awardIndex), curPlayer.GetPlayerID())
        Sync_CrossActAllRechargePlayerInfo(curPlayer)
        for itemID, itemCount, isAuctionItem in awardItemList:
            ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem],
                                         event=["CrossActAllRecharge", False, {}])
    return
def AddCTGRMB(curPlayer, addRMB):
    ## 增加活动已累计充值RMB
    actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_AllRecharge)
    if not actInfo:
        return
    if not actInfo.get(ShareDefine.ActKey_State):
        GameWorld.DebugLog("跨服全民充值非活动中! playerServerID=%s" % GameWorld.GetPlayerServerID(curPlayer), curPlayer.GetPlayerID())
        return
    totalRMB = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_AllRechargeRMB) + addRMB
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_AllRechargeRMB, totalRMB)
    GameWorld.DebugLog("跨服全民充值活动增加玩家累计充值RMB: addRMB=%s,totalRMB=%s" % (addRMB, totalRMB), curPlayer.GetPlayerID())
    Sync_CrossActAllRechargePlayerInfo(curPlayer)
    SendGameServerActRechargeRMB(curPlayer, actInfo)
    return
def SendGameServerActRechargeRMB(curPlayer, actInfo):
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
    ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {})
    if not ipyDataDict:
        return
    zoneID = ipyDataDict.get("ZoneID", 0)
    if not zoneID:
        return
    totalRMB = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_AllRechargeRMB)
    sendMsg = str(["AllRechargeRMB", [cfgID, zoneID, totalRMB]])
    GameWorld.Log("SendGameServerActRechargeRMB: %s" % sendMsg, curPlayer.GetPlayerID())
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "CrossActAllRecharge", sendMsg, len(sendMsg))
    return
def Sync_CrossActAllRechargePlayerInfo(curPlayer):
    ## 通知活动玩家数据信息
    clientPack = ChPyNetSendPack.tagMCCrossActAllRechargePlayerInfo()
    clientPack.CTGRMBTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_AllRechargeRMB)
    clientPack.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_AllRechargeAward)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
@@ -55,6 +55,7 @@
import PlayerActRechargePrize
import PlayerFamilyRedPacket
import CrossActCTGBillboard
import CrossActAllRecharge
import PlayerActGrowupBuy
import OpenServerCampaign
import PlayerFeastTravel
@@ -440,6 +441,8 @@
    if coinType in [CoinType_Gold, CoinType_Buy]:
        #跨服充值排行活动
        CrossActCTGBillboard.AddCTGRMB(curPlayer, orderCoin)
        #跨服全民充值
        CrossActAllRecharge.AddCTGRMB(curPlayer, orderCoin)
        PlayerActManyDayRecharge.AddManyDayRechargeValue(curPlayer, orderCoin) # 多日连充
        #红包, 需要真实充值
        PlayerFamilyRedPacket.OnPlayerRecharge(curPlayer, orderCoin)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -77,6 +77,7 @@
import OpenServerCampaign
import PlayerCostRebate
import CrossActCTGBillboard
import CrossActAllRecharge
import PlayerActCollectWords
import PlayerActTotalRecharge
import PlayerActGarbageSorting
@@ -1484,6 +1485,9 @@
            if actionName == ShareDefine.CrossActName_CTGBillboard:
                CrossActCTGBillboard.RefreshCrossActCTGBillboardInfo()
            
            elif actionName == ShareDefine.CrossActName_AllRecharge:
                CrossActAllRecharge.RefreshCrossActAllRechargeInfo()
            return
        
        if key == ShareDefine.Def_Notify_WorldKey_CrossZoneName:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_CrossActAllRecharge.py
New file
@@ -0,0 +1,49 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Player.RemoteQuery.GY_Query_CrossActAllRecharge
#
# @todo:跨服全民充值
# @author hxp
# @date 2022-10-11
# @version 1.0
#
# 详细描述: 跨服全民充值
#
#-------------------------------------------------------------------------------
#"""Version = 2022-10-11 19:00"""
#-------------------------------------------------------------------------------
import GameWorld
import CrossActAllRecharge
#------------------------------------------------------------------------------
## 跨服赛报名调用接口
#  @param query_Type 请求类型
#  @param query_ID 请求的玩家ID
#  @param packCMDList 发包命令
#  @param tick 当前时间
#  @return "True" or "False" or ""
#  @remarks 函数详细说明.
def DoLogic(query_Type, query_ID, packCMDList, tick):
    return
#------------------------------------------------------------------------------
## 执行结果
#  @param curPlayer 发出请求的玩家
#  @param callFunName 功能名称
#  @param funResult 查询的结果
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def DoResult(curPlayer, callFunName, funResult, tick):
    msgList = eval(funResult)
    playerID = curPlayer.GetPlayerID()
    GameWorld.Log("GY_Query_CrossActAllRecharge %s" % (msgList), playerID)
    CrossActAllRecharge.GameServer_CrossActAllRecharge(curPlayer, msgList)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -330,12 +330,13 @@
#跨服运营活动表名定义
CrossActName_CTGBillboard = "CrossActCTGBillboard" # 充值排行榜
CrossActName_AllRecharge = "CrossActAllRecharge" # 全民充值
CrossActName_LuckyCloudBuy = "CrossActLuckyCloudBuy" # 幸运云购
#跨服运营活动列表
CrossActNameList = [CrossActName_CTGBillboard, CrossActName_LuckyCloudBuy]
CrossActNameList = [CrossActName_CTGBillboard, CrossActName_AllRecharge, CrossActName_LuckyCloudBuy]
#需要锁定活动分区分配直到活动结束的跨服运营活动,即使热更分区配置,也不会改变正在活动中的分区设定,直到活动结束
CrossActLockServerGroupIDList = [CrossActName_CTGBillboard]
CrossActLockServerGroupIDList = [CrossActName_CTGBillboard, CrossActName_AllRecharge]
#活动信息字典key定义
ActKey_ID = "ID" # 活动ID,唯一标识的ID,一般是活动开启的time值
@@ -1250,7 +1251,7 @@
                                Def_UniversalGameRecType_CrossChampionshipGuess, # 跨服排位争霸赛竞猜记录信息 34
                                Def_UniversalGameRecType_CrossChampionshipOfficial, # 跨服排位争霸赛最终排名官职信息 35
                                Def_UniversalGameRecType_CrossChampionshipOffChallenge, # 跨服排位争霸赛官职挑战信息 36
                                Def_UniversalGameRecType_37,
                                Def_UniversalGameRecType_CrossActAllRecharge, # 跨服全服充值活动信息 37
                                Def_UniversalGameRecType_38,
                                Def_UniversalGameRecType_39,
                                Def_UniversalGameRecType_40,