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/Item/ChEquip.py               |    9 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py                          |  323 ++++++--------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py                 |    1 
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                     |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py       |    1 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyAction.py                       |    3 
 ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py                               |  280 +++++++++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py          |  280 +++++++++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                   |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py |  286 +++++++------
 11 files changed, 799 insertions(+), 402 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py
index 2a4c50f..a6c89e4 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py
@@ -612,6 +612,7 @@
                   ("SubCmd", c_ubyte),
                   ("PlayerID", c_int),    #玩家ID
                   ("FindPlayerID", c_int),    #要查询的玩家ID
+                  ("EquipClassLV", c_ubyte),    #大于0为查看指定境界阶装备信息,  0为查看默认信息
                   ]
 
     def __init__(self):
@@ -630,6 +631,7 @@
         self.SubCmd = 0x02
         self.PlayerID = 0
         self.FindPlayerID = 0
+        self.EquipClassLV = 0
         return
 
     def GetLength(self):
@@ -643,13 +645,15 @@
                                 Cmd:%s,
                                 SubCmd:%s,
                                 PlayerID:%d,
-                                FindPlayerID:%d
+                                FindPlayerID:%d,
+                                EquipClassLV:%d
                                 '''\
                                 %(
                                 self.Cmd,
                                 self.SubCmd,
                                 self.PlayerID,
-                                self.FindPlayerID
+                                self.FindPlayerID,
+                                self.EquipClassLV
                                 )
         return DumpString
 
@@ -665,14 +669,42 @@
     Head = tagHead()
     PlayerID = 0    #(DWORD PlayerID)//玩家ID
     PlayerLV = 0    #(WORD PlayerLV)//玩家等级
-    PropDataSize = 0    #(DWORD PropDataSize)
-    PropData = ""    #(String PropData)//属性记录
-    ItemDataSize = 0    #(DWORD ItemDataSize)
-    ItemData = ""    #(String ItemData)//物品记录
-    PlusDataSize = 0    #(DWORD PlusDataSize)
-    PlusData = ""    #(String PlusData)//扩展记录
     IsLogouting = 0    #(BYTE IsLogouting)//本次是否为下线同步
     OffTime = 0    #(DWORD OffTime)// 下线时间戳
+    PropDataSize = 0    #(WORD PropDataSize)
+    PropData = ""    #(String PropData)//属性记录
+    PlusDataSize = 0    #(WORD PlusDataSize)
+    PlusData = ""    #(String PlusData)//扩展记录
+    ItemDataSize1 = 0    #(WORD ItemDataSize1)
+    ItemData1 = ""    #(String ItemData1)//1阶装备数据
+    ItemDataSize2 = 0    #(WORD ItemDataSize2)
+    ItemData2 = ""    #(String ItemData2)
+    ItemDataSize3 = 0    #(WORD ItemDataSize3)
+    ItemData3 = ""    #(String ItemData3)
+    ItemDataSize4 = 0    #(WORD ItemDataSize4)
+    ItemData4 = ""    #(String ItemData4)
+    ItemDataSize5 = 0    #(WORD ItemDataSize5)
+    ItemData5 = ""    #(String ItemData5)
+    ItemDataSize6 = 0    #(WORD ItemDataSize6)
+    ItemData6 = ""    #(String ItemData6)
+    ItemDataSize7 = 0    #(WORD ItemDataSize7)
+    ItemData7 = ""    #(String ItemData7)
+    ItemDataSize8 = 0    #(WORD ItemDataSize8)
+    ItemData8 = ""    #(String ItemData8)
+    ItemDataSize9 = 0    #(WORD ItemDataSize9)
+    ItemData9 = ""    #(String ItemData9)
+    ItemDataSize10 = 0    #(WORD ItemDataSize10)
+    ItemData10 = ""    #(String ItemData10)
+    ItemDataSize11 = 0    #(WORD ItemDataSize11)
+    ItemData11 = ""    #(String ItemData11)
+    ItemDataSize12 = 0    #(WORD ItemDataSize12)
+    ItemData12 = ""    #(String ItemData12)
+    ItemDataSize13 = 0    #(WORD ItemDataSize13)
+    ItemData13 = ""    #(String ItemData13)
+    ItemDataSize14 = 0    #(WORD ItemDataSize14)
+    ItemData14 = ""    #(String ItemData14)
+    ItemDataSize15 = 0    #(WORD ItemDataSize15)
+    ItemData15 = ""    #(String ItemData15)
     data = None
 
     def __init__(self):
@@ -686,14 +718,42 @@
         _pos = self.Head.ReadData(_lpData, _pos)
         self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.PlayerLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.PropDataSize,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.PropData,_pos = CommFunc.ReadString(_lpData, _pos,self.PropDataSize)
-        self.ItemDataSize,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.ItemData,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize)
-        self.PlusDataSize,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.PlusData,_pos = CommFunc.ReadString(_lpData, _pos,self.PlusDataSize)
         self.IsLogouting,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.OffTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PropDataSize,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PropData,_pos = CommFunc.ReadString(_lpData, _pos,self.PropDataSize)
+        self.PlusDataSize,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PlusData,_pos = CommFunc.ReadString(_lpData, _pos,self.PlusDataSize)
+        self.ItemDataSize1,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData1,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize1)
+        self.ItemDataSize2,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData2,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize2)
+        self.ItemDataSize3,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData3,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize3)
+        self.ItemDataSize4,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData4,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize4)
+        self.ItemDataSize5,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData5,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize5)
+        self.ItemDataSize6,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData6,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize6)
+        self.ItemDataSize7,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData7,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize7)
+        self.ItemDataSize8,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData8,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize8)
+        self.ItemDataSize9,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData9,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize9)
+        self.ItemDataSize10,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData10,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize10)
+        self.ItemDataSize11,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData11,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize11)
+        self.ItemDataSize12,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData12,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize12)
+        self.ItemDataSize13,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData13,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize13)
+        self.ItemDataSize14,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData14,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize14)
+        self.ItemDataSize15,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData15,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize15)
         return _pos
 
     def Clear(self):
@@ -703,14 +763,42 @@
         self.Head.SubCmd = 0x01
         self.PlayerID = 0
         self.PlayerLV = 0
-        self.PropDataSize = 0
-        self.PropData = ""
-        self.ItemDataSize = 0
-        self.ItemData = ""
-        self.PlusDataSize = 0
-        self.PlusData = ""
         self.IsLogouting = 0
         self.OffTime = 0
+        self.PropDataSize = 0
+        self.PropData = ""
+        self.PlusDataSize = 0
+        self.PlusData = ""
+        self.ItemDataSize1 = 0
+        self.ItemData1 = ""
+        self.ItemDataSize2 = 0
+        self.ItemData2 = ""
+        self.ItemDataSize3 = 0
+        self.ItemData3 = ""
+        self.ItemDataSize4 = 0
+        self.ItemData4 = ""
+        self.ItemDataSize5 = 0
+        self.ItemData5 = ""
+        self.ItemDataSize6 = 0
+        self.ItemData6 = ""
+        self.ItemDataSize7 = 0
+        self.ItemData7 = ""
+        self.ItemDataSize8 = 0
+        self.ItemData8 = ""
+        self.ItemDataSize9 = 0
+        self.ItemData9 = ""
+        self.ItemDataSize10 = 0
+        self.ItemData10 = ""
+        self.ItemDataSize11 = 0
+        self.ItemData11 = ""
+        self.ItemDataSize12 = 0
+        self.ItemData12 = ""
+        self.ItemDataSize13 = 0
+        self.ItemData13 = ""
+        self.ItemDataSize14 = 0
+        self.ItemData14 = ""
+        self.ItemDataSize15 = 0
+        self.ItemData15 = ""
         return
 
     def GetLength(self):
@@ -718,14 +806,42 @@
         length += self.Head.GetLength()
         length += 4
         length += 2
-        length += 4
-        length += len(self.PropData)
-        length += 4
-        length += len(self.ItemData)
-        length += 4
-        length += len(self.PlusData)
         length += 1
         length += 4
+        length += 2
+        length += len(self.PropData)
+        length += 2
+        length += len(self.PlusData)
+        length += 2
+        length += len(self.ItemData1)
+        length += 2
+        length += len(self.ItemData2)
+        length += 2
+        length += len(self.ItemData3)
+        length += 2
+        length += len(self.ItemData4)
+        length += 2
+        length += len(self.ItemData5)
+        length += 2
+        length += len(self.ItemData6)
+        length += 2
+        length += len(self.ItemData7)
+        length += 2
+        length += len(self.ItemData8)
+        length += 2
+        length += len(self.ItemData9)
+        length += 2
+        length += len(self.ItemData10)
+        length += 2
+        length += len(self.ItemData11)
+        length += 2
+        length += len(self.ItemData12)
+        length += 2
+        length += len(self.ItemData13)
+        length += 2
+        length += len(self.ItemData14)
+        length += 2
+        length += len(self.ItemData15)
 
         return length
 
@@ -734,14 +850,42 @@
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
         data = CommFunc.WriteDWORD(data, self.PlayerID)
         data = CommFunc.WriteWORD(data, self.PlayerLV)
-        data = CommFunc.WriteDWORD(data, self.PropDataSize)
-        data = CommFunc.WriteString(data, self.PropDataSize, self.PropData)
-        data = CommFunc.WriteDWORD(data, self.ItemDataSize)
-        data = CommFunc.WriteString(data, self.ItemDataSize, self.ItemData)
-        data = CommFunc.WriteDWORD(data, self.PlusDataSize)
-        data = CommFunc.WriteString(data, self.PlusDataSize, self.PlusData)
         data = CommFunc.WriteBYTE(data, self.IsLogouting)
         data = CommFunc.WriteDWORD(data, self.OffTime)
+        data = CommFunc.WriteWORD(data, self.PropDataSize)
+        data = CommFunc.WriteString(data, self.PropDataSize, self.PropData)
+        data = CommFunc.WriteWORD(data, self.PlusDataSize)
+        data = CommFunc.WriteString(data, self.PlusDataSize, self.PlusData)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize1)
+        data = CommFunc.WriteString(data, self.ItemDataSize1, self.ItemData1)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize2)
+        data = CommFunc.WriteString(data, self.ItemDataSize2, self.ItemData2)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize3)
+        data = CommFunc.WriteString(data, self.ItemDataSize3, self.ItemData3)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize4)
+        data = CommFunc.WriteString(data, self.ItemDataSize4, self.ItemData4)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize5)
+        data = CommFunc.WriteString(data, self.ItemDataSize5, self.ItemData5)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize6)
+        data = CommFunc.WriteString(data, self.ItemDataSize6, self.ItemData6)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize7)
+        data = CommFunc.WriteString(data, self.ItemDataSize7, self.ItemData7)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize8)
+        data = CommFunc.WriteString(data, self.ItemDataSize8, self.ItemData8)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize9)
+        data = CommFunc.WriteString(data, self.ItemDataSize9, self.ItemData9)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize10)
+        data = CommFunc.WriteString(data, self.ItemDataSize10, self.ItemData10)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize11)
+        data = CommFunc.WriteString(data, self.ItemDataSize11, self.ItemData11)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize12)
+        data = CommFunc.WriteString(data, self.ItemDataSize12, self.ItemData12)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize13)
+        data = CommFunc.WriteString(data, self.ItemDataSize13, self.ItemData13)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize14)
+        data = CommFunc.WriteString(data, self.ItemDataSize14, self.ItemData14)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize15)
+        data = CommFunc.WriteString(data, self.ItemDataSize15, self.ItemData15)
         return data
 
     def OutputString(self):
@@ -749,27 +893,83 @@
                                 Head:%s,
                                 PlayerID:%d,
                                 PlayerLV:%d,
+                                IsLogouting:%d,
+                                OffTime:%d,
                                 PropDataSize:%d,
                                 PropData:%s,
-                                ItemDataSize:%d,
-                                ItemData:%s,
                                 PlusDataSize:%d,
                                 PlusData:%s,
-                                IsLogouting:%d,
-                                OffTime:%d
+                                ItemDataSize1:%d,
+                                ItemData1:%s,
+                                ItemDataSize2:%d,
+                                ItemData2:%s,
+                                ItemDataSize3:%d,
+                                ItemData3:%s,
+                                ItemDataSize4:%d,
+                                ItemData4:%s,
+                                ItemDataSize5:%d,
+                                ItemData5:%s,
+                                ItemDataSize6:%d,
+                                ItemData6:%s,
+                                ItemDataSize7:%d,
+                                ItemData7:%s,
+                                ItemDataSize8:%d,
+                                ItemData8:%s,
+                                ItemDataSize9:%d,
+                                ItemData9:%s,
+                                ItemDataSize10:%d,
+                                ItemData10:%s,
+                                ItemDataSize11:%d,
+                                ItemData11:%s,
+                                ItemDataSize12:%d,
+                                ItemData12:%s,
+                                ItemDataSize13:%d,
+                                ItemData13:%s,
+                                ItemDataSize14:%d,
+                                ItemData14:%s,
+                                ItemDataSize15:%d,
+                                ItemData15:%s
                                 '''\
                                 %(
                                 self.Head.OutputString(),
                                 self.PlayerID,
                                 self.PlayerLV,
+                                self.IsLogouting,
+                                self.OffTime,
                                 self.PropDataSize,
                                 self.PropData,
-                                self.ItemDataSize,
-                                self.ItemData,
                                 self.PlusDataSize,
                                 self.PlusData,
-                                self.IsLogouting,
-                                self.OffTime
+                                self.ItemDataSize1,
+                                self.ItemData1,
+                                self.ItemDataSize2,
+                                self.ItemData2,
+                                self.ItemDataSize3,
+                                self.ItemData3,
+                                self.ItemDataSize4,
+                                self.ItemData4,
+                                self.ItemDataSize5,
+                                self.ItemData5,
+                                self.ItemDataSize6,
+                                self.ItemData6,
+                                self.ItemDataSize7,
+                                self.ItemData7,
+                                self.ItemDataSize8,
+                                self.ItemData8,
+                                self.ItemDataSize9,
+                                self.ItemData9,
+                                self.ItemDataSize10,
+                                self.ItemData10,
+                                self.ItemDataSize11,
+                                self.ItemData11,
+                                self.ItemDataSize12,
+                                self.ItemData12,
+                                self.ItemDataSize13,
+                                self.ItemData13,
+                                self.ItemDataSize14,
+                                self.ItemData14,
+                                self.ItemDataSize15,
+                                self.ItemData15
                                 )
         return DumpString
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 1d77aca..5c15b7e 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -5606,6 +5606,7 @@
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
                   ("PlayerID", c_int),    
+                  ("EquipClassLV", c_ubyte),    #大于0为查看指定境界阶装备信息,  0为查看默认信息
                   ]
 
     def __init__(self):
@@ -5623,6 +5624,7 @@
         self.Cmd = 0xA2
         self.SubCmd = 0x12
         self.PlayerID = 0
+        self.EquipClassLV = 0
         return
 
     def GetLength(self):
@@ -5635,12 +5637,14 @@
         DumpString = '''//A2 12 查看玩家详细信息//tagCMViewPlayerInfo:
                                 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/PlayerFamilyAction.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyAction.py
index a8fc787..0cf2590 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyAction.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyAction.py
@@ -583,7 +583,8 @@
         #GameWorld.DebugLog("普通成员不记录家族官员模型装备信息!")
         return
     
-    modelEquipInfoList = PlayerViewCache.GetPlayerCacheEquipView(playerID)
+    modelEquipInfoList = []
+    #modelEquipInfoList = PlayerViewCache.GetPlayerCacheEquipView(playerID)
     if not modelEquipInfoList:
         #GameWorld.DebugLog("找不到家族官员模型装备信息, 不记录!familyID=%s,playerID=%s" % (familyID, playerID))
         return
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py
index 72ccc54..9709ed7 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py
@@ -16,17 +16,18 @@
 # @change: "2016-05-18 16:00" hxp 战盟有官员成员缓存不清除
 #---------------------------------------------------------------------
 #"""Version = 2016-05-18 16:00"""
-#------------------------------------------------------------------------------ 
+#---------------------------------------------------------------------
+
 import GameWorld
-import ChPyNetSendPack
 import PlayerControl
 import NetPackCommon
+import ChPyNetSendPack
 import PlayerFBHelpBattle
+import PyGameDataStruct
 import IpyGameDataPY
-import ShareDefine
+import PyDataManager
 import ChConfig
 
-import time
 import json
 
 ViewCacheMgr = GameWorld.GameWorldData.GetPlayerViewCacheMgr()
@@ -47,91 +48,21 @@
         
     return result
 
-##更新缓存数据
-#  @param PlayerID, PropData, ItemData, PlusData, isSaveDB
-#  @return None
-def UpdatePlayerCache(PlayerID, PropData, ItemData, PlusData, isSaveDB=False, packData=None):
-    curCache = ViewCacheMgr.FindCache(PlayerID)
-    if not curCache:
-        curCache = ViewCacheMgr.AddNewCache(PlayerID) 
-    if packData:
-        curCache.SetPlayerLV(packData.PlayerLV)
-        curCache.SetOffTime(packData.OffTime)
-    
-
-    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(curPackData): 
-    PlayerID = curPackData.PlayerID
-    PlayerLV = curPackData.PlayerLV
-    #不需要保存离线数据的,直接删除缓存数据
-    if not IsNeedSaveLogoutPlayer(PlayerID, PlayerLV):
-        ViewCacheMgr.DeleteCache(PlayerID)
-        return
-    #更新数据,并设置需要保存数据库
-    UpdatePlayerCache(PlayerID, curPackData.PropData, curPackData.ItemData, curPackData.PlusData, True, packData=curPackData)    
-    return
-
-## 根据规则判定是否需要继续保存离线玩家数据
-#  @param PlayerID, PlayerLV
-#  @return None
-def IsNeedSaveLogoutPlayer(PlayerID, PlayerLV):
-    if PlayerFBHelpBattle.IsInHelpBattleCheckInList(PlayerID):
+def IsSaveDBViewCache(playerID, playerLV):
+    ## 是否保存基本的缓存数据
+    if PlayerFBHelpBattle.IsInHelpBattleCheckInList(playerID):
         return True
     
     SaveDBLimitLV = IpyGameDataPY.GetFuncCfg("PlayerViewCache", 1)
     #校验玩家等级
-    if PlayerLV < SaveDBLimitLV:
+    if playerLV < SaveDBLimitLV:
         return False
     
     return True
 
-# 上榜用户
-def IsNeedSaveViewCacheAllInfo(PlayerID):
-    if PlayerFBHelpBattle.IsInHelpBattleCheckInList(PlayerID):
-        return True
+def IsSaveAllViewCache(playerID):
+    ## 是否保存所有缓存数据
+    
     NeedCheckBillBoardType = IpyGameDataPY.GetFuncEvalCfg("PlayerViewCache", 2)
     #校验玩家是否上排行榜
     billboardMgr = GameWorld.GetBillboard()
@@ -139,108 +70,149 @@
         curBillboard = billboardMgr.FindBillboard(BillBoardType)
         if not curBillboard:
             continue
-        if curBillboard.FindByID(PlayerID):
+        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
-#        
-#    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(curPackData)
-    else:
-        # 此处保存设置为True是为安全防范,比如突然断电,宕机等情况 导致误以为不保存,故等级可设置高一点
-        UpdatePlayerCache(PlayerID, curPackData.PropData, \
-                          curPackData.ItemData, curPackData.PlusData, True if PlayerLV > 150 else False, packData=curPackData)
-    GameWorld.DebugLog('ViewCache### OnMGUpdatePlayerCache out')
+def DeleteViewCache(playerID):
+    ## 删除玩家缓存
+    pyViewCacheMgr = PyDataManager.GetPlayerViewCachePyManager()
+    playerViewCachePyDict = pyViewCacheMgr.playerViewCachePyDict
+    playerViewCachePyDict.pop(playerID)
+    GameWorld.DebugLog("删除查看缓存!", playerID)
     return
 
-## //04 02 地图查询玩家缓存数据#tagMGQueryPlayerCache
-#  @param routeIndex, mapID, curPackData, tick
-#  @return None
+def FindViewCache(playerID, isAddNew=False):
+    ## 查找玩家缓存
+    curCache = None
+    pyViewCacheMgr = PyDataManager.GetPlayerViewCachePyManager()
+    playerViewCachePyDict = pyViewCacheMgr.playerViewCachePyDict
+    if playerID in playerViewCachePyDict:
+        curCache = playerViewCachePyDict[playerID]
+    elif isAddNew:
+        curCache = PyGameDataStruct.tagPlayerViewCachePy()
+        curCache.PlayerID = playerID
+        playerViewCachePyDict[playerID] = curCache
+    return curCache
+
+#//04 01 地图同步玩家缓存数据到GameServer#tagMGUpdatePlayerCache
+#
+#struct    tagMGUpdatePlayerCache
+#{
+#    tagHead        Head;
+#    DWORD        PlayerID;        //玩家ID
+#    WORD        PlayerLV;        //玩家等级
+#    BYTE        IsLogouting;        //本次是否为下线同步
+#    DWORD        OffTime;        // 下线时间戳
+#    WORD        PropDataSize;
+#    char        PropData[PropDataSize];    //属性记录
+#    WORD        PlusDataSize;
+#    char        PlusData[PlusDataSize];    //扩展记录
+#    WORD        ItemDataSize1;
+#    char        ItemData1[ItemDataSize1];    //1阶装备数据
+#    ...         ...
+#    WORD        ItemDataSize15;
+#    char        ItemData15[ItemDataSize15];
+#};
+def OnMGUpdatePlayerCache(routeIndex, mapID, curPackData, tick):
+    playerID = curPackData.PlayerID
+    playerLV = curPackData.PlayerLV
+    isLogout = curPackData.IsLogouting
+    GameWorld.DebugLog('ViewCache### OnMGUpdatePlayerCache isLogout=%s' % isLogout, playerID)
+    isSaveAll = True # 是否保存所有数据
+    if isLogout:
+        #不需要保存离线数据的,直接删除缓存数据
+        if not IsSaveDBViewCache(playerID, playerLV):
+            DeleteViewCache(playerID)
+            return
+        isSaveAll = IsSaveAllViewCache(playerID)
+        GameWorld.DebugLog("    isSaveAll=%s" % isSaveAll, playerID)
+    
+    curCache = FindViewCache(playerID, True)
+    if not curCache:
+        return
+    curCache.LV = curPackData.PlayerLV
+    curCache.OffTime = curPackData.OffTime
+    if isLogout:
+        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
+        if curPlayer:
+            curCache.GeTuiID = curPlayer.GetGeTuiClientID()
+            curCache.GeTuiIDSize = len(curCache.GeTuiID)
+            
+    curCache.PropData = curPackData.PropData
+    curCache.PropDataSize = curPackData.PropDataSize
+    curCache.PlusData = curPackData.PlusData
+    curCache.PlusDataSize = curPackData.PlusDataSize
+    
+    #GameWorld.DebugLog("    更新Prop数据: size=%s, %s" % (curCache.PropDataSize, curCache.PropData), playerID)
+    #GameWorld.DebugLog("    更新Plus数据: size=%s, %s" % (curCache.PlusDataSize, curCache.PlusData), playerID)
+    
+    # 装备数据存储,不保存装备数据的话则清空
+    for classLV in xrange(1, 15 + 1):
+        if not isSaveAll:
+            itemDataSize = 0
+            itemData = ""
+        else:
+            itemDataSize = getattr(curPackData, "ItemDataSize%s" % classLV)
+            if not itemDataSize:
+                continue
+            itemData = getattr(curPackData, "ItemData%s" % classLV)
+        setattr(curCache, "ItemData%s" % classLV, itemData)
+        setattr(curCache, "ItemDataSize%s" % classLV, itemDataSize)
+        #GameWorld.DebugLog("    更新Item数据: classLV=%s,size=%s, %s" % (classLV, itemDataSize, itemData), playerID)
+        
+    #GameWorld.DebugLog("    %s" % curCache.outputString())
+    # 同步更新助战信息
+    if PlayerFBHelpBattle.IsInHelpBattleCheckInList(playerID):
+        #PropDataDict = json.loads(curCache.PropData)
+        PropDataDict = eval(curCache.PropData)
+        fightPower = PropDataDict.get("FightPower", 0)
+        familyID = PropDataDict.get("FamilyID", 0)
+        playerName = PropDataDict.get("Name", "")
+        PlayerFBHelpBattle.UpdateCheckInPlayerInfo(playerID, fightPower, familyID, playerName)
+        
+    return
+
+#//04 02 地图查询玩家缓存数据#tagMGQueryPlayerCache
+#struct tagMGQueryPlayerCache
+#{
+#    tagHead        Head;
+#    DWORD        PlayerID;        //玩家ID
+#    DWORD        FindPlayerID;    //要查询的玩家ID
+#    BYTE        EquipClassLV;    //大于0为查看指定境界阶装备信息,  0为查看默认信息
+#};
 def OnMGQueryPlayerCache(routeIndex, mapID, curPackData, tick):
-    GameWorld.DebugLog('ViewCache### OnMGQueryPlayerCache in')
     curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curPackData.PlayerID)
     findPlayerID = curPackData.FindPlayerID
-    curCache = ViewCacheMgr.FindCache(findPlayerID)
+    equipClassLV = curPackData.EquipClassLV
+    curCache = FindViewCache(findPlayerID)
     if not curCache:
         PlayerControl.NotifyCode(curPlayer, "ViewPlayer_OffLine")
+        return
+    
+    if equipClassLV:
+        itemData = ""
+        if hasattr(curCache, "ItemDataSize%s" % equipClassLV):
+            itemData = getattr(curCache, "ItemData%s" % equipClassLV)
+        sendPack = ChPyNetSendPack.tagSCPlayerEquipCacheResult()
+        sendPack.PlayerID = findPlayerID
+        sendPack.EquipClassLV = equipClassLV
+        sendPack.ItemData = itemData
+        sendPack.ItemDataSize = len(sendPack.ItemData)
+        NetPackCommon.SendFakePack(curPlayer, sendPack)
         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)
-        
+    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')
+    #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
@@ -256,7 +228,7 @@
     answerPack = ChPyNetSendPack.tagGCAnswerPlayerShortInfo()
     answerPack.Clear()
     if not tagPlayer:
-        curCache = ViewCacheMgr.FindCache(clientPack.PlayerID)
+        curCache = FindViewCache(clientPack.PlayerID)
         if not curCache:
             # 实在找不到设置为初始化数据
             answerPack.PlayerID = clientPack.PlayerID
@@ -267,8 +239,7 @@
             answerPack.OnlineType = ChConfig.Def_Offline
             answerPack.ServerGroupID = 0
         else:
-            cacheDict = eval(curCache.GetPropData())
-    
+            cacheDict = eval(curCache.PropData)
             answerPack.PlayerID = clientPack.PlayerID
             answerPack.PlayerName = cacheDict["Name"]
             answerPack.Job = cacheDict["Job"]
@@ -276,7 +247,6 @@
             answerPack.RealmLV = cacheDict["RealmLV"]
             answerPack.OnlineType = ChConfig.Def_Offline
             answerPack.ServerGroupID = cacheDict.get("ServerGroupID", 0)
-            
     else:
         answerPack.PlayerID = clientPack.PlayerID
         answerPack.PlayerName = tagPlayer.GetName()
@@ -293,17 +263,14 @@
 
 def OnPlayerFamilyChange(playerID, familyID, familyName):
     GameWorld.DebugLog("ViewCache->OnPlayerFamilyChange", playerID)
-    curCache = ViewCacheMgr.FindCache(playerID)
+    curCache = FindViewCache(playerID)
     if not curCache:
         return
-    PropData = eval(curCache.GetPropData())
+    PropData = eval(curCache.PropData)
     PropData["FamilyID"] = familyID
     PropData["FamilyName"] = familyName
-    playerLV = PropData["LV"]
-    
-    PropData = json.dumps(PropData, ensure_ascii=False)
-    ItemData = GetItemData(curCache)
-    PlusData = GetPlusData(curCache)
-    UpdatePlayerCache(playerID, PropData, ItemData, PlusData, True if playerLV > 150 else False)  
+    PropData = json.dumps(PropData, ensure_ascii=False).replace(" ", "")
+    curCache.PropData = PropData
+    curCache.PropDataSize = len(curCache.PropData)
     return
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index de283ea..4773f9f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3445,7 +3445,7 @@
 
 Def_PDict_OnlinePrizeNote = "OnlinePrizeNote%s"  # 当日在线奖励领取信息,记录信息 参数天数
 
-
+Def_PDict_EquipViewCacheState = "EquipViewCacheState"  # 本次上线是否同步过装备缓存
 Def_PDict_DayOnlineTime = "OnlineTime"  # 当日在线时长
 Def_PDict_OnlineStartTick = "OnlineStartTime"        # 在线计算时间
 Def_PDict_LVAwardGetRecord = "LVAwardGetRecord"  # 等级奖励领取信息记录,按二进制位标示
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py
index 2a4c50f..a6c89e4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py
@@ -612,6 +612,7 @@
                   ("SubCmd", c_ubyte),
                   ("PlayerID", c_int),    #玩家ID
                   ("FindPlayerID", c_int),    #要查询的玩家ID
+                  ("EquipClassLV", c_ubyte),    #大于0为查看指定境界阶装备信息,  0为查看默认信息
                   ]
 
     def __init__(self):
@@ -630,6 +631,7 @@
         self.SubCmd = 0x02
         self.PlayerID = 0
         self.FindPlayerID = 0
+        self.EquipClassLV = 0
         return
 
     def GetLength(self):
@@ -643,13 +645,15 @@
                                 Cmd:%s,
                                 SubCmd:%s,
                                 PlayerID:%d,
-                                FindPlayerID:%d
+                                FindPlayerID:%d,
+                                EquipClassLV:%d
                                 '''\
                                 %(
                                 self.Cmd,
                                 self.SubCmd,
                                 self.PlayerID,
-                                self.FindPlayerID
+                                self.FindPlayerID,
+                                self.EquipClassLV
                                 )
         return DumpString
 
@@ -665,14 +669,42 @@
     Head = tagHead()
     PlayerID = 0    #(DWORD PlayerID)//玩家ID
     PlayerLV = 0    #(WORD PlayerLV)//玩家等级
-    PropDataSize = 0    #(DWORD PropDataSize)
-    PropData = ""    #(String PropData)//属性记录
-    ItemDataSize = 0    #(DWORD ItemDataSize)
-    ItemData = ""    #(String ItemData)//物品记录
-    PlusDataSize = 0    #(DWORD PlusDataSize)
-    PlusData = ""    #(String PlusData)//扩展记录
     IsLogouting = 0    #(BYTE IsLogouting)//本次是否为下线同步
     OffTime = 0    #(DWORD OffTime)// 下线时间戳
+    PropDataSize = 0    #(WORD PropDataSize)
+    PropData = ""    #(String PropData)//属性记录
+    PlusDataSize = 0    #(WORD PlusDataSize)
+    PlusData = ""    #(String PlusData)//扩展记录
+    ItemDataSize1 = 0    #(WORD ItemDataSize1)
+    ItemData1 = ""    #(String ItemData1)//1阶装备数据
+    ItemDataSize2 = 0    #(WORD ItemDataSize2)
+    ItemData2 = ""    #(String ItemData2)
+    ItemDataSize3 = 0    #(WORD ItemDataSize3)
+    ItemData3 = ""    #(String ItemData3)
+    ItemDataSize4 = 0    #(WORD ItemDataSize4)
+    ItemData4 = ""    #(String ItemData4)
+    ItemDataSize5 = 0    #(WORD ItemDataSize5)
+    ItemData5 = ""    #(String ItemData5)
+    ItemDataSize6 = 0    #(WORD ItemDataSize6)
+    ItemData6 = ""    #(String ItemData6)
+    ItemDataSize7 = 0    #(WORD ItemDataSize7)
+    ItemData7 = ""    #(String ItemData7)
+    ItemDataSize8 = 0    #(WORD ItemDataSize8)
+    ItemData8 = ""    #(String ItemData8)
+    ItemDataSize9 = 0    #(WORD ItemDataSize9)
+    ItemData9 = ""    #(String ItemData9)
+    ItemDataSize10 = 0    #(WORD ItemDataSize10)
+    ItemData10 = ""    #(String ItemData10)
+    ItemDataSize11 = 0    #(WORD ItemDataSize11)
+    ItemData11 = ""    #(String ItemData11)
+    ItemDataSize12 = 0    #(WORD ItemDataSize12)
+    ItemData12 = ""    #(String ItemData12)
+    ItemDataSize13 = 0    #(WORD ItemDataSize13)
+    ItemData13 = ""    #(String ItemData13)
+    ItemDataSize14 = 0    #(WORD ItemDataSize14)
+    ItemData14 = ""    #(String ItemData14)
+    ItemDataSize15 = 0    #(WORD ItemDataSize15)
+    ItemData15 = ""    #(String ItemData15)
     data = None
 
     def __init__(self):
@@ -686,14 +718,42 @@
         _pos = self.Head.ReadData(_lpData, _pos)
         self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.PlayerLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.PropDataSize,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.PropData,_pos = CommFunc.ReadString(_lpData, _pos,self.PropDataSize)
-        self.ItemDataSize,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.ItemData,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize)
-        self.PlusDataSize,_pos = CommFunc.ReadDWORD(_lpData, _pos)
-        self.PlusData,_pos = CommFunc.ReadString(_lpData, _pos,self.PlusDataSize)
         self.IsLogouting,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.OffTime,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.PropDataSize,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PropData,_pos = CommFunc.ReadString(_lpData, _pos,self.PropDataSize)
+        self.PlusDataSize,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.PlusData,_pos = CommFunc.ReadString(_lpData, _pos,self.PlusDataSize)
+        self.ItemDataSize1,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData1,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize1)
+        self.ItemDataSize2,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData2,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize2)
+        self.ItemDataSize3,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData3,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize3)
+        self.ItemDataSize4,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData4,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize4)
+        self.ItemDataSize5,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData5,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize5)
+        self.ItemDataSize6,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData6,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize6)
+        self.ItemDataSize7,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData7,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize7)
+        self.ItemDataSize8,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData8,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize8)
+        self.ItemDataSize9,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData9,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize9)
+        self.ItemDataSize10,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData10,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize10)
+        self.ItemDataSize11,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData11,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize11)
+        self.ItemDataSize12,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData12,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize12)
+        self.ItemDataSize13,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData13,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize13)
+        self.ItemDataSize14,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData14,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize14)
+        self.ItemDataSize15,_pos = CommFunc.ReadWORD(_lpData, _pos)
+        self.ItemData15,_pos = CommFunc.ReadString(_lpData, _pos,self.ItemDataSize15)
         return _pos
 
     def Clear(self):
@@ -703,14 +763,42 @@
         self.Head.SubCmd = 0x01
         self.PlayerID = 0
         self.PlayerLV = 0
-        self.PropDataSize = 0
-        self.PropData = ""
-        self.ItemDataSize = 0
-        self.ItemData = ""
-        self.PlusDataSize = 0
-        self.PlusData = ""
         self.IsLogouting = 0
         self.OffTime = 0
+        self.PropDataSize = 0
+        self.PropData = ""
+        self.PlusDataSize = 0
+        self.PlusData = ""
+        self.ItemDataSize1 = 0
+        self.ItemData1 = ""
+        self.ItemDataSize2 = 0
+        self.ItemData2 = ""
+        self.ItemDataSize3 = 0
+        self.ItemData3 = ""
+        self.ItemDataSize4 = 0
+        self.ItemData4 = ""
+        self.ItemDataSize5 = 0
+        self.ItemData5 = ""
+        self.ItemDataSize6 = 0
+        self.ItemData6 = ""
+        self.ItemDataSize7 = 0
+        self.ItemData7 = ""
+        self.ItemDataSize8 = 0
+        self.ItemData8 = ""
+        self.ItemDataSize9 = 0
+        self.ItemData9 = ""
+        self.ItemDataSize10 = 0
+        self.ItemData10 = ""
+        self.ItemDataSize11 = 0
+        self.ItemData11 = ""
+        self.ItemDataSize12 = 0
+        self.ItemData12 = ""
+        self.ItemDataSize13 = 0
+        self.ItemData13 = ""
+        self.ItemDataSize14 = 0
+        self.ItemData14 = ""
+        self.ItemDataSize15 = 0
+        self.ItemData15 = ""
         return
 
     def GetLength(self):
@@ -718,14 +806,42 @@
         length += self.Head.GetLength()
         length += 4
         length += 2
-        length += 4
-        length += len(self.PropData)
-        length += 4
-        length += len(self.ItemData)
-        length += 4
-        length += len(self.PlusData)
         length += 1
         length += 4
+        length += 2
+        length += len(self.PropData)
+        length += 2
+        length += len(self.PlusData)
+        length += 2
+        length += len(self.ItemData1)
+        length += 2
+        length += len(self.ItemData2)
+        length += 2
+        length += len(self.ItemData3)
+        length += 2
+        length += len(self.ItemData4)
+        length += 2
+        length += len(self.ItemData5)
+        length += 2
+        length += len(self.ItemData6)
+        length += 2
+        length += len(self.ItemData7)
+        length += 2
+        length += len(self.ItemData8)
+        length += 2
+        length += len(self.ItemData9)
+        length += 2
+        length += len(self.ItemData10)
+        length += 2
+        length += len(self.ItemData11)
+        length += 2
+        length += len(self.ItemData12)
+        length += 2
+        length += len(self.ItemData13)
+        length += 2
+        length += len(self.ItemData14)
+        length += 2
+        length += len(self.ItemData15)
 
         return length
 
@@ -734,14 +850,42 @@
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
         data = CommFunc.WriteDWORD(data, self.PlayerID)
         data = CommFunc.WriteWORD(data, self.PlayerLV)
-        data = CommFunc.WriteDWORD(data, self.PropDataSize)
-        data = CommFunc.WriteString(data, self.PropDataSize, self.PropData)
-        data = CommFunc.WriteDWORD(data, self.ItemDataSize)
-        data = CommFunc.WriteString(data, self.ItemDataSize, self.ItemData)
-        data = CommFunc.WriteDWORD(data, self.PlusDataSize)
-        data = CommFunc.WriteString(data, self.PlusDataSize, self.PlusData)
         data = CommFunc.WriteBYTE(data, self.IsLogouting)
         data = CommFunc.WriteDWORD(data, self.OffTime)
+        data = CommFunc.WriteWORD(data, self.PropDataSize)
+        data = CommFunc.WriteString(data, self.PropDataSize, self.PropData)
+        data = CommFunc.WriteWORD(data, self.PlusDataSize)
+        data = CommFunc.WriteString(data, self.PlusDataSize, self.PlusData)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize1)
+        data = CommFunc.WriteString(data, self.ItemDataSize1, self.ItemData1)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize2)
+        data = CommFunc.WriteString(data, self.ItemDataSize2, self.ItemData2)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize3)
+        data = CommFunc.WriteString(data, self.ItemDataSize3, self.ItemData3)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize4)
+        data = CommFunc.WriteString(data, self.ItemDataSize4, self.ItemData4)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize5)
+        data = CommFunc.WriteString(data, self.ItemDataSize5, self.ItemData5)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize6)
+        data = CommFunc.WriteString(data, self.ItemDataSize6, self.ItemData6)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize7)
+        data = CommFunc.WriteString(data, self.ItemDataSize7, self.ItemData7)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize8)
+        data = CommFunc.WriteString(data, self.ItemDataSize8, self.ItemData8)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize9)
+        data = CommFunc.WriteString(data, self.ItemDataSize9, self.ItemData9)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize10)
+        data = CommFunc.WriteString(data, self.ItemDataSize10, self.ItemData10)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize11)
+        data = CommFunc.WriteString(data, self.ItemDataSize11, self.ItemData11)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize12)
+        data = CommFunc.WriteString(data, self.ItemDataSize12, self.ItemData12)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize13)
+        data = CommFunc.WriteString(data, self.ItemDataSize13, self.ItemData13)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize14)
+        data = CommFunc.WriteString(data, self.ItemDataSize14, self.ItemData14)
+        data = CommFunc.WriteWORD(data, self.ItemDataSize15)
+        data = CommFunc.WriteString(data, self.ItemDataSize15, self.ItemData15)
         return data
 
     def OutputString(self):
@@ -749,27 +893,83 @@
                                 Head:%s,
                                 PlayerID:%d,
                                 PlayerLV:%d,
+                                IsLogouting:%d,
+                                OffTime:%d,
                                 PropDataSize:%d,
                                 PropData:%s,
-                                ItemDataSize:%d,
-                                ItemData:%s,
                                 PlusDataSize:%d,
                                 PlusData:%s,
-                                IsLogouting:%d,
-                                OffTime:%d
+                                ItemDataSize1:%d,
+                                ItemData1:%s,
+                                ItemDataSize2:%d,
+                                ItemData2:%s,
+                                ItemDataSize3:%d,
+                                ItemData3:%s,
+                                ItemDataSize4:%d,
+                                ItemData4:%s,
+                                ItemDataSize5:%d,
+                                ItemData5:%s,
+                                ItemDataSize6:%d,
+                                ItemData6:%s,
+                                ItemDataSize7:%d,
+                                ItemData7:%s,
+                                ItemDataSize8:%d,
+                                ItemData8:%s,
+                                ItemDataSize9:%d,
+                                ItemData9:%s,
+                                ItemDataSize10:%d,
+                                ItemData10:%s,
+                                ItemDataSize11:%d,
+                                ItemData11:%s,
+                                ItemDataSize12:%d,
+                                ItemData12:%s,
+                                ItemDataSize13:%d,
+                                ItemData13:%s,
+                                ItemDataSize14:%d,
+                                ItemData14:%s,
+                                ItemDataSize15:%d,
+                                ItemData15:%s
                                 '''\
                                 %(
                                 self.Head.OutputString(),
                                 self.PlayerID,
                                 self.PlayerLV,
+                                self.IsLogouting,
+                                self.OffTime,
                                 self.PropDataSize,
                                 self.PropData,
-                                self.ItemDataSize,
-                                self.ItemData,
                                 self.PlusDataSize,
                                 self.PlusData,
-                                self.IsLogouting,
-                                self.OffTime
+                                self.ItemDataSize1,
+                                self.ItemData1,
+                                self.ItemDataSize2,
+                                self.ItemData2,
+                                self.ItemDataSize3,
+                                self.ItemData3,
+                                self.ItemDataSize4,
+                                self.ItemData4,
+                                self.ItemDataSize5,
+                                self.ItemData5,
+                                self.ItemDataSize6,
+                                self.ItemData6,
+                                self.ItemDataSize7,
+                                self.ItemData7,
+                                self.ItemDataSize8,
+                                self.ItemData8,
+                                self.ItemDataSize9,
+                                self.ItemData9,
+                                self.ItemDataSize10,
+                                self.ItemData10,
+                                self.ItemDataSize11,
+                                self.ItemData11,
+                                self.ItemDataSize12,
+                                self.ItemData12,
+                                self.ItemDataSize13,
+                                self.ItemData13,
+                                self.ItemDataSize14,
+                                self.ItemData14,
+                                self.ItemDataSize15,
+                                self.ItemData15
                                 )
         return DumpString
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 1d77aca..5c15b7e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -5606,6 +5606,7 @@
                   ("Cmd", c_ubyte),
                   ("SubCmd", c_ubyte),
                   ("PlayerID", c_int),    
+                  ("EquipClassLV", c_ubyte),    #大于0为查看指定境界阶装备信息,  0为查看默认信息
                   ]
 
     def __init__(self):
@@ -5623,6 +5624,7 @@
         self.Cmd = 0xA2
         self.SubCmd = 0x12
         self.PlayerID = 0
+        self.EquipClassLV = 0
         return
 
     def GetLength(self):
@@ -5635,12 +5637,14 @@
         DumpString = '''//A2 12 查看玩家详细信息//tagCMViewPlayerInfo:
                                 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/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
index a4dcc0b..3b419c2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
@@ -171,6 +171,15 @@
 
     #if isRefreshEquipBuff:
     #    __RefreshPlayerAllEquipBuff(curPlayer)
+    
+    if classLV:
+        playerID = curPlayer.GetPlayerID()
+        if playerID not in PyGameData.g_equipChangeClassLVInfo:
+            PyGameData.g_equipChangeClassLVInfo[playerID] = []
+        classLVList = PyGameData.g_equipChangeClassLVInfo[playerID]
+        if classLV not in classLVList:
+            classLVList.append(classLV)
+            #GameWorld.DebugLog("添加装备缓存变更阶: classLV=%s, %s" % (classLV, classLVList), playerID)
     return
 
 ## 刷新所有装备对人物属性的改变
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 5f798dc..432b1aa 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -1241,6 +1241,7 @@
     PyGameData.g_zhuXianSkillReducePerDict.pop(playerID, None)
     PyGameData.g_playerFuncAttrDict.pop(playerID, None)
     PyGameData.g_playerEquipPartAttrDict.pop(playerID, None)
+    PyGameData.g_equipChangeClassLVInfo.pop(playerID, None)
     return
 
 ##更新保存玩家在线时间
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
-
-
-
-
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
index cec492f..98c193b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -24,6 +24,7 @@
 g_refreshAttrBillboardFunc = [] # 刷属性后需要触发的同步排行榜函数列表
 g_playerFuncAttrDict = {} # 玩家功能点属性 {playerID:{funcIndex:属性列表, ...}, ...}
 g_playerEquipPartAttrDict = {} # 玩家装备位养成属性 {playerID:{阶:[强化属性列表, 宝石属性列表, 洗练属性列表], ...}, ...}
+g_equipChangeClassLVInfo = {} # 玩家装备变更的装备阶信息 {playerID:[classLV, ...], ...}
 
 g_filterEquipDict = {} # 按装备条件过滤的装备ID,不分职业 {"classLV_color_star":{(itemJob,itemPlace):itemID, ...}, ...}
 

--
Gitblit v1.8.0