| | |
| | | import base64
|
| | | import ChConfig
|
| | | import PyGameData
|
| | | import PlayerDienstgrad
|
| | | import IpyGameDataPY
|
| | | import traceback
|
| | |
|
| | | # 发送格式: 类型+(数量)+数据
|
| | | # 向跨服发送的数据类型
|
| | |
| | | [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等级
|
| | | ]
|
| | |
| | | # 非跨服
|
| | | return
|
| | |
|
| | | try:
|
| | | # 跨服服务器处理
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | pdata = base64.b64decode(curPlayer.GetMergePlayerData())
|
| | |
| | | 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
|
| | |
|
| | | ## ----------------------------------------------------------------------------------------------
|
| | |
| | | if crossMapID in [ChConfig.Def_FBMapID_CrossRealmPK]:
|
| | | return
|
| | |
|
| | | if not IpyGameDataPY.GetFuncCfg("CrossSyncPlayerData", 1):
|
| | | return
|
| | | |
| | | return True
|
| | |
|
| | | def ClearCrossSyncDataCache(curPlayer):
|
| | |
| | | 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
|
| | |
|
| | |
| | | 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):
|
| | |
| | | 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) # 称号
|
| | | # 物品
|
| | |
|
| | | # 技能
|
| | |
| | | #直接用字节流会报错
|
| | | 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):
|
| | |
| | |
|
| | | pos = __ReadSyncPlayerAttrData(curPlayer, pdata, pos) # 玩家属性
|
| | | pos = __ReadSyncPlayerDictData(curPlayer, pdata, pos) # 字典
|
| | | pos = __ReadSyncPlayerDienstgradData(curPlayer, pdata, pos) # 称号
|
| | | # 物品
|
| | |
|
| | | # 技能
|
| | |
| | | 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)
|
| | |
| | | ## 写入需要同步的玩家字典
|
| | | 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)
|
| | |
| | |
|
| | | 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
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|