From 7ceba1452ba6395abd5841f62e96e384df21aa05 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期六, 29 十二月 2018 02:38:08 +0800
Subject: [PATCH] 5424 【后端】【1.4】跨服竞技场开发(GM工具增加跨服服务器维护操作)

---
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py            |   64 ++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py               |    3 
 ServerPython/db/PyMongoDataServer/GMToolLogicProcess/Commands/GMCommon.py                        |    6 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py   |    4 +
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMCommon.py                           |    6 +
 ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py                        |   58 ++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py |    4 +
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py                         |    2 
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py                   |    9 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py      |    6 +
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py                    |    4 +
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py                |   16 +++
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                    |    3 
 13 files changed, 173 insertions(+), 12 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMCommon.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMCommon.py
index 03ea28d..8655e0b 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMCommon.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMCommon.py
@@ -68,10 +68,12 @@
 Def_CurTimeGreaterEndTime, # 28当前时间大于结束时间
 Def_ActionAllreadyOpen, #29 活动已经设置过了
 Def_GMForbidMergeWar, #30 gm设置这个服不参加跨服塞
-Def_IsNotMergeServer, #31 该服不是跨服服务器
+Def_IsNotCrossServer, #31 该服不是跨服服务器
 Def_ServerAlreadyOpen, #32 已经正式开服过
+Def_ServerClose, #33 服务器维护中
+Def_ServerOpen, #34 服务器正常
 Def_ResultTypeMax, 
-) = range(34)
+) = range(36)
 
 Def_GMKey_Type = 'pack_type'
 Def_GMKey_ResultType = 'ResultType'
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py
new file mode 100644
index 0000000..1de499c
--- /dev/null
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GMT_CrossServerMaintain.py
@@ -0,0 +1,64 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.GMT_CrossServerMaintain
+#
+# @todo:跨服服务器维护
+# @author hxp
+# @date 2018-12-29
+# @version 1.0
+#
+# 详细描述: 跨服服务器维护
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2018-12-29 02:30"""
+#-------------------------------------------------------------------------------
+
+import DataRecordPack
+import CrossRealmPlayer
+import ShareDefine
+import GameWorld
+import GMCommon
+
+#---------------------------------------------------------------------
+
+## 执行逻辑
+#  @param curPlayer 当前玩家
+#  @param gmCmdDict: 命令字典
+#  @return None
+#  @remarks 函数详细说明.
+def OnExec(orderId, gmCmdDict):
+    
+    GameWorld.Log("GMT_CrossServerMaintain gmCmdDict=%s" % str(gmCmdDict))
+    
+    if not GameWorld.IsCrossServer():
+        GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_IsNotCrossServer)
+        return
+    
+    operate = gmCmdDict.get('operate', '')
+    
+    # 状态查询
+    if operate == "query":
+        isOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
+        GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ServerOpen if isOpen else GMCommon.Def_ServerClose)
+        return
+    
+    # 状态更改        
+    if operate == "on":
+        isOpen = 1
+    elif operate == "off":
+        isOpen = 0
+    else:
+        GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ParamErr)
+        return
+    
+    # 变更服务器维护
+    CrossRealmPlayer.DoChangeCrossServerState(isOpen)
+    
+    # 记录流向
+    DataRecordPack.DR_ToolGMOperate(0, '', '', 'GMT_CrossServerMaintain', str(gmCmdDict))
+    # 回复
+    GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_Success) 
+    return
+    
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
index 43bc593..9692a16 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmMsg.py
@@ -78,10 +78,11 @@
     return
 
 def ClientServerMsg_ServerInitOK(serverGroupID, msgData, tick):
-    ''' 收到子服启动成功通知 
+    ''' 收到子服连接成功通知 
          当子服启动成功后,可同步一次跨服服务器活动状态及活动数据给子服
     '''
-    GameWorld.Log("收到跨服子服启动成功通知!")
+    GameWorld.Log("收到跨服子服连接成功通知!")
+    CrossRealmPlayer.ClientServerMsg_ServerInitOK(serverGroupID)
     CrossRealmPK.ClientServerMsg_ServerInitOK(serverGroupID, tick)
     return
 
@@ -149,6 +150,9 @@
         elif msgType == ShareDefine.CrossServerMsg_PKSyncBillboard:
             CrossRealmPK.CrossServerMsg_PKSyncBillboard(msgData)
             
+        elif msgType == ShareDefine.CrossServerMsg_CrossServerState:
+            CrossRealmPlayer.CrossServerMsg_CrossServerState(msgData)
+            
         else:
             GameWorld.ErrLog("没有该信息类型逻辑处理!")
             
@@ -168,6 +172,7 @@
     result = dataPack.GetResult()
     if result != 1:
         GameWorld.Log("--OnClientServerReceiveMsg  disconn")
+        CrossRealmPlayer.CrossServerMsg_CrossServerState({"isOpen":0})
         return
     
     GameWorld.Log("OnConnCorossServer conn success!!!")
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
index fded022..c50aca3 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossRealmPK.py
@@ -1704,6 +1704,10 @@
     GameWorld.Log("===收到跨服服务器通知已准备好的对战PK房间信息处理=== curServerGroupID=%s" % curServerGroupID)
     # serverGroupID, playerName, playerJob
     
+    if not CrossRealmPlayer.IsCrossServerOpen():
+        GameWorld.Log("跨服服务器维护中,不处理!")
+        return
+    
     for roomID, readyMemberDict in readyOKRoomList:
         for playerID, playerInfo in readyMemberDict.items():
             serverGroupID = playerInfo["ServerGroupID"]
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
index 2e3eac3..b31f8ee 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -1241,9 +1241,15 @@
     #世界boss被杀次数重置
     #GameWorldBoss.CheckResetBossKilledCntOnServerInit()
     #GameWorldActionTeHui.OnGameServerInitOK() # 特惠活动初始化
-    #子服启动成功告知跨服主服
-    serverGroupID = GameWorld.GetServerGroupID()
-    GameWorld.Log("服务器启动成功: ServerGroupID=%s" % serverGroupID)
+    isCrossServer = GameWorld.IsCrossServer()
+    if isCrossServer:
+        isServerClose = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossServerClose)
+        isServerOpen = 0 if isServerClose else 1
+        GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isServerOpen)
+        GameWorld.Log("跨服服务器启动成功: isServerOpen=%s" % isServerOpen)
+    else:
+        serverGroupID = GameWorld.GetServerGroupID()
+        GameWorld.Log("服务器启动成功: ServerGroupID=%s" % serverGroupID)
     return
 
 def DoCheckNewServerOpen(tick):
@@ -1403,6 +1409,10 @@
     # 商店信息
     #GameWorldShopItem.OnMapServerInitOK()
     
+    # 跨服服务器状态
+    isCrossServerOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
+    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isCrossServerOpen)
+    
     # 跨服PK
     CrossRealmPK.OnMapServerInitOK()
     
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
index 511ba7d..cecd0f5 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py
@@ -23,7 +23,7 @@
 import PlayerControl
 import PlayerViewCache
 import ChPyNetSendPack
-import IPY_PlayerDefine
+import PlayerDBGSEvent
 import NetPackCommon
 import PyGameData
 
@@ -54,8 +54,61 @@
     
     return opName.decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName
 
+def IsCrossServerOpen():
+    ## 跨服服务器是否开放中
+    return GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
+
+def ClientServerMsg_ServerInitOK(serverGroupID):
+    ## 子服连接成功
+    isOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
+    GameWorld.Log("子服连接成功,通知当前跨服服务器状态: isOpen=%s" % isOpen)
+    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossServerState, {"isOpen":isOpen}, [serverGroupID])
+    return
+
+def DoChangeCrossServerState(isOpen):
+    ## 跨服服务器状态变更
+    
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossServerClose, 0 if isOpen else 1) # 存DB的反着存
+    GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isOpen)
+    
+    if not isOpen:
+        # 踢掉所有玩家
+        playerManager = GameWorld.GetPlayerManager()
+        for i in xrange(playerManager.GetActivePlayerCount()):
+            curPlayer = playerManager.GetActivePlayerAt(i)
+            if curPlayer == None:
+                continue
+            PlayerControl.SetCrossRealmState(curPlayer, 0)
+            curPlayer.Kick(0)
+            
+    # 广播所有子服,本服务器进入维护
+    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossServerState, {"isOpen":isOpen})
+    return
+
+def CrossServerMsg_CrossServerState(msgData):
+    ## 子服收到跨服服务器状态变更,子服不存DB,默认跨服维护中,连接跨服成功后由跨服同步状态直接更新到字典即可,没连上就默认维护中
+    isOpen = msgData["isOpen"]
+    isOpen = 1 if isOpen else 0
+    GameWorld.Log("收到跨服服务器状态变更: 是否正常开放中=%s" % isOpen)
+    GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isOpen)
+    
+    if not isOpen:
+        playerManager = GameWorld.GetPlayerManager()
+        for i in xrange(playerManager.GetActivePlayerCount()):
+            curPlayer = playerManager.GetActivePlayerAt(i)
+            if curPlayer == None:
+                continue
+            PlayerControl.SetCrossRealmState(curPlayer, 0)
+            
+    # 通知地图
+    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isOpen)
+    return
+
 def PlayerExitCrossServer(curPlayer):
     ## 玩家退出跨服服务器
+    
+    if not GameWorld.IsCrossServer():
+        return
     
     # 通知子服玩家退出跨服服务器
     playerID = curPlayer.GetPlayerID()
@@ -97,6 +150,9 @@
     if not curPlayer:
         return
     
+    if not IsCrossServerOpen():
+        return
+    
     #newAccount, newName = msgList
     
     actionType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MergeRegisterType)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
index 783cd36..7e15394 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
@@ -147,6 +147,8 @@
 Def_BRServerPlayerCnt = "BRServerPlayerCnt"
 #boss复活活动已复活次数
 Def_BossRebornCnt = "BossRebornCnt"
+#跨服服务器是否维护中
+Def_CrossServerClose = "CrossServerClose"
 
 def SetInitOpenServerTime(initTime):
     openDatetime = GameWorld.ChangeTimeNumToDatetime(initTime)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 0ea5429..7698495 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -167,6 +167,8 @@
 
 Def_Notify_WorldKey_FamilyPartyInfo = "FamilyPartyInfo"  # 仙盟宴会数据
 
+Def_Notify_WorldKey_CrossServerOpen = "CrossServerOpen"  # 跨服服务器是否开启中
+
 Def_Notify_WorldKey_CrossPKZoneID = "CrossPKZoneID"  # 本服跨服PK所属赛区
 Def_Notify_WorldKey_CrossPKSeasonID = "CrossPKSeasonID"  # 本服跨服PK当前赛季
 Def_Notify_WorldKey_CrossPKSeasonState = "CrossPKSeasonState"  # 本服跨服PK赛季状态 0-关闭,1-开启中
@@ -1182,6 +1184,7 @@
 ] = range(3)
 
 # 跨服服务器发送子服信息定义
+CrossServerMsg_CrossServerState = "CrossServerState"    # 跨服服务器状态变更
 CrossServerMsg_ExitCrossServer = "ExitCrossServer"      # 退出跨服服务器
 CrossServerMsg_Notify = "Notify"                        # 提示信息
 CrossServerMsg_ViewPlayerCacheRet = "ViewPlayerCacheRet"# 查看跨服玩家信息结果
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py
index 282698d..90c1c76 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GMCommon.py
@@ -56,10 +56,12 @@
 Def_CurTimeGreaterEndTime, # 28当前时间大于结束时间
 Def_ActionAllreadyOpen, #29 活动已经设置过了
 Def_GMForbidMergeWar, #30 gm设置这个服不参加跨服塞
-Def_IsNotMergeServer, #31 该服不是跨服服务器
+Def_IsNotCrossServer, #31 该服不是跨服服务器
 Def_ServerAlreadyOpen, #32 已经正式开服过
+Def_ServerClose, #33 服务器维护中
+Def_ServerOpen, #34 服务器正常
 Def_ResultTypeMax, 
-) = range(34)
+) = range(36)
 
 #BUFF对应中文名
 BuffNameList = ["无类型", "增益技能:", "减益技能:", "光环技能:", "增值技能:", "被动技能",
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
index b5a986e..11a0900 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
@@ -35,6 +35,10 @@
     
     return opName.decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName
 
+def IsCrossServerOpen():
+    ## 跨服服务器是否开放中
+    return GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
+
 #// C1 04 主动退出跨服 #tagCMExitCrossRealm
 #
 #struct    tagCMExitCrossRealm
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
index c55e59c..545f7bd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCrossRealmPK.py
@@ -198,6 +198,10 @@
         GameWorld.DebugLog("跨服服务器无法发起匹配!", playerID)
         return
     
+    if not CrossRealmPlayer.IsCrossServerOpen():
+        PlayerControl.NotifyCode(curPlayer, "CrossMatching18")
+        return
+    
     if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:
         GameWorld.DebugLog("副本中,无法进行跨服匹配!", playerID)
         return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 0ea5429..7698495 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -167,6 +167,8 @@
 
 Def_Notify_WorldKey_FamilyPartyInfo = "FamilyPartyInfo"  # 仙盟宴会数据
 
+Def_Notify_WorldKey_CrossServerOpen = "CrossServerOpen"  # 跨服服务器是否开启中
+
 Def_Notify_WorldKey_CrossPKZoneID = "CrossPKZoneID"  # 本服跨服PK所属赛区
 Def_Notify_WorldKey_CrossPKSeasonID = "CrossPKSeasonID"  # 本服跨服PK当前赛季
 Def_Notify_WorldKey_CrossPKSeasonState = "CrossPKSeasonState"  # 本服跨服PK赛季状态 0-关闭,1-开启中
@@ -1182,6 +1184,7 @@
 ] = range(3)
 
 # 跨服服务器发送子服信息定义
+CrossServerMsg_CrossServerState = "CrossServerState"    # 跨服服务器状态变更
 CrossServerMsg_ExitCrossServer = "ExitCrossServer"      # 退出跨服服务器
 CrossServerMsg_Notify = "Notify"                        # 提示信息
 CrossServerMsg_ViewPlayerCacheRet = "ViewPlayerCacheRet"# 查看跨服玩家信息结果
diff --git a/ServerPython/db/PyMongoDataServer/GMToolLogicProcess/Commands/GMCommon.py b/ServerPython/db/PyMongoDataServer/GMToolLogicProcess/Commands/GMCommon.py
index 1a10ab9..129ff30 100644
--- a/ServerPython/db/PyMongoDataServer/GMToolLogicProcess/Commands/GMCommon.py
+++ b/ServerPython/db/PyMongoDataServer/GMToolLogicProcess/Commands/GMCommon.py
@@ -68,10 +68,12 @@
 Def_CurTimeGreaterEndTime, # 28当前时间大于结束时间
 Def_ActionAllreadyOpen, #29 活动已经设置过了
 Def_GMForbidMergeWar, #30 gm设置这个服不参加跨服塞
-Def_IsNotMergeServer, #31 该服不是跨服服务器
+Def_IsNotCrossServer, #31 该服不是跨服服务器
 Def_ServerAlreadyOpen, #32 已经正式开服过
+Def_ServerClose, #33 服务器维护中
+Def_ServerOpen, #34 服务器正常
 Def_ResultTypeMax, 
-) = range(34)
+) = range(36)
 
 
 (

--
Gitblit v1.8.0