ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTotalRecharge.py
@@ -9,7 +9,7 @@
# @date 2018-7-16
# @version 1.0
#
# 详细描述: 累计充值X元活动
# 详细描述: 累计充值X元活动,支持多个累充活动同时存在,需要多个运营活动时间表配置
#
#-------------------------------------------------------------------------------
#"""Version = 2018-7-16 12:00"""
@@ -28,10 +28,13 @@
import GameWorld
import ChConfig
def GetTemplateID(cfgID, dayIndex):
def GetTemplateID(cfgID, dayIndex, actNum):
    if cfgID == None or dayIndex == None:
        return 0
    ipyData = IpyGameDataPY.GetIpyGameData("ActTotalRecharge", cfgID)
    if actNum == 1:
        ipyData = IpyGameDataPY.GetIpyGameData("ActTotalRecharge", cfgID)
    else:
        ipyData = IpyGameDataPY.GetIpyGameData("ActTotalRecharge2", cfgID)
    if not ipyData:
        return 0
    templateIDList = ipyData.GetTemplateIDList()
@@ -39,68 +42,83 @@
    return templateID
def OnPlayerLogin(curPlayer):
    isReset = __CheckPlayerTotalRechargeAction(curPlayer)
    # 活动1
    actNum = 1
    isReset = __CheckPlayerTotalRechargeAction(curPlayer, actNum)
    if not isReset:
        actTotalRechargeInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge, {})
        # 活动中同步活动信息
        if actTotalRechargeInfo.get(ShareDefine.ActKey_State):
            Sync_TotalRechargeActionInfo(curPlayer)
            Sync_TotalRechargeInfo(curPlayer)
            Sync_TotalRechargeActionInfo(curPlayer, actNum)
            Sync_TotalRechargeInfo(curPlayer, actNum)
    # 活动2
    actNum = 2
    isReset = __CheckPlayerTotalRechargeAction(curPlayer, actNum)
    if not isReset:
        actTotalRechargeInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge2, {})
        # 活动中同步活动信息
        if actTotalRechargeInfo.get(ShareDefine.ActKey_State):
            Sync_TotalRechargeActionInfo(curPlayer, actNum)
            Sync_TotalRechargeInfo(curPlayer, actNum)
    return
def RefreshTotalRechargeActionInfo():
def RefreshTotalRechargeActionInfo(actNum):
    ## 收到GameServer同步的活动信息,刷新活动信息
    playerManager = GameWorld.GetPlayerManager()
    for index in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(index)
        if curPlayer.GetID() == 0:
            continue
        __CheckPlayerTotalRechargeAction(curPlayer)
        __CheckPlayerTotalRechargeAction(curPlayer, actNum)
    return
def __CheckPlayerTotalRechargeAction(curPlayer):
def __CheckPlayerTotalRechargeAction(curPlayer, actNum):
    ## 检查玩家累计充值活动数据信息
    
    playerID = curPlayer.GetPlayerID()
    
    actTotalRechargeInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge, {})
    if actNum == 1:
        actTotalRechargeInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge, {})
    else:
        actTotalRechargeInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge2, {})
    TotalRechargeID = actTotalRechargeInfo.get(ShareDefine.ActKey_ID, 0)
    state = actTotalRechargeInfo.get(ShareDefine.ActKey_State, 0)
    
    playerTotalRechargeID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeID) # 玩家身上的活动ID
    playerTotalRechargeID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeID % actNum) # 玩家身上的活动ID
    
    # 活动ID 相同的话不处理
    if TotalRechargeID == playerTotalRechargeID:
        #GameWorld.DebugLog("累计充值活动ID不变,不处理!", curPlayer.GetPlayerID())
        GameWorld.DebugLog("累计充值活动ID不变,不处理!actNum=%s" % actNum, curPlayer.GetPlayerID())
        return
    actWorldLV = actTotalRechargeInfo.get(ShareDefine.ActKey_WorldLV, 0)
    playerWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeWorldLV)
    templateID = GetTemplateID(actTotalRechargeInfo.get(ShareDefine.ActKey_CfgID, 0), actTotalRechargeInfo.get(ShareDefine.ActKey_DayIndex, 0))
    playerTemplateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeTemplateID)
    playerWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeWorldLV % actNum)
    templateID = GetTemplateID(actTotalRechargeInfo.get(ShareDefine.ActKey_CfgID, 0), actTotalRechargeInfo.get(ShareDefine.ActKey_DayIndex, 0), actNum)
    playerTemplateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeTemplateID % actNum)
    
    GameWorld.DebugLog("累计充值重置! TotalRechargeID=%s,playerTotalRechargeID=%s,state=%s,templateID=%s,playerTemplateID=%s"
                       % (TotalRechargeID, playerTotalRechargeID, state, templateID, playerTemplateID), playerID)
    GameWorld.DebugLog("累计充值重置! actNum=%s,TotalRechargeID=%s,playerTotalRechargeID=%s,state=%s,templateID=%s,playerTemplateID=%s"
                       % (actNum, TotalRechargeID, playerTotalRechargeID, state, templateID, playerTemplateID), playerID)
    
    # 未领取的奖励邮件发放
    __SendTotalRechargeMail(curPlayer, playerTemplateID, playerWorldLV)
    __SendTotalRechargeMail(curPlayer, playerTemplateID, playerWorldLV, actNum)
    
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeID, TotalRechargeID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeTemplateID, templateID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeWorldLV, actWorldLV)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeGold, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeAwardRecord, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeID % actNum, TotalRechargeID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeTemplateID % actNum, templateID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeWorldLV % actNum, actWorldLV)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeGold % actNum, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeAwardRecord % actNum, 0)
    
    Sync_TotalRechargeActionInfo(curPlayer)
    Sync_TotalRechargeInfo(curPlayer)
    Sync_TotalRechargeActionInfo(curPlayer, actNum)
    Sync_TotalRechargeInfo(curPlayer, actNum)
    return True
def __SendTotalRechargeMail(curPlayer, playerTemplateID, playerWorldLV):
def __SendTotalRechargeMail(curPlayer, playerTemplateID, playerWorldLV, actNum):
    # 未领取的奖励邮件发放
    
    if not playerTemplateID:
        return
    
    curRechargeGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeGold)
    curRechargeGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeGold % actNum)
    if not curRechargeGold:
        return
    
@@ -110,7 +128,7 @@
    
    playerID = curPlayer.GetPlayerID()
    batchPlayerIDList, batchAddItemList, batchParamList = [], [], []
    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeAwardRecord)
    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeAwardRecord % actNum)
    job = curPlayer.GetJob()
    for ipyData in ipyDataList:
        awardIndex = ipyData.GetAwardIndex()
@@ -128,7 +146,7 @@
        batchParamList.append([needGold])
        
    if batchPlayerIDList:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeAwardRecord, awardRecord)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeAwardRecord % actNum, awardRecord)
        PlayerControl.SendMailBatch("TotalRechargeMail", batchPlayerIDList, batchAddItemList, batchParamList)
        
    return
@@ -137,58 +155,71 @@
    #{世界等级范围:{职业:[(物品ID,个数,是否绑定), ...]}}
    itemInfoDict = GameWorld.GetDictValueByRangeKey(itemDict, worldLV, {})
    if str(job) not in itemInfoDict:
        GameWorld.ErrLog('累计充值奖励未配置该职业itemDict=%s,job=%s'%(itemDict, job))
        GameWorld.ErrLog('累计充值奖励未配置该职业itemDict=%s,job=%s' % (itemDict, job))
        return []
    else:
        return itemInfoDict[str(job)]
    
def AddTotalRechargeGold(curPlayer, addGold):
def AddTotalRechargeGold(curPlayer, addGold, actNum):
    if addGold <= 0:
        return
   
    actTotalRechargeInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge, {})
    if actNum == 1:
        actTotalRechargeInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge, {})
    else:
        actTotalRechargeInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge2, {})
    if not actTotalRechargeInfo.get(ShareDefine.ActKey_State):
        GameWorld.DebugLog("累计充值活动当前未开启!")
        GameWorld.DebugLog("累计充值活动当前未开启! actNum=%s" % actNum)
        return
    
    actID = actTotalRechargeInfo.get(ShareDefine.ActKey_ID)
    templateID = GetTemplateID(actTotalRechargeInfo.get(ShareDefine.ActKey_CfgID, 0), actTotalRechargeInfo.get(ShareDefine.ActKey_DayIndex, 0))
    templateID = GetTemplateID(actTotalRechargeInfo.get(ShareDefine.ActKey_CfgID, 0), actTotalRechargeInfo.get(ShareDefine.ActKey_DayIndex, 0), actNum)
    if not actID or not templateID:
        GameWorld.ErrLog("累计充值活动数据异常!actID=%s,templateID=%s" % (actID, templateID), curPlayer.GetPlayerID())
        return
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeID, actID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeTemplateID, templateID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeID % actNum, actID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeTemplateID % actNum, templateID)
    
    curRechargeGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeGold)
    curRechargeGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeGold % actNum)
    updRechargeGold = curRechargeGold + addGold
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeGold, updRechargeGold)
    Sync_TotalRechargeInfo(curPlayer)
    GameWorld.DebugLog("玩家累计充值活动: actID=%s,templateID=%s,curRechargeGold=%s,addGold=%s,updRechargeGold=%s"
                       % (actID, templateID, curRechargeGold, addGold, updRechargeGold), curPlayer.GetPlayerID())
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeGold % actNum, updRechargeGold)
    Sync_TotalRechargeInfo(curPlayer, actNum)
    GameWorld.DebugLog("玩家累计充值活动: actNum=%s,actID=%s,templateID=%s,curRechargeGold=%s,addGold=%s,updRechargeGold=%s"
                       % (actNum, actID, templateID, curRechargeGold, addGold, updRechargeGold), curPlayer.GetPlayerID())
    return
def OnGetTotalRechargeAward(curPlayer, awardIndex):
    ## 领取累计充值奖励
def OnGetTotalRechargeAward(curPlayer, awardIndex, actNum):
    '''OnGetTotalRechargeAward
    @param awardIndex: 奖励索引
    @param actNum: 活动编号,如1 或 2 代表不同的活动
    '''
    actNum = GameWorld.ToIntDef(actNum, 0)
    if actNum <= 0:
        GameWorld.DebugLog("没有指定领取的累充活动编号! actNum=%s" % actNum)
        return
    playerID = curPlayer.GetPlayerID()
    
    actTotalRechargeInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge, {})
    if actNum == 1:
        actTotalRechargeInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge, {})
    else:
        actTotalRechargeInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge2, {})
    TotalRechargeID = actTotalRechargeInfo.get(ShareDefine.ActKey_ID, 0)
    state = actTotalRechargeInfo.get(ShareDefine.ActKey_State, 0)
    templateID = GetTemplateID(actTotalRechargeInfo.get(ShareDefine.ActKey_CfgID, 0), actTotalRechargeInfo.get(ShareDefine.ActKey_DayIndex, 0))
    templateID = GetTemplateID(actTotalRechargeInfo.get(ShareDefine.ActKey_CfgID, 0), actTotalRechargeInfo.get(ShareDefine.ActKey_DayIndex, 0), actNum)
    if not state or not templateID:
        GameWorld.DebugLog("没有累计充值活动,无法领奖!state=%s,templateID=%s" % (state, templateID), playerID)
        GameWorld.DebugLog("没有累计充值活动,无法领奖!actNum=%s,state=%s,templateID=%s" % (actNum, state, templateID), playerID)
        return
    
    playerTotalRechargeID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeID) # 玩家身上的活动ID
    playerTotalRechargeID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeID % actNum) # 玩家身上的活动ID
    if TotalRechargeID != playerTotalRechargeID:
        return
    
    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeAwardRecord)
    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeAwardRecord % actNum)
    if awardRecord & pow(2, awardIndex):
        GameWorld.DebugLog("已经领取过该累计充值活动奖励!awardIndex=%s" % awardIndex, playerID)
        GameWorld.DebugLog("已经领取过该累计充值活动奖励! actNum=%s,awardIndex=%s" % (actNum, awardIndex), playerID)
        return
    
    ipyDataList = IpyGameDataPY.GetIpyGameDataList("TotalRechargeTemplate", templateID)
@@ -202,17 +233,17 @@
            break
        
    if not awardIpyData:
        GameWorld.DebugLog("找不到该返利活动档位索引奖励!templateID=%s,awardIndex=%s" % (templateID, awardIndex), playerID)
        GameWorld.DebugLog("找不到该返利活动档位索引奖励!actNum=%s,templateID=%s,awardIndex=%s" % (actNum, templateID, awardIndex), playerID)
        return
    
    needGold = awardIpyData.GetNeedGold()
    actWorldLV = actTotalRechargeInfo.get(ShareDefine.ActKey_WorldLV, 0)
    awardItemList = __GetItemList(ipyData.GetAwardItem(), curPlayer.GetJob(), actWorldLV)
    
    curRechargeGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeGold)
    curRechargeGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeGold % actNum)
    if curRechargeGold < needGold:
        GameWorld.DebugLog("所需充值仙玉数不足,无法领取!templateID=%s,awardIndex=%s,needGold=%s,curRechargeGold=%s"
                           % (templateID, awardIndex, needGold, curRechargeGold), playerID)
        GameWorld.DebugLog("所需充值额度不足,无法领取!actNum=%s,templateID=%s,awardIndex=%s,needGold=%s,curRechargeGold=%s"
                           % (actNum, templateID, awardIndex, needGold, curRechargeGold), playerID)
        return
    
    needSpace = len(awardItemList)
@@ -221,32 +252,37 @@
        return
    
    awardRecord |= pow(2, awardIndex)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeAwardRecord, awardRecord)
    Sync_TotalRechargeInfo(curPlayer)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeAwardRecord % actNum, awardRecord)
    Sync_TotalRechargeInfo(curPlayer, actNum)
    
    notifyKey = awardIpyData.GetNotifyKey()
    if notifyKey:
        PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), needGold])
        
    for itemID, itemCount, isBind in awardItemList:
    for itemID, itemCount, _ in awardItemList:
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem])
        
    addDataDict = {"TemplateID":templateID, "NeedGold":needGold, "AwardIndex":awardIndex,
                   "ItemList":str(awardItemList)}
                   "ItemList":str(awardItemList), "ActNum":actNum}
    DataRecordPack.DR_FuncGiveItem(curPlayer, "TotalRechargeAward", addDataDict)
    return
def Sync_TotalRechargeInfo(curPlayer):
def Sync_TotalRechargeInfo(curPlayer, actNum):
    ## 通知累计充值玩家数据信息
    playerActInfo = ChPyNetSendPack.tagMCTotalRechargePlayerInfo()
    playerActInfo.GoldTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeGold)
    playerActInfo.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeAwardRecord)
    playerActInfo.ActNum = actNum
    playerActInfo.GoldTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeGold % actNum)
    playerActInfo.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeAwardRecord % actNum)
    NetPackCommon.SendFakePack(curPlayer, playerActInfo)
    return
def Sync_TotalRechargeActionInfo(curPlayer):
def Sync_TotalRechargeActionInfo(curPlayer, actNum):
    ## 通知累计充值活动信息
    actTotalRechargeInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge, {})
    if actNum == 1:
        actTotalRechargeInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge, {})
    else:
        actTotalRechargeInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge2, {})
    if not actTotalRechargeInfo:
        return
    
@@ -254,7 +290,10 @@
        return
    
    cfgID = actTotalRechargeInfo.get(ShareDefine.ActKey_CfgID)
    ipyData = IpyGameDataPY.GetIpyGameData("ActTotalRecharge", cfgID)
    if actNum == 1:
        ipyData = IpyGameDataPY.GetIpyGameData("ActTotalRecharge", cfgID)
    else:
        ipyData = IpyGameDataPY.GetIpyGameData("ActTotalRecharge2", cfgID)
    if not ipyData:
        return
    
@@ -265,6 +304,7 @@
    actWorldLV = actTotalRechargeInfo.get(ShareDefine.ActKey_WorldLV, 0)
    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
    actInfo = ChPyNetSendPack.tagMCActTotalRechargeInfo()
    actInfo.ActNum = actNum
    actInfo.StartDate = GameWorld.GetOperationActionDateStr(ipyData.GetStartDate(), openServerDay)
    actInfo.EndtDate = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)
    actInfo.LimitLV = ipyData.GetLVLimit()