8650 【主干】【BT2】活动规则优化(消费返利支持多活动编号同时开启);
11个文件已修改
222 ■■■■■ 已修改文件
PySysDB/PySysDBG.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCostRebate.py 169 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBG.h
@@ -440,9 +440,9 @@
struct tagActCostRebate
{
    DWORD        _CfgID;    //配置ID
    char        ActMark;    //活动组标记
    list        PlatformList;    //活动平台列表["平台A", "平台A", ...],配[]代表所有
    list        ServerGroupIDList;    //服务器ID列表
    BYTE        ActNum;    //活动分组编号, 活动类型 * 10 + 不同界面编号
    char        StartDate;    //开启日期
    char        EndDate;    //结束日期
    dict        NotifyInfoStart;    //全服提示信息 - 相对开始时间
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -26832,6 +26832,7 @@
class  tagMCCostRebateInfo(Structure):
    Head = tagHead()
    ActNum = 0    #(BYTE ActNum)//活动编号
    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
    IsDayReset = 0    #(BYTE IsDayReset)//是否每天重置
@@ -26849,6 +26850,7 @@
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
        self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
@@ -26865,6 +26867,7 @@
        self.Head.Clear()
        self.Head.Cmd = 0xAA
        self.Head.SubCmd = 0x09
        self.ActNum = 0
        self.StartDate = ""
        self.EndtDate = ""
        self.IsDayReset = 0
@@ -26876,6 +26879,7 @@
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 10
        length += 10
        length += 1
@@ -26889,6 +26893,7 @@
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.ActNum)
        data = CommFunc.WriteString(data, 10, self.StartDate)
        data = CommFunc.WriteString(data, 10, self.EndtDate)
        data = CommFunc.WriteBYTE(data, self.IsDayReset)
@@ -26901,6 +26906,7 @@
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                ActNum:%d,
                                StartDate:%s,
                                EndtDate:%s,
                                IsDayReset:%d,
@@ -26910,6 +26916,7 @@
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.ActNum,
                                self.StartDate,
                                self.EndtDate,
                                self.IsDayReset,
@@ -26932,6 +26939,7 @@
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("ActNum", c_ubyte),    #活动编号
                  ("CostGoldTotal", c_int),    #本次活动已累计消费仙玉数
                  ("AwardRecord", c_int),    #返利奖励领奖记录,按奖励索引二进制位存储是否已领取
                  ]
@@ -26950,6 +26958,7 @@
    def Clear(self):
        self.Cmd = 0xAA
        self.SubCmd = 0x10
        self.ActNum = 0
        self.CostGoldTotal = 0
        self.AwardRecord = 0
        return
@@ -26964,12 +26973,14 @@
        DumpString = '''// AA 10 消费返利玩家活动信息 //tagMCCostRebatePlayerInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                ActNum:%d,
                                CostGoldTotal:%d,
                                AwardRecord:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.ActNum,
                                self.CostGoldTotal,
                                self.AwardRecord
                                )
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
@@ -726,7 +726,7 @@
                        PlayerControl.WorldNotify(0, notifyKey, paramList)
                        
            dictName = ChConfig.Def_WorldKey_OperationActionState % actName
            if actName in ShareDefine.MultiActNumOperationActNameList:
            if actName in ShareDefine.MultiActNumOperationActNameList:
                dictName += "_%s" % actNum
            preState = gameWorld.GetDictByKey(dictName)
            if not isReload and preState == state:
@@ -786,9 +786,6 @@
                if isReload and ipyData:
                    Sync_OperationAction_ExpRate(ipyData)
                    
            elif actName == ShareDefine.OperationActionName_CostRebate:
                if isReload and ipyData:
                    pass
            elif actName == ShareDefine.OperationActionName_BossReborn:
                if isReload and ipyData:
                    GameWorldBoss.SetBossRebornNeedPoint(True)
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -371,9 +371,9 @@
                "ActCostRebate":(
                        ("DWORD", "CfgID", 1),
                        ("char", "ActMark", 0),
                        ("list", "PlatformList", 0),
                        ("list", "ServerGroupIDList", 0),
                        ("BYTE", "ActNum", 0),
                        ("char", "StartDate", 0),
                        ("char", "EndDate", 0),
                        ("dict", "NotifyInfoStart", 0),
@@ -1396,9 +1396,9 @@
    
    def __init__(self):
        self.CfgID = 0
        self.ActMark = ""
        self.PlatformList = []
        self.ServerGroupIDList = []
        self.ActNum = 0
        self.StartDate = ""
        self.EndDate = ""
        self.NotifyInfoStart = {}
@@ -1408,9 +1408,9 @@
        return
        
    def GetCfgID(self): return self.CfgID # 配置ID
    def GetActMark(self): return self.ActMark # 活动组标记
    def GetPlatformList(self): return self.PlatformList # 活动平台列表["平台A", "平台A", ...],配[]代表所有
    def GetServerGroupIDList(self): return self.ServerGroupIDList # 服务器ID列表
    def GetActNum(self): return self.ActNum # 活动分组编号, 活动类型 * 10 + 不同界面编号
    def GetStartDate(self): return self.StartDate # 开启日期
    def GetEndDate(self): return self.EndDate # 结束日期
    def GetNotifyInfoStart(self): return self.NotifyInfoStart # 全服提示信息 - 相对开始时间
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -264,7 +264,7 @@
#支持多活动分组编号的活动名
MultiActNumOperationActNameList = [OperationActionName_TotalRecharge, OperationActionName_CollectWords,
                                   OperationActionName_FlashGiftbag,
                                   OperationActionName_FlashGiftbag, OperationActionName_CostRebate,
                                   ]
#跨服运营活动表名定义
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3695,11 +3695,11 @@
Def_PDict_CA_CTGBillboardAward = "CA_CTGBillboardAward"  # 活动充值目标领奖状态,按二进制位存储
#消费返利活动
Def_PDict_CostRebateID = "CostRebateID"  # 玩家身上的消费返利活动ID,唯一标识,取活动开始日期time值
Def_PDict_CostRebateTemplateID = "CostRebateTemplateID"  # 玩家身上的消费返利模板ID
Def_PDict_CostRebateGold = "CostRebateGold"  # 消费返利总累计消费仙玉
Def_PDict_CostRebateAwardRecord = "CostRebateAwardRecord"  # 消费返利领奖记录
Def_PDict_CostRebateWorldLV = "CostRebateWorldLV" #消费返利活动开启时世界等级
Def_PDict_CostRebateID = "CostRebateID_%s"  # 玩家身上的消费返利活动ID,唯一标识,取活动开始日期time值,参数(活动编号)
Def_PDict_CostRebateTemplateID = "CostRebateTemplateID_%s"  # 玩家身上的消费返利模板ID,参数(活动编号)
Def_PDict_CostRebateGold = "CostRebateGold_%s"  # 消费返利总累计消费仙玉,参数(活动编号)
Def_PDict_CostRebateAwardRecord = "CostRebateAwardRecord_%s"  # 消费返利领奖记录,参数(活动编号)
Def_PDict_CostRebateWorldLV = "CostRebateWorldLV_%s" #消费返利活动开启时世界等级,参数(活动编号)
#累计充值活动
Def_PDict_TotalRechargeID = "TotalRechargeID_%s"  # 玩家身上的累计充值活动ID,唯一标识,取活动开始日期time值,参数:(活动编号)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -26832,6 +26832,7 @@
class  tagMCCostRebateInfo(Structure):
    Head = tagHead()
    ActNum = 0    #(BYTE ActNum)//活动编号
    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
    IsDayReset = 0    #(BYTE IsDayReset)//是否每天重置
@@ -26849,6 +26850,7 @@
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
        self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
@@ -26865,6 +26867,7 @@
        self.Head.Clear()
        self.Head.Cmd = 0xAA
        self.Head.SubCmd = 0x09
        self.ActNum = 0
        self.StartDate = ""
        self.EndtDate = ""
        self.IsDayReset = 0
@@ -26876,6 +26879,7 @@
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 10
        length += 10
        length += 1
@@ -26889,6 +26893,7 @@
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.ActNum)
        data = CommFunc.WriteString(data, 10, self.StartDate)
        data = CommFunc.WriteString(data, 10, self.EndtDate)
        data = CommFunc.WriteBYTE(data, self.IsDayReset)
@@ -26901,6 +26906,7 @@
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                ActNum:%d,
                                StartDate:%s,
                                EndtDate:%s,
                                IsDayReset:%d,
@@ -26910,6 +26916,7 @@
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.ActNum,
                                self.StartDate,
                                self.EndtDate,
                                self.IsDayReset,
@@ -26932,6 +26939,7 @@
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("ActNum", c_ubyte),    #活动编号
                  ("CostGoldTotal", c_int),    #本次活动已累计消费仙玉数
                  ("AwardRecord", c_int),    #返利奖励领奖记录,按奖励索引二进制位存储是否已领取
                  ]
@@ -26950,6 +26958,7 @@
    def Clear(self):
        self.Cmd = 0xAA
        self.SubCmd = 0x10
        self.ActNum = 0
        self.CostGoldTotal = 0
        self.AwardRecord = 0
        return
@@ -26964,12 +26973,14 @@
        DumpString = '''// AA 10 消费返利玩家活动信息 //tagMCCostRebatePlayerInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                ActNum:%d,
                                CostGoldTotal:%d,
                                AwardRecord:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.ActNum,
                                self.CostGoldTotal,
                                self.AwardRecord
                                )
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -5360,7 +5360,7 @@
        PlayerFreeGoods.OnGetFreeGoods(curPlayer, dataEx)
    # 领取消费返利奖励
    elif rewardType == ChConfig.Def_RewardType_CostRebate:
        PlayerCostRebate.OnGetCostRebateAward(curPlayer, dataEx)
        PlayerCostRebate.OnGetCostRebateAward(curPlayer, dataEx, dataExStr)
    # 领取累计充值奖励
    elif rewardType == ChConfig.Def_RewardType_TotalRecharge:
        PlayerActTotalRecharge.OnGetTotalRechargeAward(curPlayer, dataEx, dataExStr)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCostRebate.py
@@ -24,7 +24,6 @@
import DataRecordPack
import IPY_GameWorld
import NetPackCommon
import ItemCommon
import GameWorld
import ChConfig
@@ -39,68 +38,70 @@
    return templateID
def OnPlayerLogin(curPlayer):
    isReset = __CheckPlayerCostRebateAction(curPlayer)
    if not isReset:
        actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_CostRebate, {})
        # 活动中同步活动信息
        if actCostRebateInfo.get(ShareDefine.ActKey_State):
            Sync_CostRebateActionInfo(curPlayer)
            Sync_CostRebateInfo(curPlayer)
    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_CostRebate, {}).values():
        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
        isReset = __CheckPlayerCostRebateAction(curPlayer, actNum)
        if not isReset:
            # 活动中同步活动信息
            if actInfo.get(ShareDefine.ActKey_State):
                Sync_CostRebateActionInfo(curPlayer, actNum)
                Sync_CostRebateInfo(curPlayer, actNum)
    return
def RefreshCostRebateActionInfo():
def RefreshCostRebateActionInfo(actNum):
    ## 收到GameServer同步的活动信息,刷新活动信息
    playerManager = GameWorld.GetPlayerManager()
    for index in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(index)
        if curPlayer.GetID() == 0:
            continue
        __CheckPlayerCostRebateAction(curPlayer)
        __CheckPlayerCostRebateAction(curPlayer, actNum)
    return
def __CheckPlayerCostRebateAction(curPlayer):
def __CheckPlayerCostRebateAction(curPlayer, actNum):
    ## 检查玩家消费返利活动数据信息
    
    playerID = curPlayer.GetPlayerID()
    
    actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_CostRebate, {})
    costRebateID = actCostRebateInfo.get(ShareDefine.ActKey_ID, 0)
    state = actCostRebateInfo.get(ShareDefine.ActKey_State, 0)
    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_CostRebate, actNum)
    actID = actInfo.get(ShareDefine.ActKey_ID, 0)
    state = actInfo.get(ShareDefine.ActKey_State, 0)
    
    playerCostRebateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateID) # 玩家身上的活动ID
    playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateID % actNum) # 玩家身上的活动ID
    
    # 活动ID 相同的话不处理
    if costRebateID == playerCostRebateID:
        #GameWorld.DebugLog("消费返利活动ID不变,不处理!", curPlayer.GetPlayerID())
    if actID == playerActID:
        GameWorld.DebugLog("消费返利活动ID不变,不处理!actNum=%s,actID=%s" % (actNum, actID), curPlayer.GetPlayerID())
        return
    actWorldLV = actCostRebateInfo.get(ShareDefine.ActKey_WorldLV, 0)
    playerWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateWorldLV)
    templateID = GetTemplateID(actCostRebateInfo.get(ShareDefine.ActKey_CfgID, 0), actCostRebateInfo.get(ShareDefine.ActKey_DayIndex, 0))
    playerTemplateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateTemplateID)
    actWorldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0)
    playerWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateWorldLV % actNum)
    templateID = GetTemplateID(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0))
    playerTemplateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateTemplateID % actNum)
    
    GameWorld.DebugLog("消费返利重置! costRebateID=%s,playerCostRebateID=%s,state=%s,templateID=%s,playerTemplateID=%s"
                       % (costRebateID, playerCostRebateID, state, templateID, playerTemplateID), playerID)
    GameWorld.DebugLog("消费返利重置! actNum=%s,actID=%s,playerActID=%s,state=%s,templateID=%s,playerTemplateID=%s"
                       % (actNum, actID, playerActID, state, templateID, playerTemplateID), playerID)
    
    # 未领取的奖励邮件发放
    __SendCostRebateMail(curPlayer, playerTemplateID, playerWorldLV)
    __SendCostRebateMail(curPlayer, playerTemplateID, playerWorldLV, actNum)
    
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateID, costRebateID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateTemplateID, templateID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateWorldLV, actWorldLV)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateGold, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateAwardRecord, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateID % actNum, actID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateTemplateID % actNum, templateID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateWorldLV % actNum, actWorldLV)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateGold % actNum, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateAwardRecord % actNum, 0)
    
    Sync_CostRebateActionInfo(curPlayer)
    Sync_CostRebateInfo(curPlayer)
    Sync_CostRebateActionInfo(curPlayer, actNum)
    Sync_CostRebateInfo(curPlayer, actNum)
    return True
def __SendCostRebateMail(curPlayer, playerTemplateID, playerWorldLV):
def __SendCostRebateMail(curPlayer, playerTemplateID, playerWorldLV, actNum):
    # 未领取的奖励邮件发放
    
    if not playerTemplateID:
        return
    
    costGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold)
    costGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold % actNum)
    if not costGold:
        return
    
@@ -110,7 +111,7 @@
    job = curPlayer.GetJob()
    playerID = curPlayer.GetPlayerID()
    batchPlayerIDList, batchAddItemList, batchParamList = [], [], []
    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateAwardRecord)
    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateAwardRecord % actNum)
    
    for ipyData in ipyDataList:
        awardIndex = ipyData.GetAwardIndex()
@@ -128,7 +129,7 @@
        batchParamList.append([needCostGold])
        
    if batchPlayerIDList:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateAwardRecord, awardRecord)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateAwardRecord % actNum, awardRecord)
        PlayerControl.SendMailBatch("ConsumptionRebateMail", batchPlayerIDList, batchAddItemList, batchParamList)
        
    return
@@ -157,47 +158,54 @@
        GameWorld.DebugLog("不计入消费返利的消费类型!costType=%s" % costType, curPlayer.GetPlayerID())
        return
    
    actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_CostRebate, {})
    if not actCostRebateInfo.get(ShareDefine.ActKey_State):
        GameWorld.DebugLog("消费返利活动当前未开启!")
        return
    actID = actCostRebateInfo.get(ShareDefine.ActKey_ID)
    templateID = GetTemplateID(actCostRebateInfo.get(ShareDefine.ActKey_CfgID, 0), actCostRebateInfo.get(ShareDefine.ActKey_DayIndex, 0))
    if not actID or not templateID:
        GameWorld.ErrLog("消费返利活动数据异常!actID=%s,templateID=%s" % (actID, templateID), curPlayer.GetPlayerID())
        return
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateID, actID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateTemplateID, templateID)
    curCostGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold)
    updCostGold = curCostGold + costGold
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateGold, updCostGold)
    Sync_CostRebateInfo(curPlayer)
    GameWorld.DebugLog("玩家消费返利活动: actID=%s,templateID=%s,curCostGold=%s,costGold=%s,updCostGold=%s"
                       % (actID, templateID, curCostGold, costGold, updCostGold), curPlayer.GetPlayerID())
    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_CostRebate, {}).values():
        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
        if not actInfo.get(ShareDefine.ActKey_State):
            GameWorld.DebugLog("消费返利活动当前未开启!actNum=%s" % actNum)
            continue
        actID = actInfo.get(ShareDefine.ActKey_ID)
        templateID = GetTemplateID(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0))
        if not actID or not templateID:
            GameWorld.ErrLog("消费返利活动数据异常!actNum=%s,actID=%s,templateID=%s" % (actNum, actID, templateID), curPlayer.GetPlayerID())
            continue
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateID % actNum, actID)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateTemplateID % actNum, templateID)
        curCostGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold % actNum)
        updCostGold = curCostGold + costGold
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateGold % actNum, updCostGold)
        Sync_CostRebateInfo(curPlayer, actNum)
        GameWorld.DebugLog("玩家消费返利活动: actNum=%s,actID=%s,templateID=%s,curCostGold=%s,costGold=%s,updCostGold=%s"
                           % (actNum, actID, templateID, curCostGold, costGold, updCostGold), curPlayer.GetPlayerID())
    return
def OnGetCostRebateAward(curPlayer, awardIndex):
def OnGetCostRebateAward(curPlayer, awardIndex, actNum):
    ## 领取消费返利奖励
    playerID = curPlayer.GetPlayerID()
    
    actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_CostRebate, {})
    costRebateID = actCostRebateInfo.get(ShareDefine.ActKey_ID, 0)
    state = actCostRebateInfo.get(ShareDefine.ActKey_State, 0)
    templateID = GetTemplateID(actCostRebateInfo.get(ShareDefine.ActKey_CfgID, 0), actCostRebateInfo.get(ShareDefine.ActKey_DayIndex, 0))
    if not state or not templateID:
        GameWorld.DebugLog("没有消费返利活动,无法领奖!state=%s,templateID=%s" % (state, templateID), playerID)
    actNum = GameWorld.ToIntDef(actNum, 0)
    if actNum <= 0:
        GameWorld.DebugLog("没有该活动编号! actNum=%s" % actNum)
        return
    
    playerCostRebateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateID) # 玩家身上的活动ID
    playerID = curPlayer.GetPlayerID()
    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_CostRebate, actNum)
    costRebateID = actInfo.get(ShareDefine.ActKey_ID, 0)
    state = actInfo.get(ShareDefine.ActKey_State, 0)
    templateID = GetTemplateID(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0))
    if not state or not templateID:
        GameWorld.DebugLog("没有消费返利活动,无法领奖!actNum=%s,state=%s,templateID=%s" % (actNum, state, templateID), playerID)
        return
    playerCostRebateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateID % actNum) # 玩家身上的活动ID
    if costRebateID != playerCostRebateID:
        return
    
    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateAwardRecord)
    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateAwardRecord % actNum)
    if awardRecord & pow(2, awardIndex):
        GameWorld.DebugLog("已经领取过该消费返利活动奖励!awardIndex=%s" % awardIndex, playerID)
        GameWorld.DebugLog("已经领取过该消费返利活动奖励!actNum=%s,awardIndex=%s,awardRecord=%s" % (actNum, awardIndex, awardRecord), playerID)
        return
    
    ipyDataList = IpyGameDataPY.GetIpyGameDataList("CostRebateTemplate", templateID)
@@ -215,47 +223,47 @@
        return
    
    needCostGold = awardIpyData.GetNeedCostGold()
    actWorldLV = actCostRebateInfo.get(ShareDefine.ActKey_WorldLV, 0)
    actWorldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0)
    awardItemList = __GetItemList(awardIpyData.GetAwardItemList(), curPlayer.GetJob(), actWorldLV)
    
    curCostGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold)
    curCostGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold % actNum)
    if curCostGold < needCostGold:
        GameWorld.DebugLog("所需消费仙玉数不足,无法领取!templateID=%s,awardIndex=%s,needCostGold=%s,curCostGold=%s" 
                           % (templateID, awardIndex, needCostGold, curCostGold), playerID)
        return
    
    needSpace = len(awardItemList)
    packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
    if packSpace < needSpace:
    if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList):
        return
    
    awardRecord |= pow(2, awardIndex)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateAwardRecord, awardRecord)
    Sync_CostRebateInfo(curPlayer)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateAwardRecord % actNum, awardRecord)
    Sync_CostRebateInfo(curPlayer, actNum)
    
    notifyKey = awardIpyData.GetNotifyKey()
    if notifyKey:
        PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), needCostGold])
        
    for itemID, itemCount, isBind in awardItemList:
    for itemID, itemCount, _ in awardItemList:
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem])
        
    addDataDict = {"TemplateID":templateID, "NeedCostGold":needCostGold, "AwardIndex":awardIndex,
                   "ItemList":str(awardItemList)}
                   "ItemList":str(awardItemList), "ActNum":actNum}
    DataRecordPack.DR_FuncGiveItem(curPlayer, "CostRebateAward", addDataDict)
    return
def Sync_CostRebateInfo(curPlayer):
def Sync_CostRebateInfo(curPlayer, actNum):
    ## 通知消费返利玩家数据信息
    playerActInfo = ChPyNetSendPack.tagMCCostRebatePlayerInfo()
    playerActInfo.CostGoldTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold)
    playerActInfo.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateAwardRecord)
    playerActInfo.ActNum = actNum
    playerActInfo.CostGoldTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold % actNum)
    playerActInfo.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateAwardRecord % actNum)
    NetPackCommon.SendFakePack(curPlayer, playerActInfo)
    return
def Sync_CostRebateActionInfo(curPlayer):
def Sync_CostRebateActionInfo(curPlayer, actNum):
    ## 通知消费返利活动信息
    actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_CostRebate, {})
    actCostRebateInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_CostRebate, actNum)
    if not actCostRebateInfo:
        return
    
@@ -274,6 +282,7 @@
    actWorldLV = actCostRebateInfo.get(ShareDefine.ActKey_WorldLV, 0)
    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
    actInfo = ChPyNetSendPack.tagMCCostRebateInfo()
    actInfo.ActNum = actNum
    actInfo.StartDate = GameWorld.GetOperationActionDateStr(ipyData.GetStartDate(), openServerDay)
    actInfo.EndtDate = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)
    actInfo.LimitLV = ipyData.GetLVLimit()
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -1352,7 +1352,7 @@
                PlayerControl.RefreshOperationAction_ExpRate()
                
            elif actionName == ShareDefine.OperationActionName_CostRebate:
                PlayerCostRebate.RefreshCostRebateActionInfo()
                PlayerCostRebate.RefreshCostRebateActionInfo(actNum)
                
            elif actionName == ShareDefine.OperationActionName_TotalRecharge:
                PlayerActTotalRecharge.RefreshTotalRechargeActionInfo(actNum)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -264,7 +264,7 @@
#支持多活动分组编号的活动名
MultiActNumOperationActNameList = [OperationActionName_TotalRecharge, OperationActionName_CollectWords,
                                   OperationActionName_FlashGiftbag,
                                   OperationActionName_FlashGiftbag, OperationActionName_CostRebate,
                                   ]
#跨服运营活动表名定义