|  |  | 
 |  |  | #import PlayerFamilyStore
 | 
 |  |  | import PlayerSocial
 | 
 |  |  | import PlayerFamilyParty
 | 
 |  |  | import PlayerSealDemon
 | 
 |  |  | #import PlayerSealDemon
 | 
 |  |  | import PlayerBillboard
 | 
 |  |  | import PlayerLVAward
 | 
 |  |  | import PlayerDuJie
 | 
 |  |  | 
 |  |  | 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
 | 
 |  |  | import PlayerLove
 | 
 |  |  | import PlayerCharm
 | 
 |  |  | #---------------------------------------------------------------------
 | 
 |  |  | 
 | 
 |  |  | #---------------------------------------------------------------------
 | 
 |  |  | 
 |  |  |     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
 | 
 |  |  | 
 | 
 |  |  | #---------------------------------------------------------------------
 | 
 |  |  | 
 |  |  |     #玩家队伍初始化
 | 
 |  |  |     PlayerTeam.OnPlayerLoginRefreshTeam(curPlayer, tick)
 | 
 |  |  |     PlayerCompensation.NotifyPlayerCompensation(curPlayer)
 | 
 |  |  |     __UpdOnedayJobPlayerLoginoffTime(curPlayer)
 | 
 |  |  |     
 | 
 |  |  |     if not PlayerControl.GetIsTJG(curPlayer):
 | 
 |  |  |         # 只有通知逻辑的应该放此处减少IO,如有逻辑处理存储等不可放在此处
 | 
 |  |  | 
 |  |  |         #仙盟宴会
 | 
 |  |  |         PlayerFamilyParty.OnPlayerLogin(curPlayer)
 | 
 |  |  |         #封魔坛
 | 
 |  |  |         PlayerSealDemon.OnPlayerLogin(curPlayer)
 | 
 |  |  |         #PlayerSealDemon.OnPlayerLogin(curPlayer)
 | 
 |  |  |         #仙魔之争
 | 
 |  |  |         PlayerXMZZ.OnXMZZOnLogin(curPlayer)
 | 
 |  |  |         #等级奖励
 | 
 |  |  | 
 |  |  |         PlayerStore.OnPlayerLogin(curPlayer)
 | 
 |  |  |         #通知世界boss信息
 | 
 |  |  |         GameWorldBoss.OnPlayerLogin(curPlayer)
 | 
 |  |  |         #家族副本boss状态通知
 | 
 |  |  |         PlayerFamilyBoss.OnLogin(curPlayer)
 | 
 |  |  |         #渡劫
 | 
 |  |  |         PlayerDuJie.OnPlayerLogin(curPlayer)
 | 
 |  |  |         #守卫人皇
 | 
 |  |  |         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 DoPlayerRealLoginOK(curPlayer, tick):
 | 
 |  |  |     ''' 玩家最终登录成功处理, 由  MapServer  DoPlayerRealLoginOK  通知
 | 
 |  |  |         该函数为地图最终登录成功才会执行到,以后一些功能类的登录处理建议均写到这里
 | 
 |  |  |         旧的功能先不动( __DoPlayerLoginServer 函数中的功能),如果有登录相关的bug再考虑是否移动到此函数
 | 
 |  |  |     '''
 | 
 |  |  |      | 
 |  |  |     GameWorld.Log("GameServer->DoPlayerRealLoginOK", curPlayer.GetPlayerID())
 | 
 |  |  |      | 
 |  |  |     if not PlayerControl.GetIsTJG(curPlayer):
 | 
 |  |  |         #家族副本boss状态通知
 | 
 |  |  |         PlayerFamilyBoss.OnLogin(curPlayer)
 | 
 |  |  |         #魅力
 | 
 |  |  |         PlayerCharm.OnPlayerLogin(curPlayer)
 | 
 |  |  |         #情缘
 | 
 |  |  |         PlayerLove.OnPlayerLogin(curPlayer)
 | 
 |  |  |          | 
 |  |  |     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
 | 
 |  |  | 
 | 
 |  |  | ## 增加高手玩家上线广播
 | 
 |  |  | 
 |  |  |         __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
 | 
 |  |  | 
 |  |  |     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
 | 
 |  |  | 
 | 
 |  |  | ## 设置玩家离线时间
 | 
 |  |  | 
 |  |  | #  @return None
 | 
 |  |  | #  @remarks 函数详细说明.
 | 
 |  |  | def SetPlayerOfflineTime(curPlayer):
 | 
 |  |  |     if PlayerControl.GetIsTJG(curPlayer):
 | 
 |  |  |         return
 | 
 |  |  |     #if PlayerControl.GetIsTJG(curPlayer):
 | 
 |  |  |     #    return
 | 
 |  |  |     
 | 
 |  |  |     curPlayerID = curPlayer.GetPlayerID()
 | 
 |  |  |     curFamily = curPlayer.GetFamily()
 | 
 |  |  | 
 |  |  |     
 | 
 |  |  |     playerStatePack = IPY_GameServer.IPY_GRefreshPlayerProperty()
 | 
 |  |  |     packValue = playerStatePack.GetValue()
 | 
 |  |  |     packValueEx = playerStatePack.GetValueEx()
 | 
 |  |  |     packType = playerStatePack.GetType()
 | 
 |  |  |     
 | 
 |  |  |     #---特殊逻辑处理---
 | 
 |  |  | 
 |  |  |         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)
 | 
 |  |  | 
 |  |  |         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
 | 
 |  |  |      | 
 |  |  |     #---常规逻辑处理---
 | 
 |  |  |         
 | 
 |  |  |     elif packType == IPY_GameServer.CDBPlayerRefresh_LV:
 | 
 |  |  |         curPlayer.SetLV(packValue)
 | 
 |  |  |         PlayerSocial.UpdateSocialInfo(curPlayer, packType, packValue)
 | 
 |  |  |         PlayerSocial.UpdateSocialInfo(curPlayer.GetID(), packType, packValue)
 | 
 |  |  |         #玩家等级记录
 | 
 |  |  |         playerID = curPlayer.GetID()
 | 
 |  |  |         if playerID in PyGameData.g_todayPlayerLVDict:
 | 
 |  |  | 
 |  |  |     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)
 | 
 |  |  |         
 | 
 |  |  | 
 |  |  |     
 | 
 |  |  |     elif packType == IPY_GameServer.CDBPlayerRefresh_OfficialRank:
 | 
 |  |  |         curPlayer.SetOfficialRank(packValue)
 | 
 |  |  |         PlayerSocial.UpdateSocialInfo(curPlayer, packType, packValue)
 | 
 |  |  |         PlayerSocial.UpdateSocialInfo(curPlayer.GetID(), packType, packValue)
 | 
 |  |  |         #更新排行榜的境界
 | 
 |  |  |         PlayerBillboard.UpdateBillboardRealm(curPlayer)
 | 
 |  |  |         
 |