| | |
| | | import PlayerFamilyRedPacket
|
| | | import PlayerFairyCeremony
|
| | | import PlayerNewFairyCeremony
|
| | | import PlayerActGarbageSorting
|
| | | import PlayerUniversalGameRec
|
| | | import GameWorldAverageLv
|
| | | import PlayerFamilyBoss
|
| | |
| | | ## 运营活动类型
|
| | | return actNum / 10
|
| | |
|
| | | def __SaveActWorldLVLimitInfo(actWorldLVLimitInfo):
|
| | | GameWorld.GetUniversalRecMgr().Delete(ShareDefine.Def_UniversalGameRecType_ActWorldLVLimitInfo)
|
| | | recDataList = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_ActWorldLVLimitInfo)
|
| | | GameWorld.Log("保存运营活动世界等级限制开启信息: %s" % len(actWorldLVLimitInfo))
|
| | | for actName, cfgLimitInfoDict in actWorldLVLimitInfo.items():
|
| | | for cfgID, limitInfo in cfgLimitInfoDict.items():
|
| | | recStartDateStr, recEndDateStr, recLimitWorldLV, recWorldLV = limitInfo
|
| | | recData = recDataList.AddRec()
|
| | | recData.SetStrValue1(recStartDateStr)
|
| | | recData.SetStrValue2(recEndDateStr)
|
| | | recData.SetStrValue3(actName)
|
| | | recData.SetValue1(cfgID)
|
| | | recData.SetValue2(recLimitWorldLV)
|
| | | recData.SetValue3(recWorldLV)
|
| | | GameWorld.Log(" actName=%s,cfgID=%s,recStartDateStr=%s,recEndDateStr=%s,recLimitWorldLV=%s,recWorldLV=%s" |
| | | % (actName, cfgID, recStartDateStr, recEndDateStr, recLimitWorldLV, recWorldLV))
|
| | | return
|
| | |
|
| | | def __GetActWorldLVLimitInfo():
|
| | | actWorldLVLimitInfo = {}
|
| | | recDataList = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_ActWorldLVLimitInfo)
|
| | | GameWorld.Log("加载运营活动世界等级限制开启信息: %s" % recDataList.Count())
|
| | | for index in xrange(recDataList.Count()):
|
| | | recData = recDataList.At(index)
|
| | | recStartDateStr = recData.GetStrValue1()
|
| | | recEndDateStr = recData.GetStrValue2()
|
| | | actName = recData.GetStrValue3()
|
| | | cfgID = recData.GetValue1()
|
| | | recLimitWorldLV = recData.GetValue2()
|
| | | recWorldLV = recData.GetValue3()
|
| | | if actName not in actWorldLVLimitInfo:
|
| | | actWorldLVLimitInfo[actName] = {}
|
| | | actWorldLVLimitInfo[actName][cfgID] = [recStartDateStr, recEndDateStr, recLimitWorldLV, recWorldLV]
|
| | | GameWorld.Log(" actName=%s,cfgID=%s,recStartDateStr=%s,recEndDateStr=%s,recLimitWorldLV=%s,recWorldLV=%s" |
| | | % (actName, cfgID, recStartDateStr, recEndDateStr, recLimitWorldLV, recWorldLV))
|
| | | return actWorldLVLimitInfo
|
| | |
|
| | | def __GetOperationActionInfo(isRefreshState=True):
|
| | | # @return: isReload, OperationActionInfo
|
| | |
|
| | |
| | | serverGroupID = GameWorld.GetServerGroupID()
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | curWeekday = curDateTime.weekday() + 1 # 今天星期几, 1代表星期1
|
| | | curWorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
|
| | | actWorldLVLimitInfoOld = __GetActWorldLVLimitInfo()
|
| | | actWorldLVLimitInfoNew = {}
|
| | |
|
| | | GameWorld.Log("===== 加载本日运营活动信息: %s, serverGroupID=%s,openServerDay=%s,customMaxServerDay=%s,isMixServer=%s,mixServerDay=%s,maxCustomServerDayMix=%s,reloadSign=%s ====="
|
| | | % (curDateTime, serverGroupID, openServerDay, customMaxServerDay, isMixServer, mixServerDay, maxCustomServerDayMix, reloadSign))
|
| | | GameWorld.Log(" 今日周%s" % (curWeekday))
|
| | | GameWorld.Log(" 今日周%s, curWorldLV=%s" % (curWeekday, curWorldLV))
|
| | |
|
| | | for actName in ShareDefine.OperationActionNameList:
|
| | |
|
| | |
| | | GameWorld.Log("加载运营活动: actName=%s,platform=%s,serverGroupID=%s" % (actName, platform, serverGroupID))
|
| | | curServerActIpyDataList = __GetOperationActionServerIpyDataList(ipyDataMgr, platform, serverGroupID, actName)
|
| | | GameWorld.Log(" 可处理条数=%s" % (len(curServerActIpyDataList)))
|
| | | actNumDisableWeekIpyDataInfo = __GetOperationActionDisableWeekIpyDataInfo(actName, curDateTime, curServerActIpyDataList)
|
| | | actNumDisableWeekIpyDataInfo, disableWeekCfgIDDict = __GetOperationActionDisableWeekIpyDataInfo(actName, curDateTime, curServerActIpyDataList)
|
| | |
|
| | | for ipyData in curServerActIpyDataList:
|
| | |
|
| | |
| | | # 开服常规: 开服天 > 日期 > 周x (不受合服天影响,合服活动新增一套独立的活动,还是走运营活动配置)
|
| | | if actType == ShareDefine.ActType_OpenComm:
|
| | | actByWeek = (startDateStr.startswith("W") and endDateStr.startswith("W")) # 按周x开
|
| | | actByDate = (startDateStr.count("-") == 2 and endDateStr.count("-") == 2) # 按日期开
|
| | | actByDate = (not actByWeek and startDateStr.count("-") == 2 and endDateStr.count("-") == 2) # 按日期开
|
| | |
|
| | | # 开服天的
|
| | | if startDateStr.isdigit() and endDateStr.isdigit():
|
| | |
| | | % (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]))
|
| | | continue
|
| | | |
| | | if actByWeek:
|
| | | startWeekday = int(startDateStr[1:])
|
| | | endWeekday = int(endDateStr[1:])
|
| | | startWeekDate = curDateTime + datetime.timedelta(days=(startWeekday - curWeekday))
|
| | | endWeekDate = curDateTime + datetime.timedelta(days=(endWeekday - curWeekday))
|
| | | startDateStr = "%d-%d-%d" % (startWeekDate.year, startWeekDate.month, startWeekDate.day)
|
| | | endDateStr = "%d-%d-%d" % (endWeekDate.year, endWeekDate.month, endWeekDate.day)
|
| | | startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData)
|
| | | GameWorld.Log(" 星期X转化为日期: %s ~ %s" % (startDateStr, endDateStr))
|
| | |
|
| | | curServerOpenDateTime = curDateTime + datetime.timedelta(days=(1 - openServerDay)) # 开服第一天的日期
|
| | |
| | | advanceMinutes = 0 if not hasattr(ipyData, "GetAdvanceMinutes") else ipyData.GetAdvanceMinutes() # 提前通知时间,分钟,暂只支持按天的
|
| | | GameWorld.Log(" resetType=%s,startDayDate=%s,endDayDate=%s,startHMStrList=%s,endHMStrList=%s,advanceMinutes=%s"
|
| | | % (resetType, startDayDate, endDayDate, startHMStrList, endHMStrList, advanceMinutes))
|
| | | |
| | | |
| | | advanceNoticeDateTime = None
|
| | | startDayDateJudge = startDayDate # 用于判断是否需要处理的起始时间,一般是活动开始时间,如果有提前广播或预告则时间会提前
|
| | | # 提前预告
|
| | |
| | | % (activityIpyData.GetCfgID(), cfgID, advanceMinutes, minNotifyStartMinute, startDayDateJudge))
|
| | | continue
|
| | |
|
| | | #注:刚好是结束的时间点,防范已经有需要处理的配置被覆盖
|
| | | if curActTodayInfo and curDateTime == endDayDate:
|
| | | activityIpyData = curActTodayInfo[0]
|
| | | GameWorld.Log(" 已经存在需要处理的配置ID(%s)! 当前刚好结束的时间点,不处理!cfgID=%s" % (activityIpyData.GetCfgID(), cfgID))
|
| | | continue
|
| | | |
| | | # 在需要处理的时间内附加世界等级开启限制,未达到最低世界等级要求的不开,活动时间从未达到到达到也不开
|
| | | limitWorldLV = 0 if not hasattr(ipyData, "GetLimitWorldLV") else ipyData.GetLimitWorldLV() # 限制开启世界等级
|
| | | if limitWorldLV:
|
| | | GameWorld.Log(" limitWorldLV=%s,curWorldLV=%s" % (limitWorldLV, curWorldLV))
|
| | | recInfoType = ""
|
| | | worldLVLimitInfo = actWorldLVLimitInfoOld.get(actName, {})
|
| | | # 注: 该逻辑是在活动时间内的额外处理,所以需要判断此逻辑的前提理论上都在活动时间内,故只要有记录则以当时的记录为准
|
| | | if cfgID in worldLVLimitInfo:
|
| | | recInfoType = "Old"
|
| | | recStartDateStr, recEndDateStr, recLimitWorldLV, recWorldLV = worldLVLimitInfo[cfgID]
|
| | | else:
|
| | | recInfoType = "New"
|
| | | recStartDateStr, recEndDateStr, recLimitWorldLV, recWorldLV = startDateStr, endDateStr, limitWorldLV, curWorldLV
|
| | | |
| | | if actName not in actWorldLVLimitInfoNew:
|
| | | actWorldLVLimitInfoNew[actName] = {}
|
| | | actWorldLVLimitInfoNew[actName][cfgID] = [recStartDateStr, recEndDateStr, recLimitWorldLV, recWorldLV]
|
| | | |
| | | if recLimitWorldLV > recWorldLV:
|
| | | GameWorld.Log(" 活动时间内,但服务器世界等级未达到开启活动世界等级,不处理!recLimitWorldLV=%s > recWorldLV=%s %s" |
| | | % (recLimitWorldLV, recWorldLV, recInfoType))
|
| | | continue
|
| | | |
| | | startList = [] # [startDateTime, ...]
|
| | | endList = [] # [endDateTime, ...]
|
| | | startNotifyDict = {} # {notifyDateTime:notifyInfo, ...}
|
| | |
| | | mapServerOperationActionDict[actName] = activityInfoDict
|
| | |
|
| | | OperationActionInfo = IpyGameDataPY.SetConfigEx(key, [reloadSign, operationTodayActionDict, mapServerOperationActionDict])
|
| | | __SaveActWorldLVLimitInfo(actWorldLVLimitInfoNew)
|
| | |
|
| | | GameWorld.Log("本日运营活动信息加载完毕!reloadSign=%s,isRefreshState=%s" % (reloadSign, isRefreshState))
|
| | | GameWorld.Log(" operationTodayActionDict=%s" % operationTodayActionDict)
|
| | |
| | |
|
| | | def __GetOperationActionDisableWeekIpyDataInfo(actName, curDateTime, curServerActIpyDataList):
|
| | | ## 获取不可用的按星期X开启的配置数据信息,按星期X开启的 活动优先级小于按日期的,当有重叠时以日期的为准
|
| | | curWeekday = curDateTime.weekday() + 1 # 今天星期几, 1代表星期1
|
| | | #curWeekday = curDateTime.weekday() + 1 # 今天星期几, 1代表星期1
|
| | | actNumWeekYMDIpyDataInfo = {} # {actNum:[weekIpyDataList, ymdIpyDatList], ...}
|
| | | disableWeekCfgIDDict = {} # {cfgID:[startDateStr, endDateStr], ...}
|
| | | |
| | | curDateTimeYmdStr = "%d-%d-%d" % (curDateTime.year, curDateTime.month, curDateTime.day)
|
| | | curDateTimeYmd = GameWorld.ChangeStrToDatetime(curDateTimeYmdStr, ChConfig.TYPE_Time_YmdFormat)
|
| | |
|
| | | for ipyData in curServerActIpyDataList:
|
| | | cfgID = ipyData.GetCfgID()
|
| | | startDateStr = ipyData.GetStartDate()
|
| | | endDateStr = ipyData.GetEndDate()
|
| | | actNum = GetOperationActNum(actName, ipyData)
|
| | |
| | |
|
| | | # 按星期X的
|
| | | if startDateStr.startswith("W"):
|
| | | startWeekday = int(startDateStr[1:])
|
| | | endWeekday = int(endDateStr[1:])
|
| | | startWeekDate = curDateTime + datetime.timedelta(days=(startWeekday - curWeekday))
|
| | | endWeekDate = curDateTime + datetime.timedelta(days=(endWeekday - curWeekday))
|
| | | weekIpyDataList.append([ipyData, startWeekDate, endWeekDate])
|
| | | 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])
|
| | | |
| | | # 按日期的
|
| | | elif startDateStr.count("-") == 2:
|
| | | ymdIpyData = ipyData
|
| | |
| | | ymdCfgID = ymdIpyData.GetCfgID()
|
| | | actNumDisableWeekIpyDataInfo[actNum][cfgID] = [startWeekDate, endWeekDate, ymdCfgID, ymdStartDate, ymdEndDate]
|
| | |
|
| | | return actNumDisableWeekIpyDataInfo
|
| | | return actNumDisableWeekIpyDataInfo, disableWeekCfgIDDict
|
| | |
|
| | | def TransferOperationActDBKeyValue():
|
| | | ''' 服务器启动时调用
|
| | |
| | | PlayerControl.WorldNotify(0, notifyKey, paramList)
|
| | |
|
| | | dictName = ChConfig.Def_WorldKey_OperationActionState % actName
|
| | | if actName in ShareDefine.MultiActNumOperationActNameList: |
| | | if actName in ShareDefine.MultiActNumOperationActNameList:
|
| | | dictName += "_%s" % actNum
|
| | | preState = gameWorld.GetDictByKey(dictName)
|
| | | if not isReload and preState == state:
|
| | |
| | | #限时抢购重置购买次数 本次活动每场不能重复
|
| | | #dayIndex = sendMapServerMsgDict.get(ShareDefine.ActKey_DayIndex, 0)
|
| | | PlayerStore.ResetFlashSaleBuyCnt(ipyData)
|
| | | elif actName == ShareDefine.OperationActionName_GarbageSorting:
|
| | | PlayerActGarbageSorting.OnActStart(actNum)
|
| | | else:
|
| | | if actName == ShareDefine.OperationActionName_GarbageSorting:
|
| | | PlayerActGarbageSorting.OnActEnd(actNum)
|
| | | |
| | | else:
|
| | | GameWorld.Log(" dbActID不变: dbActID=%s,curActID=%s" % (dbActID, curActID))
|
| | |
|
| | | if state and actName in ShareDefine.NeedWorldLVOperationActNameList:
|
| | | if ipyData and actName in ShareDefine.NeedWorldLVOperationActNameList:
|
| | | actWorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(dbOperationActWorldLVKey)
|
| | | sendMapServerMsgDict[ShareDefine.ActKey_WorldLV] = actWorldLV
|
| | | GameWorld.Log(" 活动世界等级: actWorldLV=%s" % (actWorldLV))
|
| | |
| | | if isReload and ipyData:
|
| | | Sync_OperationAction_ExpRate(ipyData)
|
| | |
|
| | | elif actName == ShareDefine.OperationActionName_CostRebate:
|
| | | if isReload and ipyData:
|
| | | pass
|
| | | elif actName == ShareDefine.OperationActionName_BossReborn:
|
| | | if isReload and ipyData:
|
| | | GameWorldBoss.SetBossRebornNeedPoint(True)
|
| | | |
| | | |
| | | elif actName == ShareDefine.OperationActionName_HorsePetFeast:
|
| | | if preState != state and state:
|
| | | relatedID = "%s|%s" % (actName, actNum)
|
| | | GameWorld.Log(" 骑宠盛宴开始: relatedID=%s" % (relatedID))
|
| | | GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ActionBossRebornSign % relatedID, int(time.time()))
|
| | | |
| | | elif actName == ShareDefine.OperationActionName_FairyCeremony:
|
| | | if isReload and ipyData:
|
| | | PlayerFairyCeremony.Sync_OperationAction_FairyCeremony(ipyData)
|
| | |
| | | return
|
| | | if len(ipyData.GetStartTimeList()) != len(ipyData.GetEndTimeList()):
|
| | | return
|
| | | openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1
|
| | | startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData)
|
| | | multiExpRateInfo = ChPyNetSendPack.tagGCMultiExpRateInfo()
|
| | | multiExpRateInfo.Clear()
|
| | | multiExpRateInfo.StartDate = GameWorld.GetOperationActionDateStr(ipyData.GetStartDate(), openServerDay)
|
| | | multiExpRateInfo.EndtDate = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)
|
| | | multiExpRateInfo.StartDate = startDateStr
|
| | | multiExpRateInfo.EndtDate = endDateStr
|
| | | multiExpRateInfo.ActivityTime = []
|
| | | for i, startTime in enumerate(ipyData.GetStartTimeList()):
|
| | | endTime = ipyData.GetEndTimeList()[i]
|
| | |
| | | ##多倍修行点活动信息通知
|
| | | if not ipyData:
|
| | | return
|
| | | openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1
|
| | | startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData)
|
| | | multiRealmPointInfo = ChPyNetSendPack.tagGCMultiRealmPointInfo()
|
| | | multiRealmPointInfo.Clear()
|
| | | multiRealmPointInfo.StartDate = GameWorld.GetOperationActionDateStr(ipyData.GetStartDate(), openServerDay)
|
| | | multiRealmPointInfo.EndtDate = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)
|
| | | multiRealmPointInfo.StartDate = startDateStr
|
| | | multiRealmPointInfo.EndtDate = endDateStr
|
| | | multiRealmPointInfo.Multiple = ipyData.GetMultiple()
|
| | | multiRealmPointInfo.LimitLV = ipyData.GetLVLimit()
|
| | | multiRealmPointInfo.LimitPoint = ipyData.GetPointLimit()
|