| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #  | 
| #  | 
| ##@package PlayerViewCacheTube.py  | 
| #  | 
| # @todo:Íæ¼ÒÊý¾Ý»º´æ µØÍ¼·þÎñÆ÷´¦ÀíÄ£¿é  | 
| #  | 
| # @author xmnathan  | 
| # @date 2010-01-01 21:30  | 
| # @version 1.0  | 
| # @note:  | 
| #------------------------------------------------------------------------------   | 
| #"""Version = 2017-11-27 22:30"""  | 
| #------------------------------------------------------------------------------   | 
| import ChConfig  | 
| import GameWorld  | 
| import ShareDefine  | 
| import NetPackCommon  | 
| import PlayerControl  | 
| import IPY_GameWorld  | 
| import ChPyNetSendPack  | 
| import ChMapToGamePyPack  | 
| import PlayerMagicWeapon  | 
| import Operate_EquipStone  | 
| import Operate_EquipWash  | 
| import PlayerAttrFruit  | 
| import ItemControler  | 
| import IpyGameDataPY  | 
| import ChEquip  | 
| import time  | 
| import json  | 
|   | 
| Def_Process_Tick = "ProcessPlayerCache"  | 
| ##Íæ¼ÒÏÂÏßͬ²½  | 
| #  @param curPlayer, tick  | 
| #  @return None  | 
| def OnPlayerLogOut(curPlayer, tick):  | 
|     #·¢ËÍ֪ͨGameServer »º´æÊý¾Ý  | 
|     curPlayer.SetDict(Def_Process_Tick, tick)   | 
|     UpdateGameServerPlayerCache(curPlayer, tick, True)     | 
|       | 
|     return  | 
|   | 
| ##Íæ¼ÒÔÚÏß¶¨Ê±Í¬²½  | 
| #  @param curPlayer, tick  | 
| #  @return None  | 
| def ProcessCache(curPlayer, tick):  | 
|     if tick - curPlayer.GetDictByKey(Def_Process_Tick) > 5*60*1000:  | 
|         UpdateGameServerPlayerCache(curPlayer, tick, False)    | 
|         curPlayer.SetDict(Def_Process_Tick, tick)  | 
|     return  | 
|   | 
| ##¸üÐÂÍæ¼Òµ±Ç°ÏêϸÐÅÏ¢µ½GameServer  | 
| #  @param curPlayer, tick  | 
| #  @return None  | 
| def UpdateGameServerPlayerCache(curPlayer, tick, IsLogouting = False):  | 
|     GameWorld.DebugLog('ViewCache### UpdateGameServerPlayerCache in')  | 
|     #»ñÈ¡µ±Ç°Íæ¼Ò»º´æÊý¾Ý  | 
|     curPlayerPropData, curPlayerItemData, curPlayerPlusData = GetPlayerCache(curPlayer)  | 
|       | 
|     #ͬ²½·¢Ë͵½GameServer  | 
|     sendPack = ChMapToGamePyPack.tagMGUpdatePlayerCache()  | 
|     sendPack.PlayerID = curPlayer.GetPlayerID()  | 
|     sendPack.PlayerLV = curPlayer.GetLV()  | 
|     sendPack.PropData = curPlayerPropData  | 
|     sendPack.PropDataSize = len(curPlayerPropData)  | 
|     sendPack.ItemData = curPlayerItemData  | 
|     sendPack.ItemDataSize = len(curPlayerItemData)  | 
|     sendPack.PlusData = curPlayerPlusData  | 
|     sendPack.PlusDataSize = len(curPlayerPlusData)  | 
|     sendPack.IsLogouting = IsLogouting #֪ͨ±¾´Îͬ²½ÊÇ·ñÏÂÏßǰ±£´æ  | 
|     NetPackCommon.SendPyPackToGameServer(sendPack)  | 
|     GameWorld.DebugLog('ViewCache### UpdateGameServerPlayerCache out')  | 
|     return  | 
|   | 
| ## »ñÈ¡Íæ¼ÒÊý¾Ý»º´æ  | 
| #  @param curPlayer  | 
| #  @return None  | 
| def GetPlayerCache(curPlayer):  | 
|     #-----------  | 
|     #Íæ¼ÒÊôÐÔ»º´æ  | 
|     curPlayerPropDict = {}  | 
|     curPlayerPropDict["LV"] = curPlayer.GetLV()  | 
|     curPlayerPropDict["RealmLV"] = curPlayer.GetOfficialRank()  | 
|     curPlayerPropDict["Job"] = curPlayer.GetJob()  | 
|     curPlayerPropDict["JobRank"] = PlayerControl.GetJobRank(curPlayer)  | 
|     curPlayerPropDict["VIPLV"] = curPlayer.GetVIPLv()  | 
|     curPlayerPropDict["Name"] = curPlayer.GetPlayerName()  | 
|     curPlayerPropDict["FamilyID"] = curPlayer.GetFamilyID()  | 
|     curPlayerPropDict["FamilyName"] = curPlayer.GetFamilyName()  | 
|     curPlayerPropDict["FightPower"] = curPlayer.GetFightPower()  | 
|     #ÏÉħ֮ÕùËùÐèÊôÐÔ  | 
|     curPlayerPropDict["MinAtk"] = curPlayer.GetMinAtk()  | 
|     curPlayerPropDict["MaxAtk"] = curPlayer.GetMaxAtk()  | 
|     curPlayerPropDict["Def"] = curPlayer.GetDef()  | 
|     curPlayerPropDict["MaxHP"] = curPlayer.GetMaxHP()  | 
|     #ÍÆËÍÌáÐÑ  | 
|     curPlayerPropDict[ChConfig.Def_PDict_GeTuiSet] = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GeTuiSet)  | 
|     curPlayerPropDict[ChConfig.Def_PDict_NoGeTuiTime] = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_NoGeTuiTime)  | 
|     curPlayerPropDict['GeTuiClientID'] = curPlayer.GetAccountData().GetGeTuiClientID()  | 
|     curPlayerPropDict['Time'] = int(time.time())    # ×îºóÒ»´Î·¢Ëͼ´µ±×öÀëÏßʱ¼ä  | 
|       | 
|     #-----------  | 
|     #×°±¸Êý¾Ý´ò°ü»º´æ  | 
|     curEquipItemList = __GetPackEquipCacheList(curPlayer, IPY_GameWorld.rptEquip)  | 
|     #-----------  | 
|     #À©Õ¹ÊôÐÔ»º´æ  | 
|     curPlayerPlusDict = {}  | 
|       | 
|     #¸÷Ä£¿éÕ½Á¦  | 
|     fightPowerDict = {}  | 
|     for mfpType in ShareDefine.ModuleFightPowerTypeList:  | 
|         fightPower = PlayerControl.GetMFPFightPower(curPlayer, mfpType)  | 
|         if fightPower:  | 
|             fightPowerDict["%s" % mfpType] = fightPower  | 
|     curPlayerPlusDict["FightPowerDict"] = fightPowerDict  | 
|       | 
|     #³á°òÐÅÏ¢ÔÚ³á°ò×°±¸Î»¶ÔӦװ±¸ÐÅÏ¢  | 
|       | 
|     #²¿Î»Ç¿»¯Êý¾Ý  | 
|     curPlayerPlusDict["EquipPartStarLV"] = __GetEquipPartStarLVInfo(curPlayer)  | 
|       | 
|     #²¿Î»±¦Ê¯Êý¾Ý  | 
|     curPlayerPlusDict["EquipPartStone"] = __GetEquipPartStoneInfo(curPlayer)  | 
|       | 
|     #²¿Î»Ï´Á·Êý¾Ý  | 
|     curPlayerPlusDict["EquipWash"] = __GetEquipWashInfo(curPlayer)  | 
|       | 
|     #Áé³èÊý¾Ý  | 
|     curPlayerPlusDict["Pet"] = __GetPetInfo(curPlayer)  | 
|       | 
|     #×øÆïÊý¾Ý  | 
|     curPlayerPlusDict["Horse"] = __GetHorseInfo(curPlayer)  | 
|       | 
|     #ÉñÆ÷Êý¾Ý  | 
|     curPlayerPlusDict["GodWeapon"] = __GetGodWeaponInfo(curPlayer)  | 
|       | 
|     #·ûÓ¡Êý¾Ý  | 
|     curPlayerPlusDict["Rune"] = __GetRuneInfo(curPlayer)  | 
|       | 
|     #·¨±¦Êý¾Ý  | 
|     curPlayerPlusDict["MagicWeapon"] = __GetMagicWeaponInfo(curPlayer)  | 
|       | 
|     #²¿Î»Ì××°Êý¾Ý  | 
|     curPlayerPlusDict["EquipPartSuite"] = __GetEquipPartSuiteInfo(curPlayer)  | 
|     #»êʯ¡¢µ¤Ò©Ê¹ÓøöÊý  | 
|     curPlayerPlusDict["Fruit"] = PlayerAttrFruit.GetAttrFruitEatCntDict(curPlayer)  | 
|       | 
|     #-----------  | 
|     curPlayerPropData = json.dumps(curPlayerPropDict, ensure_ascii=False)  | 
|     curPlayerItemData = json.dumps(curEquipItemList, ensure_ascii=False)  | 
|     curPlayerPlusData = json.dumps(__RemoveEmptyDataKey(curPlayerPlusDict), ensure_ascii=False)  | 
|     return (curPlayerPropData, curPlayerItemData, curPlayerPlusData)  | 
|   | 
| def __RemoveEmptyDataKey(dataDict):  | 
|     for key in dataDict.keys():  | 
|         if not dataDict[key]:  | 
|             dataDict.pop(key)  | 
|     return dataDict  | 
|   | 
| ## ¹«¹²²¿Î»Ç¿»¯ÐǼ¶ÐÅÏ¢{²¿Î»Ë÷Òý:ÐǼ¶, ...}  | 
| def __GetEquipPartStarLVInfo(curPlayer):  | 
|     pType = IPY_GameWorld.rptEquip # ÔÝʱֻȡװ±¸±³°ü£¬Ö®ºóÓÐÀ©Õ¹ÔÙÐÞ¸Ä  | 
|     indexList = ChConfig.Pack_EquipPart_CanPlusStar[pType]  | 
|     starLVInfoDict = {}  | 
|     for i in indexList:  | 
|         starLV = ChEquip.GetEquipPartStarLV(curPlayer, pType, i)  | 
|         if starLV:  | 
|             starLVInfoDict[i] = starLV  | 
|     return starLVInfoDict  | 
|   | 
| ## ¹«¹²²¿Î»±¦Ê¯ÐÅÏ¢{²¿Î»Ë÷Òý:[±¦Ê¯ID, ...], ...}  | 
| def __GetEquipPartStoneInfo(curPlayer):  | 
|     stoneInfoDict = {}  | 
|     stoneCanPlaceList = Operate_EquipStone.GetAllStoneEquipIndexList() # »ñµÃËùÓпÉÏâǶ±¦Ê¯×°±¸Î»     | 
|     for equipIndex in stoneCanPlaceList:  | 
|         stoneIDList = Operate_EquipStone.GetEquipIndexStoneIDList(curPlayer, equipIndex)  | 
|         if stoneIDList and stoneIDList.count(0) != len(stoneIDList):  | 
|             stoneInfoDict[equipIndex] = stoneIDList  | 
|     return stoneInfoDict  | 
|   | 
| ## ¹«¹²²¿Î»Ï´Á·ÐÅÏ¢[{"Place":²¿Î»Ë÷Òý, "LV":Ï´Á·µÈ¼¶, "Value":[Ï´Á·Öµ1,Ï´Á·Öµ2,... ]}, ...]  | 
| def __GetEquipWashInfo(curPlayer):  | 
|     stoneInfoList = []  | 
|     washPlaceList = Operate_EquipWash.GetAllEquipWashPlace() # »ñÈ¡ËùÓпÉÏ´Á·µÄ×°±¸Î»  | 
|     for place in washPlaceList:  | 
|         washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % place) + 1  | 
|         valueList = []  | 
|         hasValue = False  | 
|         for attrNum in xrange(1, Operate_EquipWash.Def_EquipWashMaxAttrCount + 1):  | 
|             value = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (place, attrNum))  | 
|             if value:  | 
|                 valueList.append(value)  | 
|                 hasValue = True  | 
|                   | 
|         if hasValue:  | 
|             stoneInfoList.append({"Place":place, "LV":washLV, "Value":valueList})  | 
|     return stoneInfoList  | 
|   | 
|   | 
| ## ¹«¹²²¿Î»Ì××°µÈ¼¶ÐÅÏ¢{²¿Î»Ë÷Òý:{Ì××°ÀàÐÍ:Ì××°µÈ¼¶,..}, ...}  | 
| def __GetEquipPartSuiteInfo(curPlayer):  | 
|     suiteInfoDict = {}  | 
|     equipSuitTypeDict = IpyGameDataPY.GetFuncEvalCfg('EquipSuitType')  | 
|     for equipIndexList in equipSuitTypeDict.values():  | 
|         for i in equipIndexList:  | 
|             suiteInfo = ChEquip.GetSuiteInfoByPlace(curPlayer, i)  | 
|             if suiteInfo:  | 
|                 suiteInfoDict[i] = suiteInfo  | 
|     return suiteInfoDict  | 
|   | 
| ## Áé³èÐÅÏ¢  | 
| def __GetPetInfo(curPlayer):  | 
|     petInfo = {}  | 
|     petClassLVList = []  | 
|     equipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptPet)  | 
|     for index in xrange(equipPack.GetCount()):  | 
|         packItem = equipPack.GetAt(index)  | 
|         if not packItem or packItem.IsEmpty():  | 
|             continue  | 
|         petNPCID = packItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)  | 
|         classLV = packItem.GetUserAttr(ShareDefine.Def_IudetPet_ClassLV)  | 
|         petClassLVList.append({"id":petNPCID, 'lv':classLV})  | 
|           | 
|     petInfo["PetLV"] = petClassLVList  | 
|     petInfo["AtkSpeed"] = PlayerControl.GetAtkSpeed(curPlayer)  | 
|     return petInfo  | 
|   | 
| ## ×øÆïÐÅÏ¢  | 
| def __GetHorseInfo(curPlayer):  | 
|     horseList = []  | 
|     ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|     for i in xrange(ipyDataMgr.GetHorseCount()):  | 
|         ipyData = ipyDataMgr.GetHorseByIndex(i)  | 
|         horseID = ipyData.GetHorseID()  | 
|         horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID, 0, ChConfig.Def_PDictType_Horse)  | 
|         if horseLV:  | 
|             horseList.append({"id":horseID, 'lv':horseLV})  | 
|     return horseList  | 
|   | 
| ## ÉñÆ÷ÐÅÏ¢  | 
| def __GetGodWeaponInfo(curPlayer):  | 
|     godWeaponDict = {}  | 
|     ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|     maxType = ipyDataMgr.GetGodWeaponByIndex(ipyDataMgr.GetGodWeaponCount()-1).GetType()  | 
|     for gwType in xrange(1, maxType + 1):  | 
|         gwLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GodWeaponLV % gwType)  | 
|         if gwLV:  | 
|             godWeaponDict[gwType] = gwLV  | 
|     return godWeaponDict  | 
|   | 
| ## ·ûÓ¡ÐÅÏ¢  | 
| def __GetRuneInfo(curPlayer):  | 
|     runeDict = {}  | 
|     runeUnlockList = IpyGameDataPY.GetFuncEvalCfg("RuneUnlock", 1)  | 
|     for holeNum in xrange(1, len(runeUnlockList) + 1):  | 
|         runeData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Rune_Data % holeNum, 0)  | 
|         if not runeData:  | 
|             continue  | 
|         runeItemID = ItemControler.GetRuneItemID(runeData)  | 
|         runeItemPlusLV = ItemControler.GetRuneItemPlusLV(runeData)  | 
|         runeDict[holeNum] = [runeItemID, runeItemPlusLV]  | 
|     return len(runeDict)  | 
|   | 
| ## ·¨±¦ÐÅÏ¢  | 
| def __GetMagicWeaponInfo(curPlayer):  | 
|     mwDict = {}  | 
|     ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|     for i in xrange(ipyDataMgr.GetTreasureCount()):  | 
|         treasureIpyData = ipyDataMgr.GetTreasureByIndex(i)  | 
|         magicWeaponID = treasureIpyData.GetID()  | 
|         treasureType = treasureIpyData.GetTreasureType()  | 
|         if PlayerMagicWeapon.GetIsActiveMagicWeapon(curPlayer, magicWeaponID):  | 
|             mwDict[treasureType] = mwDict.get(treasureType, 0) + 1  | 
|               | 
|     return mwDict  | 
|               | 
| ## »ñÈ¡Íæ¼Ò±³°üÀàÐÍÀïµÄ×°±¸ÐÅÏ¢»º´æÁÐ±í  | 
| def __GetPackEquipCacheList(curPlayer, packType):  | 
|     equipPack = curPlayer.GetItemManager().GetPack(packType)  | 
|     itemList = []  | 
|     for index in xrange(equipPack.GetCount()):  | 
|         curEquip = equipPack.GetAt(index)  | 
|         if not curEquip or curEquip.IsEmpty():  | 
|             continue  | 
|         itemDict = {}  | 
|         itemDict["ItemIndex"] = curEquip.GetItemPlaceIndex()  | 
|         itemDict["ItemID"] = curEquip.GetItemTypeID()  | 
|         itemDict["IsBind"] = int(curEquip.GetIsBind())  | 
|         itemDict["IsSuite"] = int(curEquip.GetIsSuite())  | 
|         userData = curEquip.GetUserData()  | 
|         if userData and userData != "{}":  | 
|             itemDict["UserData"] = userData  | 
|         itemList.append(__RemoveEmptyDataKey(itemDict))  | 
|     return itemList  | 
|   | 
|   | 
| ##//A2 12 ²é¿´Íæ¼ÒÏêϸÐÅÏ¢#tagCMViewPlayerInfo  | 
| #  @param curPlayer, tick  | 
| #  @return None  | 
| def OnCMViewPlayerInfo(index, clientPack, tick):  | 
|     GameWorld.DebugLog('ViewCache### OnCMViewPlayerInfo in')  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     findPlayerID = clientPack.PlayerID  | 
|     findPlayer = GameWorld.GetPlayerManager().FindPlayerByID(findPlayerID)  | 
|     if findPlayer:  | 
|         #±¾µØÍ¼Íæ¼ÒÖ±½Ó·µ»Ø  | 
|         curPlayerPropData, curPlayerItemData, curPlayerPlusData = GetPlayerCache(findPlayer)  | 
|         #GameWorld.DebugLog("PropData=%s" % curPlayerPropData)  | 
|         #GameWorld.DebugLog("ItemData=%s" % curPlayerItemData)  | 
|         #GameWorld.DebugLog("PlusData=%s" % curPlayerPlusData)  | 
|         sendPack = ChPyNetSendPack.tagSCQueryPlayerCacheResult()  | 
|         sendPack.PlayerID = findPlayerID  | 
|         sendPack.PropData = curPlayerPropData  | 
|         sendPack.PropDataSize = len( sendPack.PropData)  | 
|         sendPack.ItemData = curPlayerItemData  | 
|         sendPack.ItemDataSize = len(sendPack.ItemData)  | 
|         sendPack.PlusData = curPlayerPlusData  | 
|         sendPack.PlusDataSize = len(sendPack.PlusData)  | 
|           | 
|         GameWorld.DebugLog('ViewCache### OnCMViewPlayerInfo len: %s , sendPack: %s'%(sendPack.GetLength(),sendPack.OutputString()))  | 
|         NetPackCommon.SendFakePack(curPlayer, sendPack)  | 
|         GameWorld.DebugLog('ViewCache### OnCMViewPlayerInfo Return MapPlayerInfo out')  | 
|         return  | 
|     #·¢Ë͵½GameServerÈ¥²éѯ  | 
|     sendPack = ChMapToGamePyPack.tagMGQueryPlayerCache()  | 
|     sendPack.PlayerID = curPlayer.GetPlayerID()  | 
|     sendPack.FindPlayerID = findPlayerID  | 
|       | 
|     NetPackCommon.SendPyPackToGameServer(sendPack)    | 
|     GameWorld.DebugLog('ViewCache### OnCMViewPlayerInfo SendToGameServer Query out')  | 
|     return  | 
|   | 
|   | 
|   | 
|   | 
|   |