ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -53,10 +53,8 @@
import PlayerCrossChampionship
import GameFuncComm
import PlayerFamilyTaofa
import PlayerBossReborn
import PlayerWeekParty
import PlayerFeastWeekParty
import PlayerFeastTravel
import PlayerFeastLogin
import PlayerFeastWish
import PlayerActLogin
@@ -81,7 +79,6 @@
import PlayerActManyDayRecharge
import PlayerActSingleRecharge
import PlayerSpringSale
import GY_Query_BossFirstKill
import PlayerCrossYaomoBoss
import PlayerLuckyCloudBuy
import PlayerLuckyTreasure
@@ -90,6 +87,7 @@
import PlayerFuncSysPrivilege
import PlayerActTurntable
import PlayerTongTianLing
import OpenServerActivity
import CrossRealmPlayer
import ChNetSendPack
import PlayerArena
@@ -102,7 +100,6 @@
import PlayerFaQi
import SkillShell
import PlayerGubao
import PlayerShentong
import PlayerCustomAward
import PlayerZhanling
import PlayerTree
@@ -123,18 +120,29 @@
import PlayerActTask
import PlayerMail
import DBDataMgr
import PlayerViewCache
import UpdatePlayerName
import GameServerRefresh
import IPY_ServerDefine
import IPY_PlayerDefine
import CommFunc
from PyMongoDB import RecvPackToMapDB
import GMT_BroadCast
import PyMongoMain
import PlayerTalk
import PlayerHero
import PlayerPreset
import PlayerOnline
import PlayerBeauty
import PlayerTravel
import PlayerMingge
import TurnAttack
import PlayerHJG
import ObjPool
import DBFamily
import CrossPlayer
import CrossMsg
import CrossMgr
import ChEquip
import datetime
import time
@@ -407,6 +415,7 @@
def DoPlayerLogin(curPlayer, tick):
    #这里只做初始化逻辑
    curPlayer.SetDict(ChConfig.Def_PlayerKey_LoadMapIsLogin, 1)
    CrossPlayer.GetCrossPlayerMgr().RegistPlayer(curPlayer.GetPlayerID())
    
    #通知时间
    Sync_PyServerDataTimeToClient(curPlayer)
@@ -469,9 +478,7 @@
    SyncGuideState(curPlayer)
    
    #上线检查一次装备属性
    ItemControler.OnPlayerLogin(curPlayer)
    #更新服务器组ID
    PlayerControl.UpdPlayerServerGroupID(curPlayer)
    ItemControler.OnPlayerLogin(curPlayer)
    
    #上线学习技能
    #SkillCommon.PlayerLoginCheckLearnSkill(curPlayer)
@@ -617,8 +624,6 @@
    #PassiveBuffEffMng.OnLoginGFPassive(curPlayer)
    # 极品白拿
    PlayerFreeGoods.OnLogin(curPlayer)
    # BOSS复活活动
    PlayerBossReborn.OnLogin(curPlayer)
    # 周狂欢活动
    PlayerWeekParty.OnLogin(curPlayer)
    # 购买次数礼包活动
@@ -637,8 +642,6 @@
    PlayerFeastLogin.OnPlayerLogin(curPlayer)
    # 节日祝福活动
    PlayerFeastWish.OnPlayerLogin(curPlayer)
    # 节日游历活动
    PlayerFeastTravel.OnPlayerLogin(curPlayer)
    # 登录奖励活动
    PlayerActLogin.OnLogin(curPlayer)
    # 炼器活动
@@ -651,6 +654,8 @@
    PlayerActSingleRecharge.OnPlayerLogin(curPlayer)
    # 转盘活动
    PlayerActTurntable.OnPlayerLogin(curPlayer)
    # 分支下载奖励记录通知
    SyncPackDownloadAward(curPlayer)
    # 登录触发功能开启(老号处理)
    GameFuncComm.DoFuncOpenLogic(curPlayer)
    # 神兽
@@ -664,8 +669,6 @@
    PlayerFB.OnLogin(curPlayer)
    #技能专精信息
    #SkillShell.NotifyElementSkillInfo(curPlayer)
    #Boss首杀
    GY_Query_BossFirstKill.OnPlayerLogin(curPlayer)
    #通天令
    PlayerTongTianLing.OnPlayerLogin(curPlayer)
    #创角奖励
@@ -702,7 +705,7 @@
    curPlayer.SetState(0)   # 脱机挂恢复为正常上线
    curPlayer.SetCountryLastWeekHornor(0) # 通知数据库是否保存还是下线,做一次恢复,1为保存 0为正常下线
    
    PlayerControl.DoGMForbidenTalkOnLogin(curPlayer)
    PlayerControl.OnPlayerLogin(curPlayer)
    DataRecordPack.DR_PlayerLogin(curPlayer) # 放最后,记录等级、经验等信息
    return
@@ -718,12 +721,12 @@
    
    else:
        PyMongoMain.GetUserCtrlDB().OnPlayerLogin(curPlayer)
        GMT_BroadCast.OnPlayerLogin(curPlayer)
        PlayerHero.OnPlayerLogin(curPlayer)
        PlayerMail.OnPlayerLogin(curPlayer)
        PlayerHJG.OnPlayerLogin(curPlayer)
        PlayerXiangong.OnPlayerLogin(curPlayer)
        PlayerGubao.OnPlayerLogin(curPlayer)
        PlayerShentong.OnPlayerLogin(curPlayer)
        PlayerZhanling.OnPlayerLogin(curPlayer)
        PlayerTask.OnPlayerLogin(curPlayer)
        PlayerTree.OnPlayerLogin(curPlayer)
@@ -734,14 +737,223 @@
        UpdatePlayerName.OnPlayerLogin(curPlayer)
        PlayerActivity.OnPlayerLogin(curPlayer)
        PlayerLLMJ.OnPlayerLogin(curPlayer)
        PlayerBeauty.OnPlayerLogin(curPlayer)
        PlayerTravel.OnPlayerLogin(curPlayer)
        PlayerMingge.OnPlayerLogin(curPlayer)
        OpenServerActivity.OnPlayerLogin(curPlayer)
        PlayerPreset.OnPlayerLogin(curPlayer)
        CrossPlayer.OnPlayerLogin(curPlayer)
        
        __OnFixVersion(curPlayer) # 修正线上玩家数据用,暂时放最后
        # 上线查询一次充值订单
        curPlayer.SendDBQueryRecharge()
        # curPlayer.SendDBQueryRecharge() 不查了,由在线轮询触发即可
        SyncOnlineStateToCross(curPlayer, 1)
        
    # 通知GameServer地图最终登录成功了
    isMixServerFirstLogin = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MixServerFirstLogin)
    msg = str([isMixServerFirstLogin])
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "PlayerRealLoginOK", msg, len(msg))
    return
#def C2S_PlayerLoginOK(playerID):
#    ## 跨服登录成功后续处理
#    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
#    if not curPlayer:
#        return
#
#    PlayerFamily.CrossServer_PlayerLogin(curPlayer)
#    return
def __OnFixVersion(curPlayer):
    ''' 修正线上玩家数据内容
    每次有需要修正时,只要定义一个新的系统内容版本号  sysFixVersion , 然后玩家根据自身版本号进行逐步修正即可
    这样只用到一个key即可,不需要每次都定义新的key
    '''
    playerID = curPlayer.GetPlayerID()
    sysFixVersion = 2025123012 # 系统定义的最后一次修正版本号,一般以 yyyyMMddhh 定义为版本号
    playerVersion = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FixVersion)
    if not playerVersion:
        createRoleTime = curPlayer.GetCreateRoleTime() # 按创角
        ymd = createRoleTime.split(" ")[0]
        playerVersion = GameWorld.ToIntDef("%s00" % ymd.replace("-", ""))
        GameWorld.DebugLog("默认数据版本为创角日期: %s, %s" % (createRoleTime, playerVersion), playerID)
    if playerVersion == sysFixVersion:
        GameWorld.DebugLog("玩家当前数据版本号已是最新版本! playerVersion=%s" % (playerVersion), playerID)
        return
    GameWorld.Log("玩家当前数据版本号不等于系统版本号,开始修正! playerVersion=%s != %s" % (playerVersion, sysFixVersion), playerID)
    # 修正玩家装备生命数值: 策划调整了生命占比,同步修改了生命战力,故需修正线上玩家装备生命,防止战力下降
    fixVersion = 2025123012
    if playerVersion < fixVersion:
        ChEquip.FixRoleEquipHP(curPlayer, fixVersion)
        # 每个版本修正完需要立即更新到对应的版本号值,防止中间某个版本修正失败,导致重登后重复修正已经处理的版本
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FixVersion, fixVersion)
    # 其他
    # 需要按修正版本时间顺序依次处理!!!需要按修正版本时间顺序依次处理!!!需要按修正版本时间顺序依次处理!!!
    # 最终强制设置为最新版本号
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FixVersion, sysFixVersion)
    return
def GetSyncCrossServerIDAndFuncInfo():
    ## 获取需要同步给的目标跨服服务器ID及相关额外的功能信息
    dataEx = {}
    serverIDList = []
    # 公会
    if DBFamily.IsFamilyCross():
        crossFamilyServerID = DBDataMgr.GetFamilyMgr().GetCurCrossServerID()
        if crossFamilyServerID > 0:
            dataEx["crossFamilyServerID"] = crossFamilyServerID
            if crossFamilyServerID not in serverIDList:
                serverIDList.append(crossFamilyServerID)
    # 其他跨服功能
    return serverIDList, dataEx
def OnPlayerBaseInfoChange(curPlayer, refreshType=0):
    '''玩家基础信息变更同步更新其他功能,可以视为同步到以前的GameServer
    除了相关基础值变化同步外,上下线状态变更也会附带基础信息的同步
    '''
    playerID = curPlayer.GetPlayerID()
    crossPlayerMgr = CrossPlayer.GetCrossPlayerMgr()
    crossPlayer = crossPlayerMgr.FindCrossPlayer(playerID)
    if not crossPlayer:
        return
    # 公会成员
    PlayerFamily.RefreshFamilyMember(crossPlayer)
    # 相关排行榜
    if refreshType == IPY_PlayerDefine.CDBPlayerRefresh_PlayerName:
        PlayerBillboard.UpdatePlayerBillboardName(curPlayer)
    # 社交名待更新
    # --------------------------------------------------------------
    # 同步给相关跨服
    tick = GameWorld.GetGameWorld().GetTick()
    lastSyncTick = curPlayer.GetDictByKey("S2C_PlayerBaseInfo")
    if lastSyncTick and (tick - lastSyncTick) <= 2000:
        # 短时间内只同步一次
        return
    curPlayer.SetDict("S2C_PlayerBaseInfo", tick)
    if refreshType == IPY_PlayerDefine.CDBPlayerRefresh_LV:
        if curPlayer.GetLV() < 20:
            return
    serverIDList = GetSyncCrossServerIDAndFuncInfo()[0]
    if not serverIDList:
        return
    playerID = curPlayer.GetPlayerID()
    baseInfo = PlayerViewCache.GetPlayerBaseViewInfo(playerID, curPlayer)
    dataMsg = {"baseInfo":baseInfo}
    CrossMsg.SendToCrossServer(ShareDefine.S2C_PlayerBaseInfo, dataMsg, serverIDList, playerID)
    return
def S2C_PlayerBaseInfo(dataMsg, fromServerID, playerID):
    isOnline = True
    baseInfo = dataMsg["baseInfo"]
    UpdCrossPlayerFromMainServer(fromServerID, playerID, baseInfo, isOnline)
    return
def UpdCrossPlayerFromMainServer(fromServerID, playerID, baseInfo, isOnline):
    ## 更新CrossPlayer根据游戏服同步的信息
    # @return: crossPlayer
    crossPlayerMgr = CrossPlayer.GetCrossPlayerMgr()
    crossPlayer = crossPlayerMgr.FindCrossPlayer(playerID)
    if not crossPlayer:
        crossPlayer = crossPlayerMgr.RegistPlayer(playerID) # 跨服不存在该玩家信息,直接注册,不用管是否在线
    # 信息更新
    curCache = PlayerViewCache.UpdPlayerBaseViewInfo(playerID, baseInfo, not isOnline)
    crossPlayer.UpdByViewCache(curCache, fromServerID)
    # 公会成员更新
    PlayerFamily.RefreshFamilyMember(crossPlayer)
    # 如果是离线的处理
    if not isOnline:
        PlayerViewCache.OnCrossPlayerLogout(crossPlayer)
        crossPlayerMgr.DeletePlayer(playerID)
    return crossPlayer
def SyncOnlinePlayerToCross(toCrossServerID):
    ## 重新同步在线玩家,确保目标服务器有跨服玩家基础数据,一般用于重连跨服、或某些跨服功能开启时重新同步确保目标服务器有本服在线玩家基本数据信息
    playerManager = GameWorld.GetPlayerManager()
    for i in xrange(playerManager.OnlineCount()):
        curPlayer = playerManager.OnlineAt(i)
        if not GameWorld.IsNormalPlayer(curPlayer):
            continue
        SyncOnlineStateToCross(curPlayer, 1, False, toCrossServerID)
    return
def SyncOnlineStateToCross(curPlayer, isOnline, isLoginout=True, toCrossServerID=0):
    ## 同步玩家在线状态给相关跨服
    # @param isLoginout: 是否上下线的,重新连上跨服时也会重新同步
    playerID = curPlayer.GetPlayerID()
    # 游戏服、跨服通用,当做以前GameServer的Player处理
    crossPlayerMgr = CrossPlayer.GetCrossPlayerMgr()
    # 离线直接清除
    if not isOnline:
        crossPlayerMgr.DeletePlayer(playerID)
    serverIDList, dataEx = GetSyncCrossServerIDAndFuncInfo()
    if not serverIDList:
        # 没有需要同步的跨服不处理
        return
    if toCrossServerID:
        if toCrossServerID not in serverIDList:
            return
        serverIDList = [toCrossServerID] # 如果有指定,指同步给该服
    baseInfo = PlayerViewCache.GetPlayerBaseViewInfo(playerID, curPlayer)
    dataMsg = {"isOnline":isOnline, "isLoginout":isLoginout, "baseInfo":baseInfo}
    dataMsg.update(dataEx)
    CrossMsg.SendToCrossServer(ShareDefine.S2C_OnlineState, dataMsg, serverIDList, playerID)
    return
def S2C_OnlineState(dataMsg, fromServerID, playerID):
    ## 收到游戏服玩家在线状态同步
    isOnline = dataMsg["isOnline"]
    isLoginout = dataMsg["isLoginout"]
    baseInfo = dataMsg["baseInfo"]
    crossPlayer = UpdCrossPlayerFromMainServer(fromServerID, playerID, baseInfo, isOnline)
    # 其他跨服功能处理,暂时仅上下线时处理
    curServerID = GameWorld.GetGameWorld().GetServerID()
    if isLoginout:
        # 公会
        if "crossFamilyServerID" in dataMsg:
            crossFamilyServerID = dataMsg["crossFamilyServerID"]
            if curServerID == crossFamilyServerID:
                if isOnline:
                    PlayerFamily.OnCrossPlayerLogin(crossPlayer)
                else:
                    PlayerFamily.OnCrossPlayerLogout(crossPlayer)
        # 最后处理缓存,先放在更新中处理删除,有问题再放后面
        #if not isOnline:
        #    PlayerViewCache.OnCrossPlayerLogout(crossPlayer)
        #    CrossPlayer.GetCrossPlayerMgr().DeletePlayer(playerID)
    # 最后同步处理跨服登录成功
    #if isLoginout and isOnline:
    #    CrossMsg.SendToClientServer(ShareDefine.C2S_PlayerLoginOK, {}, [fromServerID], playerID)
    return
## 玩家扩展信息同步
@@ -767,8 +979,7 @@
    # 特殊说明: 如果地图没有完全初始化好,客户端断开或者异常等情况会触发RunGateGameServerMapServerKickOutPlayerNoSave
    # 那么在DoPlayerLogin 中设置的数据将不会被保存, 如会导致第一个任务重复触发问题,记录多次发送
    EventReport.WriteEvent_Entry(curPlayer, 4)
    #EventReport.EventReport(ShareDefine.Def_UserAction_FirstLogin, "", curPlayer)
    curPlayer.SetFightPoint(1) # 初始化为1倍消耗
    
    #---补满血满魔---
@@ -1024,10 +1235,6 @@
    
    #检查更新总战斗力
    #PlayerBillboard.UpdatePlayerFPTotalBillboard(curPlayer, True)
    EventReport.WriteEvent_FightPower(curPlayer)
    #清除在本地图离线记录信息
    PlayerControl.RemoveLeaveServerPlayerInfo(curPlayer.GetPlayerID())
    
    PyGameData.g_needRefreshMapServerState = True # 有玩家登录地图时设置需要刷新
    return
@@ -1204,6 +1411,10 @@
    
    #初始化英雄背包
    PlayerControl.Init_PackCount(curPlayer, ShareDefine.rptHero)
    #初始化卦玉背包
    PlayerControl.Init_PackCount(curPlayer, ShareDefine.rptMGGuayu, defaultMax=True, isSync=False)
    PlayerControl.Init_PackCount(curPlayer, ShareDefine.rptMGTuiyan, defaultMax=True, isSync=False)
    
    #初始化临时交换背包,默认最大个数
    PlayerControl.Init_PackCount(curPlayer, ShareDefine.rptTempSwap, defaultMax=True, isSync=False)
@@ -2094,6 +2305,8 @@
    #离线session
    EventReport.WriteEvent_session(curPlayer)
    
    #最后同步跨服服务器
    SyncOnlineStateToCross(curPlayer, 0)
    #需放最后
    PlayerOnline.OnPlayerLogoff(curPlayer)
    return
@@ -3115,54 +3328,6 @@
    curPlayer.Syn_OfflineTimeQueryResult() # 通知客服端离线时间
    return
#//B0 24 领取家族悬赏奖励 #tagReceiveFamilyArrestAward
#
#struct    tagReceiveFamilyArrestAward
#
#{
#    tagHead        Head;
#    DWORD        ArrestID;        //悬赏任务ID
#};
## 领取家族悬赏奖励
#  @param index: 玩家索引
#  @param clientData: 封包结构体
#  @param tick: 时间戳
#  @return: None
def ReceiveFamilyArrestAward(index, clientData, tick):
    return
#//B0 26 请求家族悬赏奖励领取情况 #tagQueryFamilyArrestAwardReceiveState
#
#struct    tagQueryFamilyArrestAwardReceiveState
#
#{
#    tagHead        Head;
#};
## 请求家族悬赏奖励领取情况
#  @param index: 玩家索引
#  @param clientData: 封包结构体
#  @param tick: 时间戳
#  @return: None
def QueryFamilyArrestAwardReceiveState(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    Sync_FamilyArrestAwardReceiveState(curPlayer)
    return
## 通知客户端家族悬赏任务奖励领取情况
#  @param curPlayer: 玩家实例
#  @return: None
def Sync_FamilyArrestAwardReceiveState(curPlayer):
    awardReceiveState = ChPyNetSendPack.tagFamilyArrestAwardReceiveState()
    awardReceiveState.Clear()
    state = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyArrestAwardState)
    awardReceiveState.ReceiveState = state
    NetPackCommon.SendFakePack(curPlayer, awardReceiveState)
    return
def PlayerOnDay(curPlayer):
    #玩法前瞻奖励
    gameNoticeAwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GameNoticeAwardState)
@@ -3219,7 +3384,7 @@
        PlayerSuccess.GetSuccessAward(curPlayer, dataEx)
    # 仙树免费减时
    elif rewardType == ChConfig.Def_RewardType_TreeFreeTime:
        PlayerTree.FreeReduceTreeLVTime(curPlayer)
        PlayerTree.FreeReduceTreeLVTime(curPlayer, dataEx)
    # 广告奖励
    elif rewardType == ChConfig.Def_RewardType_ADAward:
        OnGetADAward(curPlayer, dataEx)
@@ -3232,6 +3397,18 @@
    # 阵容推荐奖励
    elif rewardType == ChConfig.Def_RewardType_LineupRecommend:
        PlayerHero.GetLineupRecommendAward(curPlayer, dataEx, dataExStr)
    # 功能开启奖励
    elif rewardType == ChConfig.Def_RewardType_OpenFunc:
        GameFuncComm.GetFuncOpenAward(curPlayer, dataEx)
    # 红颜等级奖励
    elif rewardType == ChConfig.Def_RewardType_BeautyLVAward:
        PlayerBeauty.GetBeautyLVAward(curPlayer, dataEx)
    # 领取分包下载奖励
    elif rewardType == ChConfig.Def_RewardType_DownLoad:
        GetDownloadAward(curPlayer, dataEx)
    # 开服庆典积分阶段奖励
    elif rewardType == ChConfig.Def_RewardType_OSACelebrationPointAward:
        OpenServerActivity.GetOSACelebrationPointAward(curPlayer, dataEx)
        
        
    # 每日免费直购礼包
@@ -3258,15 +3435,9 @@
    # 领取单笔累充领取
    elif rewardType == ChConfig.Def_RewardType_SingleRecharge:
        PlayerActSingleRecharge.OnGetSingleRechargeAward(curPlayer, dataEx, dataExStr)
    # 领取boss复活活动奖励
    elif rewardType == ChConfig.Def_RewardType_BossReborn:
        PlayerBossReborn.GetBossRebornActionAward(curPlayer, dataEx)
    # 领取许愿池奖励
    elif rewardType == ChConfig.Def_RewardType_WishingWell:
        PlayerWishingWell.DoGetWishingAward(curPlayer)
    # 功能开启奖励
    elif rewardType == ChConfig.Def_RewardType_OpenFunc:
        GameFuncComm.GetFuncOpenAward(curPlayer, dataEx)
    # 领取周狂欢活动奖励
    elif rewardType == ChConfig.Def_RewardType_WeekPartyAct:
        PlayerWeekParty.GetWeekPartyActionAward(curPlayer, dataEx, dataExStr)
@@ -3285,9 +3456,6 @@
    # 领取节日登录奖励
    elif rewardType == ChConfig.Def_RewardType_FeastLogin:
        PlayerFeastLogin.GetFeastLoginAward(curPlayer, dataEx)
    # 领取节日游历奖励
    elif rewardType == ChConfig.Def_RewardType_FeastTravel:
        PlayerFeastTravel.GetFeastTravelAward(curPlayer, dataEx)
    # 领取登录活动奖励
    elif rewardType == ChConfig.Def_RewardType_ActLoginAwardNew:
        PlayerActLoginNew.OnGetActLoginAward(curPlayer, dataEx, dataExStr)
@@ -3327,9 +3495,6 @@
    #历史累计充值领取
    elif rewardType == ChConfig.Def_RewardType_HistoryChargeAward:
        PlayerGoldGift.OnGetHistoryRechargeAward(curPlayer, dataEx)
    #在线特惠充值额外奖励
    elif rewardType == ChConfig.Def_RewardType_OnlineRechargeTH:
        PlayerCoin.OnGetOnlineRechargeTH(curPlayer)
    #创角奖励
    elif rewardType == ChConfig.Def_RewardType_CreateRole:
        OnGetCreateRoleAward(curPlayer)
@@ -3377,22 +3542,34 @@
        return
    adCntMax = ipyData.GetADCntMax()
    adCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ADCnt % adID)
    if adCnt >= adCntMax:
    if adCntMax and adCnt >= adCntMax:
        GameWorld.DebugLog("今日该广告奖励已达上限! adID=%s,adCnt=%s > %s" % (adID, adCnt, adCntMax))
        return
    adCnt += 1
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ADCnt % adID, adCnt)
    awardItemList = ipyData.GetADAwardItemList()
    adMapID = ipyData.GetADMapID()
    GameWorld.DebugLog("领取广告奖励! adID=%s,adCnt=%s,adMapID=%s,awardItemList=%s" % (adID, adCnt, adMapID, awardItemList))
    adAwardType = ipyData.GetADAwardType()
    adAwardValue = ipyData.GetADAwardValue()
    GameWorld.DebugLog("领取广告奖励! adID=%s,adCnt=%s,adAwardType=%s,adAwardValue=%s,awardItemList=%s" % (adID, adCnt, adAwardType, adAwardValue, awardItemList))
    SyncADCntInfo(curPlayer, [adID])
    
    if adMapID:
        FBCommon.AddFBADCnt(curPlayer, adMapID)
    if awardItemList:
        ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["ADAward", False, {}])
        
    # 领取祝福树充能奖励
    if adAwardType == 1:
        PlayerTree.GetTreeEnergyAward(curPlayer, False)
    # 副本次数
    elif adAwardType == 2:
        adMapID = adAwardValue
        FBCommon.AddFBADCnt(curPlayer, adMapID)
    # 寻宝
    elif adAwardType == 3:
        treasureType = adAwardValue
        PlayerTreasure.DoTreasure(curPlayer, treasureType, PlayerTreasure.CostType_ADFree)
    # 游历体力
    elif adAwardType == 4:
        PlayerTravel.AddTravelEnergy(curPlayer, adAwardValue)
    return
def ADCntOnDay(curPlayer):
@@ -3421,7 +3598,7 @@
        adCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ADCnt % adID)
        if not adCnt and syncADIDList == None:
            continue
        adInfo = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCADInfo)
        adInfo = ChPyNetSendPack.tagSCADInfo()
        adInfo.ADID = adID
        adInfo.ADCnt = adCnt
        adInfoList.append(adInfo)
@@ -3429,7 +3606,7 @@
    if not adInfoList:
        return
    
    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCADInfoList)
    clientPack = ChPyNetSendPack.tagSCADInfoList()
    clientPack.ADInfoList = adInfoList[:255]
    clientPack.Count = len(clientPack.ADInfoList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
@@ -3473,6 +3650,37 @@
    sendPack = ChPyNetSendPack.tagMCCreateRoleAwardState()
    sendPack.Clear()
    sendPack.GetState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CreateRoleAwardState)
    NetPackCommon.SendFakePack(curPlayer, sendPack)
    return
def GetDownloadAward(curPlayer, dataEx):
    ##分包下载奖励 dataEx 0直接领取 1发邮件
    playerID = curPlayer.GetPlayerID()
    downloadAwardNum = IpyGameDataPY.GetFuncCfg('DownReward', 2)
    curAwardNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DownloadAwardState)
    if curAwardNum == downloadAwardNum:
        GameWorld.DebugLog("已领取分包奖励! curAwardNum(%s) == downloadAwardNum(%s)" % (curAwardNum, downloadAwardNum), playerID)
        return
    awardItemList = IpyGameDataPY.GetFuncEvalCfg('DownReward', 1)
    if not awardItemList:
        return
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DownloadAwardState, downloadAwardNum)
    GameWorld.DebugLog("领取分包下载奖励: curAwardNum=%s,downloadAwardNum=%s" % (curAwardNum, downloadAwardNum), playerID)
    if dataEx == 1:
        PlayerMail.SendMailByKey('SubpackageDownload', curPlayer.GetID(), awardItemList)
    else:
        ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["PackDownload", False, {}])
    SyncPackDownloadAward(curPlayer)
    return
def SyncPackDownloadAward(curPlayer):
    #分包下载奖励记录通知
    downloadAwardNum = IpyGameDataPY.GetFuncCfg('DownReward', 2)
    sendPack = ChPyNetSendPack.tagMCPackDownloadRecord()
    sendPack.Clear()
    sendPack.Record = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DownloadAwardState) == downloadAwardNum
    NetPackCommon.SendFakePack(curPlayer, sendPack)
    return
@@ -3704,7 +3912,7 @@
#  @param curPlayer 
#  @param tick 时间戳
#  @return None
def Sync_PyServerDataTimeToClient(curPlayer):
def Sync_PyServerDataTimeToClient(curPlayer=None):
    # 服务器时间
    serverTime = GameWorld.GetCurrentTime()
    if not serverTime:
@@ -3719,10 +3927,13 @@
    serverDateTime.Minute = serverTime.minute
    serverDateTime.Second = serverTime.second
    serverDateTime.MicSecond = serverTime.microsecond
    serverDateTime.CrossServerTime = GameWorld.GetCrossServerTimeStr()
    serverDateTime.CrossServerTime = GameWorld.ChangeTimeNumToStr(CrossMgr.GetSSServerMgr().GetCrossTime())
    
    # 通知客户端同步时间
    NetPackCommon.SendFakePack(curPlayer, serverDateTime)
    if curPlayer:
        NetPackCommon.SendFakePack(curPlayer, serverDateTime)
    else:
        NetPackCommon.SendFackPackOnline(serverDateTime)
    return
## 通知开服天数