hxp
2019-04-27 835c5fad7ad4e723c34be7f5fc073eeb7104e3f4
6628 【2.0】【后端】查看玩家装备和查看玩家战力功能
11个文件已修改
1201 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/ChMapToGamePyPack.py 280 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamilyAction.py 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py 323 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChMapToGamePyPack.py 280 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py 286 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
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
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
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
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"  # 等级奖励领取信息记录,按二进制位标示
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
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
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
## 刷新所有装备对人物属性的改变
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
##更新保存玩家在线时间
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
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, ...}, ...}