hxp
2018-12-26 3a3ad99a1761438e31bc6860e94b43cb4f165513
ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
@@ -41,14 +41,10 @@
import PlayerBourse
import GameWorldActionTeHui
import PlayerXMZZ
import GameWorldMergePK
import GameWorldShopItem
import MergeChildMsg
import PlayerTruck
import PlayerMergeEvent
import HighLadder
import EventReport
import MergePlayer
import PlayerCompensation
import PlayerFamilyRedPacket
import PlayerFamilyStore
@@ -63,8 +59,14 @@
import IpyGameDataPY
import PlayerTalk
import PlayerGeTui
import PlayerStore
import GameWorldActionControl
import PlayerFBHelpBattle
import GMT_CTG
import PyGameData
import GMShell
import IPY_PlayerDefine
import CrossRealmPK
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -74,7 +76,15 @@
#  @return None
#  @remarks 登陆顺序, PlayerLogin->PlayerLoadMapState(PlayerLoginLoadMapOK), 此处未设置初始化状态
def PlayerLogin(index, tick):
    GameWorld.GetPsycoFunc(__Func_PlayerLogin)(index, tick)
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    try:
        __Func_PlayerLogin(curPlayer, tick)
    except:
        curPlayer.Kick(IPY_PlayerDefine.disWaitForPlayerLoinError)
        import traceback
        GameWorld.ErrLog("玩家上线逻辑错误~~~~~\r\n%s" % traceback.format_exc())
        if GameWorld.GetGameWorld().GetDebugLevel():
            raise Exception("玩家上线逻辑错误~~~~\r\n%s" % traceback.format_exc())
    return
#---------------------------------------------------------------------
@@ -83,10 +93,10 @@
#  @param tick 当前时间
#  @return None
#  @remarks 登陆顺序, PlayerLogin->PlayerLoadMapState(PlayerLoginLoadMapOK), 此处未设置初始化状态
def __Func_PlayerLogin(index, tick):
def __Func_PlayerLogin(curPlayer, tick):
    
    #玩家登录初始化
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    GameWorld.Log("__Func_PlayerLogin mapID=%s" % curPlayer.GetMapID(), curPlayer.GetPlayerID())
    curPlayer.SetDict(ChConfig.Def_PDict_LoginMapID, curPlayer.GetMapID())
    #玩家在线时间初始化
    InitPlayerOnLineTime(curPlayer, tick)
    #玩家响应信息初始化
@@ -108,16 +118,10 @@
        #通知玩家登陆信息,来自运营方
        #DoLogic_LoginUserData(curPlayer)
    
        #通知开服天数
        PlayerEventCounter.Sync_OpenServerDay(curPlayer)
        #通知开服天数, 登录时改为地图通知,因为GameServer的PlayerLogin在地图之后,前端有些功能处理需要提前得到开服天
        #PlayerEventCounter.Sync_OpenServerDay(curPlayer)
        # 通知广播信息
        GMCommon.SendBroadCastToClient(curPlayer)
        # 在非跨服服务器上线时,在跨服PK赛期间如果roomID不为0则重置
        #if not GameWorld.IsMergeServer() and GameWorldMergePK.IsMergePKMatchOpen() \
        #    and curPlayer.GetVsRoomId() != 0:
        #    PlayerControl.SetVsRoomId(curPlayer, 0)
    
        PlayerTruck.SyncPlayerTruckStartTime(curPlayer)
        #通知玩家交易所挂单情况
@@ -125,9 +129,6 @@
        #上线广播
        __CheckWorldNotifyOnLogin(curPlayer, tick)
        #上线奖励处理
        #PlayerMergeEvent.MergeEventOnPlayerLogin(curPlayer)
        #MergePlayer.OnPlayerLogin(curPlayer)
        
        #仙盟红包
        PlayerFamilyRedPacket.OnPlayerLogin(curPlayer)
@@ -141,7 +142,8 @@
        PlayerXMZZ.OnXMZZOnLogin(curPlayer)
        #等级奖励
        PlayerLVAward.OnPlayerLogin(curPlayer)
        #商店购买次数
        PlayerStore.OnPlayerLogin(curPlayer)
        #通知世界boss信息
        GameWorldBoss.OnPlayerLogin(curPlayer)
        #家族副本boss状态通知
@@ -154,7 +156,14 @@
        PlayerGeTui.CleanNewGuyCallBackGeTui(curPlayer.GetID())
        #活动
        GameWorldActionControl.OnPlayerLogin(curPlayer)
        #玩家等级记录
        PyGameData.g_todayPlayerLVDict[curPlayer.GetID()] = curPlayer.GetLV()
        #副本助战
        PlayerFBHelpBattle.OnHelpPlayerLogin(curPlayer)
        #跨服PK
        CrossRealmPK.OnPlayerLogin(curPlayer)
        
        GMShell.OnPlayerLogin(curPlayer)
        GMT_CTG.OnPlayerLogin(curPlayer)
        
    #通知地图服务器自己初始化成功
@@ -166,7 +175,7 @@
#  @return None
def __CheckWorldNotifyOnLogin(curPlayer, tick):
    # 跨服服务器不广播
    if GameWorld.IsMergeServer():
    if GameWorld.IsCrossServer():
        return
    
    limitLV = IpyGameDataPY.GetFuncCfg("BillBoardPlayerLoginNotify", 2) # 最低等级限制
@@ -240,44 +249,6 @@
    diff_Time = loginTime - logoffTime
    #天数 * 24小时 * 60 分钟 + 秒
    return diff_Time.days * 24 * 60 * 60 + diff_Time.seconds
## 统计客户端跨服赛激活时间
#  @param index 玩家索引
#  @return None
def SendMergeWarOpen(curPlayer):
    # 发送跨服赛服务器信息
    mapConfig = GameConfig.GetConfig()
    mergeServerIP = mapConfig.get("MergeServerIP")
    mergeServerPort = mapConfig.get("MergeServerPort")
    if not mergeServerIP:
        return
    mergeServerInfo = ChPyNetSendPack.tagMergeServerInfo()
    mergeServerInfo.ServerIPLen = len(mergeServerIP)
    mergeServerInfo.ServerIP = mergeServerIP
    mergeServerInfo.Port = mergeServerPort
    mergeServerInfo.IsMergeServer = GameWorld.IsMergeServer()
    NetPackCommon.SendFakePack(curPlayer, mergeServerInfo)
    return
## 跨服赛通知奖励
#  @param curPlayer: 玩家实例
#  @return: None
def MSGetReward(curPlayer):
    #PlayerCanGetReward.SynClient_CanGetRewardList(curPlayer)
    return
## 通知首次开服时间
#  @param curPlayer: 玩家实例
#  @return: None
def Sync_InitOpenServerTime(curPlayer):
#    initOpenServerTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime)
#    packData = ChPyNetSendPack.tagInitOpenServerTime()
#    packData.Clear()
#    packData.Time = initOpenServerTime
#    NetPackCommon.SendFakePack(curPlayer, packData)
    return
## 运营登陆信息处理
#  @param curPlayer
@@ -489,7 +460,16 @@
#  @return None
#  @remarks 函数详细说明.
def PlayerDisconnect(index, tick):
    GameWorld.GetPsycoFunc(__Func_PlayerDisconnect)(index, tick)
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    try:
        __Func_PlayerDisconnect(curPlayer, tick)
    except:
        import traceback
        GameWorld.ErrLog("玩家下线逻辑错误~~~~~\r\n%s" % traceback.format_exc())
        if GameWorld.GetGameWorld().GetDebugLevel():
            raise Exception("玩家下线逻辑错误~~~~\r\n%s" % traceback.format_exc())
    #调用底层下线
    curPlayer.DoDisconnect()
    return
## 玩家下线(封包参数)
@@ -497,11 +477,10 @@
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def __Func_PlayerDisconnect(index, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
def __Func_PlayerDisconnect(curPlayer, tick):
    
    #跨服匹配PK
    #GameWorldMergePK.OnLeaveServer(curPlayer)
    CrossRealmPK.OnLeaveServer(curPlayer)
    
    #组队玩家离线
    PlayerTeam.DoPlayerLogOffTeamLogic(curPlayer, tick)
@@ -513,11 +492,8 @@
    # 设置家族成员离线时间
    SetPlayerOfflineTime(curPlayer)
    
    #MergePlayer.OnPlayerLeaveGotoMergeServer(curPlayer, tick)
    #------------镖车逻辑
    #TruckPlayerDisconnectProcess(curPlayer, tick)
    #调用底层下线
    curPlayer.DoDisconnect()
    return
## 设置玩家离线时间
@@ -605,11 +581,6 @@
        curPlayer.SetFightPower(packValue)
        return
    if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr10:
        #设置玩家跨服预赛排位
        PlayerControl.SetMergeWarRank(curPlayer, packValue)
        return
    if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr2:
        #队伍相关相关审核开关状态
        PlayerTeam.SetTeamCheckState(curPlayer, packValue)
@@ -620,6 +591,10 @@
    elif packType == IPY_GameServer.CDBPlayerRefresh_LV:
        curPlayer.SetLV(packValue)
        PlayerSocial.UpdateSocialInfo(curPlayer, packType, packValue)
        #玩家等级记录
        playerID = curPlayer.GetID()
        if playerID in PyGameData.g_todayPlayerLVDict:
            PyGameData.g_todayPlayerLVDict[playerID] = packValue
    elif packType == IPY_GameServer.CDBPlayerRefresh_Job:
        curPlayer.SetJob(packValue)
@@ -649,6 +624,12 @@
    elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr9:
        PlayerControl.SetVIPExpireTime(curPlayer, packValue)
        
    elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr10:
        PlayerControl.SetChatBubbleBox(curPlayer, packValue)
    elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr11:
        PlayerControl.SetTodayXianyuanCoin(curPlayer, packValue)
    elif packType == IPY_GameServer.CDBPlayerRefresh_OperateInfo:
        curPlayer.SetOperateInfo(packValue);
    
@@ -662,7 +643,8 @@
    PlayerTeam.PlayerTeamMemberRefresh(curPlayer, packType, packValue, tick)
    #家族刷新
    PlayerFamily.PlayerRefresh(curPlayer, tick)
    #副本助战
    PlayerFBHelpBattle.UpdateCheckInPlayerInfoByRefresh(curPlayer, packType, packValue)
    return
## 玩家切换地图的响应(参数 -> 当前玩家,当前时间)
@@ -679,6 +661,8 @@
    GameWorld.Log("玩家 : %s,%s,FBID=%s 切换地图" % (curPlayer.GetName(), curPlayer.GetRealMapID(), curPlayer.GetFBID()) , curPlayer.GetPlayerID())
    PlayerTeam.OnPlayerChangeMap(curPlayer, tick)
    GameWorldBoss.OnPlayerChangeMap(curPlayer)
    PlayerFamily.OnPlayerChangeMap(curPlayer, tick)
    PlayerFamilyParty.OnPlayerChangeMap(curPlayer, tick)
    return 
## 玩家切换真实地图
@@ -756,7 +740,7 @@
    #改到mapServer登录成功通知
    #Sync_PyServerDataTimeToClient(curPlayer, tick)
    
    #PlayerTeam.OnPlayerReadMapOK(curPlayer, tick)
    PlayerTeam.OnPlayerReadMapOK(curPlayer, tick)
    
    #刷新人物日期状态
    PlayerEventCounter.UpdatePlayerLoginTime(curPlayer)
@@ -1114,5 +1098,52 @@
    NetPackCommon.SendFakePack(curPlayer, serverDateTime)
    return
def UpdataPlayerLVInfo():
    #Onday更新玩家等级信息
    PyGameData.g_yesterdayPlayerLVDict = PyGameData.g_todayPlayerLVDict
    PyGameData.g_todayPlayerLVDict = {}
    playerManager = GameWorld.GetPlayerManager()
    for i in xrange(playerManager.GetActivePlayerCount()):
        curPlayer = playerManager.GetActivePlayerAt(i)
        if curPlayer == None or not curPlayer.GetInitOK():
            continue
        if PlayerControl.GetIsTJG(curPlayer):
            continue
        PyGameData.g_todayPlayerLVDict[curPlayer.GetID()] = curPlayer.GetLV()
    return
def LoadPlayerLVData():
    #服务器开启时加载活跃玩家等级信息
    universalRecMgr = GameWorld.GetUniversalRecMgr()
    recDataList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_TodayPlayerLVInfo)
    allCnt = recDataList.Count()
    for index in xrange(allCnt):
        recData = recDataList.At(index)
        PyGameData.g_todayPlayerLVDict[recData.GetValue1()] = recData.GetValue2()
    
    recDataList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_YesterdayPlayerLVInfo)
    allCnt = recDataList.Count()
    for index in xrange(allCnt):
        recData = recDataList.At(index)
        PyGameData.g_yesterdayPlayerLVDict[recData.GetValue1()] = recData.GetValue2()
    GameWorld.DebugLog('    服务器开启时加载活跃玩家等级信息g_todayPlayerLVDict=%s, g_yesterdayPlayerLVDict=%s'%(PyGameData.g_todayPlayerLVDict,PyGameData.g_yesterdayPlayerLVDict))
    return
def SavePlayerLVData():
    #服务器关闭前时保存活跃玩家等级信息
    GameWorld.GetUniversalRecMgr().Delete(ShareDefine.Def_UniversalGameRecType_TodayPlayerLVInfo)
    GameWorld.GetUniversalRecMgr().Delete(ShareDefine.Def_UniversalGameRecType_YesterdayPlayerLVInfo)
    universalRecMgr = GameWorld.GetUniversalRecMgr()
    recDataList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_TodayPlayerLVInfo)
    for playerID, lv in PyGameData.g_todayPlayerLVDict.items():
        recData = recDataList.AddRec()
        recData.SetValue1(playerID)
        recData.SetValue2(lv)
    recDataList = universalRecMgr.GetTypeList(ShareDefine.Def_UniversalGameRecType_YesterdayPlayerLVInfo)
    for playerID, lv in PyGameData.g_yesterdayPlayerLVDict.items():
        recData = recDataList.AddRec()
        recData.SetValue1(playerID)
        recData.SetValue2(lv)
    return