From 5ac407ea08e218f3638e67b37c9261b437393d34 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 03 十二月 2025 19:55:29 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(支持多地图战斗)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/CrossServerPackLogic.py |  153 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 150 insertions(+), 3 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/CrossServerPackLogic.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/CrossServerPackLogic.py
index ee250de..ae314e9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/CrossServerPackLogic.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/CrossServerPackLogic.py
@@ -7,16 +7,163 @@
 # 跨服服务器间的封包 既是收包也是发包
 
 import GameWorld
-import ChServerToServerPyPack
+import ShareDefine
 import NetPackCommon
+import ChServerToServerPyPack
+import TurnAttack
+import PyGameData
+import ChPlayer
+
+import traceback
+import cPickle
+import time
 
 def OnTest(netPack):
 
     GameWorld.Log("收到跨服包 " + str(netPack.Data))
 
 
-def SendTest():
+def SendTest(dirType, serverList):
     pack = ChServerToServerPyPack.tagSSTest()
     pack.Data = 12
     #0全广播,1通知主服务器排除合服子服,2通知服务器包含合服子服, 3通知跨服服务器 
-    NetPackCommon.SendCrossServerToServerPack(1, "[501]", pack.GetBuffer())
+    NetPackCommon.SendCrossServerToServerPack(dirType, serverList, pack.GetBuffer())
+    return
+
+def GetCrossServerID():
+    ## 获取本服务器所属的跨服中心服务器
+    return 0
+
+def SendToCrossServer(msgType, dataMsg):
+    ## 发送信息到跨服服务器
+    if GameWorld.IsCrossServer():
+        return
+    if not dataMsg:
+        return
+    if msgType not in [ShareDefine.ClientServerMsg_ServerInitOK]:
+        isOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
+        if not isOpen:
+            GameWorld.Log("跨服服务器未开启或维护中不发送消息! SendMsgToCrossServer => %s" % msgType)
+            return
+    crossServerID = GetCrossServerID()
+    if not crossServerID:
+        return
+    
+    playerID = 0
+    if isinstance(dataMsg, dict):
+        playerID = dataMsg.get("playerID", 0)
+        if not playerID:
+            playerID = dataMsg.get("PlayerID", 0)
+            
+    GameWorld.Log("SendMsgToCrossServer => %s, %s, %s" % (msgType, crossServerID, dataMsg), playerID)
+    SendToServer(msgType, dataMsg, [crossServerID], ShareDefine.dirType_Cross, playerID, isLog=False)
+    return
+
+def SendToClientServer(msgType, dataMsg, serverIDList=None):
+    ''' 发送信息到子服务器
+        @param serverGroupIDList: 发送指定的服务器组ID列表,内部已经针对列表中组ID去重,
+        所以外部逻辑可直接添加,不用考虑组ID重复问题,没有指定服务器组ID时,默认广播所有子服
+    '''
+    if not GameWorld.IsCrossServer():
+        return
+    
+    if not PyGameData.g_serverInitOK:
+        GameWorld.ErrLog("跨服服务器未启动好,不允许向子服发送数据! %s, %s, %s" % (msgType, serverIDList, dataMsg))
+        return
+    
+    playerID = 0
+    if isinstance(dataMsg, dict):
+        playerID = dataMsg.get("playerID", 0)
+        if not playerID:
+            playerID = dataMsg.get("PlayerID", 0)
+            
+    GameWorld.Log("SendToClientServer => %s, %s, %s" % (msgType, serverIDList, dataMsg), playerID)
+    SendToServer(msgType, dataMsg, serverIDList, ShareDefine.dirType_Main, playerID, isLog=False) # 默认发给主服即可
+    return
+
+def SendToBattleServer(msgType, dataMsg, playerID=0):
+    SendToServer(msgType, dataMsg, dirType=ShareDefine.dirType_Battle, playerID=playerID)
+    return
+
+def SendToServer(msgType, dataMsg, serverIDList=None, dirType=ShareDefine.dirType_Main, playerID=0, isLog=True):
+    '''发送给其他服务器
+    @param msgType: 功能信息类型字符定义
+    @param dataMsg: 发送的数据,任意格式,由功能自行决定
+    @param serverIDList: 指定目标服务器ID 或   服务器ID列表
+    '''
+    
+    if isinstance(serverIDList, int):
+        serverIDList = [serverIDList]
+    elif not isinstance(serverIDList, list):
+        serverIDList = []
+    else:
+        serverIDList = list(set(serverIDList)) # 去重
+        
+    if isLog:
+        GameWorld.Log("SendToServer => %s, %s, %s" % (msgType, serverIDList, dataMsg), playerID)
+        
+    # 协议要用最高级2,可减少长度
+    sendMsg = cPickle.dumps(dataMsg, 2)
+    
+    pack = ChServerToServerPyPack.tagSSCommMsg()
+    pack.FromServerID = GameWorld.GetGameWorld().GetServerID()
+    pack.ServerTime = int(time.time())
+    pack.MsgType = msgType
+    pack.TypeLen = len(pack.MsgType)
+    pack.Data = sendMsg
+    pack.Len = len(pack.Data)
+    NetPackCommon.SendCrossServerToServerPack(dirType, serverIDList, pack.GetBuffer())
+    return
+
+def OnSSCommMsg(netPack):
+    ## 收到其他服务器发来的消息
+    
+    fromServerID = netPack.FromServerID
+    fromServerTime = netPack.ServerTime
+    msgType = netPack.MsgType
+    recvMsg = netPack.Data
+    
+    if not PyGameData.g_serverInitOK:
+        GameWorld.Log("服务器未启动好,不处理其他服务器信息! %s, fromServerID=%s" % (msgType, fromServerID))
+        return
+    
+    try:
+        dataMsg = cPickle.loads(recvMsg)
+        if GameWorld.IsCrossServer():
+            GameWorld.Log("OnCrossServerReceiveMsg: %s, fromServerID=%s, %s" % (msgType, fromServerID, dataMsg))
+        else:
+            GameWorld.Log("OnClientServerReceiveMsg: %s, fromServerID=%s, %s" % (msgType, fromServerID, dataMsg))
+            
+            crossServerID = GetCrossServerID()
+            if crossServerID == fromServerID:
+                __fixCrossServerTime(msgType, fromServerTime)
+                
+        if msgType == ShareDefine.SSMsg_BattleRequest:
+            TurnAttack.SSMsg_BattleRequest(dataMsg, fromServerID)
+        elif msgType == ShareDefine.SSMsg_BattleResult:
+            TurnAttack.SSMsg_BattleResult(dataMsg, fromServerID)
+            
+    except:
+        GameWorld.RaiseException("服务器接收信息处理报错 \r\n%s" % str(traceback.format_exc()))
+    return
+
+def __fixCrossServerTime(msgType, crossServerTime):
+    # 子服矫正跨服服务器时间
+    curServerTime = int(time.time())
+    curServerCrossServerTime = GameWorld.ChangeTimeStrToNum(GameWorld.GetCrossServerTimeStr())
+    diffSeconds = curServerCrossServerTime - crossServerTime # 本服计算误差
+    
+    PyGameData.g_crossServerTimeInfo = [crossServerTime, curServerTime] # 覆盖更新
+    
+    # 误差超过30秒 或强制同步时间的
+    if abs(diffSeconds) >= 30 or msgType == ShareDefine.CrossServerMsg_CrossServerTime:
+        GameWorld.DebugLog("同步跨服服务器时间,本服与跨服服务器时间计算误差! diffSeconds=%s" % (diffSeconds))
+        playerManager = GameWorld.GetPlayerManager()
+        for i in xrange(playerManager.GetPlayerCount()):
+            curPlayer = playerManager.GetPlayerByIndex(i)
+            if not GameWorld.IsNormalPlayer(curPlayer):
+                continue
+            ChPlayer.Sync_PyServerDataTimeToClient(curPlayer)
+    return
+
+

--
Gitblit v1.8.0