From d7b7ed5eff26ceb650ccbe3482a31bed773a3c8d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 24 六月 2021 16:55:32 +0800
Subject: [PATCH] 8921 【主干】【BT2】【后端】H.活动-节日活动-垃圾分类(仙匣秘境限制最大层数99)
---
ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py | 115 +++++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 91 insertions(+), 24 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
index 363a530..8fc20e4 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
@@ -538,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 无意义
@@ -570,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"
@@ -839,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 差距天数
@@ -983,6 +1032,24 @@
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 基础几率
# @param maxRate 最大几率
--
Gitblit v1.8.0