ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -35,43 +35,28 @@
import ChPyNetSendPack
import DataRecordPack
import PlayerBillboard
import PlayerLVAward
import PlayerGoldGift
import PlayerSignDay
import PlayerPrestigeSys
import PlayerFamily
import PlayerLoginDayAward
import PlayerGoldInvest
import PlayerActivity
import FBCommon
import PlayerWishingWell
import PlayerSuccess
import PlayerFreeGoods
import GameFuncComm
import PlayerFamilyTaofa
import PlayerFeastLogin
import PlayerFeastWish
import PlayerActLogin
import PlayerTreasure
import IpyGameDataPY
import EventReport
import PassiveBuffEffMng
import PlayerFlashSale
import PlayerFlashGiftbag
import PlayerDailyGiftbag
import PlayerActBuyOne
import PlayerActGrowupBuy
import PlayerActCollectWords
import PlayerActTotalRecharge
import PlayerActLianqi
import PlayerActGodGift
import PlayerActFamilyCTGAssist
import PlayerActManyDayRecharge
import PlayerActSingleRecharge
import PlayerSpringSale
import PlayerLuckyTreasure
import PlayerFuncSysPrivilege
import PlayerActTurntable
import OpenServerActivity
import ChNetSendPack
import PlayerArena
@@ -99,7 +84,6 @@
import PlayerActBuyCountGift
import PlayerActLunhuidian
import PlayerActFamilyGCZ
import PlayerActYunshi
import PlayerActTask
import PlayerMail
import DBDataMgr
@@ -164,10 +148,6 @@
    if FBLogic.PlayerLoginInFBCheck(curPlayer, tick):
        #玩家是第一次登录, 并且玩家需要踢回原来地图
        return
    #刷新人物日期状态
    #GameWorld.Log('PlayerEventCounter.UpdatePlayerLoginTime')
    PlayerEventCounter.UpdatePlayerLoginTime(curPlayer)
    return
#// A1 20 货币兑换 #tagCMMoneyExchange
@@ -400,11 +380,15 @@
    Sync_OpenServerDay(curPlayer)
    #通知玩家基本信息
    curPlayer.Sync_ClientPlayerLogin()  #01 02 玩家初始化#tagCDBPlayer
    SyncSettingData(curPlayer)
    
    # 屏蔽跨服下关闭和子服重复的数据的发送 pushsend接口, notifyall正常发送
    # !!!必要发送的数据要注意位置
    if GameWorld.IsCrossServer():
        curPlayer.SetForbiddenSyncClientState(True)
    # !!!先处理检查OnDay,再处理玩家登录的功能数据,防止某些功能login处理数据后又被onday重置
    PlayerEventCounter.UpdatePlayerLoginTime(curPlayer)
    
    __DoPlayerLoginServer(curPlayer, tick)
    
@@ -481,7 +465,7 @@
    EventReport.WriteEvent_login(curPlayer)
    
    # 合服首登处理
    __DoMixServerFirstLogin(curPlayer)
    #__DoMixServerFirstLogin(curPlayer)
    PlayerBillboard.BillboardOnLogin(curPlayer)
    
    #玩家扩展信息
@@ -489,9 +473,6 @@
    
    #PKģʽ
    #SyncPKModel(curPlayer)
    # 通知等级奖励领取记录
    PlayerLVAward.Sync_LVAwardGetRecordInfo(curPlayer)
    
    PlayerCoin.OnLogin(curPlayer)
    # 首充/天天首充/充值豪礼
@@ -517,9 +498,6 @@
    
    PlayerTreasure.OnTreasureLogin(curPlayer)
    
    # 通知累计登陆礼
    PlayerLoginDayAward.OnLoginNotifyLoginDayAward(curPlayer)
    # 副本进入时间
    FBCommon.FBOnLogin(curPlayer)
    
@@ -538,8 +516,6 @@
    #同步自动战斗配置记录
#    Sync_AutoFightSetting(curPlayer)
    
    PlayerFamily.OnPlayerLogin(curPlayer, tick)
    # 竞技场
    PlayerArena.OnLogin(curPlayer)
    
@@ -550,16 +526,6 @@
    #NotifyPlayerBasePoint(curPlayer)
    #累计充值
    PlayerActTotalRecharge.OnPlayerLogin(curPlayer)
    #成长必买
    PlayerActGrowupBuy.OnPlayerLogin(curPlayer)
    #限时特惠
    PlayerSpringSale.OnPlayerLogin(curPlayer)
    #限时礼包
    PlayerFlashGiftbag.OnPlayerLogin(curPlayer)
    #每日礼包
    PlayerDailyGiftbag.OnPlayerLogin(curPlayer)
    #限时抢购
    PlayerFlashSale.OnPlayerLogin(curPlayer)
    #买一送多活动
    PlayerActBuyOne.OnPlayerLogin(curPlayer)
    #仙盟充值互助
@@ -571,44 +537,24 @@
    FunctionNPCCommon.ShopItemOnLogin(curPlayer)
    # 通知设置的被动功法
    #PassiveBuffEffMng.OnLoginGFPassive(curPlayer)
    # 极品白拿
    PlayerFreeGoods.OnLogin(curPlayer)
    # 购买次数礼包活动
    PlayerActBuyCountGift.OnPlayerLogin(curPlayer)
    # 任务活动
    PlayerActTask.OnPlayerLogin(curPlayer)
    # 运势活动
    PlayerActYunshi.OnPlayerLogin(curPlayer)
    # 轮回殿活动
    PlayerActLunhuidian.OnPlayerLogin(curPlayer)
    # 登录活动
    PlayerActLoginNew.OnPlayerLogin(curPlayer)
    # 节日登录活动
    PlayerFeastLogin.OnPlayerLogin(curPlayer)
    # 节日祝福活动
    PlayerFeastWish.OnPlayerLogin(curPlayer)
    # 登录奖励活动
    PlayerActLogin.OnLogin(curPlayer)
    # 炼器活动
    PlayerActLianqi.OnPlayerLogin(curPlayer)
    # 天帝礼包活动
    PlayerActGodGift.OnPlayerLogin(curPlayer)
    # 多日连充活动
    PlayerActManyDayRecharge.OnPlayerLogin(curPlayer)
    # 单笔累充活动
    PlayerActSingleRecharge.OnPlayerLogin(curPlayer)
    # 转盘活动
    PlayerActTurntable.OnPlayerLogin(curPlayer)
    # 分支下载奖励记录通知
    SyncPackDownloadAward(curPlayer)
    # 登录触发功能开启(老号处理)
    GameFuncComm.DoFuncOpenLogic(curPlayer)
    # 神兽
    PlayerDogz.OnPlayerLogin(curPlayer)
    # 许愿池
    PlayerWishingWell.OnLogin(curPlayer)
    #幸运鉴宝
    PlayerLuckyTreasure.OnLogin(curPlayer)
    # 小助手
    SyncLittleHelper(curPlayer)
    PlayerFB.OnLogin(curPlayer)
@@ -665,6 +611,7 @@
    else:
        PyMongoMain.GetUserCtrlDB().OnPlayerLogin(curPlayer)
        GMT_BroadCast.OnPlayerLogin(curPlayer)
        PlayerFamily.OnPlayerLogin(curPlayer, tick)
        PlayerHero.OnPlayerLogin(curPlayer)
        PlayerMail.OnPlayerLogin(curPlayer)
        PlayerHJG.OnPlayerLogin(curPlayer)
@@ -686,6 +633,7 @@
        OpenServerActivity.OnPlayerLogin(curPlayer)
        PlayerPreset.OnPlayerLogin(curPlayer)
        CrossPlayer.OnPlayerLogin(curPlayer)
        PlayerActLunhuidian.OnPlayerLogin(curPlayer)
        
        __OnFixVersion(curPlayer) # 修正线上玩家数据用,暂时放最后
        # 上线查询一次充值订单
@@ -781,11 +729,16 @@
    
    # --------------------------------------------------------------
    
    syncCD = 2000
    if refreshType == IPY_PlayerDefine.CDBPlayerRefresh_FightPower:
        syncCD = 60 * 1000
    # 同步给相关跨服
    tick = GameWorld.GetGameWorld().GetTick()
    lastSyncTick = curPlayer.GetDictByKey("S2C_PlayerBaseInfo")
    if lastSyncTick and (tick - lastSyncTick) <= 2000:
    if lastSyncTick and (tick - lastSyncTick) <= syncCD:
        # 短时间内只同步一次
        #GameWorld.DebugLog("同步基础属性CD中! refreshType=%s,syncCD=%s,pass=%s" % (refreshType, syncCD, tick - lastSyncTick))
        return
    curPlayer.SetDict("S2C_PlayerBaseInfo", tick)
    
@@ -870,29 +823,34 @@
    return
def S2C_OnlineState(dataMsg, fromServerID, playerID):
    ## 收到游戏服玩家在线状态同步
    '''收到游戏服玩家在线状态同步
    跨服收到在线状态同步时都视为在跨服上线,需要处理跨服在线/上线的逻辑
    不然在跨服维护游戏服不维护的情况下,等跨服重开后,游戏服重新同步在线玩家,此时如果跨服不处理登录逻辑,会少同步封包
    如公会,跨服维护之后登录的玩家会取不到公会数据,等跨服重开后,需视为登录重新同步
    与跨服重连一样的道理,都是重新同步所有信息
    '''
    isOnline = dataMsg["isOnline"]
    isLoginout = dataMsg["isLoginout"]
    #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:
    # 公会
    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:
@@ -1247,7 +1205,8 @@
        #到此处已经可以保存数据,即使客户端不回包断线
        #原 //01 07 地图读取OK#tagCInitMapOK 逻辑 直接调用
        __Func_LoadMapOK(index, tick)
        GameServerRefresh.GameSever_PlayerInitOK(index, tick)
        DoPlayerRealLoginOK(curPlayer, tick)
        #GameServerRefresh.GameSever_PlayerInitOK(index, tick) GameServer已废弃,不再执行该逻辑
    except:
        curPlayer.Kick(IPY_GameWorld.disWaitForPlayerLoinError)
        import traceback
@@ -1561,9 +1520,6 @@
    #申请得到奖励物品
    #curPlayer.DataServer_CheckPrizeItem()
    #防止玩家读取地图时未触发OnDay,读取地图后再次验证(2009.9.11)
    PlayerEventCounter.UpdatePlayerLoginTime(curPlayer)
    
    #设置阵营
    if curPlayer.GetFaction() != ChConfig.CampType_Neutral \
@@ -2260,6 +2216,76 @@
        return
    
    curPlayer.SetSetting(setting)
    return
#// A1 31 前端自定义保存设置内容 #tagCSSettingData
#
#struct tagCSSettingData
#{
#    tagHead        Head;
#    BYTE        KeyNum;        // 自定义key编号,后端使用数字key存储,前端自行进行转换定义,限制100个
#    BYTE        DataLen;
#    char        SetData[DataLen];    //自定义保存的内容
#};
def OnSettingData(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    keyNum = clientData.KeyNum
    setData = clientData.SetData
    setData = setData.replace(" ", "") # 去空格
    keyStr = str(keyNum)
    gameRecMgr = DBDataMgr.GetGameRecMgr()
    preSetRecMgr = gameRecMgr.GetRecTypeIDMgr(ShareDefine.Def_GameRecType_Setting, playerID)
    recData = preSetRecMgr.GetOneRecData(True)
    if not recData:
        return
    dataDict = recData.GetUserDict()
    if not setData:
        dataDict.pop(keyStr, None)
    else:
        keyMax = 100
        if keyStr not in dataDict:
            if len(dataDict) >= keyMax:
                GameWorld.ErrLog("存储个数达到上限! keyMax=%s" % keyMax)
                return
        dataDict[keyStr] = setData
    SyncSettingData(curPlayer, keyStr)
    return
def SyncSettingData(curPlayer, keyStr=""):
    playerID = curPlayer.GetPlayerID()
    gameRecMgr = DBDataMgr.GetGameRecMgr()
    preSetRecMgr = gameRecMgr.GetRecTypeIDMgr(ShareDefine.Def_GameRecType_Setting, playerID)
    recData = preSetRecMgr.GetOneRecData()
    if not recData:
        return
    dataDict = recData.GetUserDict()
    settingDataList = []
    syncKeyList = [keyStr] if keyStr else dataDict.keys()
    for keyStr in syncKeyList:
        if keyStr in dataDict:
            setData = dataDict[keyStr]
        else:
            setData = ""
        keyNum = GameWorld.ToIntDef(keyStr, None)
        if keyNum == None:
            continue
        sData = ChPyNetSendPack.tagSCSettingData()
        sData.KeyNum = keyNum
        sData.SetData = setData
        sData.DataLen = len(sData.SetData)
        settingDataList.append(sData)
    if not settingDataList:
        return
    clientPack = ChPyNetSendPack.tagSCSettingDataInfo()
    clientPack.SettingDataList = settingDataList
    clientPack.DataCnt = len(clientPack.SettingDataList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
#// A2 29 设置小助手 #tagCMSetLittleHelper
@@ -3323,20 +3349,14 @@
    # 开服庆典积分阶段奖励 
    elif rewardType == ChConfig.Def_RewardType_OSACelebrationPointAward:
        OpenServerActivity.GetOSACelebrationPointAward(curPlayer, dataEx)
    # 轮回殿奖励
    elif rewardType == ChConfig.Def_RewardType_LunhuidianAward:
        PlayerActLunhuidian.GetLunhuidianAward(curPlayer, dataEx, dataExStr)
        
    # 每日免费直购礼包
    elif rewardType == ChConfig.Def_RewardType_DayFreeGoldGift:
        PlayerDailyGiftbag.OnGetDailyFreeGiftbag(curPlayer)
    # 玩家等级奖励
    elif rewardType == ChConfig.Def_RewardType_LVAward:
        PlayerLVAward.GetPlayerLVAward(curPlayer, dataEx)
    # 首充礼包奖励
    elif rewardType == ChConfig.Def_RewardType_FirstCharge:
        PlayerGoldGift.GetPlayerFirstCharge(curPlayer, dataEx, dataExStr)
    # 领取极品白拿
    elif rewardType == ChConfig.Def_RewardType_FreeGoods:
        PlayerFreeGoods.OnGetFreeGoods(curPlayer, dataEx)
    # 领取累计充值奖励
    elif rewardType == ChConfig.Def_RewardType_TotalRecharge:
        PlayerActTotalRecharge.OnGetTotalRechargeAward(curPlayer, dataEx, dataExStr)
@@ -3346,15 +3366,6 @@
    # 领取单笔累充领取
    elif rewardType == ChConfig.Def_RewardType_SingleRecharge:
        PlayerActSingleRecharge.OnGetSingleRechargeAward(curPlayer, dataEx, dataExStr)
    # 领取许愿池奖励
    elif rewardType == ChConfig.Def_RewardType_WishingWell:
        PlayerWishingWell.DoGetWishingAward(curPlayer)
    # 领取登录奖励活动奖励
    elif rewardType == ChConfig.Def_RewardType_ActLoginAwardAct:
        PlayerActLogin.GetLoginAwardActionAward(curPlayer, dataEx, dataExStr)
    # 领取节日登录奖励
    elif rewardType == ChConfig.Def_RewardType_FeastLogin:
        PlayerFeastLogin.GetFeastLoginAward(curPlayer, dataEx)
    # 领取登录活动奖励
    elif rewardType == ChConfig.Def_RewardType_ActLoginAwardNew:
        PlayerActLoginNew.OnGetActLoginAward(curPlayer, dataEx, dataExStr)
@@ -3379,9 +3390,6 @@
    # 寻宝累计次数奖励
    elif rewardType == ChConfig.Def_RewardType_TreasureCntAward:
        PlayerTreasure.GetTreasureCntAward(curPlayer, dataEx, dataExStr)
    # 轮回殿奖励
    elif rewardType == ChConfig.Def_RewardType_LunhuidianAward:
        PlayerActLunhuidian.GetLunhuidianAward(curPlayer, dataEx, dataExStr)
    #历史累计充值领取
    elif rewardType == ChConfig.Def_RewardType_HistoryChargeAward:
        PlayerGoldGift.OnGetHistoryRechargeAward(curPlayer, dataEx)