From 835c5fad7ad4e723c34be7f5fc073eeb7104e3f4 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期六, 27 四月 2019 11:14:44 +0800 Subject: [PATCH] 6628 【2.0】【后端】查看玩家装备和查看玩家战力功能 --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py | 323 ++++++++++++++++++++++++----------------------------- 1 files changed, 145 insertions(+), 178 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py index 72ccc54..9709ed7 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py @@ -16,17 +16,18 @@ # @change: "2016-05-18 16:00" hxp 战盟有官员成员缓存不清除 #--------------------------------------------------------------------- #"""Version = 2016-05-18 16:00""" -#------------------------------------------------------------------------------ +#--------------------------------------------------------------------- + import GameWorld -import ChPyNetSendPack import PlayerControl import NetPackCommon +import ChPyNetSendPack import PlayerFBHelpBattle +import PyGameDataStruct import IpyGameDataPY -import ShareDefine +import PyDataManager import ChConfig -import time import json ViewCacheMgr = GameWorld.GameWorldData.GetPlayerViewCacheMgr() @@ -47,91 +48,21 @@ return result -##更新缓存数据 -# @param PlayerID, PropData, ItemData, PlusData, isSaveDB -# @return None -def UpdatePlayerCache(PlayerID, PropData, ItemData, PlusData, isSaveDB=False, packData=None): - curCache = ViewCacheMgr.FindCache(PlayerID) - if not curCache: - curCache = ViewCacheMgr.AddNewCache(PlayerID) - if packData: - curCache.SetPlayerLV(packData.PlayerLV) - curCache.SetOffTime(packData.OffTime) - - - GameWorld.DebugLog('ViewCache### UpdatePlayerCache PlayerID %s, \ - PropData(len %s): %s, \ - ItemData(len %s): %s, \ - PlusData(len %s): %s'% - (PlayerID, len(PropData), PropData,len(ItemData), ItemData, len(PlusData), PlusData) - ) - #2017-12-21 由于保存数据库的数据(realtime)过多根据需求分SetItemData和SetItemDataNoSave - # 关服尽量只保存基础数据,默认使用不保存接口 SetItemDataNoSave - - curCache.SetPropData(PropData,len(PropData)) - if curCache.GetItemData() or (isSaveDB and IsNeedSaveViewCacheAllInfo(PlayerID)): - curCache.SetItemData(ItemData,len(ItemData)) - curCache.SetPlusData(PlusData,len(PlusData)) - curCache.SetItemDataNoSave("",0) # 避免占用内存 - curCache.SetPlusDataNoSave("",0) - else: - # 低级号不处理保存 - curCache.SetItemDataNoSave(ItemData,len(ItemData)) - curCache.SetPlusDataNoSave(PlusData,len(PlusData)) - curCache.SetNeedSaveDB(isSaveDB) #设置需要保存到数据库 - - # 同步更新助战信息 - if PlayerFBHelpBattle.IsInHelpBattleCheckInList(PlayerID): - PropDataDict = eval(PropData) - fightPower = PropDataDict.get("FightPower", 0) - familyID = PropDataDict.get("FamilyID", 0) - playerName = PropDataDict.get("Name", "") - PlayerFBHelpBattle.UpdateCheckInPlayerInfo(PlayerID, fightPower, familyID, playerName) - - #暂时关闭 - #=========================================================================== - # FamilyIDKey = "FamilyID" - # if FamilyIDKey in PropData: - # PropDataDict = eval(PropData) - # familyID = PropDataDict[FamilyIDKey] - # if familyID > 0: - # PlayerFamilyAction.UpdFamilyOfficerModelEquip(familyID, PlayerID) - #=========================================================================== - return - - -##玩家下线缓存数据 -# @param PlayerID, PlayerLV, PropData, ItemData, PlusData -# @return None -def OnPlayerLogout(curPackData): - PlayerID = curPackData.PlayerID - PlayerLV = curPackData.PlayerLV - #不需要保存离线数据的,直接删除缓存数据 - if not IsNeedSaveLogoutPlayer(PlayerID, PlayerLV): - ViewCacheMgr.DeleteCache(PlayerID) - return - #更新数据,并设置需要保存数据库 - UpdatePlayerCache(PlayerID, curPackData.PropData, curPackData.ItemData, curPackData.PlusData, True, packData=curPackData) - return - -## 根据规则判定是否需要继续保存离线玩家数据 -# @param PlayerID, PlayerLV -# @return None -def IsNeedSaveLogoutPlayer(PlayerID, PlayerLV): - if PlayerFBHelpBattle.IsInHelpBattleCheckInList(PlayerID): +def IsSaveDBViewCache(playerID, playerLV): + ## 是否保存基本的缓存数据 + if PlayerFBHelpBattle.IsInHelpBattleCheckInList(playerID): return True SaveDBLimitLV = IpyGameDataPY.GetFuncCfg("PlayerViewCache", 1) #校验玩家等级 - if PlayerLV < SaveDBLimitLV: + if playerLV < SaveDBLimitLV: return False return True -# 上榜用户 -def IsNeedSaveViewCacheAllInfo(PlayerID): - if PlayerFBHelpBattle.IsInHelpBattleCheckInList(PlayerID): - return True +def IsSaveAllViewCache(playerID): + ## 是否保存所有缓存数据 + NeedCheckBillBoardType = IpyGameDataPY.GetFuncEvalCfg("PlayerViewCache", 2) #校验玩家是否上排行榜 billboardMgr = GameWorld.GetBillboard() @@ -139,108 +70,149 @@ curBillboard = billboardMgr.FindBillboard(BillBoardType) if not curBillboard: continue - if curBillboard.FindByID(PlayerID): + if curBillboard.FindByID(playerID): return True - + return False - -# #校验玩家是否上排行榜 -# billboardMgr = GameWorld.GetBillboard() -# for BillBoardType in NeedCheckBillBoardType: -# curBillboard = billboardMgr.FindBillboard(BillBoardType) -# if not curBillboard: -# continue -# if curBillboard.FindByID(PlayerID): -# return True -# -# curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(PlayerID) -# if curPlayer: -# # 非普通成员需保存 -# if PlayerFamily.GetPlayerFamilyMemberLV(curPlayer) != IPY_GameServer.fmlMember: -# return True -# -# return False - - -## //04 01 地图同步玩家数据到GameServer#tagMGUpdatePlayerCache -# @param routeIndex, mapID, curPackData, tick -# @return None -def OnMGUpdatePlayerCache(routeIndex, mapID, curPackData, tick): - GameWorld.DebugLog('ViewCache### OnMGUpdatePlayerCache in %s'%curPackData.OutputString()) - PlayerID = curPackData.PlayerID - PlayerLV = curPackData.PlayerLV - if curPackData.IsLogouting: - OnPlayerLogout(curPackData) - else: - # 此处保存设置为True是为安全防范,比如突然断电,宕机等情况 导致误以为不保存,故等级可设置高一点 - UpdatePlayerCache(PlayerID, curPackData.PropData, \ - curPackData.ItemData, curPackData.PlusData, True if PlayerLV > 150 else False, packData=curPackData) - GameWorld.DebugLog('ViewCache### OnMGUpdatePlayerCache out') +def DeleteViewCache(playerID): + ## 删除玩家缓存 + pyViewCacheMgr = PyDataManager.GetPlayerViewCachePyManager() + playerViewCachePyDict = pyViewCacheMgr.playerViewCachePyDict + playerViewCachePyDict.pop(playerID) + GameWorld.DebugLog("删除查看缓存!", playerID) return -## //04 02 地图查询玩家缓存数据#tagMGQueryPlayerCache -# @param routeIndex, mapID, curPackData, tick -# @return None +def FindViewCache(playerID, isAddNew=False): + ## 查找玩家缓存 + curCache = None + pyViewCacheMgr = PyDataManager.GetPlayerViewCachePyManager() + playerViewCachePyDict = pyViewCacheMgr.playerViewCachePyDict + if playerID in playerViewCachePyDict: + curCache = playerViewCachePyDict[playerID] + elif isAddNew: + curCache = PyGameDataStruct.tagPlayerViewCachePy() + curCache.PlayerID = playerID + playerViewCachePyDict[playerID] = curCache + return curCache + +#//04 01 地图同步玩家缓存数据到GameServer#tagMGUpdatePlayerCache +# +#struct tagMGUpdatePlayerCache +#{ +# tagHead Head; +# DWORD PlayerID; //玩家ID +# WORD PlayerLV; //玩家等级 +# BYTE IsLogouting; //本次是否为下线同步 +# DWORD OffTime; // 下线时间戳 +# WORD PropDataSize; +# char PropData[PropDataSize]; //属性记录 +# WORD PlusDataSize; +# char PlusData[PlusDataSize]; //扩展记录 +# WORD ItemDataSize1; +# char ItemData1[ItemDataSize1]; //1阶装备数据 +# ... ... +# WORD ItemDataSize15; +# char ItemData15[ItemDataSize15]; +#}; +def OnMGUpdatePlayerCache(routeIndex, mapID, curPackData, tick): + playerID = curPackData.PlayerID + playerLV = curPackData.PlayerLV + isLogout = curPackData.IsLogouting + GameWorld.DebugLog('ViewCache### OnMGUpdatePlayerCache isLogout=%s' % isLogout, playerID) + isSaveAll = True # 是否保存所有数据 + if isLogout: + #不需要保存离线数据的,直接删除缓存数据 + if not IsSaveDBViewCache(playerID, playerLV): + DeleteViewCache(playerID) + return + isSaveAll = IsSaveAllViewCache(playerID) + GameWorld.DebugLog(" isSaveAll=%s" % isSaveAll, playerID) + + curCache = FindViewCache(playerID, True) + if not curCache: + return + curCache.LV = curPackData.PlayerLV + curCache.OffTime = curPackData.OffTime + if isLogout: + curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) + if curPlayer: + curCache.GeTuiID = curPlayer.GetGeTuiClientID() + curCache.GeTuiIDSize = len(curCache.GeTuiID) + + curCache.PropData = curPackData.PropData + curCache.PropDataSize = curPackData.PropDataSize + curCache.PlusData = curPackData.PlusData + curCache.PlusDataSize = curPackData.PlusDataSize + + #GameWorld.DebugLog(" 更新Prop数据: size=%s, %s" % (curCache.PropDataSize, curCache.PropData), playerID) + #GameWorld.DebugLog(" 更新Plus数据: size=%s, %s" % (curCache.PlusDataSize, curCache.PlusData), playerID) + + # 装备数据存储,不保存装备数据的话则清空 + for classLV in xrange(1, 15 + 1): + if not isSaveAll: + itemDataSize = 0 + itemData = "" + else: + itemDataSize = getattr(curPackData, "ItemDataSize%s" % classLV) + if not itemDataSize: + continue + itemData = getattr(curPackData, "ItemData%s" % classLV) + setattr(curCache, "ItemData%s" % classLV, itemData) + setattr(curCache, "ItemDataSize%s" % classLV, itemDataSize) + #GameWorld.DebugLog(" 更新Item数据: classLV=%s,size=%s, %s" % (classLV, itemDataSize, itemData), playerID) + + #GameWorld.DebugLog(" %s" % curCache.outputString()) + # 同步更新助战信息 + if PlayerFBHelpBattle.IsInHelpBattleCheckInList(playerID): + #PropDataDict = json.loads(curCache.PropData) + PropDataDict = eval(curCache.PropData) + fightPower = PropDataDict.get("FightPower", 0) + familyID = PropDataDict.get("FamilyID", 0) + playerName = PropDataDict.get("Name", "") + PlayerFBHelpBattle.UpdateCheckInPlayerInfo(playerID, fightPower, familyID, playerName) + + return + +#//04 02 地图查询玩家缓存数据#tagMGQueryPlayerCache +#struct tagMGQueryPlayerCache +#{ +# tagHead Head; +# DWORD PlayerID; //玩家ID +# DWORD FindPlayerID; //要查询的玩家ID +# BYTE EquipClassLV; //大于0为查看指定境界阶装备信息, 0为查看默认信息 +#}; def OnMGQueryPlayerCache(routeIndex, mapID, curPackData, tick): - GameWorld.DebugLog('ViewCache### OnMGQueryPlayerCache in') curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curPackData.PlayerID) findPlayerID = curPackData.FindPlayerID - curCache = ViewCacheMgr.FindCache(findPlayerID) + equipClassLV = curPackData.EquipClassLV + curCache = FindViewCache(findPlayerID) if not curCache: PlayerControl.NotifyCode(curPlayer, "ViewPlayer_OffLine") + return + + if equipClassLV: + itemData = "" + if hasattr(curCache, "ItemDataSize%s" % equipClassLV): + itemData = getattr(curCache, "ItemData%s" % equipClassLV) + sendPack = ChPyNetSendPack.tagSCPlayerEquipCacheResult() + sendPack.PlayerID = findPlayerID + sendPack.EquipClassLV = equipClassLV + sendPack.ItemData = itemData + sendPack.ItemDataSize = len(sendPack.ItemData) + NetPackCommon.SendFakePack(curPlayer, sendPack) return #回包客户端 sendPack = ChPyNetSendPack.tagSCQueryPlayerCacheResult() sendPack.PlayerID = findPlayerID - if not curCache: - #失败回包 空数据 - GameWorld.DebugLog("PlayerCache## OnMGQueryPlayerCache %s no found"%findPlayerID) - sendPack.PropData = "" - sendPack.PropDataSize = len(sendPack.PropData) - sendPack.ItemData = "" - sendPack.ItemDataSize = len(sendPack.ItemData) - sendPack.PlusData = "" - sendPack.PlusDataSize = len(sendPack.PlusData) - else: - #成功回包 缓存数据 - sendPack.PropData = curCache.GetPropData() - sendPack.PropDataSize = len(sendPack.PropData) - sendPack.ItemData = GetItemData(curCache) - sendPack.ItemDataSize = len(sendPack.ItemData) - sendPack.PlusData = GetPlusData(curCache) - sendPack.PlusDataSize = len(sendPack.PlusData) - + sendPack.PropData = curCache.PropData + sendPack.PropDataSize = len(sendPack.PropData) + sendPack.PlusData = curCache.PlusData + sendPack.PlusDataSize = len(sendPack.PlusData) NetPackCommon.SendFakePack(curPlayer, sendPack) - GameWorld.DebugLog('ViewCache### OnMGQueryPlayerCache out') + #GameWorld.DebugLog('ViewCache### OnMGQueryPlayerCache out') return - -## 获取玩家缓存模型装备信息 -def GetPlayerCacheEquipView(findPlayerID): - curCache = ViewCacheMgr.FindCache(findPlayerID) - if not curCache: - return - - itemData = GetItemData(curCache) - if not itemData: - return - - playerEquipList = [] - equipItemList = eval(itemData) - for equipItemDict in equipItemList: - equipIndex = equipItemDict["ItemIndex"] - if equipIndex not in ShareDefine.RoleEquipType: - continue - - itemID = equipItemDict["ItemID"] - if not itemID: - continue - - playerEquipList.append([itemID, equipIndex, equipItemDict.get("StarLV", 0), 0]) - - return playerEquipList - #=============================================================================== # //B3 06 查询玩家的简短信息 #tagCGViewPlayerShortInfo @@ -256,7 +228,7 @@ answerPack = ChPyNetSendPack.tagGCAnswerPlayerShortInfo() answerPack.Clear() if not tagPlayer: - curCache = ViewCacheMgr.FindCache(clientPack.PlayerID) + curCache = FindViewCache(clientPack.PlayerID) if not curCache: # 实在找不到设置为初始化数据 answerPack.PlayerID = clientPack.PlayerID @@ -267,8 +239,7 @@ answerPack.OnlineType = ChConfig.Def_Offline answerPack.ServerGroupID = 0 else: - cacheDict = eval(curCache.GetPropData()) - + cacheDict = eval(curCache.PropData) answerPack.PlayerID = clientPack.PlayerID answerPack.PlayerName = cacheDict["Name"] answerPack.Job = cacheDict["Job"] @@ -276,7 +247,6 @@ answerPack.RealmLV = cacheDict["RealmLV"] answerPack.OnlineType = ChConfig.Def_Offline answerPack.ServerGroupID = cacheDict.get("ServerGroupID", 0) - else: answerPack.PlayerID = clientPack.PlayerID answerPack.PlayerName = tagPlayer.GetName() @@ -293,17 +263,14 @@ def OnPlayerFamilyChange(playerID, familyID, familyName): GameWorld.DebugLog("ViewCache->OnPlayerFamilyChange", playerID) - curCache = ViewCacheMgr.FindCache(playerID) + curCache = FindViewCache(playerID) if not curCache: return - PropData = eval(curCache.GetPropData()) + PropData = eval(curCache.PropData) PropData["FamilyID"] = familyID PropData["FamilyName"] = familyName - playerLV = PropData["LV"] - - PropData = json.dumps(PropData, ensure_ascii=False) - ItemData = GetItemData(curCache) - PlusData = GetPlusData(curCache) - UpdatePlayerCache(playerID, PropData, ItemData, PlusData, True if playerLV > 150 else False) + PropData = json.dumps(PropData, ensure_ascii=False).replace(" ", "") + curCache.PropData = PropData + curCache.PropDataSize = len(curCache.PropData) return -- Gitblit v1.8.0