#!/usr/bin/python # -*- coding: GBK -*- # # ##@package PlayerViewCache.py # # @todo:Íæ¼ÒÊý¾Ý»º´æ # # @author NathanShaw # @date 2010-01-01 21:30 # @version 1.3 # @note: # # @change: "2014-11-05 11:20" xmnathan Íæ¼ÒÊý¾Ý»º´æ¹ÜÀí # @change: "2014-12-09 17:30" xmnathan Íæ¼ÒÊý¾Ý»º´æ # @change: "2016-05-18 16:00" hxp Õ½ÃËÓйÙÔ±³ÉÔ±»º´æ²»Çå³ý #--------------------------------------------------------------------- #"""Version = 2016-05-18 16:00""" #------------------------------------------------------------------------------ import GameWorld import ChPyNetSendPack import IPY_PlayerDefine import PlayerFamilyAction import PlayerControl import NetPackCommon import ReadChConfig import PlayerFamily import IPY_GameServer import PlayerFBHelpBattle import IpyGameDataPY import ShareDefine import ChConfig import time import json ViewCacheMgr = GameWorld.GameWorldData.GetPlayerViewCacheMgr() # ÓÅÏÈÈ¡»º´æÊý¾Ý£¬ºóÈ¡¿É±£´æÊý¾Ý def GetItemData(curCache): result = curCache.GetItemDataNoSave() if not result: return curCache.GetItemData() return result def GetPlusData(curCache): result = curCache.GetPlusDataNoSave() if not result: return curCache.GetPlusData() return result ##¸üлº´æÊý¾Ý # @param PlayerID, PropData, ItemData, PlusData, isSaveDB # @return None def UpdatePlayerCache(PlayerID, PropData, ItemData, PlusData, isSaveDB=False): curCache = ViewCacheMgr.FindCache(PlayerID) if not curCache: curCache = ViewCacheMgr.AddNewCache(PlayerID) curCache.SetUpdateTime(GameWorld.GetCurrentDataTimeStr()) 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(PlayerID, PlayerLV, PropData, ItemData, PlusData): #²»ÐèÒª±£´æÀëÏßÊý¾ÝµÄ£¬Ö±½Óɾ³ý»º´æÊý¾Ý if not IsNeedSaveLogoutPlayer(PlayerID, PlayerLV): ViewCacheMgr.DeleteCache(PlayerID) return #¸üÐÂÊý¾Ý£¬²¢ÉèÖÃÐèÒª±£´æÊý¾Ý¿â UpdatePlayerCache(PlayerID, PropData, ItemData, PlusData, True) return ## ¸ù¾Ý¹æÔòÅж¨ÊÇ·ñÐèÒª¼ÌÐø±£´æÀëÏßÍæ¼ÒÊý¾Ý # @param PlayerID, PlayerLV # @return None def IsNeedSaveLogoutPlayer(PlayerID, PlayerLV): if PlayerFBHelpBattle.IsInHelpBattleCheckInList(PlayerID): return True SaveDBLimitLV = IpyGameDataPY.GetFuncCfg("PlayerViewCache", 1) #УÑéÍæ¼ÒµÈ¼¶ if PlayerLV < SaveDBLimitLV: return False return True # ÉϰñÓû§ def IsNeedSaveViewCacheAllInfo(PlayerID): if PlayerFBHelpBattle.IsInHelpBattleCheckInList(PlayerID): return True NeedCheckBillBoardType = IpyGameDataPY.GetFuncEvalCfg("PlayerViewCache", 2) #УÑéÍæ¼ÒÊÇ·ñÉÏÅÅÐаñ billboardMgr = GameWorld.GetBillboard() for BillBoardType in NeedCheckBillBoardType: curBillboard = billboardMgr.FindBillboard(BillBoardType) if not curBillboard: continue 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 # # #УÑéÍæ¼Ò¾º¼¼³¡ÊÇ·ñ½øÈëÅÅÃû # hightLadderMgr = GameWorld.GetHightLadderMgr() # hightLadderData = hightLadderMgr.FindPlayerData(PlayerID) # if hightLadderData: # if hightLadderData.GetOrder() < HighLadderLimitOrder: # 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(PlayerID, PlayerLV, \ curPackData.PropData, curPackData.ItemData, curPackData.PlusData) else: # ´Ë´¦±£´æÉèÖÃΪTrueÊÇΪ°²È«·À·¶£¬±ÈÈçͻȻ¶Ïµç£¬å´»úµÈÇé¿ö µ¼ÖÂÎóÒÔΪ²»±£´æ£¬¹ÊµÈ¼¶¿ÉÉèÖøßÒ»µã UpdatePlayerCache(PlayerID, curPackData.PropData, \ curPackData.ItemData, curPackData.PlusData, True if PlayerLV > 150 else False) GameWorld.DebugLog('ViewCache### OnMGUpdatePlayerCache out') return ## //04 02 µØÍ¼²éÑ¯Íæ¼Ò»º´æÊý¾Ý#tagMGQueryPlayerCache # @param routeIndex, mapID, curPackData, tick # @return None def OnMGQueryPlayerCache(routeIndex, mapID, curPackData, tick): GameWorld.DebugLog('ViewCache### OnMGQueryPlayerCache in') curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curPackData.PlayerID) findPlayerID = curPackData.FindPlayerID curCache = ViewCacheMgr.FindCache(findPlayerID) if not curCache: PlayerControl.NotifyCode(curPlayer, "ViewPlayer_OffLine") 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) NetPackCommon.SendFakePack(curPlayer, sendPack) 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 # struct tagCGViewPlayerShortInfo # { # tagHead Head; # DWORD PlayerID; # }; #=============================================================================== def OnViewPlayerShortInfo(index, clientPack, tick): ## ·â°ü֪ͨ tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(clientPack.PlayerID) answerPack = ChPyNetSendPack.tagGCAnswerPlayerShortInfo() answerPack.Clear() if not tagPlayer: curCache = ViewCacheMgr.FindCache(clientPack.PlayerID) if not curCache: # ʵÔÚÕÒ²»µ½ÉèÖÃΪ³õʼ»¯Êý¾Ý answerPack.PlayerID = clientPack.PlayerID answerPack.PlayerName = "" answerPack.Job = 1 answerPack.LV = 1 answerPack.RealmLV = 1 answerPack.OnlineType = ChConfig.Def_Offline answerPack.ServerGroupID = 0 else: cacheDict = eval(curCache.GetPropData()) answerPack.PlayerID = clientPack.PlayerID answerPack.PlayerName = cacheDict["Name"] answerPack.Job = cacheDict["Job"] answerPack.LV = cacheDict["LV"] answerPack.RealmLV = cacheDict["RealmLV"] answerPack.OnlineType = ChConfig.Def_Offline answerPack.ServerGroupID = cacheDict.get("ServerGroupID", 0) else: answerPack.PlayerID = clientPack.PlayerID answerPack.PlayerName = tagPlayer.GetName() answerPack.Job = tagPlayer.GetJob() answerPack.LV = tagPlayer.GetLV() answerPack.RealmLV = tagPlayer.GetOfficialRank() answerPack.OnlineType = ChConfig.Def_Online answerPack.IsInTeam = tagPlayer.GetTeamID() > 0 answerPack.ServerGroupID = PlayerControl.GetPlayerServerGroupID(tagPlayer) curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) NetPackCommon.SendFakePack(curPlayer, answerPack) return def OnPlayerFamilyChange(playerID, familyID, familyName): GameWorld.DebugLog("ViewCache->OnPlayerFamilyChange", playerID) curCache = ViewCacheMgr.FindCache(playerID) if not curCache: return PropData = eval(curCache.GetPropData()) PropData["FamilyID"] = familyID PropData["FamilyName"] = familyName playerLV = PropData["LV"] PropData = json.dumps(PropData, ensure_ascii=False) ItemData = curCache.GetItemData() PlusData = curCache.GetPlusData() UpdatePlayerCache(playerID, PropData, ItemData, PlusData, True if playerLV > 150 else False) return