#!/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 FBCommon import BossHurtMng 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["AccID"] = curPlayer.GetAccID() 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["AppID"] = GameWorld.GetPlayerPlatform(curPlayer) #ÏÉħ֮ÕùËùÐèÊôÐÔ 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()) # ×îºóÒ»´Î·¢Ëͼ´µ±×öÀëÏßʱ¼ä # ¸÷À๦ÄÜ BOSS´ÎÊý, BOSSÏà¹Ø¶ÔÓ¦B.BossÐÅÏ¢.xlsxµÄCntMark # ·âħ̳ʣÓà´ÎÊý enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_SealDemon) maxCnt = FBCommon.GetEnterFBMaxCnt(curPlayer, ChConfig.Def_FBMapID_SealDemon) curPlayerPropDict['CntMark_%s'%ChConfig.Def_FBMapID_SealDemon] = max(maxCnt - enterCnt, 0) # ÊÀ½çBOSSÊ£Óà´ÎÊý curPlayerPropDict['CntMark_%s'%ShareDefine.Def_Boss_Func_World] = BossHurtMng.GetCanKillBossCnt(curPlayer, ShareDefine.Def_Boss_Func_World) # BOSSÖ®¼ÒÊ£Óà´ÎÊý curPlayerPropDict['CntMark_%s'%ShareDefine.Def_Boss_Func_Home] = BossHurtMng.GetCanKillBossCnt(curPlayer, ShareDefine.Def_Boss_Func_Home) # ÉñÊÞBOSSÊ£Óà´ÎÊý curPlayerPropDict['CntMark_%s'%ShareDefine.Def_Boss_Func_Dogz] = BossHurtMng.GetCanKillBossCnt(curPlayer, ShareDefine.Def_Boss_Func_Dogz) #----------- #×°±¸Êý¾Ý´ò°ü»º´æ 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 = {} runeHoleCnt = IpyGameDataPY.GetFuncCfg("RuneUnlock", 4) for holeNum in xrange(1, runeHoleCnt + 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