#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Script.DB.StructData.DBPlayerViewCache # # @todo:DBÍæ¼Ò²é¿´»º´æ # @author hxp # @date 2025-05-09 # @version 1.0 # # ÏêϸÃèÊö: DBÍæ¼Ò²é¿´»º´æ # #------------------------------------------------------------------------------- #"""Version = 2025-05-09 12:20""" #------------------------------------------------------------------------------- import DBComm import DBStruct import GameWorld import CommFunc import ChConfig class PlayerViewCache(): def __init__(self, dbData=None): self.__dbData = DBStruct.tagDBPlayerViewCache() if not dbData else dbData self.__plusDict = DBComm.UserDataDict(self.__dbData, "PlusData", "PlusDataSize", True) return def GetPlayerID(self): return self.__dbData.PlayerID def SetPlayerID(self, playerID): self.__dbData.PlayerID = playerID def GetAccID(self): return self.__dbData.AccID def SetAccID(self, accID): self.__dbData.AccID = accID def GetPlayerName(self): return self.__dbData.PlayerName def SetPlayerName(self, playerName): self.__dbData.PlayerName = playerName def GetLV(self): return self.__dbData.LV def SetLV(self, lv): self.__dbData.LV = lv def GetJob(self): return self.__dbData.Job def SetJob(self, job): self.__dbData.Job = job def GetRealmLV(self): return self.__dbData.RealmLV def SetRealmLV(self, realmLV): self.__dbData.RealmLV = realmLV def GetFace(self): return self.__dbData.Face def SetFace(self, face): self.__dbData.Face = face def GetFacePic(self): return self.__dbData.FacePic def SetFacePic(self, facePic): self.__dbData.FacePic = facePic def GetFamilyID(self): return self.__dbData.FamilyID def SetFamilyID(self, familyID): self.__dbData.FamilyID = familyID def GetFamilyName(self): return self.__dbData.FamilyName def SetFamilyName(self, familyName): self.__dbData.FamilyName = familyName def GetFamilyEmblemID(self): return self.__dbData.FamilyEmblemID def SetFamilyEmblemID(self, familyEmblemID): self.__dbData.FamilyEmblemID = familyEmblemID def GetTitleID(self): return self.__dbData.TitleID def SetTitleID(self, titleID): self.__dbData.TitleID = titleID def GetFightPower(self): return self.__dbData.FightPower def GetFightPowerEx(self): return self.__dbData.FightPowerEx def GetFightPowerTotal(self): return self.__dbData.FightPowerEx * ChConfig.Def_PerPointValue + self.__dbData.FightPower def SetFightPowerTotal(self, fightPowerTotal): self.__dbData.FightPower = fightPowerTotal % ChConfig.Def_PerPointValue self.__dbData.FightPowerEx = fightPowerTotal / ChConfig.Def_PerPointValue return def GetServerID(self): return self.__dbData.ServerID def SetServerID(self, serverID): self.__dbData.ServerID = serverID def GetOffTime(self): return self.__dbData.OffTime def SetOffTime(self, offTime): self.__dbData.OffTime = offTime def GetPlusDict(self): return self.__plusDict.GetData() def GetPlusData(self): return self.__plusDict.ToString() def GetBuffer(self): self.__plusDict.ToString() return self.__dbData.getBuffer() ## ----------------------------------------------------------------------- class PlayerViewCacheMgr(): def __init__(self): self.__viewCacheList = [] # [PlayerViewCache, ...] self.__viewCacheDict = {} # {playerID:PlayerViewCache, ...} self.__needSort = False self.__serverIDRangePlayerIDDict = {} # {serverIDRangeTuple:[playerID, ...], ....} return def __InitViewCacheInstance(self, dbData): '''³õʼ»¯¹¦ÄÜÊý¾ÝʵÀý£¬´´½¨»ò¼ÓÔØÊý¾ÝʱͨÓ㬹¦ÄÜÒ»°ã²»µ÷Óà @param dbData: ʵÀý¶ÔÓ¦°ó¶¨µÄdbData @return: ³É¹¦·µ»ØÊµÀý¶ÔÏó£¬Ê§°Ü·µ»ØNone ''' playerID = dbData.PlayerID if playerID in self.__viewCacheDict: return viewCache = PlayerViewCache(dbData) self.__viewCacheList.append(viewCache) self.__viewCacheDict[playerID] = viewCache self.__needSort = True return viewCache def AddPlayerViewCache(self, playerID): dbData = DBStruct.tagDBPlayerViewCache() dbData.PlayerID = playerID return self.__InitViewCacheInstance(dbData) def GetPlayerViewCache(self, playerID): ## »ñÈ¡Íæ¼Ò²é¿´»º´æ£¬½öÄÚ´æÖÐÊý¾Ý£¬ÎÞ¶îÍâÂß¼­ viewCache = None if playerID in self.__viewCacheDict: viewCache = self.__viewCacheDict[playerID] if not viewCache and False: viewCache = PlayerViewCache() return viewCache def GetPlayerIDListByServerIDInfo(self, serverIDList): ## ¸ù¾Ý·þÎñÆ÷IDÁбíÐÅÏ¢»ñÈ¡¶ÔÓ¦·þÎñÆ÷ID·¶Î§µÄÍæ¼ÒIDÕ½Á¦ÅÅÐòÁбí if serverIDList == None: return [] self.Sort() key = tuple(serverIDList) if key not in self.__serverIDRangePlayerIDDict: playerIDList = [] for viewCache in self.__viewCacheList: playerID = viewCache.GetPlayerID() serverID = viewCache.GetServerID() for idInfo in serverIDList: if (isinstance(idInfo, int) and serverID == idInfo) \ or ((isinstance(idInfo, tuple) or isinstance(idInfo, list)) \ and len(idInfo) == 2 and idInfo[0] <= serverID <= idInfo[1]): playerIDList.append(playerID) GameWorld.DebugLog("ÖØÐ¼ÓÔØÇø·þÍæ¼Ò²é¿´»º´æIDÁбí: %s, %s, %s" % (key, len(playerIDList), playerIDList)) self.__serverIDRangePlayerIDDict[key] = playerIDList return self.__serverIDRangePlayerIDDict[key] def DelPlayerViewCache(self, playerID): viewCache = self.__viewCacheDict.pop(playerID, None) if viewCache in self.__viewCacheList: self.__viewCacheList.remove(viewCache) for playerIDList in self.__serverIDRangePlayerIDDict.values(): if playerID in playerIDList: playerIDList.remove(playerID) self.__serverIDRangePlayerIDDict = {} return def DelAllCache(self): self.__viewCacheList = [] self.__viewCacheDict = {} self.__needSort = False self.__serverIDRangePlayerIDDict = {} return def GetCount(self): return len(self.__viewCacheList) def At(self, index): viewCache = self.__viewCacheList[index] if not viewCache and False: viewCache = PlayerViewCache() # ²»»áÖ´Ðе½£¬Ö»ÎªÁË.³ö´úÂëÌáʾ return viewCache def Sort(self): ## ĬÈϰ´Õ½Á¦µ¹ÐòÅÅ if not self.__needSort: return self.__needSort = False self.__viewCacheList.sort(key=lambda v: (v.GetFightPowerTotal(), v.GetLV()), reverse=True) self.__serverIDRangePlayerIDDict = {} return # ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup def GetSaveData(self): savaData = "" cntData = "" cnt = 0 for dbData in self.__viewCacheList: cnt += 1 savaData += dbData.GetBuffer() GameWorld.Log("Save DBPlayerViewCache count :%s len=%s" % (cnt, len(savaData))) return CommFunc.WriteDWORD(cntData, cnt) + savaData # ´ÓÊý¾Ý¿âÔØÈëÊý¾Ý def LoadPyGameData(self, datas, pos, dataslen): cnt, pos = CommFunc.ReadDWORD(datas, pos) GameWorld.Log("Load DBPlayerViewCache count :%s" % cnt) for _ in xrange(cnt): dbData = DBStruct.tagDBPlayerViewCache() pos += dbData.readData(datas, pos, dataslen) self.__InitViewCacheInstance(dbData) self.Sort() return pos