From b4c65eee7a595d44e2282e50f96d0e43283b730e Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 13 二月 2025 15:49:02 +0800
Subject: [PATCH] 5563 【英文】【BT】【越南】【砍树】跨服服务器维护优化

---
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py |    3 ++-
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py        |   10 +++++++++-
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py     |    2 ++
 ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py             |   11 +++++++++++
 4 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py
index e04cf71..6cefb52 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py
@@ -38,6 +38,7 @@
         return
     
     operate = gmCmdDict.get('operate', '')
+    tick = GameWorld.GetGameWorld().GetTick()
     
     # 状态查询
     if operate == "query":
@@ -48,12 +49,12 @@
     # 状态更改        
     if operate == "on":
         CrossRealmPlayer.DoChangeCrossServerState(1)
+        CrossRealmMsg.Sync_CrossServerInitDataToClientServer(tick, serverGroupID=0)
     elif operate == "off":
         CrossRealmPlayer.DoChangeCrossServerState(0)
         
     # 同步子服
     elif operate == "sync":
-        tick = GameWorld.GetGameWorld().GetTick()
         CrossRealmMsg.Sync_CrossServerInitDataToClientServer(tick, serverGroupID=0)
         
     else:
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
index 8c11841..580e7a9 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
@@ -65,7 +65,11 @@
         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
     # 协议要用最高级2,可减少长度
     srcMsg = {"MsgType":msgType, "Data":dataMsg, "ServerGroupID":GameWorld.GetServerGroupID()}
     sendMsg = cPickle.dumps(srcMsg, 2)
@@ -256,6 +260,10 @@
          当子服启动成功后,可同步一次跨服服务器活动状态及活动数据给子服
     '''
     GameWorld.Log("收到跨服子服连接成功通知! serverGroupID=%s" % serverGroupID)
+    isOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
+    if not isOpen:
+        GameWorld.Log("跨服服务器维护中不处理! serverGroupID=%s" % serverGroupID)
+        return
     Sync_CrossServerInitDataToClientServer(tick, serverGroupID)
     return
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
index 8530d3c..61c2dfb 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -2077,6 +2077,8 @@
 #  @param None 
 #  @return None
 def BeforeClose(tick):
+    if GameWorld.IsCrossServer():
+        CrossRealmPlayer.OnCrossServerClose()
     PlayerTeam.OnServerClose(tick)
     ChPlayer.SavePlayerLVData()
     PlayerFBHelpBattle.OnServerClose()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
index 7dbf112..2cefcaa 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
@@ -149,6 +149,17 @@
     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossServerState, {"isOpen":isOpen})
     return
 
+def OnCrossServerClose():
+    '''关服时处理
+        注意关服只需设置关闭状态即可,不调用 DoChangeCrossServerState 改变db状态及其他额外处理
+    db存储的关闭状态为维护状态(可能跨服服务器正常开着,但是运维后台GM手动设置处于维护状态)
+    通知关服状态主要目的是让子服不再发送消息到跨服服务器了,等待跨服服务器重新开启即可
+    '''
+    isOpen = 0
+    GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isOpen)
+    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossServerState, {"isOpen":isOpen})
+    return
+
 def CrossServerMsg_CrossServerState(msgData):
     ## 子服收到跨服服务器状态变更,子服不存DB,默认跨服维护中,连接跨服成功后由跨服同步状态直接更新到字典即可,没连上就默认维护中
     if "crossZoneName" in msgData:

--
Gitblit v1.8.0