From fdebf36f0d9201c6a6949a08cdfeebb718c25ce2 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 23 五月 2025 19:35:53 +0800 Subject: [PATCH] 16 卡牌服务端(聊天、广播、通用记录、查看玩家;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py | 176 +++++----------------------------------------------------- 1 files changed, 16 insertions(+), 160 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py index 4acf923..1b24dc3 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DB/StructData/DBPlayerViewCache.py @@ -18,17 +18,8 @@ import DBComm import DBStruct import GameWorld -import ShareDefine -import PlayerControl -import DBDataMgr import CommFunc import ChConfig -import GameObj - -import random -import time - -Key_UpdViewCacheTick = "UpdViewCacheTick" class PlayerViewCache(): @@ -84,97 +75,36 @@ def __init__(self): self.__viewCacheList = [] # [PlayerViewCache, ...] - self.__idIndexDict = {} # {playerID:index, ...} + self.__viewCacheDict = {} # {playerID:PlayerViewCache, ...} self.__needSort = False self.__serverIDRangePlayerIDDict = {} # {serverIDRangeTuple:[playerID, ...], ....} return - def InitViewCacheInstance(self, dbData): + def __InitViewCacheInstance(self, dbData): '''初始化功能数据实例,创建或加载数据时通用,功能一般不调用 @param dbData: 实例对应绑定的dbData @return: 成功返回实例对象,失败返回None ''' playerID = dbData.PlayerID - self.__refreshIDIndex() - if playerID in self.__idIndexDict: + if playerID in self.__viewCacheDict: return viewCache = PlayerViewCache(dbData) self.__viewCacheList.append(viewCache) - self.__idIndexDict[playerID] = len(self.__viewCacheList) - 1 + self.__viewCacheDict[playerID] = viewCache self.__needSort = True return viewCache - def CheckUpdViewCache(self, playerID): - if playerID <= ShareDefine.FackPlayerIDMax: - return - curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) - if not curPlayer: - return - lastUpdTick = curPlayer.GetDictByKey(Key_UpdViewCacheTick) - tick = GameWorld.GetGameWorld().GetTick() - if lastUpdTick and tick - lastUpdTick < 60000: - GameWorld.DebugLog("1分钟内只更新一次玩家缓存", playerID) - return - curPlayer.SetDict(Key_UpdViewCacheTick, tick) - return UpdPlayerViewCache(curPlayer) - - def FindViewCache(self, playerID, isAdd=False): - '''查找玩家缓存,如果不存在,则会有额外逻辑,如从redis、db直接找, - 跨服玩家从跨服取,可能延迟获得 - ''' - curCache = self.GetPlayerViewCache(playerID) - if curCache: - updCache = self.CheckUpdViewCache(playerID) - if updCache: - curCache = updCache - - # 真实玩家 - elif playerID > ShareDefine.FackPlayerIDMax: - curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) - # 本服在线玩家,直接生成新数据 - if curPlayer: - dbData = DBStruct.tagDBPlayerViewCache() - dbData.PlayerID = playerID - self.InitViewCacheInstance(dbData) - UpdPlayerViewCache(curPlayer) - - # 离线玩家 - else: - pass - # 本服玩家,从redis或db读取重新加载读取,换句话说,本服玩家只要获取一定有查看缓存数据 - # 跨服玩家,去子服拉取数据,理论上也一定有,但是如果需要拉数据,有一定延迟 - # 逻辑待扩展 - - # 假玩家,默认添加 - elif ShareDefine.FackPlayerIDStart <= playerID <= ShareDefine.FackPlayerIDMax: - serverID = playerID % 100 + 1 # 1 ~ 100 服 - accID = "fake%s@test@s%s" % (playerID, serverID) - fightPower = random.randint(1000000, 100000000) # 先随机,外层有需要的话再自己设置 - - dbData = DBStruct.tagDBPlayerViewCache() - dbData.PlayerID = playerID - dbData.PlayerName = "%s%s" % (GameWorld.GbkToCode("神秘道友"), playerID) - dbData.AccID = accID - dbData.LV = random.randint(100, 200) - dbData.Job = random.randint(1, 2) - dbData.RealmLV = random.randint(5, 15) - dbData.FightPower = fightPower % ChConfig.Def_PerPointValue - dbData.FightPowerEx = fightPower / ChConfig.Def_PerPointValue - dbData.ServerID = serverID - dbData.OffTime = int(time.time()) - random.randint(1, 3600 * 24 * 10) # 随机离线 0~10天 - curCache = self.InitViewCacheInstance(dbData) - - return curCache + def AddPlayerViewCache(self, playerID): + dbData = DBStruct.tagDBPlayerViewCache() + dbData.PlayerID = playerID + return self.__InitViewCacheInstance(dbData) def GetPlayerViewCache(self, playerID): ## 获取玩家查看缓存,仅内存中数据,无额外逻辑 - self.__refreshIDIndex() viewCache = None - if playerID in self.__idIndexDict: - index = self.__idIndexDict[playerID] - if index < len(self.__viewCacheList): - viewCache = self.__viewCacheList[index] - + if playerID in self.__viewCacheDict: + viewCache = self.__viewCacheDict[playerID] + if not viewCache and False: viewCache = PlayerViewCache() @@ -200,32 +130,19 @@ self.__serverIDRangePlayerIDDict[key] = playerIDList return self.__serverIDRangePlayerIDDict[key] - def IsPlayerIn(self, playerID): - self.__refreshIDIndex() - return playerID in self.__idIndexDict - - def __refreshIDIndex(self): - if not self.__idIndexDict: - self.__idIndexDict = {} - for index, viewCache in enumerate(self.__viewCacheList): - self.__idIndexDict[viewCache.GetPlayerID()] = index - return self.__idIndexDict - def DelPlayerViewCache(self, playerID): - self.__refreshIDIndex() - index = self.__idIndexDict.pop(playerID, -1) - if index >= 0 and index < len(self.__viewCacheList): - self.__viewCacheList.pop(index) + 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.__idIndexDict = {} self.__serverIDRangePlayerIDDict = {} return def DelAllCache(self): self.__viewCacheList = [] - self.__idIndexDict = {} + self.__viewCacheDict = {} self.__needSort = False self.__serverIDRangePlayerIDDict = {} return @@ -243,9 +160,7 @@ return self.__needSort = False self.__viewCacheList.sort(key=lambda v: (v.GetFightPowerTotal(), v.GetLV()), reverse=True) - self.__idIndexDict = {} self.__serverIDRangePlayerIDDict = {} - self.__refreshIDIndex() return # 保存数据 存数据库和realtimebackup @@ -269,66 +184,7 @@ for _ in xrange(cnt): dbData = DBStruct.tagDBPlayerViewCache() pos += dbData.readData(datas, pos, dataslen) - self.InitViewCacheInstance(dbData) + self.__InitViewCacheInstance(dbData) self.Sort() return pos - -def OnPlayerLogout(curPlayer): - if curPlayer.GetLV() >= 10: - UpdPlayerViewCache(curPlayer) - - return - -def UpdPlayerViewCache(curPlayer, isOffline=False): - '''更新玩家查看缓存数据,更新时机由外层自己判断,这里只做更新逻辑 - 1. 下线时强制更新一次,上线暂不更新,上线时由各功能如果有需要用到触发更新 - 2. 有需要用到缓存数据时,如果玩家在线,1分钟内多次获取时最多更新一次,没有获取缓存数据则不更新 - ''' - if not curPlayer: - return - - playerID = curPlayer.GetPlayerID() - curCache = DBDataMgr.GetPlayerViewCacheMgr().GetPlayerViewCache(playerID) - if not curCache: - return - - tick = GameWorld.GetGameWorld().GetTick() - curPlayer.SetDict(Key_UpdViewCacheTick, tick) - GameWorld.DebugLog("更新玩家查看缓存数据! isOffline=%s" % isOffline, playerID) - curCache.SetAccID(curPlayer.GetAccID()) - curCache.SetPlayerName(curPlayer.GetPlayerName()) - curCache.SetLV(curPlayer.GetLV()) - curCache.SetJob(curPlayer.GetJob()) - curCache.SetRealmLV(curPlayer.GetOfficialRank()) - curCache.SetFace(curPlayer.GetFace()) - curCache.SetFacePic(curPlayer.GetFacePic()) - curCache.SetFamilyID(curPlayer.GetFamilyID()) - curCache.SetFamilyName(curPlayer.GetFamilyName()) - curCache.SetFamilyEmblemID(PlayerControl.GetFamilyEmblemID(curPlayer)) - curCache.SetTitleID(PlayerControl.GetTitleID(curPlayer)) - curCache.SetFightPowerTotal(PlayerControl.GetFightPower(curPlayer)) - curCache.SetServerID(GameWorld.GetPlayerServerID(curPlayer)) - if isOffline: - curCache.SetOffTime(int(time.time())) - - plusDict = curCache.GetPlusDict() - - #战斗属性 - plusDict.update({ - "MinAtk":curPlayer.GetMinAtk(), - "MaxAtk":curPlayer.GetMaxAtk(), - "Def":curPlayer.GetDef(), - "MaxHP":GameObj.GetMaxHP(curPlayer), - "Hit":curPlayer.GetHit(), - "Miss":curPlayer.GetMiss(), - "SuperHitRate":curPlayer.GetSuperHitRate(), # 暴击率 - }) - - # 功能数据 - - # 其他 - - return curCache - - \ No newline at end of file -- Gitblit v1.8.0