ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py
@@ -28,6 +28,7 @@
#---------------------------------------------------------------------
import GameWorld
import PlayerDBOper
import PyDataManager
import IPY_GameServer
import PlayerDBGSEvent
import CrossChampionship
@@ -38,6 +39,7 @@
import PyGameData
import ChConfig
import types
import time
#---------------------------------------------------------------------
#系统提示参数列表
NotifyCodeList = IPY_GameServer.IPY_NotifyCodeList()
@@ -449,4 +451,84 @@
            FuncOpenLogicDict[funcID](curPlayer)
    return
def AddOfflineUnprocessed(playerID, eventName, eventData, outtimeDays=30):
    '''添加玩家离线未处理的事件
    @param eventName: 事件名
    @param eventData: 事件数据,由功能自定定义,任意格式
    @param outtimeDays: 过期天数,0-永久, >0-指定天数, 默认30天
    '''
    playerRecMgr = PyDataManager.GetDBPlayerRecDataManager()
    recData = playerRecMgr.AddPlayerRecData(ShareDefine.Def_PlayerRecType_OfflineUnprocessed, playerID)
    recData.SetValue1(outtimeDays)
    recData.SetUserDataByKey("eventName", eventName)
    recData.SetUserDataByKey("eventData", eventData)
    GameWorld.Log("添加玩家离线未处理的事件: %s, %s, %s" % (eventName, outtimeDays, eventData), playerID)
    return
def DoOfflineUnprocessed(curPlayer, eventName, dofunc):
    '''执行处理玩家离线未处理的事件
    @param dofunc: 执行函数,参数[curPlayer, recData, eventName, eventData]
    '''
    if not dofunc:
        return
    playerID = curPlayer.GetPlayerID()
    playerRecMgr = PyDataManager.GetDBPlayerRecDataManager()
    recDataList = playerRecMgr.GetPlayerRecDataList(ShareDefine.Def_PlayerRecType_OfflineUnprocessed, playerID)
    delRecDataList = []
    # 需按添加顺序执行逻辑
    for recData in recDataList:
        if recData.GetUserDataByKey("eventName") != eventName:
            continue
        eventData = recData.GetUserDataByKey("eventData")
        GameWorld.Log("执行玩家上次离线前未处理事件: %s, %s" % (eventName, eventData), playerID)
        dofunc(curPlayer, recData, eventName, eventData)
        delRecDataList.append(recData)
    # 执行完后再统一删除
    for recData in delRecDataList:
        playerRecMgr.DelRecData(recData)
    return
def DelOfflineUnprocessed(eventName):
    ## 删除玩家离线未处理的事件
    playerRecMgr = PyDataManager.GetDBPlayerRecDataManager()
    recDict = playerRecMgr.GetPlayerRecDataDict(ShareDefine.Def_PlayerRecType_OfflineUnprocessed)
    if not recDict:
        return
    delCnt = 0
    for recDataList in recDict.values():
        for recData in recDataList[::-1]: # 倒序处理删除到期
            if recData.GetUserDataByKey("eventName") != eventName:
                continue
            playerRecMgr.DelRecData(recData)
            delCnt += 1
    GameWorld.DebugLog("删除玩家离线未处理的事件: %s, delCnt=%s" % (eventName, delCnt))
    return
def DelOuttimeOfflineUnprocessed():
    ## 删除过期玩家离线未处理的事件
    playerRecMgr = PyDataManager.GetDBPlayerRecDataManager()
    recDict = playerRecMgr.GetPlayerRecDataDict(ShareDefine.Def_PlayerRecType_OfflineUnprocessed)
    if not recDict:
        return
    curTime = int(time.time())
    for recDataList in recDict.values():
        for recData in recDataList[::-1]: # 倒序处理删除到期
            recTime = recData.GetTime()
            outtimeDays = recData.GetValue1()
            if not outtimeDays:
                continue
            diffDays = GameWorld.GetDiff_Day(curTime, recTime) + 1
            if diffDays <= outtimeDays:
                continue
            playerRecMgr.DelRecData(recData)
            GameWorld.DebugLog("删除玩家离线未处理的过期事件: %s, %s" % (outtimeDays, recData.GetUserData()), recData.GetPlayerID())
    return
def DoOnDay():
    DelOuttimeOfflineUnprocessed()
    return