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 ++++++++++++++++++++++++++++++++++-----------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py | 1
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDienstgrad.py | 5 +
3 files changed, 109 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
+
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDienstgrad.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDienstgrad.py
index 6551fe4..66c8424 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDienstgrad.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDienstgrad.py
@@ -25,6 +25,7 @@
import SkillShell
import PassiveBuffEffMng
import DataRecordPack
+import CrossPlayerData
import time
#-------------------------------------------------------------
@@ -130,6 +131,8 @@
for skillID in skillList:
__GiveSkill(curPlayer, skillID)
+ CrossPlayerData.OnDienstgradChange(curPlayer, dienstgradID, 1)
+
#重新刷新角色属性
if isRefreshAttr:
CalcAllDienstgradAttr(curPlayer)
@@ -221,6 +224,8 @@
# 删除对应技能
__DelSkill(curPlayer, curDienstgradData)
DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_Title, {'dienstgradID':dienstgradID})
+
+ CrossPlayerData.OnDienstgradChange(curPlayer, dienstgradID, 0)
#重新刷新角色属性
if isRefreshAttr:
CalcAllDienstgradAttr(curPlayer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
index ba5199f..cd47b0b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py
@@ -84,5 +84,6 @@
g_crossRegPlayerAttrDict = {} #跨服注册时登记的会影响战力的属性值 {playerID:[value, ...], ...}
g_crossSyncTickDict = {} #需要同步跨服数据的玩家同步tick字典 {playerID:tick, ...}
g_crossPlayerDictChangeInfo = {} #跨服玩家字典变化信息 {playerID:{(key, dType):value, ...}, ...}
+g_crossPlayerDienstgradChangeInfo = {} #跨服玩家称号变化信息 {playerID:{id:isAdd, ...}, ...}
--
Gitblit v1.8.0