From 1ea73e1885835466265ce788d93556b7030ee0e8 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期日, 30 十二月 2018 18:42:00 +0800 Subject: [PATCH] 5424 【后端】【1.4】跨服竞技场开发(GM工具增加子服服务器维护,文字翻译版) --- ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 58 insertions(+), 1 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/CrossRealmPlayer.py index 511ba7d..adbe385 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() @@ -95,6 +148,9 @@ curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if not curPlayer: + return + + if not IsCrossServerOpen(): return #newAccount, newName = msgList @@ -234,6 +290,7 @@ sendPack.ItemDataSize = len(sendPack.ItemData) sendPack.PlusData = PlusData sendPack.PlusDataSize = len(sendPack.PlusData) + sendPack.CrossPlayer = 1 NetPackCommon.SendFakePack(curPlayer, sendPack) return -- Gitblit v1.8.0