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