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