5722 【后端】【1.5】跨服BOSS开发(同步玩家等级、称号变更到跨服,增加读写try,增加同步CD配置开关)
3个文件已修改
80 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerDienstgrad.py 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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,6 +82,7 @@
        # 非跨服
        return
    
    try:
    # 跨服服务器处理
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    pdata = base64.b64decode(curPlayer.GetMergePlayerData())
@@ -102,6 +107,12 @@
    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,15 +192,18 @@
    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)
    
    try:
    # 这里只做可能引起战力变化所需要同步的数据
    data = ""
        data = CommFunc.WriteBYTE(data, MergeData_Player)
    data = __WriteSyncPlayerAttrData(curPlayer, data) # 玩家属性
    data = __WriteSyncPlayerDictData(curPlayer, data) # 字典
        data = __WriteSyncPlayerDienstgradData(curPlayer, data) # 称号
    # 物品
    
    # 技能
@@ -183,6 +211,12 @@
    #直接用字节流会报错
    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
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)
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, ...}, ...}