hxp
2021-05-13 ba0a86e24c17b4f9a0ada323f7ebc3b32fb0b169
ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
@@ -44,7 +44,7 @@
#import PlayerFamilyStore
import PlayerSocial
import PlayerFamilyParty
import PlayerSealDemon
#import PlayerSealDemon
import PlayerBillboard
import PlayerLVAward
import PlayerDuJie
@@ -56,12 +56,15 @@
import GameWorldActionControl
import GameWorldFamilyWar
import PlayerFBHelpBattle
import GameWorldSkyTower
import GMT_CTG
import PyGameData
import GMShell
import IPY_PlayerDefine
import GameWorldArena
import CrossRealmPK
import AuctionHouse
import PlayerAssist
import PlayerFB
#---------------------------------------------------------------------
@@ -87,9 +90,7 @@
    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())
        GameWorld.RaiseException("玩家上线逻辑错误\r\n%s" % traceback.format_exc())
    return
#---------------------------------------------------------------------
@@ -128,6 +129,7 @@
    #玩家队伍初始化
    PlayerTeam.OnPlayerLoginRefreshTeam(curPlayer, tick)
    PlayerCompensation.NotifyPlayerCompensation(curPlayer)
    __UpdOnedayJobPlayerLoginoffTime(curPlayer)
    
    if not PlayerControl.GetIsTJG(curPlayer):
        # 只有通知逻辑的应该放此处减少IO,如有逻辑处理存储等不可放在此处
@@ -158,7 +160,7 @@
        #仙盟宴会
        PlayerFamilyParty.OnPlayerLogin(curPlayer)
        #封魔坛
        PlayerSealDemon.OnPlayerLogin(curPlayer)
        #PlayerSealDemon.OnPlayerLogin(curPlayer)
        #仙魔之争
        PlayerXMZZ.OnXMZZOnLogin(curPlayer)
        #等级奖励
@@ -175,20 +177,59 @@
        PlayerFamilySWRH.OnLogin(curPlayer)
        PlayerTalk.LoginChatMi(curPlayer)
        PlayerTalk.NotifyTalkCache(curPlayer)
        PlayerGeTui.CleanNewGuyCallBackGeTui(curPlayer.GetID())
        #PlayerGeTui.CleanNewGuyCallBackGeTui(curPlayer.GetID())
        #活动
        GameWorldActionControl.OnPlayerLogin(curPlayer)
        #玩家等级记录
        PyGameData.g_todayPlayerLVDict[curPlayer.GetID()] = curPlayer.GetLV()
        #副本助战
        PlayerFBHelpBattle.OnHelpPlayerLogin(curPlayer)
        #竞技场
        GameWorldArena.OnPlayerLogin(curPlayer)
        #跨服PK
        CrossRealmPK.OnPlayerLogin(curPlayer)
        #诛仙BOSS
        PlayerZhuXianBoss.OnPlayerLogin(curPlayer)
        #骑宠boss状态通知
        PlayerHorsePetBoss.OnLogin(curPlayer)
        #协助
        PlayerAssist.OnPlayerLogin(curPlayer, False)
        #天星塔
        GameWorldSkyTower.OnPlayerLogin(curPlayer)
        GMT_CTG.OnPlayerLogin(curPlayer)
    else:
        #协助
        PlayerAssist.OnPlayerLogin(curPlayer, True)
    return
def __UpdOnedayJobPlayerLoginoffTime(curPlayer):
    ## 更新一天内职业对应玩家登录、离线时间
    job = curPlayer.GetJob()
    playerID = curPlayer.GetPlayerID()
    if job not in PyGameData.g_onedayJobPlayerLoginoffTimeDict:
        PyGameData.g_onedayJobPlayerLoginoffTimeDict[job] = {}
    playerLoginoffTimeDict = PyGameData.g_onedayJobPlayerLoginoffTimeDict[job]
    playerLoginoffTimeDict[playerID] = int(time.time())
    #GameWorld.DebugLog("更新职业对应玩家登录离线时间: %s" % PyGameData.g_onedayJobPlayerLoginoffTimeDict)
    return
def CheckOnedayJobPlayerLoginoffTimeout():
    ## 检查一天内职业对应玩家登录、离线时间超时玩家,每小时检查一次
    maxTime = 24 * 3600 # 暂定24小时
    curTime = int(time.time())
    #GameWorld.DebugLog("处理24小时内在线的角色职业玩家: curTime=%s,maxTime=%s, %s" % (curTime, maxTime, PyGameData.g_onedayJobPlayerLoginoffTimeDict))
    playerManager = GameWorld.GetPlayerManager()
    for playerDict in PyGameData.g_onedayJobPlayerLoginoffTimeDict.values():
        for playerID, loginoffTime in playerDict.items():
            if playerManager.FindPlayerByID(playerID):
                #GameWorld.DebugLog("    在线不处理, playerID=%s" % playerID)
                continue
            if curTime - loginoffTime > maxTime:
                playerDict.pop(playerID)
                #GameWorld.DebugLog("    超时玩家,移除! playerID=%s,loginoffTime=%s" % (playerID, loginoffTime))
    #GameWorld.DebugLog("    处理完毕,剩余玩家! %s" % PyGameData.g_onedayJobPlayerLoginoffTimeDict)
    return
## 增加高手玩家上线广播
@@ -479,9 +520,7 @@
        __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())
        GameWorld.RaiseException("玩家下线逻辑错误\r\n%s" % traceback.format_exc())
    #调用底层下线
    curPlayer.DoDisconnect()
    return
@@ -505,13 +544,23 @@
    PlayerFamily.PlayerLogoffRefreshFamily(curPlayer, tick)
    PlayerFriend.OnPlayerDisconnect(curPlayer, tick)
    
    PlayerGeTui.NewGuyCallBackGeTui(curPlayer, tick)
    __UpdOnedayJobPlayerLoginoffTime(curPlayer)
    #PlayerGeTui.NewGuyCallBackGeTui(curPlayer, tick)
    # 设置家族成员离线时间
    SetPlayerOfflineTime(curPlayer)
    #拍卖行
    AuctionHouse.OnPlayerLeaveServer(curPlayer)
    #协助
    PlayerAssist.OnLeaveServer(curPlayer)
    #红包
    PlayerFamilyRedPacket.OnLeaveServer(curPlayer)
    #------------镖车逻辑
    #TruckPlayerDisconnectProcess(curPlayer, tick)
    if not PlayerControl.GetIsTJG(curPlayer):
        playerID = curPlayer.GetPlayerID()
        PyGameData.g_unTJLogoffTime[playerID] = int(time.time())
    return
## 设置玩家离线时间
@@ -519,8 +568,8 @@
#  @return None
#  @remarks 函数详细说明.
def SetPlayerOfflineTime(curPlayer):
    if PlayerControl.GetIsTJG(curPlayer):
        return
    #if PlayerControl.GetIsTJG(curPlayer):
    #    return
    
    curPlayerID = curPlayer.GetPlayerID()
    curFamily = curPlayer.GetFamily()
@@ -574,6 +623,7 @@
    
    playerStatePack = IPY_GameServer.IPY_GRefreshPlayerProperty()
    packValue = playerStatePack.GetValue()
    packValueEx = playerStatePack.GetValueEx()
    packType = playerStatePack.GetType()
    
    #---特殊逻辑处理---
@@ -581,6 +631,10 @@
        PlayerControl.SetGMForbidenTalk(curPlayer, packValue)
        return
    
    if packType == ShareDefine.CDBPlayerRefresh_ExAttr17:
        PlayerControl.SetPlayerAccState(curPlayer, packValue)
        return
    if packType == IPY_GameServer.CDBPlayerRefresh_State:
        # 脱机在线
        PlayerControl.SetIsTJG(curPlayer, packValue)
@@ -596,12 +650,20 @@
        return
    
    if packType == IPY_GameServer.CDBPlayerRefresh_FightPower:
        curPlayer.SetFightPower(packValue)
        curPlayer.SetFightPower(packValue, packValueEx)
        return
    if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr2:
        #队伍相关相关审核开关状态
        PlayerTeam.SetTeamCheckState(curPlayer, packValue)
        return
    #if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr1:
    #    PlayerControl.SetAssistTagPlayerID(curPlayer, packValue)
    #    return
    if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr3:
        PlayerControl.SetFBFuncLineID(curPlayer, packValue)
        return
    
    #---常规逻辑处理---
@@ -646,9 +708,6 @@
        
    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_ExAttr13:
        PlayerControl.SetPlayerServerGroupID(curPlayer, packValue)