hxp
2025-02-13 b4c65eee7a595d44e2282e50f96d0e43283b730e
5563 【英文】【BT】【越南】【砍树】跨服服务器维护优化
4个文件已修改
26 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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:
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
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()
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: