From a8f9421ee701e988e767e2735628e08b67efd393 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 18 一月 2019 17:49:06 +0800 Subject: [PATCH] 5722 【后端】【1.5.100】【1.5】跨服BOSS开发(同步场景灵宠、坐骑变更) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py | 86 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 85 insertions(+), 1 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 f381374..35c9de7 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossPlayerData.py @@ -23,6 +23,8 @@ import PyGameData import PlayerDienstgrad import IpyGameDataPY +import PlayerHorse +import PlayerPet import traceback # 发送格式: 类型+(数量)+数据 @@ -32,7 +34,24 @@ MergeData_Item, # 对比处理 只算属性的背包 装备 宠物 MergeData_Skill, # 只处理ID MergeData_Buff, # 即时发送 -) = range(0, 4) +CrossData_PetState, # 即时发送 宠物出战 +CrossData_HorseChange, # 即时发送 骑乘坐骑变更 +CrossData_RideHorse, # 即时发送 上下马 +) = range(0, 7) + +## 写数据类型定义 +( +WDT_BYTE, +WDT_WORD, +WDT_DWORD, +WDT_String, +) = range(4) + +CrossDataInfo = { + CrossData_PetState:[[WDT_DWORD, WDT_BYTE, WDT_BYTE], lambda curObj, valueList:PlayerPet.CrossServer_DoChangePetState(curObj, valueList)], + CrossData_HorseChange:[[WDT_DWORD], lambda curObj, valueList:PlayerHorse.CrossServer_ChangeHorse(curObj, valueList)], + CrossData_RideHorse:[[WDT_BYTE], lambda curObj, valueList:PlayerHorse.CrossServer_RideHorse(curObj, valueList)], + } # 影响跨服战力属性列表 CrossFightPowerAttrList = [ @@ -107,6 +126,9 @@ elif dataType == MergeData_Player: __ReadMainServerSyncPlayerData(curPlayer, curPlayer.GetMergePlayerData(), pos) + else: + __ReadCrossData(curPlayer, dataType, curPlayer.GetMergePlayerData(), pos) + except BaseException: errorMsg = str(traceback.format_exc()) GameWorld.ErrLog('接收跨服变更玩家数据错误 - > %s' % errorMsg, curPlayer.GetPlayerID()) @@ -117,6 +139,68 @@ ## ---------------------------------------------------------------------------------------------- +def SendDataToCrossServer(curPlayer, dataType, dataList): + ## 通用的根据类型向跨服发送数据 + if dataType not in CrossDataInfo: + return + + if not IsNeedProcessCrossPlayer(curPlayer): + return + + dataInfo = CrossDataInfo[dataType][0] + if len(dataList) != len(dataInfo): + return + + data = '' + data = CommFunc.WriteBYTE(data, dataType) + for i, wDType in enumerate(dataInfo): + value = dataList[i] + if wDType == WDT_BYTE: + data = CommFunc.WriteBYTE(data, value) + elif wDType == WDT_WORD: + data = CommFunc.WriteWORD(data, value) + elif wDType == WDT_DWORD: + data = CommFunc.WriteDWORD(data, value) + elif wDType == WDT_String: + sLen = len(value) + data = CommFunc.WriteBYTE(data, sLen) + data = CommFunc.WriteString(data, sLen, value) + + #直接用字节流会报错 + data = base64.b64encode(data) + curPlayer.SendMergePlayerData(data) + GameWorld.DebugLog("发送数据到跨服服务器: dataType=%s,dataList=%s" % (dataType, dataList), curPlayer.GetPlayerID()) + return + +def __ReadCrossData(curPlayer, dataType, pdata, pos): + if dataType not in CrossDataInfo: + return + dataInfo, callFunc = CrossDataInfo[dataType] + + if not callFunc: + return + + dataList = [] + pdata = base64.b64decode(pdata) + + for wDType in dataInfo: + if wDType == WDT_BYTE: + value, pos = CommFunc.ReadBYTE(pdata, pos) + elif wDType == WDT_WORD: + value, pos = CommFunc.ReadWORD(pdata, pos) + elif wDType == WDT_DWORD: + value, pos = CommFunc.ReadDWORD(pdata, pos) + elif wDType == WDT_String: + sLen, pos = CommFunc.ReadBYTE(pdata, pos) + value, pos = CommFunc.ReadString(pdata, pos, sLen) + else: + continue + dataList.append(value) + + GameWorld.DebugLog("收到主服数据: dataType=%s,dataList=%s" % (dataType, dataList), curPlayer.GetPlayerID()) + callFunc(curPlayer, dataList) + return + def IsNeedProcessCrossPlayer(curPlayer): ## 是否需要处理同步跨服中的玩家数据 if GameWorld.IsCrossServer(): -- Gitblit v1.8.0