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/Player/CrossRealmPlayer.py |   58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 57 insertions(+), 1 deletions(-)

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)

--
Gitblit v1.8.0