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