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