From 01d734e87f81367d8cdcca7d69b0c8e75de17905 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 01 九月 2021 17:03:48 +0800 Subject: [PATCH] 8585 【主干】【gt_1.101.1】【BT3】【bt3_1.100.1】【后端】竞技场(排行榜、匹配列表,对战记录战斗力支持超20亿;对战记录挑战支持查询最新数据;守护者支持积分加减并同步名次对应等级; 增加对战流向记录) --- ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py | 145 +++++++++++++++++++++++++++++++++++++----------- 1 files changed, 111 insertions(+), 34 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py index ae54f4e..8fc20e4 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py @@ -15,7 +15,6 @@ # @change: "2013-03-20 18:00" Alee 添加DEBUG输出函数DebugLog # @change: "2013-09-10 20:10" Alee 函数DebugLog改用GetDebugLevel才有效 # @change: "2014-05-16 10:30" xmnathan 增加交易所管理器接口 -# @change: "2014-08-01 15:30" xmnathan 增加天梯竞技场管理器接口 # @change: "2014-09-22 10:00" xmnathan 增加GM工具补偿管理器接口 # @change: "2015-01-14 00:30" hxp 增加服务器平台区服ID获取 # @change: "2015-01-14 20:30" hxp 增加CanHappen函数 @@ -539,31 +538,73 @@ #--------------------------------------------------------------------- -def GetOperationActionDateStr(dateInfo, openServerDay): - '''获取运营活动对应日期,存数字代表开服天配置,需要转化为对应的日期 - @param dateInfo: 运营活动表配置的日期信息, 如果是纯数字代表开服天 - @param openServerDay: 当前开服天 - ''' - if not dateInfo: - curDateTime = datetime.datetime.today() - return "%d-%d-%d" % (curDateTime.year, curDateTime.month, curDateTime.day) - if dateInfo.startswith("W"): - curDateTime = datetime.datetime.today() - curWeekday = curDateTime.weekday() + 1 - actionWeekday = int(dateInfo[1:]) - actionDateTime = curDateTime + datetime.timedelta(days=(actionWeekday-curWeekday)) - return "%d-%d-%d" % (actionDateTime.year, actionDateTime.month, actionDateTime.day) - if dateInfo.startswith("Mix"): - diffDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) + 1 - actionServerDay = int(dateInfo[3:]) - elif not dateInfo.isdigit(): - return dateInfo - else: - diffDay = openServerDay - actionServerDay = int(dateInfo) +def GetOperationActionDateStr(ipyData): + ## 获取运营活动对应日期,存数字代表开服天配置,需要转化为对应的日期 curDateTime = datetime.datetime.today() - actionDateTime = curDateTime + datetime.timedelta(days=(actionServerDay-diffDay)) - return "%d-%d-%d" % (actionDateTime.year, actionDateTime.month, actionDateTime.day) + startDateStr = ipyData.GetStartDate() + endDateStr = ipyData.GetEndDate() + if not startDateStr: + startDateStr = "%d-%d-%d" % (curDateTime.year, curDateTime.month, curDateTime.day) + if not endDateStr: + endDateStr = "%d-%d-%d" % (curDateTime.year, curDateTime.month, curDateTime.day) + + # 日期直接返回 + if startDateStr.count("-") == 2 and "W" not in startDateStr: + return startDateStr, endDateStr + + # 开服天 + if startDateStr.isdigit(): + diffDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 + startDateTime = curDateTime + datetime.timedelta(days=(int(startDateStr)-diffDay)) + endDateTime = curDateTime + datetime.timedelta(days=(int(endDateStr)-diffDay)) + + # 合服天 + elif startDateStr.startswith("Mix"): + diffDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) + 1 + startDateTime = curDateTime + datetime.timedelta(days=(int(startDateStr[3:])-diffDay)) + endDateTime = curDateTime + datetime.timedelta(days=(int(endDateStr[3:])-diffDay)) + + # 周循环, 直接配置 Wx 或 Wx|有效开始日期 或 Wx|有效结束日期 + elif startDateStr.startswith("W"): + curWeekday = curDateTime.weekday() + 1 + + startWeekDateInfo = startDateStr.split("|") + startWeekInfo = startWeekDateInfo[0] + startWeekday = int(startWeekInfo[1:]) + startDateTime = curDateTime + datetime.timedelta(days=(startWeekday-curWeekday)) + + # 限制开启循环日期 + if len(startWeekDateInfo) > 1: + startLoopDateStr = startWeekDateInfo[1] + startLoopDateTime = ChangeStrToDatetime(startLoopDateStr, ChConfig.TYPE_Time_YmdFormat) + if startLoopDateTime > startDateTime: + startDateTime = startLoopDateTime + + startWeekDay = startDateTime.weekday() + 1 # 实际开启活动是周几,不一定和配置的周几一样,可能从中间被截断开始 + + # 处理周循环的结束日期 + endWeekDateInfo = endDateStr.split("|") + endWeekInfo = endWeekDateInfo[0] + endWeekday = int(endWeekInfo[1:]) + endDateTime = startDateTime + datetime.timedelta(days=(endWeekday-startWeekDay)) + if len(endWeekDateInfo) > 1: + endLoopDateStr = endWeekDateInfo[1] + endLoopDateTime = ChangeStrToDatetime(endLoopDateStr, ChConfig.TYPE_Time_YmdFormat) + if endDateTime > endLoopDateTime: + endDateTime = endLoopDateTime + + # 只配置结束日期的时候可能导致开始日期计算出来比结束日期还大,即当前时间超过结束日期,且 配置还存在的情况 + if startDateTime > endDateTime: + startDateTime = endDateTime # 反正都无法开启,随便给个日期,不超过结束日期即可 + + # 默认 + else: + startDateTime = curDateTime + endDateTime = curDateTime + + startDateStr = "%d-%d-%d" % (startDateTime.year, startDateTime.month, startDateTime.day) + endDateStr = "%d-%d-%d" % (endDateTime.year, endDateTime.month, endDateTime.day) + return startDateStr, endDateStr ##获得系统时间 # @param 无意义 @@ -571,6 +612,11 @@ # @remarks 获得系统时间 def GetServerTime(): return datetime.datetime.today() + +def GetWeekOfYear(): + ## 一年中的第几周, 1代表第1周 + return datetime.datetime.isocalendar(datetime.datetime.today())[1] + #--------------------------------------------------------------------- ##获取2个时间之间差异的TimeDelta类实例 # @param compareTimeStr 比较的时间字符, 如"2010-05-26 11:21:25" @@ -840,6 +886,8 @@ timeStr = datetime.datetime.strptime(timeStr, timeFormat).timetuple() return int(time.mktime(timeStr)) +def ChangeStrToDatetime(timeStr, timeFormat=ChConfig.TYPE_Time_Format): + return datetime.datetime.strptime(timeStr, timeFormat) ##获取与当前时间相差天数的datetime格式数据 # @param diffDays 差距天数 @@ -916,8 +964,9 @@ # @param itemList 待选列表 # @return object def GetResultByRandomList(randList, defValue=None, maxRateValue=ChConfig.Def_MaxRateValue): - rate = random.randint(0, maxRateValue) - + if not randList: + return defValue + rate = random.randint(0, randList[-1][0]) return GetResultByRiseList(randList, rate, defValue) ## 增长列表(类似饼图)从中获得指定的信息 @@ -982,6 +1031,24 @@ adict[key] = value + bdict.pop(key) adict.update(bdict) return adict + +## 根据排行获取名次对应值 +# @param orderDict {名次:obj, ...} 名次支持段跳跃 +# @param order 名次,从1开始 +# @param isDefaultLast 找不到的名次是否默认取最后一名的 +# @return obj or None +def GetOrderValueByDict(orderDict, order, isDefaultLast=True): + if order in orderDict: + return orderDict[order] + + orderList = sorted(orderDict.keys()) + if order > 0: + for dOrder in orderList: + if order <= dOrder: + return orderDict[dOrder] + + # 找不到的默认取最后一名 + return orderDict[orderList[-1]] if isDefaultLast else None ##概率相关, 这个事件是否能够出现 # @param rate 基础几率 @@ -1049,15 +1116,25 @@ return inputText +def RaiseException(errorMsg, playerID=0): + ## 处理抛出异常信息,debug下直接抛出异常报错信息,否则发送运维邮件提醒 + ErrLog(errorMsg, playerID) + if GetGameWorld().GetDebugLevel(): + raise Exception(errorMsg) + else: + SendGameError("GameServerRaiseException", errorMsg) + return -# 向运维发送邮件,用于需要紧急处理的信息 -# 此处不包含服务器报错的汇报 -def SendGameStateMail(msgInfo): - # 使用方式 向OpenStateUrl 发送Type为GameWarning,那么就会收到一封游戏内容警告邮件,信息为MsgInfo +def SendGameError(errType, msgInfo=""): + ''' 向运维发送邮件,用于需要紧急处理的信息 + @param errType: 错误类型,自定义即可 + @param msgInfo: 错误信息,可选 + ''' getUrl = ReadChConfig.GetPyMongoConfig("EventReport", "OpenStateUrl") groupID = ReadChConfig.GetPyMongoConfig("platform", "GroupID") userDBName = ReadChConfig.GetPyMongoConfig("connect", "USER_DB_NAME") - getUrl = getUrl + "?Type=GameWarning&groupID=%s&userDBName=%s&MsgInfo=%s"%(groupID, userDBName, urllib.quote_plus(msgInfo)) - + getUrl = getUrl + "?Type=%s&groupID=%s&userDBName=%s"%(errType, groupID, userDBName) + if msgInfo: + getUrl = getUrl + "&MsgInfo=%s" % urllib.quote_plus(msgInfo) GetGameWorld().EventReport_EventReport("", "", "", "", 0, getUrl) - \ No newline at end of file + return -- Gitblit v1.8.0