From 17432204d51d7e7c46d8371566f71d9d922804f3 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 11 十一月 2024 14:56:14 +0800
Subject: [PATCH] 5416 【工具】兑换码优化(兑换码邮件内容文件json支持不同的appID独立文件配置;)
---
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py | 282 +++++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 226 insertions(+), 56 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
index 166ec22..bf08925 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
@@ -33,7 +33,12 @@
import PlayerFamilyRedPacket
import PlayerFairyCeremony
import PlayerNewFairyCeremony
+import PlayerActFamilyCTGAssist
import PlayerActGarbageSorting
+import PlayerActBossTrial
+import PlayerActXianXiaMJ
+import PlayerActGubao
+import PlayerActHorsePetTrain
import PlayerUniversalGameRec
import GameWorldAverageLv
import PlayerFamilyBoss
@@ -108,10 +113,11 @@
def SendMapServerOperationActionState():
# 地图启动成功时通知本日运行活动相关状态
+ CrossActionControl.SendMapServerCrossActionState()
+
if GameWorld.IsCrossServer():
# 跨服不处理运营活动
return
- CrossActionControl.SendMapServerCrossActionState()
isReload, OperationActionInfo = __GetOperationActionInfo()
mapServerInfoDict = OperationActionInfo[OperationAction_MapServerInfo]
@@ -141,7 +147,7 @@
活动分组编号 = 活动类型 * 10 + 不同界面编号
'''
- if ipyData and hasattr(ipyData, "ActNum"):
+ if ipyData and hasattr(ipyData, "GetActNum"):
return ipyData.GetActNum()
# 原节日活动的还是默认节日活动
@@ -241,13 +247,14 @@
GameWorld.Log("加载运营活动: actName=%s,platform=%s,serverGroupID=%s" % (actName, platform, serverGroupID))
curServerActIpyDataList = __GetOperationActionServerIpyDataList(ipyDataMgr, platform, serverGroupID, actName)
GameWorld.Log(" 可处理条数=%s" % (len(curServerActIpyDataList)))
- actNumDisableWeekIpyDataInfo, disableWeekCfgIDDict = __GetOperationActionDisableWeekIpyDataInfo(actName, curDateTime, curServerActIpyDataList)
-
+ coverDisableLoopIpyDataInfo, disableLoopCfgIDDict, otherLoopCfgIDDict, coverDisableWeekIpyDataInfo, disableWeekCfgIDDict = \
+ __GetOperationActionDisableIpyDataInfo(actName, curDateTime, curServerActIpyDataList)
+
for ipyData in curServerActIpyDataList:
- platformList = [] if not hasattr(ipyData, "PlatformList") else ipyData.GetPlatformList()
- serverGroupIDList = [] if not hasattr(ipyData, "ServerGroupIDList") else ipyData.GetServerGroupIDList()
- serverGroupIDListExcept = [] if not hasattr(ipyData, "ServerGroupIDListExcept") else ipyData.GetServerGroupIDListExcept()
+ platformList = [] if not hasattr(ipyData, "GetPlatformList") else ipyData.GetPlatformList()
+ serverGroupIDList = [] if not hasattr(ipyData, "GetServerGroupIDList") else ipyData.GetServerGroupIDList()
+ serverGroupIDListExcept = [] if not hasattr(ipyData, "GetServerGroupIDListExcept") else ipyData.GetServerGroupIDListExcept()
cfgID = ipyData.GetCfgID()
startDateStr = ipyData.GetStartDate()
endDateStr = ipyData.GetEndDate()
@@ -274,10 +281,30 @@
endDateStr = "%d-%d-%d" % (serverTime.year, serverTime.month, serverTime.day)
GameWorld.Log(" 结束日期为空,默认每天,今日为: endDateStr=%s" % endDateStr)
- # 开服常规: 开服天 > 日期 > 周x (不受合服天影响,合服活动新增一套独立的活动,还是走运营活动配置)
+ actByLoopYmd = startDateStr.startswith("L") # 按日期循环
+ # 根据日期循环的通用
+ if actByLoopYmd:
+ if cfgID in coverDisableLoopIpyDataInfo:
+ loopStartDate, loopEndDate, ymdCfgID, ymdStartDate, ymdEndDate = coverDisableLoopIpyDataInfo[cfgID]
+ GameWorld.Log(" 按日期循环的在按日期开启的时间内,不处理! cfgID=%s,%s(%s) ~ %s(%s) in ymdCfgID=%s,%s ~ %s"
+ % (cfgID, loopStartDate, startDateStr, loopEndDate, endDateStr, ymdCfgID, ymdStartDate, ymdEndDate))
+ continue
+
+ if cfgID in disableLoopCfgIDDict:
+ GameWorld.Log(" 按日期循环的未到开启循环日期或已结束循环日期,不处理! cfgID=%s,startDateStr=%s,endDateStr=%s" % (cfgID, startDateStr, endDateStr))
+ continue
+
+ if cfgID in otherLoopCfgIDDict:
+ loopCfgIDList, startDateStr, endDateStr, loopIndex, loopTimes = otherLoopCfgIDDict[cfgID]
+ GameWorld.Log(" 按日期循环的还未循环到当前配置,不处理! cfgID=%s,startDateStr=%s,endDateStr=%s,loopCfgIDList=%s,loopIndex=%s,loopTimes=%s"
+ % (cfgID, startDateStr, endDateStr, loopCfgIDList, loopIndex, loopTimes))
+ continue
+ startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData)
+
+ # 开服常规: 开服天 > 日期 > 周x=日期循环 (不受合服天影响,合服活动新增一套独立的活动,还是走运营活动配置)
if actType == ShareDefine.ActType_OpenComm:
actByWeek = (startDateStr.startswith("W") and endDateStr.startswith("W")) # 按周x开
- actByDate = (not actByWeek and startDateStr.count("-") == 2 and endDateStr.count("-") == 2) # 按日期开
+ actByDate = (not actByLoopYmd and not actByWeek and startDateStr.count("-") == 2 and endDateStr.count("-") == 2) # 按日期开
# 开服天的
if startDateStr.isdigit() and endDateStr.isdigit():
@@ -293,21 +320,20 @@
GameWorld.Log(" 开服天转化为日期: %s ~ %s" % (startDateStr, endDateStr))
# 常规配置: 开服前X天不开,不受合服影响,功能配置表可配置 开服前X天后交叉可开,每日重置的活动默认可开
- elif actByWeek or actByDate:
+ elif actByWeek or actByDate or actByLoopYmd:
if openServerDay <= customMaxServerDay:
GameWorld.Log(" 按日期/周开的在开服定制限制天内,不处理! cfgID=%s,%s ~ %s,openServerDay=%s" % (cfgID, startDateStr, endDateStr, openServerDay))
continue
- disableWeekIpyDataInfo = actNumDisableWeekIpyDataInfo.get(actNum, {})
- if cfgID in disableWeekIpyDataInfo:
- startWeekDate, endWeekDate, ymdCfgID, ymdStartDate, ymdEndDate = disableWeekIpyDataInfo[cfgID]
+ if cfgID in coverDisableWeekIpyDataInfo:
+ startWeekDate, endWeekDate, ymdCfgID, ymdStartDate, ymdEndDate = coverDisableWeekIpyDataInfo[cfgID]
GameWorld.Log(" 常规活动,按星期开启的在按日期开启的时间内,不处理! cfgID=%s,%s(%s) ~ %s(%s) in ymdCfgID=%s,%s ~ %s"
% (cfgID, startWeekDate, startDateStr, endWeekDate, endDateStr, ymdCfgID, ymdStartDate, ymdEndDate))
continue
if cfgID in disableWeekCfgIDDict:
GameWorld.Log(" 常规活动,按星期开启的未到开启循环日期或已结束循环日期,不处理! cfgID=%s,startDateStr=%s,endDateStr=%s, %s"
- % (cfgID, startDateStr, endDateStr, disableWeekCfgIDDict[cfgID]))
+ % (cfgID, startDateStr, endDateStr, str(disableWeekCfgIDDict[cfgID])))
continue
if actByWeek:
@@ -373,6 +399,13 @@
GameWorld.Log(" 非法配置,未知活动类型,不处理! cfgID=%s,actNum=%s" % (cfgID, actNum))
continue
+ if hasattr(ipyData, "GetJoinStartTime") and hasattr(ipyData, "GetJoinEndTime"):
+ joinStartTimeStr = ipyData.GetJoinStartTime()
+ joinEndTimeStr = ipyData.GetJoinEndTime()
+ else:
+ joinStartTimeStr = ""
+ joinEndTimeStr = ""
+
if hasattr(ipyData, "GetStartTimeList") and hasattr(ipyData, "GetEndTimeList"):
startHMStrList = ipyData.GetStartTimeList()
endHMStrList = ipyData.GetEndTimeList()
@@ -389,6 +422,7 @@
% (actName, cfgID, startHMStrList, endHMStrList))
continue
+ isDayRest = 0 if not hasattr(ipyData, "GetIsDayReset") else ipyData.GetIsDayReset()
resetType = 0 if not hasattr(ipyData, "GetResetType") else ipyData.GetResetType() # 重置类型,0-0点重置;1-5点重置
if resetType == 1:
startDayDate = datetime.datetime.strptime("%s 05:00:00" % (startDateStr), ChConfig.TYPE_Time_Format)
@@ -496,6 +530,17 @@
GameWorld.Log(" startList=%s" % (startList))
GameWorld.Log(" end List=%s" % (endList))
+ joinStartTimeList, joinEndTimeList = [], [] # 可指定活动可参与的时间点,不影响活动状态,只影响活动某些功能的参与时机,如上榜类
+ if joinStartTimeStr:
+ if isDayRest:
+ joinStartTimeList.append(datetime.datetime.strptime("%d-%d-%d %s:00" % (curDateTime.year, curDateTime.month, curDateTime.day, joinStartTimeStr), ChConfig.TYPE_Time_Format))
+ joinEndTimeList.append(datetime.datetime.strptime("%d-%d-%d %s:00" % (curDateTime.year, curDateTime.month, curDateTime.day, joinEndTimeStr), ChConfig.TYPE_Time_Format))
+ else:
+ joinStartTimeList.append(datetime.datetime.strptime("%s %s:00" % (startDateStr, joinStartTimeStr), ChConfig.TYPE_Time_Format))
+ joinEndTimeList.append(datetime.datetime.strptime("%s %s:00" % (endDateStr, joinEndTimeStr), ChConfig.TYPE_Time_Format))
+ GameWorld.Log(" joinStartTimeList=%s" % (joinStartTimeList))
+ GameWorld.Log(" joinEndTime List=%s" % (joinEndTimeList))
+
for dtIndex, startDateTime in enumerate(startList):
endDateTime = endList[dtIndex]
# 广播 - 相对实际开始时间
@@ -541,9 +586,9 @@
if actName in ShareDefine.MultiActNumOperationActNameList:
if actName not in operationTodayActionDict:
operationTodayActionDict[actName] = {} # 今日有需要处理的才初始化
- operationTodayActionDict[actName][actNum] = [ipyData, startList, endList, notifyDict]
+ operationTodayActionDict[actName][actNum] = [ipyData, startList, endList, notifyDict, joinStartTimeList, joinEndTimeList]
else:
- operationTodayActionDict[actName] = [ipyData, startList, endList, notifyDict]
+ operationTodayActionDict[actName] = [ipyData, startList, endList, notifyDict, joinStartTimeList, joinEndTimeList]
if isActTime:
activityInfoDict = {ShareDefine.ActKey_CfgID:cfgID, ShareDefine.ActKey_ActNum:actNum}
@@ -557,7 +602,6 @@
dayIndex = (curDateTime - startDayDate).days
actIDDateTime = startDayDate
- isDayRest = 0 if not hasattr(ipyData, "GetIsDayReset") else ipyData.GetIsDayReset()
# 按时段开的默认每天重置
if isDayRest or (startHMStrList and endHMStrList):
actIDDateTime += datetime.timedelta(days=dayIndex)
@@ -598,9 +642,9 @@
actCfgCount = getattr(ipyDataMgr, "Get%sCount" % actName)()
for cfgIndex in xrange(actCfgCount):
ipyData = getattr(ipyDataMgr, "Get%sByIndex" % actName)(cfgIndex)
- platformList = [] if not hasattr(ipyData, "PlatformList") else ipyData.GetPlatformList()
- serverGroupIDList = [] if not hasattr(ipyData, "ServerGroupIDList") else ipyData.GetServerGroupIDList()
- serverGroupIDListExcept = [] if not hasattr(ipyData, "ServerGroupIDListExcept") else ipyData.GetServerGroupIDListExcept()
+ platformList = [] if not hasattr(ipyData, "GetPlatformList") else ipyData.GetPlatformList()
+ serverGroupIDList = [] if not hasattr(ipyData, "GetServerGroupIDList") else ipyData.GetServerGroupIDList()
+ serverGroupIDListExcept = [] if not hasattr(ipyData, "GetServerGroupIDListExcept") else ipyData.GetServerGroupIDListExcept()
if platformList and platform not in platformList:
continue
@@ -629,11 +673,16 @@
return curServerActIpyDataList
-def __GetOperationActionDisableWeekIpyDataInfo(actName, curDateTime, curServerActIpyDataList):
+def __GetOperationActionDisableIpyDataInfo(actName, curDateTime, curServerActIpyDataList):
## 获取不可用的按星期X开启的配置数据信息,按星期X开启的 活动优先级小于按日期的,当有重叠时以日期的为准
- #curWeekday = curDateTime.weekday() + 1 # 今天星期几, 1代表星期1
- actNumWeekYMDIpyDataInfo = {} # {actNum:[weekIpyDataList, ymdIpyDatList], ...}
- disableWeekCfgIDDict = {} # {cfgID:[startDateStr, endDateStr], ...}
+ # 优先级 日期 > 按日期循环 > 按星期循环
+
+ actNumYMDIpyDataInfo = {} # {actNum:ymdIpyDataList, ...} # 配置日期的
+ actNumLoopIpyDataInfo = {} # {actNum:{loopKey:[loopCfgIDList, loopDateInfo]}, ...} # 按日期循环的
+ actNumWeekIpyDataInfo = {} # {actNum:weekIpyDataList, ...} # 按星期循环的
+
+ disableWeekCfgIDDict = {} # {cfgID:[startDateStr, endDateStr], ...} # 未开始循环的星期
+ disableLoopCfgIDDict = {} # {cfgID:[startDateStr, endDateStr], ...} # 未开始循环的日期
curDateTimeYmdStr = "%d-%d-%d" % (curDateTime.year, curDateTime.month, curDateTime.day)
curDateTimeYmd = GameWorld.ChangeStrToDatetime(curDateTimeYmdStr, ChConfig.TYPE_Time_YmdFormat)
@@ -643,50 +692,90 @@
startDateStr = ipyData.GetStartDate()
endDateStr = ipyData.GetEndDate()
actNum = GetOperationActNum(actName, ipyData)
- actType = GetOperationActType(actNum)
- # 这里只处理常规运营活动,日期优先级大于周
- if actType != ShareDefine.ActType_OpenComm:
- continue
-
- if actNum not in actNumWeekYMDIpyDataInfo:
- weekIpyDataList, ymdIpyDatList = [], []
- actNumWeekYMDIpyDataInfo[actNum] = [weekIpyDataList, ymdIpyDatList]
- weekIpyDataList, ymdIpyDatList = actNumWeekYMDIpyDataInfo[actNum]
# 按星期X的
if startDateStr.startswith("W"):
+ if actNum not in actNumWeekIpyDataInfo:
+ actNumWeekIpyDataInfo[actNum] = []
+ weekIpyDataList = actNumWeekIpyDataInfo[actNum]
startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData)
startWeekDate = GameWorld.ChangeStrToDatetime(startDateStr, ChConfig.TYPE_Time_YmdFormat)
endWeekDate = GameWorld.ChangeStrToDatetime(endDateStr, ChConfig.TYPE_Time_YmdFormat)
if startWeekDate > curDateTimeYmd or curDateTimeYmd > endWeekDate: # 还未开始的循环 or 已经强制结束的循环
disableWeekCfgIDDict[cfgID] = [startDateStr, endDateStr]
else:
- weekIpyDataList.append([ipyData, startWeekDate, endWeekDate])
+ weekIpyDataList.append([cfgID, startWeekDate, endWeekDate])
+ # 按日期循环
+ elif startDateStr.startswith("L"):
+ loopStartDate, loopEndDate, loopTimes = GameWorld.GetOperationActionLoopDate(startDateStr, endDateStr, curDateTime)
+ if loopStartDate > curDateTimeYmd or curDateTimeYmd > loopEndDate: # 还未开始的循环 or 已经强制结束的循环
+ disableLoopCfgIDDict[cfgID] = [startDateStr, endDateStr]
+ else:
+ loopKey = (startDateStr, endDateStr) # 同个循环周期的视为同一组
+ if actNum not in actNumLoopIpyDataInfo:
+ actNumLoopIpyDataInfo[actNum] = {}
+ loopIpyDataDict = actNumLoopIpyDataInfo[actNum]
+ if loopKey not in loopIpyDataDict:
+ loopCfgIDList, loopDateInfo = [], [loopStartDate, loopEndDate, loopTimes]
+ loopIpyDataDict[loopKey] = [loopCfgIDList, loopDateInfo]
+ loopCfgIDList, loopDateInfo = loopIpyDataDict[loopKey]
+ loopCfgIDList.append(cfgID)
+
# 按日期的
elif startDateStr.count("-") == 2:
- ymdIpyData = ipyData
- ymdStartDate = datetime.datetime.strptime("%s %02d:%02d:00" % (startDateStr, curDateTime.hour, curDateTime.minute), ChConfig.TYPE_Time_Format)
- ymdEndDate = datetime.datetime.strptime("%s %02d:%02d:00" % (endDateStr, curDateTime.hour, curDateTime.minute), ChConfig.TYPE_Time_Format)
- ymdIpyDatList.append([ymdIpyData, ymdStartDate, ymdEndDate])
+ if actNum not in actNumYMDIpyDataInfo:
+ actNumYMDIpyDataInfo[actNum] = []
+ ymdIpyDataList = actNumYMDIpyDataInfo[actNum]
+ ymdStartDate = GameWorld.ChangeStrToDatetime(startDateStr, ChConfig.TYPE_Time_YmdFormat)
+ ymdEndDate = GameWorld.ChangeStrToDatetime(endDateStr, ChConfig.TYPE_Time_YmdFormat)
+ ymdIpyDataList.append([cfgID, ymdStartDate, ymdEndDate])
else:
- # 只处理按星期、按日期的,其他的不处理
+ # 其他的不处理
pass
- actNumDisableWeekIpyDataInfo = {} # {actNum:{cfgID:[info], ...}, ...}
- for actNum, weekYMDIpyDataInfo in actNumWeekYMDIpyDataInfo.items():
- weekIpyDataList, ymdIpyDatList = weekYMDIpyDataInfo
- for ipyData, startWeekDate, endWeekDate in weekIpyDataList:
- cfgID = ipyData.GetCfgID()
- for ymdIpyData, ymdStartDate, ymdEndDate in ymdIpyDatList:
- if ymdStartDate <= startWeekDate <= ymdEndDate or ymdStartDate <= endWeekDate <= ymdEndDate:
- if actNum not in actNumDisableWeekIpyDataInfo:
- actNumDisableWeekIpyDataInfo[actNum] = {}
- ymdCfgID = ymdIpyData.GetCfgID()
- actNumDisableWeekIpyDataInfo[actNum][cfgID] = [startWeekDate, endWeekDate, ymdCfgID, ymdStartDate, ymdEndDate]
+ nowLoopYMDIpyDataInfo = {} # {actNum:loopIpyDataList, ...} # # 日期循环中当前在循环的
+ otherLoopCfgIDDict = {} # {cfgID:[info], ...} # 日期循环中不是当前循环的其他循环
+ coverDisableLoopIpyDataInfo = {} # {cfgID:[info], ...} # 被日期覆盖的日期循环
+ for actNum, loopIpyDataDict in actNumLoopIpyDataInfo.items():
+ ymdIpyDataList = actNumYMDIpyDataInfo.get(actNum, [])
+ if actNum not in nowLoopYMDIpyDataInfo:
+ nowLoopYMDIpyDataInfo[actNum] = []
+ loopIpyDataList = nowLoopYMDIpyDataInfo[actNum]
+ for loopKey, loopInfo in loopIpyDataDict.items():
+ startDateStr, endDateStr = loopKey
+ loopCfgIDList, loopDateInfo = loopInfo
+ loopStartDate, loopEndDate, loopTimes = loopDateInfo
+ loopIndex = (loopTimes - 1) % len(loopCfgIDList) # 当前循环次数对应的循环索引
+ curLoopCfgID = 0
+ for index, loopCfgID in enumerate(loopCfgIDList):
+ if index == loopIndex: # 当前循环的
+ curLoopCfgID = loopCfgID
+ loopIpyDataList.append([loopCfgID, loopStartDate, loopEndDate])
+ else:
+ otherLoopCfgIDDict[loopCfgID] = [loopCfgIDList, startDateStr, endDateStr, loopIndex, loopTimes]
- return actNumDisableWeekIpyDataInfo, disableWeekCfgIDDict
+ for ymdCfgID, ymdStartDate, ymdEndDate in ymdIpyDataList:
+ if ymdStartDate <= loopStartDate <= ymdEndDate or ymdStartDate <= loopEndDate <= ymdEndDate:
+ coverDisableLoopIpyDataInfo[curLoopCfgID] = [loopStartDate, loopEndDate, ymdCfgID, ymdStartDate, ymdEndDate]
+
+ coverDisableWeekIpyDataInfo = {} # {cfgID:[info], ...} # 被日期覆盖的星期循环
+ for actNum, weekIpyDataList in actNumWeekIpyDataInfo.items():
+ ymdIpyDataList = actNumYMDIpyDataInfo.get(actNum, [])
+ loopIpyDatList = nowLoopYMDIpyDataInfo.get(actNum, [])
+ for weekCfgID, startWeekDate, endWeekDate in weekIpyDataList:
+ # 被常规日期覆盖的
+ for ymdCfgID, ymdStartDate, ymdEndDate in ymdIpyDataList:
+ if ymdStartDate <= startWeekDate <= ymdEndDate or ymdStartDate <= endWeekDate <= ymdEndDate:
+ coverDisableWeekIpyDataInfo[weekCfgID] = [startWeekDate, endWeekDate, ymdCfgID, ymdStartDate, ymdEndDate]
+
+ # 被循环日期覆盖的
+ for loopCfgID, loopStartDate, loopEndDate in loopIpyDatList:
+ if loopStartDate <= startWeekDate <= loopEndDate or loopStartDate <= endWeekDate <= loopEndDate:
+ coverDisableWeekIpyDataInfo[weekCfgID] = [startWeekDate, endWeekDate, loopCfgID, loopStartDate, loopEndDate]
+
+ return coverDisableLoopIpyDataInfo, disableLoopCfgIDDict, otherLoopCfgIDDict, coverDisableWeekIpyDataInfo, disableWeekCfgIDDict
def Dispose_OperationActionState(reloadRefresh=False):
# 运营活动状态处理, 每天0点会强制同步当天的运营活动详情到地图服务器
@@ -721,6 +810,7 @@
for sendMapServerMsgDict in curActMapInfoDictList:
state = 0 # 默认关闭
+ stateJoin = ShareDefine.ActStateJoin_None # 可参与状态,0-参与前;1-可参与;2-参与结束
ipyData = None
actNum = sendMapServerMsgDict.get(ShareDefine.ActKey_ActNum, 0)
@@ -733,12 +823,12 @@
else:
todayActInfoList = operationTodayActionDict[actName]
- if isinstance(todayActInfoList, list) and len(todayActInfoList) == 4:
+ if isinstance(todayActInfoList, list) and len(todayActInfoList) == 6:
#startList = [] # [startDateTime, ...]
#endList = [] # [endDateTime, ...]
#notifyDict = {} # {notifyDateTime:[notifyKey, [参数]], ...}
#ipyData 可能为 None
- ipyData, startList, endList, notifyDict = todayActInfoList
+ ipyData, startList, endList, notifyDict, joinStartTimeList, joinEndTimeList = todayActInfoList
# 状态
for dIndex, startDateTime in enumerate(startList):
@@ -746,6 +836,17 @@
if startDateTime <= curDateTime < endDateTime:
state = dIndex + 1 # 代表第几个时间段
break
+
+ if joinStartTimeList:
+ for jIndex, joinStartDateTime in enumerate(joinStartTimeList):
+ endJoinDateTime = joinEndTimeList[jIndex]
+ if joinStartDateTime <= curDateTime < endJoinDateTime:
+ stateJoin = ShareDefine.ActStateJoin_Start
+ break
+ elif curDateTime >= endJoinDateTime:
+ stateJoin = ShareDefine.ActStateJoin_End
+ else:
+ stateJoin = ShareDefine.ActStateJoin_Start if state else ShareDefine.ActStateJoin_None
# 全服广播提示信息
if curDateTime in notifyDict:
@@ -756,12 +857,19 @@
if actName in ShareDefine.MultiActNumOperationActNameList:
dictName += "_%s" % actNum
preState = gameWorld.GetDictByKey(dictName)
- if not isReload and preState == state:
+
+ dictNameJoin = ChConfig.Def_WorldKey_OperationActionStateJoin % actName
+ if actName in ShareDefine.MultiActNumOperationActNameList:
+ dictNameJoin += "_%s" % actNum
+ preStateJoin = gameWorld.GetDictByKey(dictNameJoin)
+
+ if not isReload and preState == state and preStateJoin == stateJoin:
#已经是这个状态了
continue
- GameWorld.Log("运营活动变更: actName=%s,actNum=%s,preState=%s,state=%s,dictName=%s" % (actName, actNum, preState, state, dictName))
+ GameWorld.Log("运营活动变更: actName=%s,actNum=%s,preState=%s,state=%s,preStateJoin=%s,stateJoin=%s" % (actName, actNum, preState, state, preStateJoin, stateJoin))
#更新字典值
gameWorld.SetDict(dictName, state)
+ gameWorld.SetDict(dictNameJoin, stateJoin)
dbOperationActIDKey = PlayerDBGSEvent.Def_OperationActID % actName
dbOperationActWorldLVKey = PlayerDBGSEvent.Def_OActWorldLV % actName
@@ -776,6 +884,17 @@
GameWorld.Log(" dbActID变更: dbActID=%s,curActID=%s" % (dbActID, curActID))
PlayerDBGSEvent.SetDBGSTrig_ByKey(dbOperationActIDKey, curActID)
+ # 结束旧的
+ if dbActID:
+ if actName == ShareDefine.OperationActionName_BossTrial:
+ PlayerActBossTrial.OnActEnd(actNum, ipyData, dayIndex)
+ elif actName == ShareDefine.OperationActionName_XianXiaMJ:
+ PlayerActXianXiaMJ.OnActEnd(actNum, ipyData, dayIndex)
+ elif actName == ShareDefine.OperationActionName_Gubao:
+ PlayerActGubao.OnActEnd(actNum, ipyData, dayIndex)
+ elif actName == ShareDefine.OperationActionName_HorsePetTrain:
+ PlayerActHorsePetTrain.OnActEnd(actNum, ipyData, dayIndex)
+
if curActID:
if actName in ShareDefine.NeedWorldLVOperationActNameList:
#记录开启时世界等级
@@ -803,6 +922,16 @@
PlayerStore.ResetFlashSaleBuyCnt(ipyData)
elif actName == ShareDefine.OperationActionName_GarbageSorting:
PlayerActGarbageSorting.OnActStart(actNum)
+ elif actName == ShareDefine.OperationActionName_BossTrial:
+ PlayerActBossTrial.OnActStart(actNum)
+ elif actName == ShareDefine.OperationActionName_XianXiaMJ:
+ PlayerActXianXiaMJ.OnActStart(actNum, ipyData)
+ elif actName == ShareDefine.OperationActionName_Gubao:
+ PlayerActGubao.OnActStart(actNum, ipyData)
+ elif actName == ShareDefine.OperationActionName_HorsePetTrain:
+ PlayerActHorsePetTrain.OnActStart(actNum, ipyData)
+ elif actName == ShareDefine.OperationActionName_FamilyCTGAssist:
+ PlayerActFamilyCTGAssist.OnActStart(actNum)
else:
if actName == ShareDefine.OperationActionName_GarbageSorting:
PlayerActGarbageSorting.OnActEnd(actNum)
@@ -810,6 +939,34 @@
else:
GameWorld.Log(" dbActID不变: dbActID=%s,curActID=%s" % (dbActID, curActID))
+ # 活动中刷新,每次都需要刷新的逻辑,包含重读配置等
+ if state:
+ if actName == ShareDefine.OperationActionName_BossTrial:
+ PlayerActBossTrial.OnActInStateRefresh(actNum, ipyData, dayIndex)
+ elif actName == ShareDefine.OperationActionName_XianXiaMJ:
+ PlayerActXianXiaMJ.OnActInStateRefresh(actNum, ipyData)
+ elif actName == ShareDefine.OperationActionName_Gubao:
+ PlayerActGubao.OnActInStateRefresh(actNum, ipyData)
+ elif actName == ShareDefine.OperationActionName_HorsePetTrain:
+ PlayerActHorsePetTrain.OnActInStateRefresh(actNum, ipyData)
+
+ # 仅活动有配置参与时间段的会触发
+ if curActID and dbActID == curActID and preStateJoin != stateJoin:
+ GameWorld.Log(" 参与状态变更: preStateJoin=%s,stateJoin=%s" % (preStateJoin, stateJoin))
+ # 参与开始
+ if stateJoin == ShareDefine.ActStateJoin_Start:
+ pass
+ # 参与结束
+ elif stateJoin == ShareDefine.ActStateJoin_End:
+ if actName == ShareDefine.OperationActionName_BossTrial:
+ PlayerActBossTrial.OnActJoinEnd(actNum, ipyData, dayIndex)
+ elif actName == ShareDefine.OperationActionName_XianXiaMJ:
+ PlayerActXianXiaMJ.OnActJoinEnd(actNum, ipyData, dayIndex)
+ elif actName == ShareDefine.OperationActionName_Gubao:
+ PlayerActGubao.OnActJoinEnd(actNum, ipyData, dayIndex)
+ elif actName == ShareDefine.OperationActionName_HorsePetTrain:
+ PlayerActHorsePetTrain.OnActJoinEnd(actNum, ipyData, dayIndex)
+
if ipyData and actName in ShareDefine.NeedWorldLVOperationActNameList:
actWorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(dbOperationActWorldLVKey)
sendMapServerMsgDict[ShareDefine.ActKey_WorldLV] = actWorldLV
@@ -851,6 +1008,7 @@
#GameWorld.SendMapServerMsgEx(dictName, state) # 运营活动不单独通知活动状态,需与活动信息整合后一起通知
sendMapServerMsgDict[ShareDefine.ActKey_State] = state
+ sendMapServerMsgDict[ShareDefine.ActKey_StateJoin] = stateJoin
GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_OperationActionInfo % actName, sendMapServerMsgDict)
GameWorld.Log(" sendMapServerMsgDict: %s" % (sendMapServerMsgDict))
@@ -1070,6 +1228,9 @@
def Dispose_DailyActionState():
# 日常活动状态变更检查处理
+ if GameWorld.IsCrossServer():
+ CrossActionControl.Dispose_CrossDailyActionState()
+
todayDailyActionInfo = __GetTodayDailyActionInfo()
if not todayDailyActionInfo:
return
@@ -1135,11 +1296,20 @@
def SendMapServerDailyActionState():
# 地图启动成功时通知本日进行中的日常活动状态
+ gameWorld = GameWorld.GetGameWorld()
+ if GameWorld.IsCrossServer():
+ CrossActionControl.SendMapServerCrossDailyActionState()
+ else:
+ for dailyActionID in ShareDefine.CrossDailyActionIDList:
+ dictName = ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % dailyActionID
+ state = gameWorld.GetDictByKey(dictName)
+ if state:
+ GameWorld.SendMapServerMsgEx(dictName, state)
+
todayDailyActionInfo = __GetTodayDailyActionInfo()
if not todayDailyActionInfo:
return
- gameWorld = GameWorld.GetGameWorld()
for actionInfo in todayDailyActionInfo:
dailyActionID = actionInfo[0]
dictName = ShareDefine.Def_Notify_WorldKey_DailyActionState % dailyActionID
--
Gitblit v1.8.0