From 921ba9c6e954f2f1377cb08d5a8476c9e6c2b30e Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 15 三月 2019 17:44:27 +0800
Subject: [PATCH] 6332 【后端】【2.0】主要是拍品相关规则调整及背包优化(给非拍卖物品为拍品时优化)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py | 581 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 560 insertions(+), 21 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py
index 7eadb42..e0ae076 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py
@@ -20,7 +20,14 @@
import SkillCommon
import base64
import ChConfig
-
+import PyGameData
+import PlayerDienstgrad
+import IpyGameDataPY
+import PlayerHorse
+import PlayerPet
+import traceback
+import ShareDefine
+import md5
# 发送格式: 类型+(数量)+数据
# 向跨服发送的数据类型
(
@@ -28,10 +35,37 @@
MergeData_Item, # 对比处理 只算属性的背包 装备 宠物
MergeData_Skill, # 只处理ID
MergeData_Buff, # 即时发送
-) = range(0, 4)
+CrossData_PetState, # 即时发送 宠物出战
+CrossData_HorseChange, # 即时发送 骑乘坐骑变更
+CrossData_RideHorse, # 即时发送 上下马
+) = range(0, 7)
+
+## 写数据类型定义
+(
+WDT_BYTE,
+WDT_WORD,
+WDT_DWORD,
+WDT_String,
+) = range(4)
+
+CrossDataInfo = {
+ CrossData_PetState:[[WDT_DWORD, WDT_BYTE, WDT_BYTE], lambda curObj, valueList:PlayerPet.CrossServer_DoChangePetState(curObj, valueList)],
+ CrossData_HorseChange:[[WDT_DWORD], lambda curObj, valueList:PlayerHorse.CrossServer_ChangeHorse(curObj, valueList)],
+ CrossData_RideHorse:[[WDT_BYTE], lambda curObj, valueList:PlayerHorse.CrossServer_RideHorse(curObj, valueList)],
+ }
+
+# 影响跨服战力属性列表
+CrossFightPowerAttrList = [
+ [lambda curObj:curObj.GetBaseSTR(), lambda curObj, value:curObj.SetBaseSTR(value)], # 力量
+ [lambda curObj:curObj.GetBasePNE(), lambda curObj, value:curObj.SetBasePNE(value)], # 智力
+ [lambda curObj:curObj.GetBasePHY(), lambda curObj, value:curObj.SetBasePHY(value)], # 敏捷
+ [lambda curObj:curObj.GetBaseCON(), lambda curObj, value:curObj.SetBaseCON(value)], # 体质
+ [lambda curObj:curObj.GetLV(), lambda curObj, value:curObj.SetLV(value)], # 等级
+ [lambda curObj:curObj.GetOfficialRank(), lambda curObj, value:curObj.SetOfficialRank(value)], # 境界
+ [lambda curObj:curObj.GetVIPLv(), lambda curObj, value:curObj.SetVIPLv(value)], # VIP等级
+ ]
# 发送主服玩家数据给跨服
-
def SendMergeData_Buff(curPlayer, buffID, plusValueList):
if buffID in [ChConfig.Def_SkillID_LimitSuperBuff,
ChConfig.Def_SkillID_TJGSuperBuff]:
@@ -68,29 +102,534 @@
# 非跨服
return
- # 跨服服务器处理
- curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
- pdata = base64.b64decode(curPlayer.GetMergePlayerData())
-
- pos = 0
- dataType, pos = CommFunc.ReadBYTE(pdata, pos)
- if dataType == MergeData_Buff:
- buffID, pos = CommFunc.ReadDWORD(pdata, pos)
- curSkill = GameWorld.GetGameData().GetSkillBySkillID(buffID)
- if not curSkill:
- return
+ try:
+ # 跨服服务器处理
+ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ pdata = base64.b64decode(curPlayer.GetMergePlayerData())
- plusValueList = []
- cnt, pos = CommFunc.ReadBYTE(pdata, pos)
- for i in range(cnt):
- value, pos = CommFunc.ReadDWORD(pdata, pos)
- plusValueList.append(value)
+ pos = 0
+ dataType, pos = CommFunc.ReadBYTE(pdata, pos)
+ if dataType == MergeData_Buff:
+ buffID, pos = CommFunc.ReadDWORD(pdata, pos)
+ curSkill = GameWorld.GetGameData().GetSkillBySkillID(buffID)
+ if not curSkill:
+ return
- buffType = SkillCommon.GetBuffType(curSkill)
- BuffSkill.AddBuffNoRefreshState(curPlayer, buffType, curSkill, tick, plusValueList)
+ plusValueList = []
+ cnt, pos = CommFunc.ReadBYTE(pdata, pos)
+ for i in range(cnt):
+ value, pos = CommFunc.ReadDWORD(pdata, pos)
+ plusValueList.append(value)
+
+ buffType = SkillCommon.GetBuffType(curSkill)
+ BuffSkill.AddBuffNoRefreshState(curPlayer, buffType, curSkill, tick, plusValueList)
+
+ elif dataType == MergeData_Player:
+ __ReadMainServerSyncPlayerData(curPlayer, curPlayer.GetMergePlayerData(), pos)
+
+ else:
+ __ReadCrossData(curPlayer, dataType, curPlayer.GetMergePlayerData(), pos)
+
+ except BaseException:
+ errorMsg = str(traceback.format_exc())
+ GameWorld.ErrLog('接收跨服变更玩家数据错误 - > %s' % errorMsg, curPlayer.GetPlayerID())
+ if GameWorld.GetGameWorld().GetDebugLevel():
+ raise Exception(errorMsg)
+
+ return
+## ----------------------------------------------------------------------------------------------
+
+def SendDataToCrossServer(curPlayer, dataType, dataList):
+ ## 通用的根据类型向跨服发送数据
+ if dataType not in CrossDataInfo:
+ return
+
+ if not IsNeedProcessCrossPlayer(curPlayer):
+ return
+
+ dataInfo = CrossDataInfo[dataType][0]
+ if len(dataList) != len(dataInfo):
+ return
+
+ data = ''
+ data = CommFunc.WriteBYTE(data, dataType)
+ for i, wDType in enumerate(dataInfo):
+ value = dataList[i]
+ if wDType == WDT_BYTE:
+ data = CommFunc.WriteBYTE(data, value)
+ elif wDType == WDT_WORD:
+ data = CommFunc.WriteWORD(data, value)
+ elif wDType == WDT_DWORD:
+ data = CommFunc.WriteDWORD(data, value)
+ elif wDType == WDT_String:
+ sLen = len(value)
+ data = CommFunc.WriteBYTE(data, sLen)
+ data = CommFunc.WriteString(data, sLen, value)
+
+ #直接用字节流会报错
+ data = base64.b64encode(data)
+ curPlayer.SendMergePlayerData(data)
+ GameWorld.DebugLog("发送数据到跨服服务器: dataType=%s,dataList=%s" % (dataType, dataList), curPlayer.GetPlayerID())
+ return
+
+def __ReadCrossData(curPlayer, dataType, pdata, pos):
+ if dataType not in CrossDataInfo:
+ return
+ dataInfo, callFunc = CrossDataInfo[dataType]
+
+ if not callFunc:
+ return
+
+ dataList = []
+ pdata = base64.b64decode(pdata)
+
+ for wDType in dataInfo:
+ if wDType == WDT_BYTE:
+ value, pos = CommFunc.ReadBYTE(pdata, pos)
+ elif wDType == WDT_WORD:
+ value, pos = CommFunc.ReadWORD(pdata, pos)
+ elif wDType == WDT_DWORD:
+ value, pos = CommFunc.ReadDWORD(pdata, pos)
+ elif wDType == WDT_String:
+ sLen, pos = CommFunc.ReadBYTE(pdata, pos)
+ value, pos = CommFunc.ReadString(pdata, pos, sLen)
+ else:
+ continue
+ dataList.append(value)
+
+ GameWorld.DebugLog("收到主服数据: dataType=%s,dataList=%s" % (dataType, dataList), curPlayer.GetPlayerID())
+ callFunc(curPlayer, dataList)
+ return
+
+def IsNeedProcessCrossPlayer(curPlayer):
+ ## 是否需要处理同步跨服中的玩家数据
+ if GameWorld.IsCrossServer():
+ return
+
+ crossMapID = curPlayer.NomalDictGetProperty(ChConfig.Def_PlayerKey_CrossRegisterMap)
+ if not crossMapID:
+ crossMapID = PlayerControl.GetCrossMapID(curPlayer)
+ if not crossMapID or crossMapID not in ChConfig.Def_CrossMapIDList:
+ return
+
+ # 不需要处理的跨服地图
+ if crossMapID in [ChConfig.Def_FBMapID_CrossRealmPK]:
+ return
+
+ if not IpyGameDataPY.GetFuncCfg("CrossSyncPlayerData", 1):
+ return
+
+ return True
+
+def ClearCrossSyncDataCache(curPlayer):
+ ## 清除同步跨服数据的临时缓存
+ playerID = curPlayer.GetPlayerID()
+ PyGameData.g_crossRegPlayerAttrDict.pop(playerID, None)
+ PyGameData.g_crossSyncTickDict.pop(playerID, None)
+ PyGameData.g_crossPlayerDictChangeInfo.pop(playerID, None)
+ PyGameData.g_crossPlayerDienstgradChangeInfo.pop(playerID, None)
+ PyGameData.g_crossPlayerItemsChangeInfo.pop(playerID, None)
+ PyGameData.g_crossPlayerSkillsChangeInfo.pop(playerID, None)
+ GameWorld.DebugLog("清除同步跨服数据的临时缓存", playerID)
+ return
+
+def OnPlayerCrossReg(curPlayer):
+ ## 玩家跨服数据注册
+
+ if not IsNeedProcessCrossPlayer(curPlayer):
+ return
+
+ ClearCrossSyncDataCache(curPlayer)
+ attrList = []
+ for attrInfo in CrossFightPowerAttrList:
+ attrList.append(attrInfo[0](curPlayer))
+ playerID = curPlayer.GetPlayerID()
+ PyGameData.g_crossRegPlayerAttrDict[playerID] = attrList
+
+ OnPlayerCrossRegItems(curPlayer) # 物品
+ OnPlayerCrossRegSkills(curPlayer) # 技能
+ return
+
+# 物品数据更新
+def OnPlayerCrossRegItems(curPlayer):
+ # 影响战力的物品,新功能注意添加,下次需要加上诛仙塔
+ PyGameData.g_crossPlayerItemsChangeInfo[curPlayer.GetPlayerID()] = GetPlayerCrossRegItems(curPlayer)
+
+ return
+
+def GetPlayerCrossRegItems(curPlayer):
+ itemsDict = {}
+ # 影响战力的物品,新功能注意添加,下次需要加上诛仙塔
+
+ packList = [IPY_GameWorld.rptEquip, ShareDefine.rptPet, ShareDefine.rptDogzEquip, ShareDefine.rptZhuXianEquip]
+ for packIndex in packList:
+ curPack = curPlayer.GetItemManager().GetPack(packIndex)
+ for i in range(curPack.GetCount()):
+ curItem = curPack.GetAt(i)
+ if not curItem or curItem.IsEmpty():
+ continue
+
+ itemMark = (curItem.GetItemPlaceType(), curItem.GetItemPlaceIndex())
+ itemsDict[itemMark] = md5.md5(curItem.GetB64ItemData()).hexdigest()
+
+ return itemsDict
+
+# 技能数据更新
+def OnPlayerCrossRegSkills(curPlayer):
+ PyGameData.g_crossPlayerSkillsChangeInfo[curPlayer.GetPlayerID()] = GetPlayerCrossRegSkills(curPlayer)
+
+def GetPlayerCrossRegSkills(curPlayer):
+ skills = []
+ skillManager = curPlayer.GetSkillManager()
+ for i in range(0 , skillManager.GetSkillCount()):
+ curSkill = skillManager.GetSkillByIndex(i)
+ skills.append(curSkill.GetSkillID())
+
+ return skills
+#===============================================================================
+# def test(curPlayer):
+# curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
+# curItem = curPack.GetAt(1)
+# curItem.GetB64ItemData()
+# curSingleItem = GameWorld.GetItemFactory().AddItem(curItem.GetB64ItemData())
+# if not curSingleItem:
+# return
+#
+# curItem2 = curPack.GetAt(2)
+# curItem2.AssignItem(curSingleItem)
+#===============================================================================
+
+def OnDienstgradChange(curPlayer, dienstgradID, state):
+ ## 称号变更
+ if not IsNeedProcessCrossPlayer(curPlayer):
+ return
+ playerID = curPlayer.GetPlayerID()
+ dienstgradStateDict = PyGameData.g_crossPlayerDienstgradChangeInfo.get(playerID, {})
+ dienstgradStateDict[dienstgradID] = state
+ PyGameData.g_crossPlayerDienstgradChangeInfo[playerID] = dienstgradStateDict
+ return
+
+def OnPlayerFightPowerChange(curPlayer):
+ ## 玩家战力变更时
+ if not IsNeedProcessCrossPlayer(curPlayer):
+ return
+ playerID = curPlayer.GetPlayerID()
+ if playerID in PyGameData.g_crossSyncTickDict:
+ return
+ tick = GameWorld.GetGameWorld().GetTick()
+ PyGameData.g_crossSyncTickDict[playerID] = tick
+ #GameWorld.DebugLog("标记需要同步跨服玩家战力变更相关数据! tick=%s" % tick, curPlayer.GetPlayerID())
+ return
+
+def ProcessCrossPlayer(curPlayer, tick):
+ ## 跨服状态的本服玩家处理
+ if not IsNeedProcessCrossPlayer(curPlayer):
+ return
+
+ playerID = curPlayer.GetPlayerID()
+ if playerID not in PyGameData.g_crossSyncTickDict:
+ return
+ setTick = PyGameData.g_crossSyncTickDict[playerID]
+ if tick - setTick < IpyGameDataPY.GetFuncCfg("CrossSyncPlayerData", 1) * 1000:
+ return
+ PyGameData.g_crossSyncTickDict.pop(playerID)
+ GameWorld.DebugLog("开始同步本服变更的属性...", playerID)
+
+ try:
+ # 这里只做可能引起战力变化所需要同步的数据
+ data = ""
+ data = CommFunc.WriteBYTE(data, MergeData_Player)
+ data = __WriteSyncPlayerAttrData(curPlayer, data) # 玩家属性
+ data = __WriteSyncPlayerDictData(curPlayer, data) # 字典
+ data = __WriteSyncPlayerDienstgradData(curPlayer, data) # 称号
+ data = __WriteSyncPlayerItems(curPlayer, data)# 物品
+ data = __WriteSyncPlayerSkills(curPlayer, data)# 技能
+
+ #直接用字节流会报错
+ data = base64.b64encode(data)
+ curPlayer.SendMergePlayerData(data)
+ except BaseException:
+ errorMsg = str(traceback.format_exc())
+ GameWorld.ErrLog('打包跨服变更玩家数据错误 - > %s' % errorMsg, curPlayer.GetPlayerID())
+ if GameWorld.GetGameWorld().GetDebugLevel():
+ raise Exception(errorMsg)
return
+def __ReadMainServerSyncPlayerData(curPlayer, pdata, pos):
+ ## 读取子服同步的玩家战力变更相关属性
+
+ GameWorld.DebugLog("收到子服同步的玩家变更数据:", curPlayer.GetPlayerID())
+
+ pos = __ReadSyncPlayerAttrData(curPlayer, pdata, pos) # 玩家属性
+ pos = __ReadSyncPlayerDictData(curPlayer, pdata, pos) # 字典
+ pos = __ReadSyncPlayerDienstgradData(curPlayer, pdata, pos) # 称号
+ pos = __ReadSyncPlayerItems(curPlayer, pdata, pos) # 物品
+ pos = __ReadSyncPlayerSkills(curPlayer, pdata, pos)# 技能
+
+ # 强刷一次属性
+ PlayerControl.PlayerControl(curPlayer).ReCalcAllState()
+ return
+
+def __WriteSyncPlayerAttrData(curPlayer, data):
+ ## 写入需要同步的玩家属性
+
+ playerID = curPlayer.GetPlayerID()
+ if playerID not in PyGameData.g_crossRegPlayerAttrDict:
+ return CommFunc.WriteBYTE(data, 0)
+ attrList = PyGameData.g_crossRegPlayerAttrDict[playerID]
+
+ if len(attrList) != len(CrossFightPowerAttrList):
+ return CommFunc.WriteBYTE(data, 0)
+
+ changeAttrList = []
+ for i, attrInfo in enumerate(CrossFightPowerAttrList):
+ befValue = attrList[i]
+ curValue = attrInfo[0](curPlayer)
+ if befValue == curValue:
+ continue
+ changeAttrList.append([i, curValue])
+ attrList[i] = curValue # 更新记录的值
+
+ if not changeAttrList:
+ return CommFunc.WriteBYTE(data, 0)
+
+ count = len(changeAttrList)
+ GameWorld.DebugLog("变更的玩家属性个数: %s" % count)
+ data = CommFunc.WriteBYTE(data, count)
+ for index, curValue in changeAttrList:
+ data = CommFunc.WriteBYTE(data, index)
+ data = CommFunc.WriteDWORD(data, curValue)
+ GameWorld.DebugLog(" index=%s,value=%s" % (index, curValue))
+
+ return data
+
+def __ReadSyncPlayerAttrData(curPlayer, pdata, pos):
+ ## 读取同步的玩家属性
+ pdata = base64.b64decode(pdata)
+ count, pos = CommFunc.ReadBYTE(pdata, pos)
+ GameWorld.DebugLog("变更的玩家属性个数: %s" % count)
+ for _ in range(count):
+ index, pos = CommFunc.ReadBYTE(pdata, pos)
+ value, pos = CommFunc.ReadDWORD(pdata, pos)
+ CrossFightPowerAttrList[index][1](curPlayer, value) # 设置更新值
+ GameWorld.DebugLog(" index=%s,value=%s" % (index, value))
+
+ return pos
+
+def __WriteSyncPlayerDictData(curPlayer, data):
+ ## 写入需要同步的玩家字典
+ playerID = curPlayer.GetPlayerID()
+ if playerID not in PyGameData.g_crossPlayerDictChangeInfo:
+ return CommFunc.WriteWORD(data, 0)
+ changeDict = PyGameData.g_crossPlayerDictChangeInfo.pop(playerID)
+
+ count = len(changeDict)
+ GameWorld.DebugLog("变更的玩家字典个数: %s" % count)
+ data = CommFunc.WriteWORD(data, count)
+ for keyInfo, value in changeDict.items():
+ key, dType = keyInfo
+ keyLen = len(key)
+ data = CommFunc.WriteBYTE(data, keyLen)
+ data = CommFunc.WriteString(data, keyLen, key)
+ data = CommFunc.WriteDWORD(data, value)
+ data = CommFunc.WriteBYTE(data, dType)
+ GameWorld.DebugLog(" key=%s, value=%s, dType=%s" % (key, value, dType))
+
+ return data
+
+def __ReadSyncPlayerDictData(curPlayer, pdata, pos):
+ ## 读取同步的玩家字典
+ pdata = base64.b64decode(pdata)
+ count, pos = CommFunc.ReadWORD(pdata, pos)
+ GameWorld.DebugLog("变更的玩家字典个数: %s" % count)
+ for _ in xrange(count):
+ keyLen, pos = CommFunc.ReadBYTE(pdata, pos)
+ key, pos = CommFunc.ReadString(pdata, pos, keyLen)
+ value, pos = CommFunc.ReadDWORD(pdata, pos)
+ dType, pos = CommFunc.ReadBYTE(pdata, pos)
+ PlayerControl.NomalDictSetProperty(curPlayer, key, value, dType)
+ GameWorld.DebugLog(" key=%s, value=%s, dType=%s" % (key, value, dType))
+
+ return pos
+
+def __WriteSyncPlayerDienstgradData(curPlayer, data):
+ ## 写入需要同步的玩家称号
+ playerID = curPlayer.GetPlayerID()
+ if playerID not in PyGameData.g_crossPlayerDienstgradChangeInfo:
+ return CommFunc.WriteBYTE(data, 0)
+ changeDienstgradDict = PyGameData.g_crossPlayerDienstgradChangeInfo.pop(playerID)
+
+ count = len(changeDienstgradDict)
+ GameWorld.DebugLog("变更的玩家称号个数: %s" % count)
+ data = CommFunc.WriteBYTE(data, count)
+ for dienstgradID, state in changeDienstgradDict.items():
+ data = CommFunc.WriteDWORD(data, dienstgradID)
+ data = CommFunc.WriteBYTE(data, state)
+ GameWorld.DebugLog(" dienstgradID=%s, state=%s" % (dienstgradID, state))
+
+ return data
+
+def __ReadSyncPlayerDienstgradData(curPlayer, pdata, pos):
+ ## 读取同步的玩家称号
+ pdata = base64.b64decode(pdata)
+ count, pos = CommFunc.ReadBYTE(pdata, pos)
+ GameWorld.DebugLog("变更的玩家称号个数: %s" % count)
+ for _ in xrange(count):
+ dienstgradID, pos = CommFunc.ReadDWORD(pdata, pos)
+ state, pos = CommFunc.ReadBYTE(pdata, pos)
+ GameWorld.DebugLog(" dienstgradID=%s, state=%s" % (dienstgradID, state))
+ if state:
+ PlayerDienstgrad.PlayerAddDienstgrad(curPlayer, dienstgradID, isRefreshAttr=False)
+ else:
+ PlayerDienstgrad.PlayerDelDienstgrad(curPlayer, dienstgradID, False)
+
+ return pos
+
+def __WriteSyncPlayerItems(curPlayer, data):
+ ## 写入需要同步的玩家物品,包含删除
+ playerID = curPlayer.GetPlayerID()
+ if playerID not in PyGameData.g_crossPlayerItemsChangeInfo:
+ data = CommFunc.WriteBYTE(data, 0) # 删除
+ data = CommFunc.WriteBYTE(data, 0) # 增改
+ return data
+ lastItems = PyGameData.g_crossPlayerItemsChangeInfo[playerID]
+ # 对比数据区分增改和删除
+ nowItems = GetPlayerCrossRegItems(curPlayer)
+
+ delItems = []
+ addItems = []
+ # --删除物品
+ for indexs in lastItems:
+ if indexs not in nowItems:
+ delItems.append(indexs)
+
+ data = CommFunc.WriteBYTE(data, len(delItems)) # 删除数量
+ for indexs in delItems:
+ data = CommFunc.WriteBYTE(data, indexs[0])
+ data = CommFunc.WriteBYTE(data, indexs[1])
+
+ # --添加修改物品
+ for indexs in nowItems:
+ if indexs not in lastItems:
+ addItems.append(indexs)
+ elif lastItems[indexs] != nowItems[indexs]:
+ addItems.append(indexs)
+
+ tmpData = ""
+ cnt = 0
+ for indexs in addItems:
+ curPack = curPlayer.GetItemManager().GetPack(indexs[0])
+ curItem = curPack.GetAt(indexs[1])
+ if not curItem or curItem.IsEmpty():
+ continue
+ itemData = base64.b64decode(curItem.GetB64ItemData())
+ tmpData = CommFunc.WriteWORD(tmpData, len(itemData)) # 物品数据长度
+ tmpData = CommFunc.WriteString(tmpData, len(itemData), itemData)
+ cnt += 1
+
+ data = CommFunc.WriteBYTE(data, cnt) # 增改数量
+ data += tmpData
+
+ # 同步最新物品数据
+ PyGameData.g_crossPlayerItemsChangeInfo[playerID] = nowItems
+ return data
+
+def __ReadSyncPlayerItems(curPlayer, pdata, pos):
+ ## 读取同步的玩家物品
+ pdata = base64.b64decode(pdata)
+ count, pos = CommFunc.ReadBYTE(pdata, pos)
+ GameWorld.DebugLog("删除的玩家物品个数: %s" % count)
+
+ # 删除物品
+ for _ in xrange(count):
+ packType, pos = CommFunc.ReadBYTE(pdata, pos)
+ itemIndex, pos = CommFunc.ReadBYTE(pdata, pos)
+ curPack = curPlayer.GetItemManager().GetPack(packType)
+ curItem = curPack.GetAt(itemIndex)
+ if not curItem or curItem.IsEmpty():
+ continue
+ curItem.Clear()
+
+
+ # 增改物品
+ count, pos = CommFunc.ReadBYTE(pdata, pos)
+ GameWorld.DebugLog("增改的玩家物品个数: %s" % count)
+
+ for _ in xrange(count):
+ #def ReadString(buf, pos, _len):
+ itemDataLen, pos = CommFunc.ReadWORD(pdata, pos)
+ itemData, pos = CommFunc.ReadString(pdata, pos, itemDataLen)
+ curSingleItem = GameWorld.GetItemFactory().AddItem(base64.b64encode(itemData))
+ if not curSingleItem or curSingleItem.GetItemTypeID() == 0:
+ continue
+
+ curPack = curPlayer.GetItemManager().GetPack(curSingleItem.GetItemPlaceType())
+ curItem = curPack.GetAt(curSingleItem.GetItemPlaceIndex())
+ curItem.AssignItem(curSingleItem)
+
+ return pos
+
+
+def __WriteSyncPlayerSkills(curPlayer, data):
+ ## 写入需要同步的玩家技能,包含删除
+ playerID = curPlayer.GetPlayerID()
+ if playerID not in PyGameData.g_crossPlayerSkillsChangeInfo:
+ data = CommFunc.WriteBYTE(data, 0) # 删除
+ data = CommFunc.WriteBYTE(data, 0) # 添加
+ return data
+
+ # 对比数据区分添加和删除
+ lastSkills = PyGameData.g_crossPlayerSkillsChangeInfo[playerID]
+ nowSkills = GetPlayerCrossRegSkills(curPlayer)
+
+ delSkills = []
+ # --删除物品
+ for skillID in lastSkills:
+ if skillID not in nowSkills:
+ delSkills.append(skillID)
+
+ data = CommFunc.WriteBYTE(data, len(delSkills)) # 删除数量
+ for skillID in delSkills:
+ data = CommFunc.WriteDWORD(data, skillID)
+
+ # --添加修改物品
+ addSkills = []
+ for skillID in nowSkills:
+ if skillID not in lastSkills:
+ addSkills.append(skillID)
+
+ data = CommFunc.WriteBYTE(data, len(addSkills)) # 增加数量
+ for skillID in addSkills:
+ data = CommFunc.WriteDWORD(data, skillID)
+
+
+ # 同步最新技能数据
+ PyGameData.g_crossPlayerSkillsChangeInfo[playerID] = nowSkills
+ return data
+
+def __ReadSyncPlayerSkills(curPlayer, pdata, pos):
+ ## 读取同步的玩家技能
+ skillManager = curPlayer.GetSkillManager()
+ pdata = base64.b64decode(pdata)
+ count, pos = CommFunc.ReadBYTE(pdata, pos)
+ GameWorld.DebugLog("删除的玩家技能个数: %s" % count)
+
+ # 删除技能
+ for _ in xrange(count):
+ skillID, pos = CommFunc.ReadDWORD(pdata, pos)
+ skillManager.DeleteSkillBySkillID(skillID, False)
+
+ count, pos = CommFunc.ReadBYTE(pdata, pos)
+ GameWorld.DebugLog("增加的玩家技能个数: %s" % count)
+
+ # 添加技能
+ for _ in xrange(count):
+ skillID, pos = CommFunc.ReadDWORD(pdata, pos)
+ skillManager.LearnSkillByID(skillID, False)
+
+ return pos
+
--
Gitblit v1.8.0