5424 【后端】【1.4】跨服竞技场开发(GM工具增加跨服服务器维护操作)
| | |
| | | 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'
|
New file |
| | |
| | | #!/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
|
| | | |
| | |
| | | return
|
| | |
|
| | | def ClientServerMsg_ServerInitOK(serverGroupID, msgData, tick):
|
| | | ''' 收到子服启动成功通知 |
| | | ''' 收到子服连接成功通知 |
| | | 当子服启动成功后,可同步一次跨服服务器活动状态及活动数据给子服
|
| | | '''
|
| | | GameWorld.Log("收到跨服子服启动成功通知!")
|
| | | GameWorld.Log("收到跨服子服连接成功通知!")
|
| | | CrossRealmPlayer.ClientServerMsg_ServerInitOK(serverGroupID)
|
| | | CrossRealmPK.ClientServerMsg_ServerInitOK(serverGroupID, tick)
|
| | | return
|
| | |
|
| | |
| | | elif msgType == ShareDefine.CrossServerMsg_PKSyncBillboard:
|
| | | CrossRealmPK.CrossServerMsg_PKSyncBillboard(msgData)
|
| | |
|
| | | elif msgType == ShareDefine.CrossServerMsg_CrossServerState:
|
| | | CrossRealmPlayer.CrossServerMsg_CrossServerState(msgData)
|
| | | |
| | | else:
|
| | | GameWorld.ErrLog("没有该信息类型逻辑处理!")
|
| | |
|
| | |
| | | result = dataPack.GetResult()
|
| | | if result != 1:
|
| | | GameWorld.Log("--OnClientServerReceiveMsg disconn")
|
| | | CrossRealmPlayer.CrossServerMsg_CrossServerState({"isOpen":0})
|
| | | return
|
| | |
|
| | | GameWorld.Log("OnConnCorossServer conn success!!!")
|
| | |
| | | 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"]
|
| | |
| | | #世界boss被杀次数重置
|
| | | #GameWorldBoss.CheckResetBossKilledCntOnServerInit()
|
| | | #GameWorldActionTeHui.OnGameServerInitOK() # 特惠活动初始化
|
| | | #子服启动成功告知跨服主服
|
| | | 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
|
| | |
| | | # 商店信息
|
| | | #GameWorldShopItem.OnMapServerInitOK()
|
| | |
|
| | | # 跨服服务器状态
|
| | | isCrossServerOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
|
| | | GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isCrossServerOpen)
|
| | | |
| | | # 跨服PK
|
| | | CrossRealmPK.OnMapServerInitOK()
|
| | |
|
| | |
| | | import PlayerControl
|
| | | import PlayerViewCache
|
| | | import ChPyNetSendPack
|
| | | import IPY_PlayerDefine
|
| | | import PlayerDBGSEvent
|
| | | import NetPackCommon
|
| | | import PyGameData
|
| | |
|
| | |
| | |
|
| | | 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()
|
| | |
| | | if not curPlayer:
|
| | | return
|
| | |
|
| | | if not IsCrossServerOpen():
|
| | | return
|
| | | |
| | | #newAccount, newName = msgList
|
| | |
|
| | | actionType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MergeRegisterType)
|
| | |
| | | Def_BRServerPlayerCnt = "BRServerPlayerCnt"
|
| | | #boss复活活动已复活次数
|
| | | Def_BossRebornCnt = "BossRebornCnt"
|
| | | #跨服服务器是否维护中
|
| | | Def_CrossServerClose = "CrossServerClose"
|
| | |
|
| | | def SetInitOpenServerTime(initTime):
|
| | | openDatetime = GameWorld.ChangeTimeNumToDatetime(initTime)
|
| | |
| | |
|
| | | 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-开启中
|
| | |
| | | ] = range(3)
|
| | |
|
| | | # 跨服服务器发送子服信息定义
|
| | | CrossServerMsg_CrossServerState = "CrossServerState" # 跨服服务器状态变更
|
| | | CrossServerMsg_ExitCrossServer = "ExitCrossServer" # 退出跨服服务器
|
| | | CrossServerMsg_Notify = "Notify" # 提示信息
|
| | | CrossServerMsg_ViewPlayerCacheRet = "ViewPlayerCacheRet"# 查看跨服玩家信息结果
|
| | |
| | | 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 = ["无类型", "增益技能:", "减益技能:", "光环技能:", "增值技能:", "被动技能",
|
| | |
| | |
|
| | | return opName.decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName
|
| | |
|
| | | def IsCrossServerOpen():
|
| | | ## 跨服服务器是否开放中
|
| | | return GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
|
| | |
|
| | | #// C1 04 主动退出跨服 #tagCMExitCrossRealm
|
| | | #
|
| | | #struct tagCMExitCrossRealm
|
| | |
| | | GameWorld.DebugLog("跨服服务器无法发起匹配!", playerID)
|
| | | return
|
| | |
|
| | | if not CrossRealmPlayer.IsCrossServerOpen():
|
| | | PlayerControl.NotifyCode(curPlayer, "CrossMatching18")
|
| | | return
|
| | | |
| | | if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:
|
| | | GameWorld.DebugLog("副本中,无法进行跨服匹配!", playerID)
|
| | | return
|
| | |
| | |
|
| | | 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-开启中
|
| | |
| | | ] = range(3)
|
| | |
|
| | | # 跨服服务器发送子服信息定义
|
| | | CrossServerMsg_CrossServerState = "CrossServerState" # 跨服服务器状态变更
|
| | | CrossServerMsg_ExitCrossServer = "ExitCrossServer" # 退出跨服服务器
|
| | | CrossServerMsg_Notify = "Notify" # 提示信息
|
| | | CrossServerMsg_ViewPlayerCacheRet = "ViewPlayerCacheRet"# 查看跨服玩家信息结果
|
| | |
| | | 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)
|
| | |
|
| | |
|
| | | (
|