| | |
| | | import CrossBattlefield
|
| | | import CrossActAllRecharge
|
| | | import CrossYaomoBoss
|
| | | import CrossRealmMsg
|
| | | import PlayerViewCache
|
| | | import PlayerFuncTeam
|
| | | import PyDataManager
|
| | | import GameWorldMineArea
|
| | | import PlayerRecData
|
| | | import GameWorship
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | class OnlinePlayerMgr():
|
| | | ''' 在线玩家管理,子服跨服通用
|
| | | 注:跨服服务器时,玩家不一定在跨服服务器,只是表示有同步到跨服服务器的在线玩家,且不是所有玩家都有同步
|
| | | '''
|
| | | |
| | | def __init__(self):
|
| | | self.onlinePlayerDict = {} # 在线玩家 {playerID:serverGroupID, ...}
|
| | | return
|
| | | |
| | | def IsOnline(self, playerID): return playerID in self.onlinePlayerDict
|
| | | |
| | | def __SetOnline(self, playerID, serverGroupID):
|
| | | self.onlinePlayerDict[playerID] = serverGroupID
|
| | | return
|
| | | |
| | | def __SetOffline(self, playerID, serverGroupID):
|
| | | self.onlinePlayerDict.pop(playerID, None)
|
| | | return
|
| | | |
| | | def SetOnlineState(self, playerID, isOnline, serverGroupID=0):
|
| | | if isOnline:
|
| | | self.__SetOnline(playerID, serverGroupID)
|
| | | else:
|
| | | self.__SetOffline(playerID, serverGroupID)
|
| | | return
|
| | | |
| | | def GetOfflineValue(self, playerID, viewCache=None):
|
| | | ## 离线值:0-在线;1-离线;>1-上次离线时间戳,可用于计算离线多久了;当取不到玩家信息时用1代表已离线;
|
| | | if playerID in self.onlinePlayerDict:
|
| | | return 0
|
| | | offlineValue = 1
|
| | | if viewCache and viewCache.OffTime:
|
| | | offlineValue = viewCache.OffTime
|
| | | return offlineValue
|
| | | |
| | | def GetOnlinePlayerMgr():
|
| | | mgr = PyGameData.g_onlinePlayerMgr
|
| | | if mgr == None:
|
| | | mgr = OnlinePlayerMgr()
|
| | | PyGameData.g_onlinePlayerMgr = mgr
|
| | | return mgr
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | |
| | | CrossYaomoBoss.OnPlayerLogin(curPlayer)
|
| | | #玩家记录
|
| | | PlayerRecData.OnPlayerLogin(curPlayer)
|
| | | |
| | | #在线状态变更,放最后
|
| | | __OnPlayerOnlineStateChange(curPlayer, True)
|
| | |
|
| | | if isMixServerFirstLogin:
|
| | | PlayerCharm.OnMixServerFirstLogin(curPlayer)
|
| | |
| | |
|
| | | if GameWorld.IsCrossServer():
|
| | | PlayerFB.OnPlayerDisconnectCrossServer(curPlayer)
|
| | | |
| | | return
|
| | | |
| | | #跨服匹配PK
|
| | | CrossRealmPK.OnLeaveServer(curPlayer)
|
| | |
|
| | |
| | | playerID = curPlayer.GetPlayerID()
|
| | | PyGameData.g_unTJLogoffTime[playerID] = int(time.time())
|
| | |
|
| | | #在线状态变更,放最后
|
| | | __OnPlayerOnlineStateChange(curPlayer, False)
|
| | | return
|
| | |
|
| | | def __OnPlayerOnlineStateChange(curPlayer, isOnline):
|
| | | ## 在线状态变更
|
| | | if PlayerControl.GetIsTJG(curPlayer):
|
| | | return
|
| | | |
| | | playerID = curPlayer.GetPlayerID()
|
| | | olMgr = GetOnlinePlayerMgr()
|
| | | olMgr.SetOnlineState(playerID, isOnline)
|
| | | |
| | | #relatedPlayerIDList = [] # 本服相关玩家
|
| | | #offlineValue = olMgr.GetOfflineValue(playerID, PlayerViewCache.FindViewCache(playerID))
|
| | | #SyncRelatedPlayerOnlineState(playerID, offlineValue, relatedPlayerIDList)
|
| | | |
| | | if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_CrossRealmPK) \
|
| | | and not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_CrossBattlefield):
|
| | | GameWorld.DebugLog("跨服相关功能未开启,不同步在线状态到跨服服务器! LV=%s" % curPlayer.GetLV(), curPlayer.GetPlayerID())
|
| | | return
|
| | | |
| | | cacheBase = PlayerViewCache.GetSyncCrossCacheBase(curPlayer)
|
| | | dataMsg = {"playerID":playerID, "isOnline":isOnline, "cacheBase":cacheBase}
|
| | | CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_PlayerLoginout, dataMsg)
|
| | | return
|
| | |
|
| | | def ClientServerMsg_PlayerLoginout(serverGroupID, msgData):
|
| | | ## 收到子服玩家上下线
|
| | | |
| | | playerID = msgData["playerID"]
|
| | | isOnline = msgData["isOnline"]
|
| | | cacheBase = msgData["cacheBase"]
|
| | | |
| | | isLogout = not isOnline
|
| | | PlayerViewCache.UpdCrossCacheBase(playerID, cacheBase, isLogout)
|
| | | |
| | | SyncCrossPlayerOnlineStateToRelatedPlayer(playerID)
|
| | | return
|
| | |
|
| | | def SyncCrossPlayerOnlineStateToRelatedPlayer(playerID):
|
| | | ## 同步跨服玩家在线状态给相关玩家
|
| | | |
| | | relatedPlayerIDList = []
|
| | | |
| | | # 功能队伍
|
| | | funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
|
| | | playerTeamIDDict = funcTeamMgr.GetPlayerTeamIDDict(playerID)
|
| | | for _, teamID in playerTeamIDDict.items():
|
| | | funcTeam = funcTeamMgr.GetFuncTeam(teamID)
|
| | | if not funcTeam:
|
| | | continue
|
| | | relatedPlayerIDList += funcTeam.GetMemberIDList()
|
| | | |
| | | # 其他...
|
| | | |
| | | # 去重汇总
|
| | | relatedPlayerIDList = list(set(relatedPlayerIDList)) |
| | | if playerID in relatedPlayerIDList:
|
| | | relatedPlayerIDList.remove(playerID)
|
| | | if not relatedPlayerIDList:
|
| | | return
|
| | | |
| | | offlineValue = GetOnlinePlayerMgr().GetOfflineValue(playerID, PlayerViewCache.FindViewCache(playerID))
|
| | | dataMsg = {"loginoutPlayerID":playerID, "offlineValue":offlineValue, "relatedPlayerIDList":relatedPlayerIDList}
|
| | | CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PlayerLoginout, dataMsg)
|
| | | return
|
| | |
|
| | | def CrossServerMsg_PlayerLoginout(msgData):
|
| | | ## 收到跨服服务器信息 - 玩家上下线状态变更
|
| | | loginoutPlayerID = msgData["loginoutPlayerID"]
|
| | | offlineValue = msgData["offlineValue"]
|
| | | relatedPlayerIDList = msgData["relatedPlayerIDList"]
|
| | | SyncRelatedPlayerOnlineState(loginoutPlayerID, offlineValue, relatedPlayerIDList, 1)
|
| | | return
|
| | |
|
| | | def SyncRelatedPlayerOnlineState(loginoutPlayerID, offlineValue, relatedPlayerIDList, isCross=0):
|
| | | clientPack = None
|
| | | playerMgr = GameWorld.GetPlayerManager()
|
| | | for playerID in relatedPlayerIDList:
|
| | | if not PlayerControl.GetDBPlayerAccIDByID(playerID):
|
| | | continue
|
| | | curPlayer = playerMgr.FindPlayerByID(playerID)
|
| | | if not curPlayer or not curPlayer.GetInitOK():
|
| | | continue
|
| | | |
| | | if not clientPack:
|
| | | clientPack = ChPyNetSendPack.tagGCRelatedPlayerOnlineState()
|
| | | clientPack.PlayerID = loginoutPlayerID
|
| | | clientPack.OfflineValue = offlineValue
|
| | | clientPack.IsCross = isCross
|
| | | |
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|
| | | return
|
| | |
|
| | | ## 设置玩家离线时间
|