From c6d9ab20eef7bdef1be9bf67ed7a4862439071de Mon Sep 17 00:00:00 2001 From: hch <305670599@qq.com> Date: 星期五, 18 一月 2019 21:20:09 +0800 Subject: [PATCH] 5722 【后端】【1.5.100】【1.5】跨服BOSS开发- 同步玩家装备物品(神兽,宠物,身上装备),技能 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py | 208 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 201 insertions(+), 7 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 35c9de7..91f317a 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py @@ -26,7 +26,8 @@ import PlayerHorse import PlayerPet import traceback - +import ShareDefine +import md5 # 发送格式: 类型+(数量)+数据 # 向跨服发送的数据类型 ( @@ -228,6 +229,8 @@ 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 @@ -243,8 +246,60 @@ 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] + 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): @@ -288,9 +343,8 @@ data = __WriteSyncPlayerAttrData(curPlayer, data) # 玩家属性 data = __WriteSyncPlayerDictData(curPlayer, data) # 字典 data = __WriteSyncPlayerDienstgradData(curPlayer, data) # 称号 - # 物品 - - # 技能 + data = __WriteSyncPlayerItems(curPlayer, data)# 物品 + data = __WriteSyncPlayerSkills(curPlayer, data)# 技能 #直接用字节流会报错 data = base64.b64encode(data) @@ -303,6 +357,8 @@ return + + def __ReadMainServerSyncPlayerData(curPlayer, pdata, pos): ## 读取子服同步的玩家战力变更相关属性 @@ -311,9 +367,8 @@ 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() @@ -434,8 +489,147 @@ 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