#!/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
|