From 835c5fad7ad4e723c34be7f5fc073eeb7104e3f4 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期六, 27 四月 2019 11:14:44 +0800 Subject: [PATCH] 6628 【2.0】【后端】查看玩家装备和查看玩家战力功能 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py | 286 +++++++++++++++++++++++++++++--------------------------- 1 files changed, 148 insertions(+), 138 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py index 4d3572c..d4b43cf 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py @@ -30,59 +30,134 @@ import ChEquip import FBCommon import BossHurtMng +import ItemCommon +import PyGameData +import PlayerTJG 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) - + ##玩家下线同步 + UpdateGameServerPlayerCache(curPlayer, tick, True) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipViewCacheState, 0) return -##玩家在线定时同步 -# @param curPlayer, tick -# @return None def ProcessCache(curPlayer, tick): - if tick - curPlayer.GetDictByKey(Def_Process_Tick) > 5*60*1000: - UpdateGameServerPlayerCache(curPlayer, tick, False) + ##玩家在线定时同步 + lastTick = curPlayer.GetDictByKey(Def_Process_Tick) + if not lastTick: curPlayer.SetDict(Def_Process_Tick, tick) + return + if tick - lastTick < 5 * 60 * 1000: # 同步玩家缓存间隔 + return + UpdateGameServerPlayerCache(curPlayer, tick, False) return ##更新玩家当前详细信息到GameServer # @param curPlayer, tick # @return None -def UpdateGameServerPlayerCache(curPlayer, tick, IsLogouting = False): - GameWorld.DebugLog('ViewCache### UpdateGameServerPlayerCache in') +def UpdateGameServerPlayerCache(curPlayer, tick, IsLogouting=False): + if PlayerTJG.GetIsTJG(curPlayer): + # 脱机不处理 + return + curPlayer.SetDict(Def_Process_Tick, tick) #获取当前玩家缓存数据 - curPlayerPropData, curPlayerItemData, curPlayerPlusData = GetPlayerCache(curPlayer) + PropData, PlusData = GetPlayerPropPlusCache(curPlayer) + itemDataDict = __GetPlayerItemDataCache(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 #通知本次同步是否下线前保存 sendPack.OffTime = int(time.time()) # 最后一次发送即当做离线时间 + sendPack.PropData = PropData + sendPack.PropDataSize = len(sendPack.PropData) + sendPack.PlusData = PlusData + sendPack.PlusDataSize = len(sendPack.PlusData) + for classLV, itemData in itemDataDict.items(): + setattr(sendPack, "ItemData%s" % classLV, itemData) + setattr(sendPack, "ItemDataSize%s" % classLV, len(itemData)) + #GameWorld.DebugLog("同步缓存: %s" % sendPack.OutputString()) NetPackCommon.SendPyPackToGameServer(sendPack) - GameWorld.DebugLog('ViewCache### UpdateGameServerPlayerCache out') return -## 获取玩家数据缓存 -# @param curPlayer -# @return None -def GetPlayerCache(curPlayer): - #----------- +def __GetPlayerItemDataCache(curPlayer): + ## 装备及装备位养成缓存,由于装备位比较多,所以按阶同步,重登第一次同步所有阶 + + if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipViewCacheState): + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipViewCacheState, 1) + needSyncClassLVList = xrange(1, IpyGameDataPY.GetFuncCfg('EquipMaxClasslv') + 1) + else: + playerID = curPlayer.GetPlayerID() + needSyncClassLVList = PyGameData.g_equipChangeClassLVInfo.pop(playerID, []) + + itemDataDict = {} + for classLV in needSyncClassLVList: + itemDataDict[classLV] = __GetPlayerEquipClassDataCache(curPlayer, classLV) + + return itemDataDict + +def __GetPlayerEquipClassDataCache(curPlayer, classLV): + ## 获取境界阶装备缓存数据 + ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'ClassLV':classLV}, True) + if not ipyDataList: + return "{}" + + packType = IPY_GameWorld.rptEquip + equipPack = curPlayer.GetItemManager().GetPack(packType) + classItemDataDict = {} + for ipyData in ipyDataList: + index = ipyData.GetGridIndex() + + curEquip = equipPack.GetAt(index) + if not curEquip or curEquip.IsEmpty(): + continue + + itemDict = {} + itemDict["ItemID"] = curEquip.GetItemTypeID() + userData = curEquip.GetUserData() + if userData and userData != "{}": + itemDict["UserData"] = userData + + classItemDataDict[index] = itemDict + classLV = ItemCommon.GetItemClassLV(curEquip) + if not classLV: + continue + + #部位升星数据 + equipStar = ChEquip.GetEquipPartStarByRank(curPlayer, index, curEquip) + if equipStar: + itemDict["Star"] = equipStar + + #部位强化数据 + equipPartPlusLV = ChEquip.GetEquipPartPlusLVByRank(curPlayer, packType, index, curEquip) + equipPartPlusEvolveLV = ChEquip.GetEquipPartPlusEvolveLVByEquip(curPlayer, packType, index, curEquip) + if equipPartPlusLV: + itemDict["PlusLV"] = equipPartPlusLV + if equipPartPlusEvolveLV: + itemDict["EvolveLV"] = equipPartPlusEvolveLV + + #部位宝石数据 + stoneIDList = Operate_EquipStone.GetEquipIndexStoneIDList(curPlayer, index) + if stoneIDList and stoneIDList.count(0) != len(stoneIDList): + itemDict["Stone"] = stoneIDList + + #部位洗练数据 + washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % index) + 1 + valueList = [] + for attrNum in xrange(1, Operate_EquipWash.Def_EquipWashMaxAttrCount + 1): + value = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashValue % (index, attrNum)) + valueList.append(value) + if valueList and valueList.count(0) != len(valueList): + itemDict["Wash"] = {"LV":washLV, "Value":valueList} + + return json.dumps(classItemDataDict, ensure_ascii=False).replace(" ", "") + +def GetPlayerPropPlusCache(curPlayer): #玩家属性缓存 curPlayerPropDict = {} curPlayerPropDict["AccID"] = curPlayer.GetAccID() @@ -96,6 +171,7 @@ curPlayerPropDict["FightPower"] = curPlayer.GetFightPower() curPlayerPropDict["AppID"] = GameWorld.GetPlayerPlatform(curPlayer) curPlayerPropDict["EquipShowSwitch"] = curPlayer.GetEquipShowSwitch() + curPlayerPropDict["EquipShowID"] = __GetEquipShowIDList(curPlayer) curPlayerPropDict["ServerGroupID"] = PlayerControl.GetPlayerServerGroupID(curPlayer) #仙魔之争所需属性 curPlayerPropDict["MinAtk"] = curPlayer.GetMinAtk() @@ -110,21 +186,18 @@ # 封魔坛剩余次数 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) + curPlayerPropDict['CntMark_%s' % ChConfig.Def_FBMapID_SealDemon] = max(maxCnt - enterCnt, 0) # 诛仙BOSS剩余次数 enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % ChConfig.Def_FBMapID_ZhuXianBoss) maxCnt = FBCommon.GetEnterFBMaxCnt(curPlayer, ChConfig.Def_FBMapID_ZhuXianBoss) - curPlayerPropDict['CntMark_%s'%ChConfig.Def_FBMapID_ZhuXianBoss] = max(maxCnt - enterCnt, 0) + curPlayerPropDict['CntMark_%s' % ChConfig.Def_FBMapID_ZhuXianBoss] = max(maxCnt - enterCnt, 0) # 世界BOSS剩余次数 - curPlayerPropDict['CntMark_%s'%ShareDefine.Def_Boss_Func_World] = BossHurtMng.GetCanKillBossCnt(curPlayer, ShareDefine.Def_Boss_Func_World) + 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) + 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) + curPlayerPropDict['CntMark_%s' % ShareDefine.Def_Boss_Func_Dogz] = BossHurtMng.GetCanKillBossCnt(curPlayer, ShareDefine.Def_Boss_Func_Dogz) + #----------- #扩展属性缓存 curPlayerPlusDict = {} @@ -136,17 +209,6 @@ if fightPower: fightPowerDict["%s" % mfpType] = fightPower curPlayerPlusDict["FightPowerDict"] = fightPowerDict - - #翅膀信息在翅膀装备位对应装备信息 - - #部位强化数据 - curPlayerPlusDict["EquipPartStarLV"] = __GetEquipPartPlusLVInfo(curPlayer) - - #部位宝石数据 - curPlayerPlusDict["EquipPartStone"] = __GetEquipPartStoneInfo(curPlayer) - - #部位洗练数据 - curPlayerPlusDict["EquipWash"] = __GetEquipWashInfo(curPlayer) #灵宠数据 curPlayerPlusDict["Pet"] = __GetPetInfo(curPlayer) @@ -166,57 +228,21 @@ #魂石、丹药使用个数 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) + PropData = json.dumps(curPlayerPropDict, ensure_ascii=False).replace(" ", "") + PlusData = json.dumps(curPlayerPlusDict, ensure_ascii=False).replace(" ", "") + return PropData, PlusData -def __RemoveEmptyDataKey(dataDict): - for key in dataDict.keys(): - if not dataDict[key]: - dataDict.pop(key) - return dataDict - -## 公共部位强化星级信息{部位索引:强化等级, ...} -def __GetEquipPartPlusLVInfo(curPlayer): - pType = IPY_GameWorld.rptEquip # 暂时只取装备背包,之后有扩展再修改 - indexList = ChConfig.Pack_EquipPart_CanPlusStar[pType] - starLVInfoDict = {} - for i in indexList: - starLV = ChEquip.GetEquipPartPlusLV(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 __GetEquipShowIDList(curPlayer): + ## 获取外观装备ID列表 + equipShowIDList = [] + indexList = range(10) + PlayerControl.GetFaceEquipIndexList(curPlayer) # 暂写死前10个物品 + 展示的境界装备部位 + equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip) + for index in indexList: + curEquip = equipPack.GetAt(index) + if not curEquip or curEquip.IsEmpty(): + continue + equipShowIDList.append(curEquip.GetItemTypeID()) + return equipShowIDList ## 灵宠信息 def __GetPetInfo(curPlayer): @@ -251,7 +277,7 @@ def __GetGodWeaponInfo(curPlayer): godWeaponDict = {} ipyDataMgr = IpyGameDataPY.IPY_Data() - maxType = ipyDataMgr.GetGodWeaponByIndex(ipyDataMgr.GetGodWeaponCount()-1).GetType() + maxType = ipyDataMgr.GetGodWeaponByIndex(ipyDataMgr.GetGodWeaponCount() - 1).GetType() for gwType in xrange(1, maxType + 1): gwLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GodWeaponLV % gwType) if gwLV: @@ -283,65 +309,49 @@ 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["IsAuctionItem"] = int(ItemControler.GetIsAuctionItem(curEquip)) - #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 +#//A2 12 查看玩家详细信息#tagCMViewPlayerInfo +#struct tagCMViewPlayerInfo +#{ +# tagHead Head; +# DWORD PlayerID; +# BYTE EquipClassLV; //大于0为查看指定境界阶装备信息, 0为查看默认信息 +#}; def OnCMViewPlayerInfo(index, clientPack, tick): - GameWorld.DebugLog('ViewCache### OnCMViewPlayerInfo in') curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) findPlayerID = clientPack.PlayerID + equipClassLV = clientPack.EquipClassLV findPlayer = GameWorld.GetPlayerManager().FindPlayerByID(findPlayerID) if findPlayer: + if equipClassLV: + sendPack = ChPyNetSendPack.tagSCPlayerEquipCacheResult() + sendPack.PlayerID = findPlayerID + sendPack.EquipClassLV = equipClassLV + sendPack.ItemData = __GetPlayerEquipClassDataCache(curPlayer, equipClassLV) + sendPack.ItemDataSize = len(sendPack.ItemData) + NetPackCommon.SendFakePack(curPlayer, sendPack) + return + #本地图玩家直接返回 - curPlayerPropData, curPlayerItemData, curPlayerPlusData = GetPlayerCache(findPlayer) - #GameWorld.DebugLog("PropData=%s" % curPlayerPropData) - #GameWorld.DebugLog("ItemData=%s" % curPlayerItemData) - #GameWorld.DebugLog("PlusData=%s" % curPlayerPlusData) + PropData, PlusData = GetPlayerPropPlusCache(curPlayer) sendPack = ChPyNetSendPack.tagSCQueryPlayerCacheResult() sendPack.PlayerID = findPlayerID - sendPack.PropData = curPlayerPropData - sendPack.PropDataSize = len( sendPack.PropData) - sendPack.ItemData = curPlayerItemData + sendPack.PropData = PropData + sendPack.PropDataSize = len(sendPack.PropData) + sendPack.ItemData = "" sendPack.ItemDataSize = len(sendPack.ItemData) - sendPack.PlusData = curPlayerPlusData + sendPack.PlusData = PlusData sendPack.PlusDataSize = len(sendPack.PlusData) - - GameWorld.DebugLog('ViewCache### OnCMViewPlayerInfo len: %s , sendPack: %s'%(sendPack.GetLength(),sendPack.OutputString())) + #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 + sendPack.EquipClassLV = equipClassLV NetPackCommon.SendPyPackToGameServer(sendPack) - GameWorld.DebugLog('ViewCache### OnCMViewPlayerInfo SendToGameServer Query out') return - - - - -- Gitblit v1.8.0