| #!/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 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) #ÉèÖÃÐèÒª±£´æµ½Êý¾Ý¿â  | 
|       | 
|     #ÔÝʱ¹Ø±Õ  | 
|     #===========================================================================  | 
|     # 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):  | 
|     SaveDBLimitLV, NeedCheckBillBoardType, HighLadderLimitOrder = ReadChConfig.GetEvalChConfig("CacheSaveLimit")  | 
|     #УÑéÍæ¼ÒµÈ¼¶  | 
|     if PlayerLV < SaveDBLimitLV:  | 
|         return False  | 
|       | 
|     return True  | 
|   | 
| # ÉϰñÓû§  | 
| def IsNeedSaveViewCacheAllInfo(PlayerID):  | 
|     SaveDBLimitLV, NeedCheckBillBoardType, HighLadderLimitOrder = ReadChConfig.GetEvalChConfig("CacheSaveLimit")  | 
|     #УÑéÍæ¼ÒÊÇ·ñÉÏÅÅÐаñ  | 
|     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  | 
|         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  | 
|               | 
|     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  | 
|   | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     NetPackCommon.SendFakePack(curPlayer, answerPack)  | 
|     return  | 
|   | 
| def OnPlayerLeaveFamily(playerID):  | 
|     GameWorld.DebugLog("ViewCache->OnPlayerLeaveFamily", playerID)  | 
|     curCache = ViewCacheMgr.FindCache(playerID)  | 
|     if not curCache:  | 
|         return  | 
|     PropData = eval(curCache.GetPropData())  | 
|     PropData["FamilyID"] = 0  | 
|     PropData["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  | 
|   |