#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerOnline # # @todo:ÔÚÏßÍæ¼Ò¹ÜÀí # @author hxp # @date 2025-07-02 # @version 1.0 # # ÏêϸÃèÊö: ÔÚÏßÍæ¼Ò¹ÜÀí£¬ÓÃÓÚ¹ÜÀíÔÚÏßÍæ¼Ò¡¢×¼ÔÚÏßÍæ¼ÒµÄÁÙʱÊý¾Ý # ×¼ÔÚÏßÍæ¼Ò - ʵ¼Ê²»ÔÚÏߣ¬x·ÖÖÓÄÚÀëÏßµÄÍæ¼Ò£¬ÓÃÓÚÖ§³Ö¶ÏÏßÖØÁ¬£¬¶Ìʱ¼äÄÚÁÙʱÊý¾Ý¿É³ÖÐø # #------------------------------------------------------------------------------- #"""Version = 2025-07-02 17:30""" #------------------------------------------------------------------------------- import TurnAttack import PyGameData import time class OnlinePlayer(): ## ×¼ÔÚÏßÍæ¼ÒÁÙʱÊý¾Ý def __init__(self, playerID): self.playerID = playerID self.mainFight = TurnAttack.MainFight(playerID) return def OnPlayerLogin(self, curPlayer): self.mainFight.playerLogin(curPlayer) return def OnPlayerOffline(self, curPlayer): self.mainFight.playerOffline(curPlayer) return def OnClear(self): self.mainFight.clear() return class OnlineMgr(): ## ×¼ÔÚÏßÍæ¼Ò¹ÜÀí def __init__(self): self.__onlinePlayerDict = {} # ×¼ÔÚÏßÍæ¼ÒÁÙʱÊý¾Ý×Öµä {playerID:OnlinePlayer, ...} self.__offlinePlayerTimeDict = {} # ×¼ÔÚÏßÍæ¼ÒÁÙʱÀëÏßʱ¼ä´Á {playerID:ÀëÏßʱ¼ä´Á, ...} return def GetOnlinePlayer(self, curPlayer): olPlayer = None playerID = curPlayer.GetPlayerID() if playerID in self.__onlinePlayerDict: olPlayer = self.__onlinePlayerDict[playerID] else: olPlayer = OnlinePlayer(playerID) self.__onlinePlayerDict[playerID] = olPlayer return olPlayer def SetPlayerOnline(self, curPlayer): ## ÉèÖÃÍæ¼ÒÔÚÏß playerID = curPlayer.GetPlayerID() self.__offlinePlayerTimeDict.pop(playerID, None) if playerID not in self.__onlinePlayerDict: olPlayer = OnlinePlayer(playerID) self.__onlinePlayerDict[playerID] = olPlayer else: olPlayer = self.__onlinePlayerDict[playerID] olPlayer.OnPlayerLogin(curPlayer) return def SetPlayerOffline(self, curPlayer): ## ÉèÖÃÍæ¼ÒÀëÏß playerID = curPlayer.GetPlayerID() if playerID not in self.__onlinePlayerDict: return olPlayer = self.__onlinePlayerDict[playerID] olPlayer.OnPlayerOffline(curPlayer) self.__offlinePlayerTimeDict[playerID] = int(time.time()) return def ProcessOffline(self): ## ¶¨Ê±´¦ÀíÀëÏßÍæ¼Ò curTime = int(time.time()) offlineTimes = 5 * 60 # 5·ÖÖÓºóÇå³ýÊý¾Ý for playerID, offlineTime in self.__offlinePlayerTimeDict.items(): if curTime - offlineTime < offlineTimes: continue self.__offlinePlayerTimeDict.pop(playerID, None) if playerID not in self.__onlinePlayerDict: continue olPlayer = self.__onlinePlayerDict.pop(playerID, None) olPlayer.OnClear() return def GetOnlineMgr(): mgr = None if PyGameData.g_onlineMgr: mgr = PyGameData.g_onlineMgr else: mgr = OnlineMgr() PyGameData.g_onlineMgr = mgr return mgr def OnPlayerLogin(curPlayer): GetOnlineMgr().SetPlayerOnline(curPlayer) return def OnPlayerLogoff(curPlayer): GetOnlineMgr().SetPlayerOffline(curPlayer) return def OnMinute(): GetOnlineMgr().ProcessOffline() return