16 卡牌服务端(自动开服相关;A103增加同步开服时间;增加是否允许加入跨服标记,默认否;跨服公会仅在允许跨服时才会加入跨服;优化ServersConfig.json配置,支持后台导出,优化战斗服务器配置;)
| | |
| | | ("NowSecond", c_ubyte),
|
| | | ("NowMicSecond", c_int),
|
| | | ("WeekOfYear", c_ubyte), #一年中的第几周
|
| | | ("OpenServerTime", c_int), #开服时间戳
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.NowSecond = 0
|
| | | self.NowMicSecond = 0
|
| | | self.WeekOfYear = 0
|
| | | self.OpenServerTime = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | NowMinute:%d,
|
| | | NowSecond:%d,
|
| | | NowMicSecond:%d,
|
| | | WeekOfYear:%d
|
| | | WeekOfYear:%d,
|
| | | OpenServerTime:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | |
| | | self.NowMinute,
|
| | | self.NowSecond,
|
| | | self.NowMicSecond,
|
| | | self.WeekOfYear
|
| | | self.WeekOfYear,
|
| | | self.OpenServerTime
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
| | | CheckMainServerNoFamilyToCross(connServerID)
|
| | | return
|
| | |
|
| | | if not DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_CanCross):
|
| | | GameWorld.Log("该服务器暂时未开放加入跨服!")
|
| | | return
|
| | | |
| | | NeedServerDay = IpyGameDataPY.GetFuncCfg("FamilyCross", 1)
|
| | | serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1
|
| | | if serverDay < NeedServerDay:
|
| | |
| | | IsMixServer = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_IsMixServer)
|
| | | MixDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_MixServerDay) + 1
|
| | | OpenWeekday = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_OpenServerWeekday)
|
| | | openServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_InitOpenServerTime)
|
| | | GameWorld.DebugAnswer(curPlayer, '开服星期%s, 天数:%s 是否合服:%s, 合服天数:%s' % (OpenWeekday, ServerDay, IsMixServer, MixDay))
|
| | | GameWorld.DebugAnswer(curPlayer, '开服时间:%s' % GameWorld.ChangeTimeNumToStr(openServerTime))
|
| | | return
|
| | |
|
| | | def __clearOpenServerDay(curPlayer):
|
| | |
| | | #PlayerDBOper.FindDBOper(PlayerDBOper.Table_DBPlayer, {}, {"PlayerID":1, "AccID":1, "_id":0}, LoadDBPlayerRet)
|
| | | return
|
| | |
|
| | | def GMSetOpenServerTime(openServerTime):
|
| | | '''GM设置开服时间
|
| | | @param openServerTime: 开服时间戳
|
| | | @return: 1-成功;-1-设置的时间异常;-2-已经设置过且开服了,不能重复设置
|
| | | '''
|
| | | serverID = GameWorld.GetGameWorld().GetServerID()
|
| | | curTime = int(time.time())
|
| | | if openServerTime < curTime:
|
| | | GameWorld.ErrLog("当前时间已经超过设置的开服时间,不能设置! serverID=%s" % serverID)
|
| | | #GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_InvalidTime, "The set time is less than the current time.")
|
| | | return -1
|
| | | setOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_SetOpenServerTime)
|
| | | if setOpenServerTime and curTime > setOpenServerTime:
|
| | | GameWorld.ErrLog("已经设置过且开服了,不能重复设置! serverID=%s" % serverID)
|
| | | #GMCommon.GMCommandResult(orderId, gmCmdDict, GMCommon.Def_ServerAlreadyOpen, "The server has been opened.")
|
| | | return -2
|
| | | |
| | | DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_SetOpenServerTime, openServerTime)
|
| | | GameWorld.Log("GM设置开服时间: serverID=%s,%s,%s" % (serverID, GameWorld.ChangeTimeNumToStr(openServerTime), openServerTime))
|
| | | if openServerTime == curTime:
|
| | | OnNewServerOpen(GameWorld.GetGameWorld().GetTick())
|
| | | |
| | | return 1
|
| | |
|
| | | def DoCheckNewServerOpen(tick):
|
| | | setOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_SetOpenServerTime)
|
| | | if not setOpenServerTime:
|
| | |
| | | DBDataMgr.GetMailMgr().DelAllMail()
|
| | | DBDataMgr.GetPlayerViewCacheMgr().DelAllCache()
|
| | |
|
| | | # 设置允许跨服,该函数为自动开服会触发,所以要设置为允许跨服,手动开服的需后台手动设置为允许
|
| | | DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_CanCross, 1)
|
| | | SetInitOpenServerTime(setOpenServerTime)
|
| | | AllMapServerInitOK(tick)
|
| | |
|
| | | GameWorld.GetGameWorld().SaveGameServerData()
|
| | | #强制备档一次、入库
|
| | | DBDataMgr.BackupGameWorldData(saveToDB=True)
|
| | | #GameWorld.GetGameWorld().SaveGameServerData()
|
| | | GameWorld.SendGameError("ClearOpenServerOK")
|
| | | return
|
| | |
|
| | |
| | | clientPack.NowSecond = serverTime.second
|
| | | clientPack.NowMicSecond = serverTime.microsecond
|
| | | clientPack.WeekOfYear = GameWorld.GetWeekOfYear()
|
| | | clientPack.OpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_InitOpenServerTime)
|
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|
| | | return
|
| | |
|
| | |
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package PyMongoDataServer.GMToolLogicProcess.Commands.GMT_CheckOpenServer
|
| | | ##@package PyMongoDB.GMToolLogicProcess.Commands.GMT_CheckOpenServer
|
| | | #
|
| | | # @todo:检查开服相关是否正常
|
| | | # @author hxp
|
| | | # @date 2024-10-23
|
| | | # @date 2026-03-16
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 检查开服相关是否正常
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2024-10-23 15:00"""
|
| | | #"""Version = 2026-03-16 20:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import GMCommon
|
| | | import ShareDefine
|
| | | import GameWorld
|
| | | import DBDataMgr
|
| | |
|
| | | ## 收到gm命令执行
|
| | | # @param gmCmdDict:gm命令字典
|
| | | # @return None |
| | | def OnExec(gmCmdDict):
|
| | | from LogicProcess import (UserCtrlDB,)
|
| | | from LogicProcess import (UserCtrlDB)
|
| | |
|
| | | # 先检查版本号
|
| | | checkRet = UserCtrlDB.CheckGameVersion()
|
| | | curVersion, centerVersion = checkRet if checkRet else ("", "")
|
| | | if curVersion == centerVersion:
|
| | | # 推给GameServer进一步检查
|
| | | return GMCommon.Def_SendToGameServer, ''
|
| | | return GMCommon.Def_Unknow, {"errMsg":"VersionError", "curVersion":curVersion, "centerVersion":centerVersion}
|
| | | if curVersion != centerVersion:
|
| | | return GMCommon.Def_Unknow, {"errMsg":"VersionError", "curVersion":curVersion, "centerVersion":centerVersion}
|
| | | |
| | | openServerDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1
|
| | | if openServerDay != 1:
|
| | | GameWorld.SendGameError("GMT_CheckOpenServer", "开服天异常:%s" % openServerDay)
|
| | | return GMCommon.Def_Unknow, {"errMsg":"OpenServerDayError", "openServerDay":openServerDay}
|
| | | |
| | | return GMCommon.Def_Success, {"errMsg":"OK"}
|
| | |
|
| New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package PyMongoDB.GMToolLogicProcess.Commands.GMT_SetCanCross
|
| | | #
|
| | | # @todo:设置是否允许跨服
|
| | | # @author hxp
|
| | | # @date 2026-03-16
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 设置是否允许跨服
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2026-03-16 20:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import GMCommon
|
| | | import ShareDefine
|
| | | import GameWorld
|
| | | import DBDataMgr
|
| | |
|
| | | def OnExec(gmCmdDict):
|
| | | setValue = GameWorld.ToIntDef(gmCmdDict.get("setValue"), None)
|
| | | if setValue == None:
|
| | | return GMCommon.Def_ParamErr
|
| | | |
| | | canCross = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_CanCross)
|
| | | # 查询
|
| | | if setValue == 2:
|
| | | pass
|
| | | elif setValue == 1:
|
| | | canCross = DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_CanCross, 1)
|
| | | else:
|
| | | #if canCross:
|
| | | # return GMCommon.Def_Unknow, {"errMsg":"AlreadyCrossState"}
|
| | | canCross = DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_CanCross, 0)
|
| | | |
| | | GameWorld.Log("是否允许加入跨服: %s" % canCross)
|
| | | return GMCommon.Def_Success, {"errMsg":"OK", "canCross":canCross}
|
| | |
|
| New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package PyMongoDB.GMToolLogicProcess.Commands.GMT_SetOpenServerTime
|
| | | #
|
| | | # @todo:设置开服时间
|
| | | # @author hxp
|
| | | # @date 2026-03-16
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 设置开服时间
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2026-03-16 20:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import GMCommon
|
| | | import GameWorld
|
| | | import GameWorldEvent
|
| | | import ShareDefine
|
| | | import DBDataMgr
|
| | | import time
|
| | |
|
| | | def OnExec(gmCmdDict):
|
| | | from LogicProcess import (UserCtrlDB)
|
| | | |
| | | curTime = int(time.time())
|
| | | OpenServerDate = gmCmdDict.get("OpenServerDate")
|
| | | OpenServerHour = GameWorld.ToIntDef(gmCmdDict.get("OpenServerHour"), None)
|
| | | OpenServerMinute = GameWorld.ToIntDef(gmCmdDict.get("OpenServerMinute"), None)
|
| | | |
| | | if not OpenServerDate or OpenServerHour == None or OpenServerMinute == None:
|
| | | openServerTime = curTime # 允许不设置时间,默认取当前服务器时间
|
| | | timeStr = GameWorld.ChangeTimeNumToStr(openServerTime)
|
| | | else:
|
| | | timeStr = "%s %02d:%02d:%02d" % (OpenServerDate, OpenServerHour, OpenServerMinute, 0)
|
| | | openServerTime = GameWorld.ChangeTimeStrToNum(timeStr)
|
| | | |
| | | if openServerTime < curTime:
|
| | | # 当前时间已经超过设置的开服时间,不能设置!
|
| | | return GMCommon.Def_InvalidTime, "The set time is less than the current time."
|
| | | |
| | | setOpenServerTime = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_SetOpenServerTime)
|
| | | if setOpenServerTime and curTime > setOpenServerTime:
|
| | | # 已经设置过且开服了,不能重复设置!
|
| | | return GMCommon.Def_ServerAlreadyOpen, "The server has been opened."
|
| | | |
| | | DBDataMgr.GetEventTrigMgr().SetValue(ShareDefine.Def_SetOpenServerTime, openServerTime)
|
| | | |
| | | if openServerTime == curTime:
|
| | | GameWorldEvent.OnNewServerOpen(GameWorld.GetGameWorld().GetTick())
|
| | | |
| | | return GMCommon.Def_Success, timeStr
|
| | |
|
| | |
| | | GameWorld.Log('无法找到文件 = %s'%(filePath))
|
| | | raise Exception('无法找到文件 = %s'%(filePath))
|
| | |
|
| | | batFilePath = ChConfig.GetServersRoutePath() + "\\Config\\BattleServer.json"
|
| | | if not os.path.isfile(batFilePath):
|
| | | GameWorld.Log('无法找到文件 = %s'%(batFilePath))
|
| | | raise Exception('无法找到文件 = %s'%(batFilePath))
|
| | | |
| | | f = open(filePath, 'r')
|
| | | strMsg = f.read()
|
| | | serverDict = eval(f.read())
|
| | | f.close()
|
| | |
|
| | | ServersConfigDict = eval(strMsg)
|
| | | f = open(batFilePath, 'r')
|
| | | batServerDict = eval(f.read())
|
| | | f.close()
|
| | |
|
| | | groupName = GameWorld.GetServerGroupName()
|
| | | ServersConfigDict = {}
|
| | | ServersConfigDict = {int(k):v for k, v in serverDict.items()}
|
| | | for batServerID, mapID in batServerDict.items():
|
| | | if batServerID in ServersConfigDict:
|
| | | continue
|
| | | ServersConfigDict[batServerID] = [groupName, mapID, ShareDefine.serverType_Battle]
|
| | | |
| | | return ServersConfigDict
|
| | |
|
| | | ## PyMongoDataServer.ini配置读取
|
| | |
| | | '''
|
| | | Def_InitOpenServerTime = 'InitOpenServerTime'
|
| | | Def_SetOpenServerTime = 'SetOpenServerTime' # GM工具预定的开服时间
|
| | | Def_CanCross = 'CanCross' # 是否允许加入跨服,暂时仅对将要加入的做限制,已加入的暂不处理
|
| | |
|
| | | Def_FamilyCrossState = 'FamilyCrossState' # 本服公会跨服状态, 0-未跨服;1-已跨服
|
| | | Def_FamilyTransDataTime = 'FamilyTransDataTime' # 本服公会首次跨服互通数据开始传输时间戳,不为0代表传输数据中
|