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