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