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 | 157 ++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 132 insertions(+), 25 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
index 674e250..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,22 +538,73 @@
#---------------------------------------------------------------------
-def GetOperationActionDateStr(dateInfo, openServerDay):
- '''获取运营活动对应日期,存数字代表开服天配置,需要转化为对应的日期
- @param dateInfo: 运营活动表配置的日期信息, 如果是纯数字代表开服天
- @param openServerDay: 当前开服天
- '''
- 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 无意义
@@ -562,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"
@@ -831,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 差距天数
@@ -838,6 +895,14 @@
# @remarks 客户端封包响应
def GetDatetimeBySubDays(diffDays):
return datetime.datetime.today() - datetime.timedelta(days = diffDays)
+
+def GetDailyDateStr():
+ ## 获取日常日期 yyyy-MM-dd
+ curDate = GetServerTime()
+ if curDate.hour >= ShareDefine.Def_OnEventHour:
+ return "%d-%s-%s" % (curDate.year, curDate.month, curDate.day)
+ preDate = curDate - datetime.timedelta(days = -1) # 属于前一天
+ return "%s-%s-%s" % (preDate.year, preDate.month, preDate.day)
def IsCrossServer():
## 是否跨服服务器
@@ -899,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)
## 增长列表(类似饼图)从中获得指定的信息
@@ -916,6 +982,19 @@
return smallList[1]
return defValue
+
+## 从列表中产生物品,[[权重, object], ....]
+# @param weightList 待选列表
+def GetResultByWeightList(weightList):
+ randList = []
+ weight = 0
+ for info in weightList:
+ weight += info[0]
+ randList.append([weight, info[1] if len(info) == 2 else info[1:]])
+ if not randList:
+ return
+ rate = random.randint(1, randList[-1][0])
+ return GetResultByRiseList(randList, rate)
## 根据字典key获取value值
# @return
@@ -952,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 基础几率
@@ -1019,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