6628 【2.0】【后端】查看玩家装备和查看玩家战力功能
| | |
| | | ("SubCmd", c_ubyte),
|
| | | ("PlayerID", c_int), #玩家ID
|
| | | ("FindPlayerID", c_int), #要查询的玩家ID
|
| | | ("EquipClassLV", c_ubyte), #大于0为查看指定境界阶装备信息, 0为查看默认信息
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.SubCmd = 0x02
|
| | | self.PlayerID = 0
|
| | | self.FindPlayerID = 0
|
| | | self.EquipClassLV = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | 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
|
| | |
|
| | |
| | | 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):
|
| | |
| | | _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):
|
| | |
| | | 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):
|
| | |
| | | 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
|
| | |
|
| | |
| | | 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):
|
| | |
| | | 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
|
| | |
|
| | |
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("PlayerID", c_int),
|
| | | ("EquipClassLV", c_ubyte), #大于0为查看指定境界阶装备信息, 0为查看默认信息
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.Cmd = 0xA2
|
| | | self.SubCmd = 0x12
|
| | | self.PlayerID = 0
|
| | | self.EquipClassLV = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | 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
|
| | |
|
| | |
| | | #GameWorld.DebugLog("普通成员不记录家族官员模型装备信息!")
|
| | | return
|
| | |
|
| | | modelEquipInfoList = PlayerViewCache.GetPlayerCacheEquipView(playerID)
|
| | | modelEquipInfoList = []
|
| | | #modelEquipInfoList = PlayerViewCache.GetPlayerCacheEquipView(playerID)
|
| | | if not modelEquipInfoList:
|
| | | #GameWorld.DebugLog("找不到家族官员模型装备信息, 不记录!familyID=%s,playerID=%s" % (familyID, playerID))
|
| | | return
|
| | |
| | | # @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()
|
| | |
| | |
|
| | | 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()
|
| | |
| | | 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
|
| | |
| | | answerPack = ChPyNetSendPack.tagGCAnswerPlayerShortInfo()
|
| | | answerPack.Clear()
|
| | | if not tagPlayer:
|
| | | curCache = ViewCacheMgr.FindCache(clientPack.PlayerID)
|
| | | curCache = FindViewCache(clientPack.PlayerID)
|
| | | if not curCache:
|
| | | # 实在找不到设置为初始化数据
|
| | | answerPack.PlayerID = clientPack.PlayerID
|
| | |
| | | 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"]
|
| | |
| | | answerPack.RealmLV = cacheDict["RealmLV"]
|
| | | answerPack.OnlineType = ChConfig.Def_Offline
|
| | | answerPack.ServerGroupID = cacheDict.get("ServerGroupID", 0)
|
| | | |
| | | else:
|
| | | answerPack.PlayerID = clientPack.PlayerID
|
| | | answerPack.PlayerName = tagPlayer.GetName()
|
| | |
| | |
|
| | | 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
|
| | |
|
| | |
| | |
|
| | | Def_PDict_OnlinePrizeNote = "OnlinePrizeNote%s" # 当日在线奖励领取信息,记录信息 参数天数
|
| | |
|
| | |
|
| | | Def_PDict_EquipViewCacheState = "EquipViewCacheState" # 本次上线是否同步过装备缓存
|
| | | Def_PDict_DayOnlineTime = "OnlineTime" # 当日在线时长
|
| | | Def_PDict_OnlineStartTick = "OnlineStartTime" # 在线计算时间
|
| | | Def_PDict_LVAwardGetRecord = "LVAwardGetRecord" # 等级奖励领取信息记录,按二进制位标示
|
| | |
| | | ("SubCmd", c_ubyte),
|
| | | ("PlayerID", c_int), #玩家ID
|
| | | ("FindPlayerID", c_int), #要查询的玩家ID
|
| | | ("EquipClassLV", c_ubyte), #大于0为查看指定境界阶装备信息, 0为查看默认信息
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.SubCmd = 0x02
|
| | | self.PlayerID = 0
|
| | | self.FindPlayerID = 0
|
| | | self.EquipClassLV = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | 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
|
| | |
|
| | |
| | | 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):
|
| | |
| | | _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):
|
| | |
| | | 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):
|
| | |
| | | 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
|
| | |
|
| | |
| | | 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):
|
| | |
| | | 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
|
| | |
|
| | |
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("PlayerID", c_int),
|
| | | ("EquipClassLV", c_ubyte), #大于0为查看指定境界阶装备信息, 0为查看默认信息
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.Cmd = 0xA2
|
| | | self.SubCmd = 0x12
|
| | | self.PlayerID = 0
|
| | | self.EquipClassLV = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | 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
|
| | |
|
| | |
| | |
|
| | | #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
|
| | |
|
| | | ## 刷新所有装备对人物属性的改变
|
| | |
| | | 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
|
| | |
|
| | | ##更新保存玩家在线时间
|
| | |
| | | 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()
|
| | |
| | | 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()
|
| | |
| | | # 封魔坛剩余次数
|
| | | 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 = {}
|
| | |
| | | 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)
|
| | |
| | | #魂石、丹药使用个数
|
| | | 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):
|
| | |
| | | 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:
|
| | |
| | | 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
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
| | | g_refreshAttrBillboardFunc = [] # 刷属性后需要触发的同步排行榜函数列表
|
| | | g_playerFuncAttrDict = {} # 玩家功能点属性 {playerID:{funcIndex:属性列表, ...}, ...}
|
| | | g_playerEquipPartAttrDict = {} # 玩家装备位养成属性 {playerID:{阶:[强化属性列表, 宝石属性列表, 洗练属性列表], ...}, ...}
|
| | | g_equipChangeClassLVInfo = {} # 玩家装备变更的装备阶信息 {playerID:[classLV, ...], ...}
|
| | |
|
| | | g_filterEquipDict = {} # 按装备条件过滤的装备ID,不分职业 {"classLV_color_star":{(itemJob,itemPlace):itemID, ...}, ...}
|
| | |
|