From bc433db8262081f0400bcb9c2c3476000662daf3 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 10 七月 2024 14:24:53 +0800
Subject: [PATCH] 10205 【越南】【主干】【港台】【砍树】自选礼包(支持一次性放入超65535个数叠加物品;邮件同步支持一次性领取超65535个数叠加物品)
---
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 102 insertions(+), 16 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
index bfee180..c89e50d 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
@@ -33,7 +33,9 @@
import PlayerFamilyRedPacket
import PlayerFairyCeremony
import PlayerNewFairyCeremony
+import PlayerActFamilyCTGAssist
import PlayerActGarbageSorting
+import PlayerActBossTrial
import PlayerUniversalGameRec
import GameWorldAverageLv
import PlayerFamilyBoss
@@ -108,10 +110,11 @@
def SendMapServerOperationActionState():
# 地图启动成功时通知本日运行活动相关状态
+ CrossActionControl.SendMapServerCrossActionState()
+
if GameWorld.IsCrossServer():
# 跨服不处理运营活动
return
- CrossActionControl.SendMapServerCrossActionState()
isReload, OperationActionInfo = __GetOperationActionInfo()
mapServerInfoDict = OperationActionInfo[OperationAction_MapServerInfo]
@@ -141,7 +144,7 @@
活动分组编号 = 活动类型 * 10 + 不同界面编号
'''
- if ipyData and hasattr(ipyData, "ActNum"):
+ if ipyData and hasattr(ipyData, "GetActNum"):
return ipyData.GetActNum()
# 原节日活动的还是默认节日活动
@@ -245,9 +248,9 @@
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()
@@ -257,6 +260,7 @@
% (cfgID, actNum, startDateStr, endDateStr, openServerDay, isMixServer, mixServerDay, curDateTime, platformList, serverGroupIDList, serverGroupIDListExcept))
actIDDateTimeSpec = None # 特殊指定的活动ID日期
+ startDateSync = None # 特殊同步前端显示用的开始日期,一般用于与开服前X天交叉的活动
if actName in ShareDefine.MultiActNumOperationActNameList:
# 多活动分组编号的需要把所有配置的 actNum 都登记进来,以确保地图能正确进行逻辑
if actNum not in mapServerOperationActionDict[actName]:
@@ -331,6 +335,14 @@
% (customMaxServerDateTime.year, customMaxServerDateTime.month, customMaxServerDateTime.day),
ChConfig.TYPE_Time_Format) + datetime.timedelta(days=1)
GameWorld.Log(" 开服天后可开启的非每日重置活动! 活动ID日期特殊设置为开服定制天结束后一天! cfgID=%s,actIDDateTimeSpec=%s" % (cfgID, actIDDateTimeSpec))
+
+ # 特殊同步的开始日期,无视是否每日重置
+ if actName in startDateInCustomCanOpenList:
+ startDateSync = datetime.datetime.strptime("%d-%d-%d 00:00:00"
+ % (customMaxServerDateTime.year, customMaxServerDateTime.month, customMaxServerDateTime.day),
+ ChConfig.TYPE_Time_Format) + datetime.timedelta(days=1)
+ startDateSync = "%d-%d-%d" % (startDateSync.year, startDateSync.month, startDateSync.day)
+
else:
GameWorld.Log(" 开服常规活动,配置时间格式不支持,不处理! cfgID=%s,startDateStr=%s,endDateStr=%s" % (cfgID, startDateStr, endDateStr))
continue
@@ -364,6 +376,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()
@@ -380,6 +399,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)
@@ -487,6 +507,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]
# 广播 - 相对实际开始时间
@@ -532,9 +563,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}
@@ -542,9 +573,12 @@
#活动每天的世界等级
activityInfoDict[ShareDefine.ActKey_WorldLVList] = GameWorldAverageLv.GetWorldLVListByTime(startDayDate, (endDayDate - startDayDate).days)
+ if startDateSync:
+ activityInfoDict[ShareDefine.ActKey_StartDateSync] = startDateSync
+ GameWorld.Log(" startDateSync=%s" % (startDateSync))
+
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)
@@ -585,9 +619,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
@@ -708,6 +742,7 @@
for sendMapServerMsgDict in curActMapInfoDictList:
state = 0 # 默认关闭
+ stateJoin = ShareDefine.ActStateJoin_None # 可参与状态,0-参与前;1-可参与;2-参与结束
ipyData = None
actNum = sendMapServerMsgDict.get(ShareDefine.ActKey_ActNum, 0)
@@ -720,12 +755,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):
@@ -733,6 +768,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:
@@ -743,12 +789,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
@@ -763,6 +816,11 @@
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)
+
if curActID:
if actName in ShareDefine.NeedWorldLVOperationActNameList:
#记录开启时世界等级
@@ -790,6 +848,10 @@
PlayerStore.ResetFlashSaleBuyCnt(ipyData)
elif actName == ShareDefine.OperationActionName_GarbageSorting:
PlayerActGarbageSorting.OnActStart(actNum)
+ elif actName == ShareDefine.OperationActionName_BossTrial:
+ PlayerActBossTrial.OnActStart(actNum)
+ elif actName == ShareDefine.OperationActionName_FamilyCTGAssist:
+ PlayerActFamilyCTGAssist.OnActStart(actNum)
else:
if actName == ShareDefine.OperationActionName_GarbageSorting:
PlayerActGarbageSorting.OnActEnd(actNum)
@@ -797,6 +859,17 @@
else:
GameWorld.Log(" dbActID不变: dbActID=%s,curActID=%s" % (dbActID, curActID))
+ # 仅活动有配置参与时间段的会触发
+ 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)
+
if ipyData and actName in ShareDefine.NeedWorldLVOperationActNameList:
actWorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(dbOperationActWorldLVKey)
sendMapServerMsgDict[ShareDefine.ActKey_WorldLV] = actWorldLV
@@ -838,6 +911,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))
@@ -1057,6 +1131,9 @@
def Dispose_DailyActionState():
# 日常活动状态变更检查处理
+ if GameWorld.IsCrossServer():
+ CrossActionControl.Dispose_CrossDailyActionState()
+
todayDailyActionInfo = __GetTodayDailyActionInfo()
if not todayDailyActionInfo:
return
@@ -1122,11 +1199,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