From f44c22844d7176ed48b1963f36454637efaa0a54 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期六, 27 四月 2019 20:10:20 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.0.87:10010/r/SnxxServerCode

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFBHelpBattle.py        |    2 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py               |   16 ++--
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py           |   67 ++++++++++------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py |    8 +
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerXMZZ.py                |   49 +++---------
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py        |    4 
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                      |    8 +
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py              |    4 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py                |    4 
 ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py          |   60 ++++++++------
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py              |   12 +-
 11 files changed, 123 insertions(+), 111 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 5c15b7e..7acab5f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -3396,6 +3396,7 @@
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
                   ("PlayerID", c_int),    # 跨服玩家ID
+                  ("EquipClassLV", c_ubyte),    #大于0为查看指定境界阶装备信息,  0为查看默认信息
                   ]
 
     def __init__(self):
@@ -3413,6 +3414,7 @@
         self.Cmd = 0xC0
         self.SubCmd = 0x02
         self.PlayerID = 0
+        self.EquipClassLV = 0
         return
 
     def GetLength(self):
@@ -3425,12 +3427,14 @@
         DumpString = '''// C0 02 查看跨服玩家信息 //tagCGViewCrossPlayerInfo:
                                 Cmd:%s,
                                 SubCmd:%s,
-                                PlayerID:%d
+                                PlayerID:%d,
+                                EquipClassLV:%d
                                 '''\
                                 %(
                                 self.Cmd,
                                 self.SubCmd,
-                                self.PlayerID
+                                self.PlayerID,
+                                self.EquipClassLV
                                 )
         return DumpString
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
index 9150260..9cbeaaa 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
@@ -265,6 +265,7 @@
 #{
 #    tagHead        Head;
 #    DWORD        PlayerID;    // 跨服玩家ID
+#    BYTE        EquipClassLV;    //大于0为查看指定境界阶装备信息,  0为查看默认信息
 #};
 def OnViewCrossPlayerInfo(index, clientData, tick):
     if GameWorld.IsCrossServer():
@@ -273,27 +274,20 @@
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
     playerID = curPlayer.GetPlayerID()
     tagPlayerID = clientData.PlayerID
-    curCache = PlayerViewCache.ViewCacheMgr.FindCache(tagPlayerID)
+    equipClassLV = clientData.EquipClassLV
+    curCache = PlayerViewCache.FindViewCache(tagPlayerID)
     ## 本服有,直接回客户端
     if curCache:
         GameWorld.DebugLog("查看跨服玩家,是本服玩家,直接回复!tagPlayerID=%s" % (tagPlayerID), playerID)
-        sendPack = ChPyNetSendPack.tagSCQueryPlayerCacheResult()
-        sendPack.PlayerID = tagPlayerID
-        sendPack.PropData = curCache.GetPropData()
-        sendPack.PropDataSize = len(sendPack.PropData)
-        sendPack.ItemData = PlayerViewCache.GetItemData(curCache)
-        sendPack.ItemDataSize = len(sendPack.ItemData)
-        sendPack.PlusData = PlayerViewCache.GetPlusData(curCache)
-        sendPack.PlusDataSize = len(sendPack.PlusData)
-        NetPackCommon.SendFakePack(curPlayer, sendPack)
+        PlayerViewCache.Sync_PlayerCache(curPlayer, curCache, equipClassLV)
         return
     
     if tagPlayerID in PyGameData.g_crossPlayerViewCache:
-        validChaheTime = 5 * 60 * 1000
+        validChaheTime = 10 * 60 * 1000
         cacheInfo, updTick = PyGameData.g_crossPlayerViewCache[tagPlayerID]
         if tick - updTick <= validChaheTime:
             GameWorld.DebugLog("查看跨服玩家数据同步CD中,直接用缓存数据回复!tagPlayerID=%s" % (tagPlayerID), playerID)
-            SyncPlayerViewCrossPlayerInfo(curPlayer, tagPlayerID, cacheInfo)
+            SyncPlayerViewCrossPlayerInfo(curPlayer, tagPlayerID, equipClassLV, cacheInfo)
             return
         
         for crossPlayerID, cacheInfoList in PyGameData.g_crossPlayerViewCache.items():
@@ -301,50 +295,64 @@
                 PyGameData.g_crossPlayerViewCache.pop(crossPlayerID)
                 
     # 发送跨服服务器查询
-    dataMsg = {"tagPlayerID":tagPlayerID, "playerID":playerID}
+    dataMsg = {"tagPlayerID":tagPlayerID, "playerID":playerID, "equipClassLV":equipClassLV}
     CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ViewPlayerCache, dataMsg)
     return
 
 def ClientServerMsg_ViewPlayerCache(serverGroupID, msgData):
     tagPlayerID = msgData["tagPlayerID"]
     playerID = msgData["playerID"]
+    equipClassLV = msgData["equipClassLV"]
     
     GameWorld.Log("收到子服查看跨服玩家信息: serverGroupID=%s,playerID=%s,tagPlayerID=%s" % (serverGroupID, playerID, tagPlayerID))
     
-    cacheInfo = []
-    curCache = PlayerViewCache.ViewCacheMgr.FindCache(tagPlayerID)
+    cacheInfo = {}
+    curCache = PlayerViewCache.FindViewCache(tagPlayerID)
     if curCache:
-        cacheInfo = [curCache.GetPropData(), PlayerViewCache.GetItemData(curCache), PlayerViewCache.GetPlusData(curCache)]
-        
-    viewPlayerCacheRet = [playerID, tagPlayerID, cacheInfo]
+        cacheInfo = {"PropData":curCache.PropData, "PlusData":curCache.PlusData}
+        for classLV in xrange(1, 15 + 1):
+            attrName = "ItemData%s" % classLV
+            if hasattr(curCache, attrName):
+                cacheInfo[attrName] = getattr(curCache, attrName)
+                
+    viewPlayerCacheRet = [playerID, tagPlayerID, equipClassLV, cacheInfo]
     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ViewPlayerCacheRet, viewPlayerCacheRet, [serverGroupID])
     return
 
 def CrossServerMsg_ViewPlayerCacheRet(msgData, tick):
     
-    playerID, tagPlayerID, cacheInfo = msgData
+    playerID, tagPlayerID, equipClassLV, cacheInfo = msgData
     GameWorld.Log("收到跨服服务器回复的查看玩家信息: playerID=%s,tagPlayerID=%s" % (playerID, tagPlayerID))
     
     PyGameData.g_crossPlayerViewCache[tagPlayerID] = [cacheInfo, tick] # 更新信息
     
     curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
     if curPlayer:
-        SyncPlayerViewCrossPlayerInfo(curPlayer, tagPlayerID, cacheInfo)
+        SyncPlayerViewCrossPlayerInfo(curPlayer, tagPlayerID, equipClassLV, cacheInfo)
         
     return
 
-def SyncPlayerViewCrossPlayerInfo(curPlayer, tagPlayerID, cacheInfo):
+def SyncPlayerViewCrossPlayerInfo(curPlayer, tagPlayerID, equipClassLV, cacheInfo):
     if not cacheInfo:
         PlayerControl.NotifyCode(curPlayer, "ViewPlayer_OffLine")
         return
-    PropData, ItemData, PlusData = cacheInfo
+    
+    if equipClassLV:
+        itemData = cacheInfo.get("ItemData%s" % equipClassLV, "")
+        sendPack = ChPyNetSendPack.tagSCPlayerEquipCacheResult()
+        sendPack.PlayerID = tagPlayerID
+        sendPack.EquipClassLV = equipClassLV
+        sendPack.ItemData = itemData
+        sendPack.ItemDataSize = len(sendPack.ItemData)
+        NetPackCommon.SendFakePack(curPlayer, sendPack)
+        return
+    
+    #回包客户端
     sendPack = ChPyNetSendPack.tagSCQueryPlayerCacheResult()
     sendPack.PlayerID = tagPlayerID
-    sendPack.PropData = PropData
+    sendPack.PropData = cacheInfo.get("PropData", "")
     sendPack.PropDataSize = len(sendPack.PropData)
-    sendPack.ItemData = ItemData
-    sendPack.ItemDataSize = len(sendPack.ItemData)
-    sendPack.PlusData = PlusData
+    sendPack.PlusData = cacheInfo.get("PlusData", "")
     sendPack.PlusDataSize = len(sendPack.PlusData)
     NetPackCommon.SendFakePack(curPlayer, sendPack)
     return
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py
index 4294f66..28cf71e 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py
@@ -24,7 +24,7 @@
 import datetime
 import PlayerFamily
 import PlayerDBGSEvent
-import GameWorldActionControl
+import PlayerViewCache
 import PlayerFBHelpBattle
 import PlayerFairyDomain
 import ChPyNetSendPack
@@ -77,6 +77,8 @@
     PlayerDuJie.OnDayEx()
     #副本助战
     PlayerFBHelpBattle.HelpBattleOnDay()
+    #玩家缓存
+    PlayerViewCache.DelOutofTimeViewCacheData()
     #缥缈OnDay
     PlayerFairyDomain.OnDayEx()
     playerManager = GameWorld.GetPlayerManager()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFBHelpBattle.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFBHelpBattle.py
index 1dd2cd0..853e3f0 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFBHelpBattle.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFBHelpBattle.py
@@ -277,7 +277,7 @@
     checkInCount, fightPower = msgList[1:]
     curTime = int(time.time())
     playerID = curPlayer.GetPlayerID()
-    curCache = PlayerViewCache.ViewCacheMgr.FindCache(playerID)
+    curCache = PlayerViewCache.FindViewCache(playerID)
     haveViewCache = 1 if curCache else 0
     todayXianyuanCoin = PlayerControl.GetTodayXianyuanCoin(curPlayer)
     
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py
index 4070bbf..96adcd2 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFriend.py
@@ -76,12 +76,12 @@
             return
     
     if not tagPlayer:
-        curCache = PlayerViewCache.ViewCacheMgr.FindCache(curTagPlayerID)
+        curCache = PlayerViewCache.FindViewCache(curTagPlayerID)
         if not curCache:
             #玩家的数据没有缓存过
             PlayerControl.NotifyCode(curPlayer, 'Friend_OffLine')
             return
-        tagLV = curCache.GetPlayerLV()
+        tagLV = curCache.LV
     else:
         tagLV = tagPlayer.GetLV()
     
@@ -264,7 +264,7 @@
     srcPlayer = playerManager.FindPlayerByID(srcPlayerID)
     if srcPlayer == None:
         # 玩家已下线
-        curCache = PlayerViewCache.ViewCacheMgr.FindCache(srcPlayerID)
+        curCache = PlayerViewCache.FindViewCache(srcPlayerID)
         if not curCache:
             #玩家的数据没有缓存过
             #PlayerControl.NotifyCode(curPlayer, 'Friend_OffLine')
@@ -322,7 +322,7 @@
         PlayerControl.NotifyCode(srcPlayer, 'Friend_MakeFriend', [curPlayer.GetName()])
         #srcPlayer.MapServer_QueryPlayerResult(0, 0, 'AddFriendSucceed', "", 0)
     else:
-        cacheDict = eval(curCache.GetPropData())
+        cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
         PlayerControl.NotifyCode(curPlayer, 'Friend_MakeFriend', [cacheDict['Name']])  
         # 记录等对方上线通知地图,任务等会用到触发逻辑,通用记录次数即可, MapServer_SyncFriendInfo为具体的好友数量,根据策划需求制作
         pass
@@ -391,10 +391,10 @@
     
     tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagID)
     if not tagPlayer:
-        curCache = PlayerViewCache.ViewCacheMgr.FindCache(tagID)
+        curCache = PlayerViewCache.FindViewCache(tagID)
         if not curCache:
             return
-        cacheDict = eval(curCache.GetPropData())
+        cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
         playerName = cacheDict['Name']
     else:
         playerName = tagPlayer.GetName()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py
index e59ad49..28611ad 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerGeTui.py
@@ -257,11 +257,11 @@
     
 # 个推基础判定
 def CanGeTuiByCache(curCache):
-    if not curCache.GetGeTuiID():
+    if not curCache.GeTuiID:
         return False
     
     # 离线超过24小时不再推送,目前极光推送的特点是推送ID同机器不同包都是同一个ID
-    if time.time() - curCache.GetOffTime() > 24*60*60:
+    if time.time() - curCache.OffTime > 24*60*60:
         return False
     return True
     
@@ -285,7 +285,7 @@
             continue
         
         # 离线玩家
-        curCache = PlayerViewCache.ViewCacheMgr.FindCache(playerID)
+        curCache = PlayerViewCache.FindViewCache(playerID)
         if not curCache:
             continue
         
@@ -298,7 +298,7 @@
             #0-默认未关注, 1-主动关注, 2-自动关注, 9-主动取消关注
             continue
         
-        cacheDict = eval(curCache.GetPropData())
+        cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
         if not CheckCanGeTui(cacheDict, geTuiType):
             # 个推逻辑检查
             continue
@@ -311,7 +311,7 @@
         if appID not in appIDDict:
             appIDDict[appID] = []
             
-        appIDDict[appID].append([curCache.GetGeTuiID(), cacheDict.get("Name", "")])
+        appIDDict[appID].append([curCache.GeTuiID, cacheDict.get("Name", "")])
              
 
     if not appIDDict:
@@ -332,7 +332,7 @@
 
 # 私聊
 def ChatMiGeTui(playerID, playerName, tagPlayerName):
-    curCache = PlayerViewCache.ViewCacheMgr.FindCache(playerID)
+    curCache = PlayerViewCache.FindViewCache(playerID)
     if not curCache:
         return
 
@@ -340,13 +340,13 @@
         #无推送资格,基础判定
         return
 
-    cacheDict = eval(curCache.GetPropData())
+    cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
     if not CheckCanGeTui(cacheDict, Def_Onoff_Chat):
         # 过滤个推
         return
     
     showStr = GameWorld.GbkToCode(IpyGameDataPY.GetFuncCfg("GeTuiOffLine", 3))%(tagPlayerName)    # 文字信息
-    GeTuiNotify({cacheDict.get("AppID", ""):[[curCache.GetGeTuiID(), playerName]]}, showStr)
+    GeTuiNotify({cacheDict.get("AppID", ""):[[curCache.GeTuiID, playerName]]}, showStr)
     return
 
 # 下线时,低级玩家没有离线时间的玩家提示, 上线清空
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py
index 5a3ba64..ac14101 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerSocial.py
@@ -710,7 +710,7 @@
         
     # 增加社交对象信息,针对不在社交圈记录并且不在线玩家的情况
     def AddPlayerInfoByViewCache(self, playerID):
-        curCache = PlayerViewCache.ViewCacheMgr.FindCache(playerID)
+        curCache = PlayerViewCache.FindViewCache(playerID)
         playerSocial = PyGameDataStruct.tagPersonalSocial()
         if not curCache:
             # 实在找不到设置为初始化数据
@@ -722,7 +722,7 @@
             playerSocial.RealmLV = 1
             playerSocial.OnlineType = ChConfig.Def_Offline
         else:
-            cacheDict = eval(curCache.GetPropData())
+            cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
     
             playerSocial.clear()
             playerSocial.PlayerID = playerID
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py
index 917d631..1d267d8 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTalk.py
@@ -88,7 +88,7 @@
     curCache = None
     tagPlayerName = ""
     if tagPlayer == None:
-        curCache = PlayerViewCache.ViewCacheMgr.FindCache(tagPlayerID)
+        curCache = PlayerViewCache.FindViewCache(tagPlayerID)
         if not curCache:
             PlayerControl.NotifyCode(curPlayer, "CanootTalk10")
             return
@@ -100,7 +100,7 @@
         return
     
     if curCache:
-        cacheDict = eval(curCache.GetPropData())
+        cacheDict = PlayerViewCache.GetCachePropDataDict(curCache)
         tagPlayerName = cacheDict["Name"]
         
     talkType = sendPack.GetTalkType()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py
index 9709ed7..b563069 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py
@@ -29,24 +29,11 @@
 import ChConfig
 
 import json
+import time
 
-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
+def DoOnDay():
+    DelOutofTimeViewCacheData()
+    return
 
 def IsSaveDBViewCache(playerID, playerLV):
     ## 是否保存基本的缓存数据
@@ -75,6 +62,25 @@
         
     return False
 
+def DelOutofTimeViewCacheData():
+    ## 删除过期的查看缓存数据
+    
+    curTime = int(time.time())
+    MaxTime = 30 * 3600 * 24 # 30天
+    
+    pyViewCacheMgr = PyDataManager.GetPlayerViewCachePyManager()
+    playerViewCachePyDict = pyViewCacheMgr.playerViewCachePyDict
+    for playerID, viewCache in playerViewCachePyDict.items():
+        
+        passTime = curTime - viewCache.OffTime
+        if passTime < MaxTime:
+            continue
+        if IsSaveAllViewCache(playerID):
+            continue
+        playerViewCachePyDict.pop(playerID)
+        
+    return
+
 def DeleteViewCache(playerID):
     ## 删除玩家缓存
     pyViewCacheMgr = PyDataManager.GetPlayerViewCachePyManager()
@@ -95,6 +101,14 @@
         curCache.PlayerID = playerID
         playerViewCachePyDict[playerID] = curCache
     return curCache
+
+def GetCachePropDataDict(curCache):
+    ## 获取缓存基础属性字典信息
+    if not hasattr(curCache, "PropDataDict"):
+        curCache.PropDataDict = {}
+    if not curCache.PropDataDict:
+        curCache.PropDataDict = eval(curCache.PropData)
+    return curCache.PropDataDict
 
 #//04 01 地图同步玩家缓存数据到GameServer#tagMGUpdatePlayerCache
 #
@@ -140,6 +154,7 @@
             curCache.GeTuiID = curPlayer.GetGeTuiClientID()
             curCache.GeTuiIDSize = len(curCache.GeTuiID)
             
+    curCache.PropDataDict = {} # 每次更新数据时,重置字典缓存,下次获取时重新eval缓存
     curCache.PropData = curPackData.PropData
     curCache.PropDataSize = curPackData.PropDataSize
     curCache.PlusData = curPackData.PlusData
@@ -165,8 +180,7 @@
     #GameWorld.DebugLog("    %s" % curCache.outputString())
     # 同步更新助战信息
     if PlayerFBHelpBattle.IsInHelpBattleCheckInList(playerID):
-        #PropDataDict = json.loads(curCache.PropData)
-        PropDataDict = eval(curCache.PropData)
+        PropDataDict = GetCachePropDataDict(curCache)
         fightPower = PropDataDict.get("FightPower", 0)
         familyID = PropDataDict.get("FamilyID", 0)
         playerName = PropDataDict.get("Name", "")
@@ -190,13 +204,17 @@
     if not curCache:
         PlayerControl.NotifyCode(curPlayer, "ViewPlayer_OffLine")
         return
-    
+    Sync_PlayerCache(curPlayer, curCache, equipClassLV)
+    return
+
+def Sync_PlayerCache(curPlayer, curCache, equipClassLV=0):
+    ## 同步玩家缓存
     if equipClassLV:
         itemData = ""
         if hasattr(curCache, "ItemDataSize%s" % equipClassLV):
             itemData = getattr(curCache, "ItemData%s" % equipClassLV)
         sendPack = ChPyNetSendPack.tagSCPlayerEquipCacheResult()
-        sendPack.PlayerID = findPlayerID
+        sendPack.PlayerID = curCache.PlayerID
         sendPack.EquipClassLV = equipClassLV
         sendPack.ItemData = itemData
         sendPack.ItemDataSize = len(sendPack.ItemData)
@@ -205,13 +223,12 @@
     
     #回包客户端
     sendPack = ChPyNetSendPack.tagSCQueryPlayerCacheResult()
-    sendPack.PlayerID = findPlayerID
+    sendPack.PlayerID = curCache.PlayerID
     sendPack.PropData = curCache.PropData
     sendPack.PropDataSize = len(sendPack.PropData)
     sendPack.PlusData = curCache.PlusData
     sendPack.PlusDataSize = len(sendPack.PlusData)
     NetPackCommon.SendFakePack(curPlayer, sendPack)
-    #GameWorld.DebugLog('ViewCache### OnMGQueryPlayerCache out')
     return
 
 #===============================================================================
@@ -239,7 +256,7 @@
             answerPack.OnlineType = ChConfig.Def_Offline
             answerPack.ServerGroupID = 0
         else:
-            cacheDict = eval(curCache.PropData)
+            cacheDict = GetCachePropDataDict(curCache)
             answerPack.PlayerID = clientPack.PlayerID
             answerPack.PlayerName = cacheDict["Name"]
             answerPack.Job = cacheDict["Job"]
@@ -266,7 +283,7 @@
     curCache = FindViewCache(playerID)
     if not curCache:
         return
-    PropData = eval(curCache.PropData)
+    PropData = GetCachePropDataDict(curCache)
     PropData["FamilyID"] = familyID
     PropData["FamilyName"] = familyName
     PropData = json.dumps(PropData, ensure_ascii=False).replace(" ", "")
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerXMZZ.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerXMZZ.py
index 3315d81..122ab4c 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerXMZZ.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerXMZZ.py
@@ -40,7 +40,6 @@
 RecType = ShareDefine.Def_UniversalGameRecType_XMZZStageRecord
 RecType1 = ShareDefine.Def_UniversalGameRecType_XMZZPKInfoRecord
 #strValue3 {投注索引:结果,..}
-g_playerPowerDict = {} #玩家战力缓存
 g_historyPKDict = {} #历史对手ID缓存
 
 (
@@ -89,10 +88,8 @@
 
 def XMZZOndayEx():
     #过天
-    global g_playerPowerDict
     global g_historyPKDict
     PyDataManager.GetXMZZManager().ResetXMZZ()
-    g_playerPowerDict = {} #玩家战力缓存
     g_historyPKDict = {} #历史对手ID缓存
     return
 
@@ -262,17 +259,15 @@
         if playerID not in self.vsPlayerIDDict:
             return
         pkPlayerID = self.vsPlayerIDDict[playerID]
-        curCache = PlayerViewCache.ViewCacheMgr.FindCache(pkPlayerID)
+        curCache = PlayerViewCache.FindViewCache(pkPlayerID)
         if not curCache:
             return
         
         packData = ChPyNetSendPack.tagGCXMZZFightInfo()
         packData.Clear()
         packData.PlayerID = pkPlayerID
-        packData.PropData = curCache.GetPropData()
+        packData.PropData = curCache.PropData
         packData.PropDataSize = len(packData.PropData)
-        packData.ItemData = PlayerViewCache.GetItemData(curCache)
-        packData.ItemDataSize = len(packData.ItemData)
         NetPackCommon.SendFakePack(curPlayer, packData)
         return
     
@@ -609,7 +604,6 @@
 
 def RandomBattler(curPlayer, overInfo=[]):
     #筛选对手 根据连胜次数一定几率随机到高级机器人,否则每5个的第1个低于自己战力 先从小范围随机,再大范围随机,没有则用NPC
-    global g_playerPowerDict
     global g_historyPKDict
     myPlayerID = curPlayer.GetID()
     GameWorld.DebugLog('    仙魔之争开始筛选对手', myPlayerID)
@@ -624,7 +618,6 @@
         
     pkPlayerID = 0 # 默认低级机器人
     isRobotNPC = True
-    pkDataDict = {}
     conWinCnt = XMZZPlayerDict[myPlayerID].ConWinCnt #参数
     XMZZSpecialNPCRate = eval(IpyGameDataPY.GetFuncCompileCfg('XMZZSpecialNPCRate'))
     XMZZSuperNPCRate = eval(IpyGameDataPY.GetFuncCompileCfg('XMZZSpecialNPCRate', 2))
@@ -654,15 +647,9 @@
         underList1, aboveList1 = [], [] #小范围
         underList2, aboveList2 = [], [] #大范围
         
-        ViewCacheMgr = GameWorld.GameWorldData.GetPlayerViewCacheMgr()
-        for i in xrange(ViewCacheMgr.GetCount()):
-            curCache = ViewCacheMgr.At(i)
-            itemData = PlayerViewCache.GetItemData(curCache)
-            if not itemData:
-                #没有装备信息
-                continue
-            playerID = curCache.GetPlayerID()
-            
+        pyViewCacheMgr = PyDataManager.GetPlayerViewCachePyManager()
+        playerViewCachePyDict = pyViewCacheMgr.playerViewCachePyDict
+        for playerID, curCache in playerViewCachePyDict.items():
             if myPlayerID == playerID:
                 #不和自己pk
                 continue
@@ -673,14 +660,9 @@
                 #已匹配过的跳过
                 continue
             
-            if playerID in g_playerPowerDict:
-                power = g_playerPowerDict[playerID]
-            else:
-                propDataDict = eval(curCache.GetPropData())
-                power = propDataDict.get('FightPower', 0)
-                g_playerPowerDict[playerID] = power
+            propDataDict = PlayerViewCache.GetCachePropDataDict(curCache)
+            power = propDataDict.get('FightPower', 0)
             
-            pkDataDict[playerID] = [curCache.GetPropData(), itemData]
             #GameWorld.DebugLog('    筛选对手 playerID=%s,power=%s' % (playerID, power))
             if minPower1 < power < myPower:
                 underList1.append(playerID)
@@ -714,34 +696,29 @@
     if isRobotNPC:
         #机器人, 职业随机
         openJob = IpyGameDataPY.GetFuncEvalCfg("OpenJob")
-        PropData = str({"Job":random.choice(openJob), "LV":curPlayer.GetLV()})
-        ItemData = "" # 前端自己根据职业及NPC等级处理
+        pkPlayerPropData = {"Job":random.choice(openJob), "LV":curPlayer.GetLV()}
     else:
         if myPlayerID in g_historyPKDict:
             g_historyPKDict[myPlayerID].append(pkPlayerID)
         else:
             g_historyPKDict[myPlayerID] = [pkPlayerID]
             
-        PropData, ItemData = pkDataDict.get(pkPlayerID, ["", ""])
+        pkPlayerCache = PlayerViewCache.FindViewCache(pkPlayerID)
+        pkPlayerPropData = {} if not pkPlayerCache else PlayerViewCache.GetCachePropDataDict(pkPlayerCache)
     XMZZManager.vsPlayerIDDict[myPlayerID] = pkPlayerID
 
-    GameWorld.DebugLog('   仙魔之争匹配对手信息 pkPlayerID=%s, PropData=%s, overInfo=%s' % (pkPlayerID, PropData, overInfo), myPlayerID)
+    GameWorld.DebugLog('   仙魔之争匹配对手信息 pkPlayerID=%s, pkPlayerPropData=%s, overInfo=%s' % (pkPlayerID, pkPlayerPropData, overInfo), myPlayerID)
     
     #通知前端
     packData = ChPyNetSendPack.tagGCXMZZFightInfo()
     packData.Clear()
     packData.PlayerID = pkPlayerID
-    packData.PropData = PropData
+    packData.PropData = str(pkPlayerPropData)
     packData.PropDataSize = len(packData.PropData)
-    packData.ItemData = ItemData
-    packData.ItemDataSize = len(packData.ItemData)
     NetPackCommon.SendFakePack(curPlayer, packData)
     
     #通知地图
-    pkPlayerPropData = {}
-    if PropData:
-        pkPlayerPropData = eval(PropData)
-    else:
+    if not pkPlayerPropData:
         GameWorld.ErrLog("仙魔之争没有匹配到对手信息!fightPower=%s" % curPlayer.GetFightPower(), myPlayerID)
     vsPlayerInfo = [pkPlayerID, pkPlayerPropData]
     XMZZManager.MapServer_XMZZPKInfo(curPlayer, overInfo, vsPlayerInfo)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 5c15b7e..7acab5f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -3396,6 +3396,7 @@
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
                   ("PlayerID", c_int),    # 跨服玩家ID
+                  ("EquipClassLV", c_ubyte),    #大于0为查看指定境界阶装备信息,  0为查看默认信息
                   ]
 
     def __init__(self):
@@ -3413,6 +3414,7 @@
         self.Cmd = 0xC0
         self.SubCmd = 0x02
         self.PlayerID = 0
+        self.EquipClassLV = 0
         return
 
     def GetLength(self):
@@ -3425,12 +3427,14 @@
         DumpString = '''// C0 02 查看跨服玩家信息 //tagCGViewCrossPlayerInfo:
                                 Cmd:%s,
                                 SubCmd:%s,
-                                PlayerID:%d
+                                PlayerID:%d,
+                                EquipClassLV:%d
                                 '''\
                                 %(
                                 self.Cmd,
                                 self.SubCmd,
-                                self.PlayerID
+                                self.PlayerID,
+                                self.EquipClassLV
                                 )
         return DumpString
 

--
Gitblit v1.8.0