From c38e918b531d7d524f7c38117928d1822795876b Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 18 一月 2019 11:14:34 +0800
Subject: [PATCH] 5722 【后端】【1.5】跨服BOSS开发(同步玩家等级、称号变更到跨服,增加读写try,增加同步CD配置开关)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py |  138 ++++++++++++++++++++++++++++++++++-----------
 1 files changed, 103 insertions(+), 35 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 ec3ae5c..f381374 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py
@@ -21,6 +21,9 @@
 import base64
 import ChConfig
 import PyGameData
+import PlayerDienstgrad
+import IpyGameDataPY
+import traceback
 
 # 发送格式: 类型+(数量)+数据
 # 向跨服发送的数据类型
@@ -37,6 +40,7 @@
     [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等级
                            ]
@@ -78,29 +82,36 @@
         # 非跨服
         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)
-        
-    elif dataType == MergeData_Player:
-        __ReadMainServerSyncPlayerData(curPlayer, curPlayer.GetMergePlayerData(), pos)
+            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)
+            
+    except BaseException:
+        errorMsg = str(traceback.format_exc())
+        GameWorld.ErrLog('接收跨服变更玩家数据错误 - > %s' % errorMsg, curPlayer.GetPlayerID())
+        if GameWorld.GetGameWorld().GetDebugLevel():
+            raise Exception(errorMsg)
         
     return
 
@@ -121,6 +132,9 @@
     if crossMapID in [ChConfig.Def_FBMapID_CrossRealmPK]:
         return
     
+    if not IpyGameDataPY.GetFuncCfg("CrossSyncPlayerData", 1):
+        return
+    
     return True
 
 def ClearCrossSyncDataCache(curPlayer):
@@ -129,6 +143,7 @@
     PyGameData.g_crossRegPlayerAttrDict.pop(playerID, None)
     PyGameData.g_crossSyncTickDict.pop(playerID, None)
     PyGameData.g_crossPlayerDictChangeInfo.pop(playerID, None)
+    PyGameData.g_crossPlayerDienstgradChangeInfo.pop(playerID, None)
     GameWorld.DebugLog("清除同步跨服数据的临时缓存", playerID)
     return
 
@@ -144,6 +159,16 @@
         attrList.append(attrInfo[0](curPlayer))
     playerID = curPlayer.GetPlayerID()
     PyGameData.g_crossRegPlayerAttrDict[playerID] = attrList
+    return
+
+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):
@@ -167,22 +192,31 @@
     if playerID not in PyGameData.g_crossSyncTickDict:
         return
     setTick = PyGameData.g_crossSyncTickDict[playerID]
-    if tick - setTick < 5000:
+    if tick - setTick < IpyGameDataPY.GetFuncCfg("CrossSyncPlayerData", 1) * 1000:
         return
     PyGameData.g_crossSyncTickDict.pop(playerID)
     GameWorld.DebugLog("开始同步本服变更的属性...", playerID)
     
-    # 这里只做可能引起战力变化所需要同步的数据
-    data = ""
-    data = __WriteSyncPlayerAttrData(curPlayer, data) # 玩家属性
-    data = __WriteSyncPlayerDictData(curPlayer, data) # 字典
-    # 物品
-    
-    # 技能
-    
-    #直接用字节流会报错
-    data = base64.b64encode(data)
-    curPlayer.SendMergePlayerData(data)
+    try:
+        # 这里只做可能引起战力变化所需要同步的数据
+        data = ""
+        data = CommFunc.WriteBYTE(data, MergeData_Player)
+        data = __WriteSyncPlayerAttrData(curPlayer, data) # 玩家属性
+        data = __WriteSyncPlayerDictData(curPlayer, data) # 字典
+        data = __WriteSyncPlayerDienstgradData(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):
@@ -192,6 +226,7 @@
     
     pos = __ReadSyncPlayerAttrData(curPlayer, pdata, pos) # 玩家属性
     pos = __ReadSyncPlayerDictData(curPlayer, pdata, pos) # 字典
+    pos = __ReadSyncPlayerDienstgradData(curPlayer, pdata, pos) # 称号
     # 物品
     
     # 技能
@@ -203,7 +238,6 @@
 def __WriteSyncPlayerAttrData(curPlayer, data):
     ## 写入需要同步的玩家属性
     
-    data = CommFunc.WriteBYTE(data, MergeData_Player)
     playerID = curPlayer.GetPlayerID()
     if playerID not in PyGameData.g_crossRegPlayerAttrDict:
         return CommFunc.WriteBYTE(data, 0)
@@ -251,7 +285,7 @@
     ## 写入需要同步的玩家字典
     playerID = curPlayer.GetPlayerID()
     if playerID not in PyGameData.g_crossPlayerDictChangeInfo:
-        return CommFunc.WriteBYTE(data, 0)
+        return CommFunc.WriteWORD(data, 0)
     changeDict = PyGameData.g_crossPlayerDictChangeInfo.pop(playerID)
     
     count = len(changeDict)
@@ -283,6 +317,40 @@
         
     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
+
+
 
 
 

--
Gitblit v1.8.0