|  |  |  | 
|---|
|  |  |  | import ChConfig | 
|---|
|  |  |  | import datetime | 
|---|
|  |  |  | import GameWorld | 
|---|
|  |  |  | import ReadChConfig | 
|---|
|  |  |  | import PlayerControl | 
|---|
|  |  |  | import ShareDefine | 
|---|
|  |  |  | #import PlayerExam | 
|---|
|  |  |  | import PlayerDBGSEvent | 
|---|
|  |  |  | import MergeBroadcast | 
|---|
|  |  |  | #import PlayerManorWar | 
|---|
|  |  |  | #import GameWorldShopItem | 
|---|
|  |  |  | #import GameWorldActionTeHui | 
|---|
|  |  |  | import GameWorldAverageLv | 
|---|
|  |  |  | #import GameWorldMergeBoss | 
|---|
|  |  |  | #import GameWorldMergeKing | 
|---|
|  |  |  | #import GameWorldMergePK | 
|---|
|  |  |  | import CrossRealmPK | 
|---|
|  |  |  | import GameWorldFamilyWar | 
|---|
|  |  |  | import PlayerFamilyParty | 
|---|
|  |  |  | import IpyGameDataPY | 
|---|
|  |  |  | import PlayerXMZZ | 
|---|
|  |  |  | import PlayerFamilySWRH | 
|---|
|  |  |  | import GameWorldBoss | 
|---|
|  |  |  | import PlayerFamilyRedPacket | 
|---|
|  |  |  | import PlayerFairyCeremony | 
|---|
|  |  |  | import PlayerNewFairyCeremony | 
|---|
|  |  |  | import PlayerUniversalGameRec | 
|---|
|  |  |  | import GameWorldAverageLv | 
|---|
|  |  |  | import PlayerFamilyBoss | 
|---|
|  |  |  | import PlayerHorsePetBoss | 
|---|
|  |  |  | import GameWorldProcess | 
|---|
|  |  |  | import ChPyNetSendPack | 
|---|
|  |  |  | import NetPackCommon | 
|---|
|  |  |  | 
|---|
|  |  |  | from types import IntType | 
|---|
|  |  |  | import time | 
|---|
|  |  |  | #--------------------------------------------------------------------- | 
|---|
|  |  |  |  | 
|---|
|  |  |  | MaxCustomServerDay = 14 # 最大定制开服天数 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #年月日时间格式 | 
|---|
|  |  |  | Time_YmdFormat = ChConfig.TYPE_Time_YmdFormat | 
|---|
|  |  |  | 
|---|
|  |  |  | ) = range(3) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def OnPlayerLogin(curPlayer): | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if GameWorld.IsCrossServer(): | 
|---|
|  |  |  | # 跨服不处理运营活动 | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | isReload, OperationActionInfo = __GetOperationActionInfo() | 
|---|
|  |  |  | operationActionDict = OperationActionInfo[OperationAction_TodayInfo] | 
|---|
|  |  |  | 
|---|
|  |  |  | ipyData = operationActionDict[ShareDefine.OperationActionName_FairyCeremony][0] | 
|---|
|  |  |  | if ipyData: | 
|---|
|  |  |  | PlayerFairyCeremony.Sync_OperationAction_FairyCeremony(ipyData, curPlayer) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 新仙界盛典活动进行中 | 
|---|
|  |  |  | if ShareDefine.OperationActionName_NewFairyCeremony in operationActionDict: | 
|---|
|  |  |  | ipyData = operationActionDict[ShareDefine.OperationActionName_NewFairyCeremony][0] | 
|---|
|  |  |  | if ipyData: | 
|---|
|  |  |  | PlayerNewFairyCeremony.Sync_OperationAction_NewFairyCeremony(ipyData, curPlayer) | 
|---|
|  |  |  | # 多倍修行点活动进行中 | 
|---|
|  |  |  | if ShareDefine.OperationActionName_RealmPoint in operationActionDict: | 
|---|
|  |  |  | ipyData = operationActionDict[ShareDefine.OperationActionName_RealmPoint][0] | 
|---|
|  |  |  | if ipyData: | 
|---|
|  |  |  | Sync_OperationAction_RealmPoint(ipyData, curPlayer) | 
|---|
|  |  |  | # 节日红包活动进行中 | 
|---|
|  |  |  | if ShareDefine.OperationActionName_FeastRedPacket in operationActionDict: | 
|---|
|  |  |  | ipyData = operationActionDict[ShareDefine.OperationActionName_FeastRedPacket][0] | 
|---|
|  |  |  | if ipyData: | 
|---|
|  |  |  | PlayerFamilyRedPacket.Sync_FeastRedPacket(ipyData, curPlayer) | 
|---|
|  |  |  | # 幸运鉴宝活动进行中 | 
|---|
|  |  |  | if ShareDefine.OperationActionName_LuckyTreasure in operationActionDict: | 
|---|
|  |  |  | PlayerUniversalGameRec.SendUniversalGameRecInfo(curPlayer, ShareDefine.Def_UniversalGameRecType_LuckyTreasure) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def SendMapServerOperationActionState(): | 
|---|
|  |  |  | # 地图启动成功时通知本日运行活动相关状态 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if GameWorld.IsCrossServer(): | 
|---|
|  |  |  | # 跨服不处理运营活动 | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | isReload, OperationActionInfo = __GetOperationActionInfo() | 
|---|
|  |  |  | mapServerInfoDict = OperationActionInfo[OperationAction_MapServerInfo] | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | key = "OperationActionInfo" | 
|---|
|  |  |  | openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 | 
|---|
|  |  |  | isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer) | 
|---|
|  |  |  | mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) + 1 | 
|---|
|  |  |  | OperationActionInfo = IpyGameDataPY.GetConfigEx(key) | 
|---|
|  |  |  | serverTime = GameWorld.GetServerTime() | 
|---|
|  |  |  | curHour = serverTime.hour | 
|---|
|  |  |  | reloadSignHour = 0 if curHour < 5 else 5 | 
|---|
|  |  |  | reloadSign = "%s_%s" % (openServerDay, reloadSignHour) | 
|---|
|  |  |  | reloadSign = [openServerDay, isMixServer, mixServerDay, reloadSignHour] | 
|---|
|  |  |  | if OperationActionInfo and OperationActionInfo[OperationAction_ReloadSign] == reloadSign: | 
|---|
|  |  |  | #GameWorld.DebugLog("已经加载过本日运营活动处理信息!openServerDay=%s" % openServerDay) | 
|---|
|  |  |  | return False, OperationActionInfo | 
|---|
|  |  |  | 
|---|
|  |  |  | curDateTimeStr = "%d-%d-%d %02d:%02d:00" % (serverTime.year, serverTime.month, serverTime.day, serverTime.hour, serverTime.minute) | 
|---|
|  |  |  | curDateTime = datetime.datetime.strptime(curDateTimeStr, ChConfig.TYPE_Time_Format) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | customMaxServerDay = MaxCustomServerDay # 定制运营活动最大开服天 | 
|---|
|  |  |  | startDateInCustomCanOpenList = IpyGameDataPY.GetFuncEvalCfg("OperationAction", 2) # 开始天在定制天内在定制天结束后可继续开启的活动列表 | 
|---|
|  |  |  | customMaxServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) # 定制运营活动最大开服天 | 
|---|
|  |  |  | maxCustomServerDayMix = IpyGameDataPY.GetFuncCfg("MixServer", 1) # 定制运营活动最大合服天 | 
|---|
|  |  |  | operationActionDict = {} | 
|---|
|  |  |  | mapServerOperationActionDict = {} | 
|---|
|  |  |  | serverID = GameWorld.GetServerID() | 
|---|
|  |  |  | serverGroupID = GameWorld.GetServerGroupID() | 
|---|
|  |  |  | ipyDataMgr = IpyGameDataPY.IPY_Data() | 
|---|
|  |  |  | curWeekday = curDateTime.weekday() + 1 # 今天星期几, 1代表星期1 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.Log("===== 加载本日运营活动信息: %s, serverID=%s,openServerDay=%s,customMaxServerDay=%s,reloadSign=%s =====" | 
|---|
|  |  |  | % (curDateTime, serverID, openServerDay, customMaxServerDay, reloadSign)) | 
|---|
|  |  |  | 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)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for actName in ShareDefine.OperationActionNameList: | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 取出本活动所属本服ID的所有配置 | 
|---|
|  |  |  | curServerActIpyDataList = __GetOperationActionServerIpyDataList(ipyDataMgr, serverID, actName) | 
|---|
|  |  |  | GameWorld.Log("加载运营活动: actName=%s,可处理条数=%s" % (actName, len(curServerActIpyDataList))) | 
|---|
|  |  |  | GameWorld.Log("加载运营活动: actName=%s" % (actName)) | 
|---|
|  |  |  | curServerActIpyDataList = __GetOperationActionServerIpyDataList(ipyDataMgr, serverGroupID, actName) | 
|---|
|  |  |  | GameWorld.Log("    可处理条数=%s" % (len(curServerActIpyDataList))) | 
|---|
|  |  |  | disableWeekIpyDataInfo, customOpenServerDayState, customMixServerDayState = __GetOperationActionDisableWeekIpyDataInfo(actName, curDateTime, curServerActIpyDataList) | 
|---|
|  |  |  | GameWorld.Log("    是否有配开服天活动=%s, 是否有配合服天活动=%s" % (customOpenServerDayState, customMixServerDayState)) | 
|---|
|  |  |  | needStartList = [] # [startDateTime, ...] | 
|---|
|  |  |  | needEndList = [] # [endDateTime, ...] | 
|---|
|  |  |  | needNotifyDict = {} # {notifyDateTime:[notifyKey, [参数]], ...} | 
|---|
|  |  |  | 
|---|
|  |  |  | # 注意:每个活动配置会有多个活动时间点,但是有且只能生效一条活动配置,换句话说就是每个活动配置时间不允许交叉 | 
|---|
|  |  |  | for ipyData in curServerActIpyDataList: | 
|---|
|  |  |  |  | 
|---|
|  |  |  | serverGroupIDList = [] if not hasattr(ipyData, "ServerGroupIDList") else ipyData.GetServerGroupIDList() | 
|---|
|  |  |  | serverGroupIDListExcept = [] if not hasattr(ipyData, "ServerGroupIDListExcept") else ipyData.GetServerGroupIDListExcept() | 
|---|
|  |  |  | cfgID = ipyData.GetCfgID() | 
|---|
|  |  |  | startDateStr = ipyData.GetStartDate() | 
|---|
|  |  |  | endDateStr = ipyData.GetEndDate() | 
|---|
|  |  |  | GameWorld.Log("    cfgID=%s,mark=%s,serverIDList=%s,startDateStr=%s,endDateStr=%s,openServerDay=%s,curDateTime=%s" | 
|---|
|  |  |  | % (cfgID, ipyData.GetActMark(), ipyData.GetServerIDList(), startDateStr, endDateStr, openServerDay, curDateTime)) | 
|---|
|  |  |  | GameWorld.Log("    cfgID=%s,serverGroupIDList=%s,Except=%s,startDateStr=%s,endDateStr=%s,openServerDay=%s,isMixServer=%s,mixServerDay=%s,maxCustomServerDayMix=%s,curDateTime=%s" | 
|---|
|  |  |  | % (cfgID, serverGroupIDList, serverGroupIDListExcept, startDateStr, endDateStr, openServerDay, isMixServer, mixServerDay, maxCustomServerDayMix, curDateTime)) | 
|---|
|  |  |  | if cfgID in disableWeekIpyDataInfo: | 
|---|
|  |  |  | startWeekDate, endWeekDate, ymdCfgID, ymdStartDate, ymdEndDate = disableWeekIpyDataInfo[cfgID] | 
|---|
|  |  |  | GameWorld.Log("        按星期开启的在按日期开启的时间内,不处理! cfgID=%s,%s(%s) ~ %s(%s) in ymdCfgID=%s,%s ~ %s" | 
|---|
|  |  |  | % (cfgID, startWeekDate, startDateStr, endWeekDate, endDateStr, ymdCfgID, ymdStartDate, ymdEndDate)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | if not startDateStr: | 
|---|
|  |  |  | startDateStr = "%d-%d-%d" % (serverTime.year, serverTime.month, serverTime.day) | 
|---|
|  |  |  | GameWorld.Log("        开始日期为空,默认每天,今日为: startDateStr=%s" % startDateStr) | 
|---|
|  |  |  | if not endDateStr: | 
|---|
|  |  |  | endDateStr = "%d-%d-%d" % (serverTime.year, serverTime.month, serverTime.day) | 
|---|
|  |  |  | GameWorld.Log("        结束日期为空,默认每天,今日为: endDateStr=%s" % endDateStr) | 
|---|
|  |  |  | # 活动优先级为   开服天=合服天>运营日期>运营周天 | 
|---|
|  |  |  | # 按开服天开的 | 
|---|
|  |  |  | if startDateStr.isdigit() and endDateStr.isdigit(): | 
|---|
|  |  |  | startServerDay, endServerDay = int(startDateStr), int(endDateStr) | 
|---|
|  |  |  | 
|---|
|  |  |  | startDateStr = "%d-%d-%d" % (openServerDateTime.year, openServerDateTime.month, openServerDateTime.day) | 
|---|
|  |  |  | endDateStr = "%d-%d-%d" % (endServerDateTime.year, endServerDateTime.month, endServerDateTime.day) | 
|---|
|  |  |  | GameWorld.Log("        开服天转化为日期: %s ~ %s" % (startDateStr, endDateStr)) | 
|---|
|  |  |  | elif startDateStr.startswith("Mix") and endDateStr.startswith("Mix"): | 
|---|
|  |  |  | if not isMixServer: | 
|---|
|  |  |  | GameWorld.Log("        非合服服务器,不处理! cfgID=%s,%s ~ %s" % (cfgID, startDateStr, endDateStr)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | startMixServerDay, endMixServerDay = int(startDateStr[3:]), int(endDateStr[3:]) | 
|---|
|  |  |  | #结束日可能还需要处理广播之类,所以这里需要+1 | 
|---|
|  |  |  | if mixServerDay > endMixServerDay + 1: | 
|---|
|  |  |  | GameWorld.Log("        当前合服天超过活动结束合服天,不处理! cfgID=%s,%s ~ %s < mixServerDay(%s)" % (cfgID, startDateStr, endDateStr, mixServerDay)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | openServerDateTime = curDateTime + datetime.timedelta(days=(startMixServerDay-mixServerDay)) | 
|---|
|  |  |  | endServerDateTime = curDateTime + datetime.timedelta(days=(endMixServerDay-mixServerDay)) | 
|---|
|  |  |  | startDateStr = "%d-%d-%d" % (openServerDateTime.year, openServerDateTime.month, openServerDateTime.day) | 
|---|
|  |  |  | endDateStr = "%d-%d-%d" % (endServerDateTime.year, endServerDateTime.month, endServerDateTime.day) | 
|---|
|  |  |  | GameWorld.Log("        合服天转化为日期: %s ~ %s" % (startDateStr, endDateStr)) | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | if openServerDay <= customMaxServerDay: | 
|---|
|  |  |  | GameWorld.Log("        按日期开的在开服定制限制天内,不处理! cfgID=%s,%s ~ %s,openServerDay=%s" % (cfgID, startDateStr, endDateStr, openServerDay)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | customMaxServerDateTime = curDateTime + datetime.timedelta(days=(customMaxServerDay-openServerDay)) | 
|---|
|  |  |  | curStartDateTime = datetime.datetime.strptime("%s %02d:%02d:%02d" % (startDateStr, customMaxServerDateTime.hour, customMaxServerDateTime.minute, | 
|---|
|  |  |  | customMaxServerDateTime.second), ChConfig.TYPE_Time_Format) | 
|---|
|  |  |  | if curStartDateTime <= customMaxServerDateTime: | 
|---|
|  |  |  | GameWorld.Log("        按日期开的开始日期在开服定制限制天内,不处理! cfgID=%s,curStartDateTime=%s,customMaxServerDateTime=%s" % (cfgID, curStartDateTime, customMaxServerDateTime)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if startDateStr.startswith("W") and endDateStr.startswith("W"): | 
|---|
|  |  |  | 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) | 
|---|
|  |  |  | GameWorld.Log("        星期X转化为日期: %s ~ %s" % (startDateStr, endDateStr)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if actName not in ShareDefine.FeastOperationActionNameList: | 
|---|
|  |  |  | if customOpenServerDayState and openServerDay <= customMaxServerDay: | 
|---|
|  |  |  | GameWorld.Log("        按日期/周开的在开服定制限制天内,不处理! cfgID=%s,%s ~ %s,openServerDay=%s" % (cfgID, startDateStr, endDateStr, openServerDay)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | curServerOpenDateTime = curDateTime + datetime.timedelta(days=(1-openServerDay)) # 开服第一天的日期 | 
|---|
|  |  |  | customMaxServerDateTime = curDateTime + datetime.timedelta(days=(customMaxServerDay-openServerDay)) | 
|---|
|  |  |  | curStartDateTime = datetime.datetime.strptime("%s %02d:%02d:%02d" % (startDateStr, customMaxServerDateTime.hour, customMaxServerDateTime.minute, | 
|---|
|  |  |  | customMaxServerDateTime.second), ChConfig.TYPE_Time_Format) | 
|---|
|  |  |  | if customOpenServerDayState and curServerOpenDateTime <= curStartDateTime <= customMaxServerDateTime: | 
|---|
|  |  |  | if actName not in startDateInCustomCanOpenList: | 
|---|
|  |  |  | GameWorld.Log("        按日期/周开的开始日期在开服定制限制天内,不处理! cfgID=%s,curServerOpenDateTime=%s<=curStartDateTime=%s<=customMaxServerDateTime=%s" % (cfgID, curServerOpenDateTime, curStartDateTime, customMaxServerDateTime)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if isMixServer: | 
|---|
|  |  |  | if customMixServerDayState and mixServerDay <= maxCustomServerDayMix: | 
|---|
|  |  |  | GameWorld.Log("        按日期/周开的在合服定制限制天内,不处理! cfgID=%s,%s ~ %s,mixServerDay=%s" % (cfgID, startDateStr, endDateStr, mixServerDay)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | mixStartServerDateTime = curDateTime + datetime.timedelta(days=(1-mixServerDay)) # 合服第一天的日期 | 
|---|
|  |  |  | customMaxServerDateTime = curDateTime + datetime.timedelta(days=(maxCustomServerDayMix-mixServerDay)) | 
|---|
|  |  |  | curStartDateTime = datetime.datetime.strptime("%s %02d:%02d:%02d" % (startDateStr, customMaxServerDateTime.hour, customMaxServerDateTime.minute, | 
|---|
|  |  |  | customMaxServerDateTime.second), ChConfig.TYPE_Time_Format) | 
|---|
|  |  |  | if customMixServerDayState and mixStartServerDateTime <= curStartDateTime <= customMaxServerDateTime: | 
|---|
|  |  |  | if actName not in startDateInCustomCanOpenList: | 
|---|
|  |  |  | GameWorld.Log("        按日期/周开的开始日期在合服定制限制天内,不处理! cfgID=%s,mixStartServerDateTime=%s<=curStartDateTime=%s<=customMaxServerDateTime=%s" % (cfgID, mixStartServerDateTime, curStartDateTime, customMaxServerDateTime)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if hasattr(ipyData, "GetStartTimeList") and hasattr(ipyData, "GetEndTimeList"): | 
|---|
|  |  |  | startHMStrList = ipyData.GetStartTimeList() | 
|---|
|  |  |  | endHMStrList = ipyData.GetEndTimeList() | 
|---|
|  |  |  | 
|---|
|  |  |  | isEnd = (curDateTime == endDayDate) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 每天按时段开启的,支持多时段 | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | if startDayDate <= curDateTime <= endDayDate: | 
|---|
|  |  |  | isEnd = (curDateTime == endDayDate) | 
|---|
|  |  |  | elif startDayDate <= curDateTime <= endDayDate: | 
|---|
|  |  |  | isEnd = (curDateTime == endDayDate) | 
|---|
|  |  |  | if not isEnd: | 
|---|
|  |  |  | for hmIndex, startHMStr in enumerate(startHMStrList): | 
|---|
|  |  |  | endHMStr = endHMStrList[hmIndex] | 
|---|
|  |  |  | # 每天开的, 实际开关时间只取今天的日期; 这里有个问题,全服广播的时间不是今天的, 暂不做支持,之后真有这种需求再说 | 
|---|
|  |  |  | 
|---|
|  |  |  | if not activityIpyData or (isActivity and not isEnd): | 
|---|
|  |  |  | activityIpyData = ipyData | 
|---|
|  |  |  | activityInfoDict = {ShareDefine.ActKey_CfgID:cfgID} | 
|---|
|  |  |  | if actName == ShareDefine.OperationActionName_LoginAward: | 
|---|
|  |  |  | #活动每天的世界等级 | 
|---|
|  |  |  | activityInfoDict[ShareDefine.ActKey_WorldLVList] = GameWorldAverageLv.GetWorldLVListByTime(startDayDate, (endDayDate - startDayDate).days) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if startDayDate <= curDateTime < endDayDate: | 
|---|
|  |  |  | dayIndex = 0 | 
|---|
|  |  |  | dayIndex = (curDateTime - startDayDate).days | 
|---|
|  |  |  | actIDDateTime = startDayDate | 
|---|
|  |  |  | isDayRest = 0 if not hasattr(ipyData, "GetIsDayReset") else ipyData.GetIsDayReset() | 
|---|
|  |  |  | # 按时段开的默认每天重置 | 
|---|
|  |  |  | if isDayRest or (startHMStrList and endHMStrList): | 
|---|
|  |  |  | dayIndex = (curDateTime - startDayDate).days | 
|---|
|  |  |  | actIDDateTime += datetime.timedelta(days=dayIndex) | 
|---|
|  |  |  | actID = int(time.mktime(actIDDateTime.timetuple())) # 默认取开始时间点的time值作为活动ID | 
|---|
|  |  |  | activityInfoDict[ShareDefine.ActKey_DayIndex] = dayIndex | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return True, OperationActionInfo | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def __GetOperationActionServerIpyDataList(ipyDataMgr, serverID, actName): | 
|---|
|  |  |  | def __GetOperationActionServerIpyDataList(ipyDataMgr, serverGroupID, actName): | 
|---|
|  |  |  | ## 获取运营活动本服务器对应的配置数据列表 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 所有配置先按活动标识归组 | 
|---|
|  |  |  | actGroupDict = {} # {ActMark:{ServerIDTuple:[ipyData, ...], ...}, ...} | 
|---|
|  |  |  | if not hasattr(ipyDataMgr, "Get%sCount" % actName): | 
|---|
|  |  |  | GameWorld.ErrLog("没有该运营活动类型对应活动时间表! actName=%s" % actName) | 
|---|
|  |  |  | return [] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | curServerActIpyDataList = [] | 
|---|
|  |  |  | actCfgCount = getattr(ipyDataMgr, "Get%sCount" % actName)() | 
|---|
|  |  |  | for cfgIndex in xrange(actCfgCount): | 
|---|
|  |  |  | ipyData = getattr(ipyDataMgr, "Get%sByIndex" % actName)(cfgIndex) | 
|---|
|  |  |  | actMark = ipyData.GetActMark() | 
|---|
|  |  |  | serverIDTuple = tuple(ipyData.GetServerIDList()) | 
|---|
|  |  |  | ipyData = getattr(ipyDataMgr, "Get%sByIndex" % actName)(cfgIndex) | 
|---|
|  |  |  | serverGroupIDList = [] if not hasattr(ipyData, "ServerGroupIDList") else ipyData.GetServerGroupIDList() | 
|---|
|  |  |  | serverGroupIDListExcept = [] if not hasattr(ipyData, "ServerGroupIDListExcept") else ipyData.GetServerGroupIDListExcept() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | serverIpyDataDict = actGroupDict.get(actMark, {}) | 
|---|
|  |  |  | ipyDataList = serverIpyDataDict.get(serverIDTuple, []) | 
|---|
|  |  |  | ipyDataList.append(ipyData) | 
|---|
|  |  |  | serverIpyDataDict[serverIDTuple] = ipyDataList | 
|---|
|  |  |  | actGroupDict[actMark] = serverIpyDataDict | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 取出所属本服ID的所有配置 | 
|---|
|  |  |  | curServerActIpyDataList = [] | 
|---|
|  |  |  | for actMark, serverIpyDataDict in actGroupDict.items(): | 
|---|
|  |  |  | generalIpyDataList = [] | 
|---|
|  |  |  | isGeneral = True | 
|---|
|  |  |  | for serverIDTuple, ipyDataList in serverIpyDataDict.items(): | 
|---|
|  |  |  | if not serverIDTuple: | 
|---|
|  |  |  | generalIpyDataList = ipyDataList | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | for serverIDInfo in serverIDTuple: | 
|---|
|  |  |  | if (isinstance(serverIDInfo, int) and serverIDInfo == serverID) \ | 
|---|
|  |  |  | or ((isinstance(serverIDInfo, list) or isinstance(serverIDInfo, tuple)) \ | 
|---|
|  |  |  | and len(serverIDInfo) == 2 and serverIDInfo[0] <= serverID <= serverIDInfo[1]): | 
|---|
|  |  |  | curServerActIpyDataList += ipyDataList | 
|---|
|  |  |  | isGeneral = False | 
|---|
|  |  |  | # 排除的服务器组ID列表 | 
|---|
|  |  |  | if serverGroupIDListExcept: | 
|---|
|  |  |  | isExcept = False | 
|---|
|  |  |  | for serverGroupIDInfo in serverGroupIDListExcept: | 
|---|
|  |  |  | if (isinstance(serverGroupIDInfo, int) and serverGroupIDInfo == serverGroupID) \ | 
|---|
|  |  |  | or ((isinstance(serverGroupIDInfo, list) or isinstance(serverGroupIDInfo, tuple)) \ | 
|---|
|  |  |  | and len(serverGroupIDInfo) == 2 and serverGroupIDInfo[0] <= serverGroupID <= serverGroupIDInfo[1]): | 
|---|
|  |  |  | isExcept = True | 
|---|
|  |  |  | break | 
|---|
|  |  |  | if isGeneral: | 
|---|
|  |  |  | curServerActIpyDataList += generalIpyDataList | 
|---|
|  |  |  | if isExcept: | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if not serverGroupIDList: | 
|---|
|  |  |  | curServerActIpyDataList.append(ipyData) | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | for serverGroupIDInfo in serverGroupIDList: | 
|---|
|  |  |  | if (isinstance(serverGroupIDInfo, int) and serverGroupIDInfo == serverGroupID) \ | 
|---|
|  |  |  | or ((isinstance(serverGroupIDInfo, list) or isinstance(serverGroupIDInfo, tuple)) \ | 
|---|
|  |  |  | and len(serverGroupIDInfo) == 2 and serverGroupIDInfo[0] <= serverGroupID <= serverGroupIDInfo[1]): | 
|---|
|  |  |  | curServerActIpyDataList.append(ipyData) | 
|---|
|  |  |  | break | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return curServerActIpyDataList | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def __GetOperationActionDisableWeekIpyDataInfo(actName, curDateTime, curServerActIpyDataList): | 
|---|
|  |  |  | ## 获取不可用的按星期X开启的配置数据信息,按星期X开启的 活动优先级小于按日期的,当有重叠时以日期的为准 | 
|---|
|  |  |  | disableWeekIpyDataInfo = {} | 
|---|
|  |  |  | curWeekday = curDateTime.weekday() + 1 # 今天星期几, 1代表星期1 | 
|---|
|  |  |  | customOpenServerDayState, customMixServerDayState = False, False # 是否有配开服天、合服天活动 | 
|---|
|  |  |  | weekIpyDataList, ymdIpyDatList = [], [] | 
|---|
|  |  |  | for ipyData in curServerActIpyDataList: | 
|---|
|  |  |  | startDateStr = ipyData.GetStartDate() | 
|---|
|  |  |  | endDateStr = ipyData.GetEndDate() | 
|---|
|  |  |  | if startDateStr.isdigit() or startDateStr.startswith("Mix"): | 
|---|
|  |  |  | # 开服天、合服天的不处理 | 
|---|
|  |  |  | if startDateStr.isdigit(): | 
|---|
|  |  |  | customOpenServerDayState = True | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | customMixServerDayState = True | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 按星期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]) | 
|---|
|  |  |  | # 按日期的 | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | 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]) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for ipyData, startWeekDate, endWeekDate in weekIpyDataList: | 
|---|
|  |  |  | cfgID = ipyData.GetCfgID() | 
|---|
|  |  |  | for ymdIpyData, ymdStartDate, ymdEndDate in ymdIpyDatList: | 
|---|
|  |  |  | if ymdStartDate <= startWeekDate <= ymdEndDate or ymdStartDate <= endWeekDate <= ymdEndDate \ | 
|---|
|  |  |  | or (actName in ShareDefine.FeastOperationActionNameList and ymdStartDate <= curDateTime <= ymdEndDate): | 
|---|
|  |  |  | ymdCfgID = ymdIpyData.GetCfgID() | 
|---|
|  |  |  | disableWeekIpyDataInfo[cfgID] = [startWeekDate, endWeekDate, ymdCfgID, ymdStartDate, ymdEndDate] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return disableWeekIpyDataInfo, customOpenServerDayState, customMixServerDayState | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def Dispose_OperationActionState(reloadRefresh=False): | 
|---|
|  |  |  | # 运营活动状态处理, 每天0点会强制同步当天的运营活动详情到地图服务器 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if GameWorld.IsCrossServer(): | 
|---|
|  |  |  | # 跨服不处理运营活动 | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | isReload, OperationActionInfo = __GetOperationActionInfo(False) # 这里必须传False | 
|---|
|  |  |  | isReload = isReload or reloadRefresh | 
|---|
|  |  |  | 
|---|
|  |  |  | curDateTime = datetime.datetime.strptime("%d-%d-%d %d:%d:00" % (curDateTime.year, curDateTime.month, curDateTime.day, | 
|---|
|  |  |  | curDateTime.hour, curDateTime.minute), ChConfig.TYPE_Time_Format) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | startDateInCustomCanOpenList = IpyGameDataPY.GetFuncEvalCfg("OperationAction", 2) # 开始天在定制天内在定制天结束后可继续开启的活动列表 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for actName in ShareDefine.OperationActionNameList: | 
|---|
|  |  |  |  | 
|---|
|  |  |  | state = 0 # 默认关闭 | 
|---|
|  |  |  | 
|---|
|  |  |  | #notifyDict = {} # {notifyDateTime:[notifyKey, [参数]], ...} | 
|---|
|  |  |  | #ipyData 可能为 None | 
|---|
|  |  |  | ipyData, startList, endList, notifyDict = operationActionDict[actName] | 
|---|
|  |  |  | # 精确匹配开启 | 
|---|
|  |  |  | if curDateTime in startList: | 
|---|
|  |  |  | state = startList.index(curDateTime) + 1 # 也是代表第几个时间段 | 
|---|
|  |  |  | # 精确匹配关闭 | 
|---|
|  |  |  | elif curDateTime in endList: | 
|---|
|  |  |  | state = 0 | 
|---|
|  |  |  | # goon ״̬ | 
|---|
|  |  |  | else: | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if actName in startDateInCustomCanOpenList: | 
|---|
|  |  |  | # 由于某些活动的开始天允许和前定制X天有交叉的情况出现(实际不开,会等定制结束后才接下去开) | 
|---|
|  |  |  | # 所以会有时间交叉的情况出现,这种活动goon单独判断 | 
|---|
|  |  |  | # 为防止动到其他活动,允许交叉的活动另外处理,理论上可以统一逻辑,为保险起见分开处理 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 精确匹配开启 | 
|---|
|  |  |  | if curDateTime in startList: | 
|---|
|  |  |  | state = startList.index(curDateTime) + 1 # 也是代表第几个时间段 | 
|---|
|  |  |  | # 精确匹配关闭 | 
|---|
|  |  |  | elif curDateTime in endList: | 
|---|
|  |  |  | state = 0 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # goon ״̬ | 
|---|
|  |  |  | for dIndex, startDateTime in enumerate(startList): | 
|---|
|  |  |  | endDateTime = endList[dIndex] | 
|---|
|  |  |  | if startDateTime < curDateTime < endDateTime: | 
|---|
|  |  |  | state = dIndex + 1 | 
|---|
|  |  |  | break | 
|---|
|  |  |  |  | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | # 精确匹配开启 | 
|---|
|  |  |  | if curDateTime in startList: | 
|---|
|  |  |  | state = startList.index(curDateTime) + 1 # 也是代表第几个时间段 | 
|---|
|  |  |  | # 精确匹配关闭 | 
|---|
|  |  |  | elif curDateTime in endList: | 
|---|
|  |  |  | state = 0 | 
|---|
|  |  |  | # goon ״̬ | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | for dIndex, startDateTime in enumerate(startList): | 
|---|
|  |  |  | endDateTime = endList[dIndex] | 
|---|
|  |  |  | if startDateTime < curDateTime < endDateTime: | 
|---|
|  |  |  | state = dIndex + 1 | 
|---|
|  |  |  | break | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 全服广播提示信息 | 
|---|
|  |  |  | if curDateTime in notifyDict: | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | dbOperationActIDKey = PlayerDBGSEvent.Def_OperationActID % actName | 
|---|
|  |  |  | curActID = sendMapServerMsgDict.get(ShareDefine.ActKey_ID) | 
|---|
|  |  |  | if state >= 1 and curActID and PlayerDBGSEvent.GetDBGSTrig_ByKey(dbOperationActIDKey) != curActID: | 
|---|
|  |  |  | dayIndex = sendMapServerMsgDict.get(ShareDefine.ActKey_DayIndex, 0) | 
|---|
|  |  |  | if curActID and PlayerDBGSEvent.GetDBGSTrig_ByKey(dbOperationActIDKey) != curActID: | 
|---|
|  |  |  | PlayerDBGSEvent.SetDBGSTrig_ByKey(dbOperationActIDKey, curActID) | 
|---|
|  |  |  | if actName in ShareDefine.NeedWorldLVOperationActNameList: | 
|---|
|  |  |  | #记录开启时世界等级 | 
|---|
|  |  |  | 
|---|
|  |  |  | elif actName == ShareDefine.OperationActionName_FairyCeremony: | 
|---|
|  |  |  | #重置仙界盛典 | 
|---|
|  |  |  | PlayerFairyCeremony.ResetFairyCeremony() | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif actName == ShareDefine.OperationActionName_NewFairyCeremony: | 
|---|
|  |  |  | #重置仙界盛典 | 
|---|
|  |  |  | PlayerNewFairyCeremony.ResetNewFairyCeremony() | 
|---|
|  |  |  | elif actName == ShareDefine.OperationActionName_FeastRedPacket: | 
|---|
|  |  |  | #重置节日红包 | 
|---|
|  |  |  | if ipyData: | 
|---|
|  |  |  | PlayerFamilyRedPacket.OnResetFeastRedPacket(ipyData, dayIndex) | 
|---|
|  |  |  | elif actName == ShareDefine.OperationActionName_FlashSale: | 
|---|
|  |  |  | #限时抢购重置购买次数 本次活动每场不能重复 | 
|---|
|  |  |  | #dayIndex = sendMapServerMsgDict.get(ShareDefine.ActKey_DayIndex, 0) | 
|---|
|  |  |  | PlayerStore.ResetFlashSaleBuyCnt(ipyData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if state >= 1 and actName in ShareDefine.NeedWorldLVOperationActNameList: | 
|---|
|  |  |  | if actName in ShareDefine.NeedWorldLVOperationActNameList: | 
|---|
|  |  |  | actWorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_OActWorldLV % actName) | 
|---|
|  |  |  | sendMapServerMsgDict[ShareDefine.ActKey_WorldLV] = actWorldLV | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | PlayerFairyCeremony.Sync_OperationAction_FairyCeremony(ipyData) | 
|---|
|  |  |  | if preState != state and state == 0: | 
|---|
|  |  |  | PlayerFairyCeremony.OnFairyCeremonyEnd() | 
|---|
|  |  |  | elif actName == ShareDefine.OperationActionName_NewFairyCeremony: | 
|---|
|  |  |  | if isReload and ipyData: | 
|---|
|  |  |  | PlayerNewFairyCeremony.Sync_OperationAction_NewFairyCeremony(ipyData) | 
|---|
|  |  |  | if preState != state and state == 0: | 
|---|
|  |  |  | PlayerNewFairyCeremony.OnNewFairyCeremonyEnd() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif actName == ShareDefine.OperationActionName_RealmPoint: | 
|---|
|  |  |  | if isReload and ipyData: | 
|---|
|  |  |  | Sync_OperationAction_RealmPoint(ipyData) | 
|---|
|  |  |  | elif actName == ShareDefine.OperationActionName_FlashSale: | 
|---|
|  |  |  | if ipyData and preState != state: | 
|---|
|  |  |  | dayIndex = sendMapServerMsgDict.get(ShareDefine.ActKey_DayIndex, 0) | 
|---|
|  |  |  | PlayerStore.ResetFlashSaleBuyCnt(ipyData, dayIndex, state) | 
|---|
|  |  |  | elif actName == ShareDefine.OperationActionName_FeastRedPacket: | 
|---|
|  |  |  | if isReload and ipyData: | 
|---|
|  |  |  | PlayerFamilyRedPacket.Sync_FeastRedPacket(ipyData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #通知Mapserver,设置字典 | 
|---|
|  |  |  | #GameWorld.SendMapServerMsgEx(dictName, state) # 运营活动不单独通知活动状态,需与活动信息整合后一起通知 | 
|---|
|  |  |  | 
|---|
|  |  |  | multiRealmPointInfo.EndtDate = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay) | 
|---|
|  |  |  | multiRealmPointInfo.Multiple = ipyData.GetMultiple() | 
|---|
|  |  |  | multiRealmPointInfo.LimitLV = ipyData.GetLVLimit() | 
|---|
|  |  |  | multiRealmPointInfo.LimitPoint = ipyData.GetPointLimit() | 
|---|
|  |  |  | if not curPlayer: | 
|---|
|  |  |  | # 全服广播在线玩家 | 
|---|
|  |  |  | playerManager = GameWorld.GetPlayerManager() | 
|---|
|  |  |  | 
|---|
|  |  |  | # 获取本日待处理的日常活动信息 | 
|---|
|  |  |  | key = "TodayDailyActionInfo" | 
|---|
|  |  |  | openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 | 
|---|
|  |  |  | isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer) | 
|---|
|  |  |  | mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) + 1 | 
|---|
|  |  |  | loadSign = [openServerDay, isMixServer, mixServerDay] | 
|---|
|  |  |  | TodayDailyActionInfo = IpyGameDataPY.GetConfigEx(key) | 
|---|
|  |  |  | if TodayDailyActionInfo and TodayDailyActionInfo[0] == openServerDay: | 
|---|
|  |  |  | #GameWorld.DebugLog("已经加载过本日日常活动处理信息!openServerDay=%s" % openServerDay) | 
|---|
|  |  |  | if TodayDailyActionInfo and TodayDailyActionInfo[0] == loadSign: | 
|---|
|  |  |  | #GameWorld.DebugLog("已经加载过本日日常活动处理信息!loadSign=%s" % loadSign) | 
|---|
|  |  |  | return TodayDailyActionInfo[1] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | todayActionInfo = [] | 
|---|
|  |  |  | 
|---|
|  |  |  | curDateStr = GameWorld.ChangeTimeNumToStr(curTime, ChConfig.TYPE_Time_YmdFormat) # 当天日期 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | openServerWeekday = GameWorldProcess.GetOpenServerWeekday() # 服务器开服时是星期几 | 
|---|
|  |  |  | curMaxCustomServerDay = MaxCustomServerDay - openServerWeekday + 1 # 最大有效定制开服天 | 
|---|
|  |  |  | curMaxCustomServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) - openServerWeekday + 1 # 最大有效定制开服天 | 
|---|
|  |  |  | maxCustomServerDayMix = IpyGameDataPY.GetFuncCfg("MixServer", 1) | 
|---|
|  |  |  | GameWorld.Log("===== 加载今天日常活动信息 =====") | 
|---|
|  |  |  | GameWorld.Log("    开服是星期%s, 开服第%s天, 当前星期%s" % (openServerWeekday, openServerDay, weekDay)) | 
|---|
|  |  |  | GameWorld.Log("    最大有效定制开服天: %s" % (curMaxCustomServerDay)) | 
|---|
|  |  |  | GameWorld.Log("开服是星期%s, 开服第%s天, 当前星期%s" % (openServerWeekday, openServerDay, weekDay)) | 
|---|
|  |  |  | GameWorld.Log("最大有效定制开服天: %s" % (curMaxCustomServerDay)) | 
|---|
|  |  |  | GameWorld.Log("是否合服: %s, 合服天: %s, 最大定制合服天: %s" % (isMixServer, mixServerDay, maxCustomServerDayMix)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | customDailyIDList = [] | 
|---|
|  |  |  | dailyTimeInfoList = [] | 
|---|
|  |  |  | # 暂固定前2周定制有效, 为方便GM命令测试,这里用开服天做判断,不用开服周 | 
|---|
|  |  |  | if openServerDay <= curMaxCustomServerDay: | 
|---|
|  |  |  | customIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("DailyActionCustom", openServerWeekday) | 
|---|
|  |  |  | GameWorld.Log("    本周定制的日常活动条数: %s" % len(customIpyDataList)) | 
|---|
|  |  |  | if not customIpyDataList: | 
|---|
|  |  |  | customIpyDataList = [] | 
|---|
|  |  |  | GameWorld.Log("    本周定制的开服日常活动条数: %s" % len(customIpyDataList)) | 
|---|
|  |  |  | customIDList = [] | 
|---|
|  |  |  | todayCustomIDList = [] | 
|---|
|  |  |  | for customIpyData in customIpyDataList: | 
|---|
|  |  |  | 
|---|
|  |  |  | customIDList.append(dataID) | 
|---|
|  |  |  | if customIpyData.GetOpenServerDay() == openServerDay: | 
|---|
|  |  |  | todayCustomIDList.append(dataID) | 
|---|
|  |  |  | isCustom = True | 
|---|
|  |  |  | dailyTimeInfoList.append([isCustom, customIpyData.GetOpenTimeList(), customIpyData]) | 
|---|
|  |  |  | GameWorld.Log("    增加本日日常活动信息: isCustom=%s,dailyID=%s,dataID=%s" % (isCustom, dailyID, dataID)) | 
|---|
|  |  |  | GameWorld.Log("    本周定制的日常配置表ID列表: %s" % (customIDList)) | 
|---|
|  |  |  | GameWorld.Log("    本周定制的日常活动ID列表: %s" % (customDailyIDList)) | 
|---|
|  |  |  | GameWorld.Log("    今天定制的日常表ID列表=%s" % (todayCustomIDList)) | 
|---|
|  |  |  | customType = 1 | 
|---|
|  |  |  | dailyTimeInfoList.append([customType, customIpyData.GetOpenTimeList(), customIpyData]) | 
|---|
|  |  |  | GameWorld.Log("    增加本日开服日常活动信息: customType=%s,dailyID=%s,dataID=%s" % (customType, dailyID, dataID)) | 
|---|
|  |  |  | GameWorld.Log("    本周定制的开服日常配置表ID列表: %s" % (customIDList)) | 
|---|
|  |  |  | GameWorld.Log("    本周定制的开服日常活动ID列表: %s" % (customDailyIDList)) | 
|---|
|  |  |  | GameWorld.Log("    今天定制的开服日常表ID列表=%s" % (todayCustomIDList)) | 
|---|
|  |  |  | elif isMixServer and mixServerDay <= maxCustomServerDayMix: | 
|---|
|  |  |  | todayCustomIDList = [] # 今天定制的数据表ID | 
|---|
|  |  |  | ipyDataMgr = IpyGameDataPY.IPY_Data() | 
|---|
|  |  |  | for i in xrange(ipyDataMgr.GetDailyActionCustomMixCount()): | 
|---|
|  |  |  | customIpyData = ipyDataMgr.GetDailyActionCustomMixByIndex(i) | 
|---|
|  |  |  | dataID = customIpyData.GetID() | 
|---|
|  |  |  | dailyID = customIpyData.GetDailyID() | 
|---|
|  |  |  | if dailyID not in customDailyIDList: | 
|---|
|  |  |  | customDailyIDList.append(dailyID) | 
|---|
|  |  |  | if customIpyData.GetMixServerDay() == mixServerDay: | 
|---|
|  |  |  | todayCustomIDList.append(dataID) | 
|---|
|  |  |  | customType = 2 | 
|---|
|  |  |  | dailyTimeInfoList.append([customType, customIpyData.GetOpenTimeList(), customIpyData]) | 
|---|
|  |  |  | GameWorld.Log("    增加本日合服日常活动信息: customType=%s,dailyID=%s,dataID=%s" % (customType, dailyID, dataID)) | 
|---|
|  |  |  | GameWorld.Log("    定制的合服日常活动ID列表: %s" % (customDailyIDList)) | 
|---|
|  |  |  | GameWorld.Log("    今天定制的合服日常表ID列表=%s" % (todayCustomIDList)) | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | GameWorld.Log("    超过最大定制开服天,不定制,走常规日常配置!") | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | GameWorld.Log("    不是日常活动开启星期: dailyID=%s,openWeekLimit=%s" % (dailyID, openTimeDict.keys())) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | openTimeList = openTimeDict["0"] if "0" in openTimeDict else openTimeDict[weekDay] | 
|---|
|  |  |  | dailyTimeInfoList.append([False, openTimeList, dailyIpyData]) | 
|---|
|  |  |  | customType = 0 | 
|---|
|  |  |  | dailyTimeInfoList.append([customType, openTimeList, dailyIpyData]) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.Log("    -----------------------") | 
|---|
|  |  |  | for isCustom, openTimeList, ipyData in dailyTimeInfoList: | 
|---|
|  |  |  | for customType, openTimeList, ipyData in dailyTimeInfoList: | 
|---|
|  |  |  | dailyID = ipyData.GetDailyID() | 
|---|
|  |  |  | notifyInfoDict = ipyData.GetNotifyInfo() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | notifyDict[(notifyDateTime.hour, notifyDateTime.minute)] = notifyInfo | 
|---|
|  |  |  |  | 
|---|
|  |  |  | todayActionInfo.append([dailyID, openList, overList, goonStateDict, notifyDict]) | 
|---|
|  |  |  | GameWorld.Log("    增加本日日常活动信息: isCustom=%s,dailyID=%s,openList=%s,overList=%s,goonStateDict=%s,notifyDict=%s" | 
|---|
|  |  |  | % (int(isCustom), dailyID, openList, overList, goonStateDict, notifyDict)) | 
|---|
|  |  |  | GameWorld.Log("    增加本日限时日常活动信息: customType=%s,dailyID=%s,openList=%s,overList=%s,goonStateDict=%s,notifyDict=%s" | 
|---|
|  |  |  | % (customType, dailyID, openList, overList, goonStateDict, notifyDict)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TodayDailyActionInfo = IpyGameDataPY.SetConfigEx(key, [openServerDay, todayActionInfo]) | 
|---|
|  |  |  | GameWorld.Log("本日日常活动信息加载完毕!") | 
|---|
|  |  |  | TodayDailyActionInfo = IpyGameDataPY.SetConfigEx(key, [loadSign, todayActionInfo]) | 
|---|
|  |  |  | GameWorld.Log("本日日常活动信息加载完毕! loadSign=%s" % loadSign) | 
|---|
|  |  |  | GameWorld.Log("=============================================================") | 
|---|
|  |  |  | return TodayDailyActionInfo[1] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | PlayerControl.WorldNotify(0, notifyKey, paramList) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | dictName = ShareDefine.Def_Notify_WorldKey_DailyActionState % dailyActionID | 
|---|
|  |  |  | if gameWorld.GetDictByKey(dictName) == state: | 
|---|
|  |  |  | beforeState = gameWorld.GetDictByKey(dictName) | 
|---|
|  |  |  | if beforeState == state: | 
|---|
|  |  |  | #已经是这个状态了 | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | # 骑宠争夺活动开始前同步有效人数到地图 | 
|---|
|  |  |  | if dailyActionID == ShareDefine.DailyActionID_FamilyRobBoss: | 
|---|
|  |  |  | GameWorldBoss.SyncMapServer_HorsePetRobBossPlayerCount() | 
|---|
|  |  |  | GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ActionBossRebornSign % dailyActionID, int(time.time())) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #通知Mapserver,设置字典 | 
|---|
|  |  |  | GameWorld.SendMapServerMsgEx(dictName, state) | 
|---|
|  |  |  | #更新字典值 | 
|---|
|  |  |  | gameWorld.SetDict(dictName, state) | 
|---|
|  |  |  | GameWorld.Log("日常活动状态变更: dailyActionID=%s,state=%s,dictName=%s" % (dailyActionID, state, dictName)) | 
|---|
|  |  |  | __DoLogic_GameServer_ActionState(dictName, state) | 
|---|
|  |  |  | __DoLogic_GameServer_ActionState(dictName, state, beforeState) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | FBStateEndTimeNotResetIDList.append(dataID) | 
|---|
|  |  |  | FBStateEndTimeNotResetIDList.sort() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 加载定制表 | 
|---|
|  |  |  | # 加载开服定制表 | 
|---|
|  |  |  | customStateTimeDict = {} | 
|---|
|  |  |  | for i in xrange(ipyDataMgr.GetFBStateTimeCustomCount()): | 
|---|
|  |  |  | customIpyData = ipyDataMgr.GetFBStateTimeCustomByIndex(i) | 
|---|
|  |  |  | 
|---|
|  |  |  | FBStateEndTimeNotResetCustomIDList.append(dataID) | 
|---|
|  |  |  | FBStateEndTimeNotResetCustomIDList.sort() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | notResetIDList = IpyGameDataPY.SetConfigEx(key, [FBStateEndTimeNotResetIDList, FBStateEndTimeNotResetCustomIDList]) | 
|---|
|  |  |  | # 加载合服定制表 | 
|---|
|  |  |  | customMixStateTimeDict = {} | 
|---|
|  |  |  | for i in xrange(ipyDataMgr.GetFBStateTimeCustomMixCount()): | 
|---|
|  |  |  | customIpyData = ipyDataMgr.GetFBStateTimeCustomMixByIndex(i) | 
|---|
|  |  |  | dataID = customIpyData.GetID() | 
|---|
|  |  |  | dataMapID = customIpyData.GetDataMapID() | 
|---|
|  |  |  | openMixDay = customIpyData.GetMixServerDay() | 
|---|
|  |  |  | startHour, startMinute = customIpyData.GetStartHour(), customIpyData.GetStartMinute() | 
|---|
|  |  |  | endHour, endMinute = customIpyData.GetEndHour(), customIpyData.GetEndMinute() | 
|---|
|  |  |  | startTimeList, endTimeDict = customMixStateTimeDict.get(dataMapID, [[], {}]) | 
|---|
|  |  |  | startTimeList.append([openMixDay, startHour, startMinute]) | 
|---|
|  |  |  | endTimeDict[dataID] = [openMixDay, endHour, endMinute] | 
|---|
|  |  |  | customMixStateTimeDict[dataMapID] = [startTimeList, endTimeDict] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | FBStateEndTimeNotResetCustomMixIDList = [] | 
|---|
|  |  |  | for dataMapID, timeInfo in customMixStateTimeDict.items(): | 
|---|
|  |  |  | startTimeList, endTimeDict = timeInfo | 
|---|
|  |  |  | for dataID, endTime in endTimeDict.items(): | 
|---|
|  |  |  | # 结束时间属于某一条的开启时间,则不重置,具体状态由另一条决定 | 
|---|
|  |  |  | if endTime in startTimeList: | 
|---|
|  |  |  | FBStateEndTimeNotResetCustomMixIDList.append(dataID) | 
|---|
|  |  |  | FBStateEndTimeNotResetCustomMixIDList.sort() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | notResetIDList = IpyGameDataPY.SetConfigEx(key, [FBStateEndTimeNotResetIDList, FBStateEndTimeNotResetCustomIDList, FBStateEndTimeNotResetCustomMixIDList]) | 
|---|
|  |  |  | GameWorld.Log("加载副本状态结束时间不需要重置状态值的数据ID列表:") | 
|---|
|  |  |  | GameWorld.Log("    不需要重置的常规ID: %s" % FBStateEndTimeNotResetIDList) | 
|---|
|  |  |  | GameWorld.Log("    不需要重置的定制ID: %s" % FBStateEndTimeNotResetCustomIDList) | 
|---|
|  |  |  | GameWorld.Log("    不需要重置的常规常规ID: %s" % FBStateEndTimeNotResetIDList) | 
|---|
|  |  |  | GameWorld.Log("    不需要重置的开服定制ID: %s" % FBStateEndTimeNotResetCustomIDList) | 
|---|
|  |  |  | GameWorld.Log("    不需要重置的合服定制ID: %s" % FBStateEndTimeNotResetCustomMixIDList) | 
|---|
|  |  |  | return notResetIDList | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def __GetTodayFBStateTimeInfo(): | 
|---|
|  |  |  | key = "TodayFBStateTimeInfo" | 
|---|
|  |  |  | openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 | 
|---|
|  |  |  | isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer) | 
|---|
|  |  |  | mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) + 1 | 
|---|
|  |  |  | loadSign = [openServerDay, isMixServer, mixServerDay] | 
|---|
|  |  |  | TodayFBStateTimeInfo = IpyGameDataPY.GetConfigEx(key) | 
|---|
|  |  |  | if TodayFBStateTimeInfo and TodayFBStateTimeInfo[0] == openServerDay: | 
|---|
|  |  |  | #GameWorld.DebugLog("已经加载过本日副本状态处理信息!openServerDay=%s" % openServerDay) | 
|---|
|  |  |  | if TodayFBStateTimeInfo and TodayFBStateTimeInfo[0] == loadSign: | 
|---|
|  |  |  | #GameWorld.DebugLog("已经加载过本日副本状态处理信息!loadSign=%s" % loadSign) | 
|---|
|  |  |  | return TodayFBStateTimeInfo[1] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 | 
|---|
|  |  |  | 
|---|
|  |  |  | GameWorld.ErrLog("获取开服是星期几数据错误!openServerWeekday=%s" % openServerWeekday) | 
|---|
|  |  |  | return [] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | curMaxCustomServerDay = MaxCustomServerDay - openServerWeekday + 1 # 最大有效定制开服天 | 
|---|
|  |  |  | curMaxCustomServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) - openServerWeekday + 1 # 最大有效定制开服天 | 
|---|
|  |  |  | maxCustomServerDayMix = IpyGameDataPY.GetFuncCfg("MixServer", 1) | 
|---|
|  |  |  | GameWorld.Log("===== 加载今天副本状态时间表 =====") | 
|---|
|  |  |  | GameWorld.Log("    开服是星期%s, 开服第%s天, 当前星期%s,%s点%s分 !" % (openServerWeekday, openServerDay, curWeekDay, curHour, curMinute)) | 
|---|
|  |  |  | GameWorld.Log("    最大有效定制开服天: %s" % (curMaxCustomServerDay)) | 
|---|
|  |  |  | GameWorld.Log("开服是星期%s, 开服第%s天, 当前星期%s,%s点%s分 !" % (openServerWeekday, openServerDay, curWeekDay, curHour, curMinute)) | 
|---|
|  |  |  | GameWorld.Log("最大有效定制开服天: %s" % (curMaxCustomServerDay)) | 
|---|
|  |  |  | GameWorld.Log("是否合服: %s, 合服天: %s, 最大定制合服天: %s" % (isMixServer, mixServerDay, maxCustomServerDayMix)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ipyDataMgr = IpyGameDataPY.IPY_Data() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | # 暂固定前2周定制有效, 为方便GM命令测试,这里用开服天做判断,不用开服周 | 
|---|
|  |  |  | if openServerDay <= curMaxCustomServerDay: | 
|---|
|  |  |  | customIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("FBStateTimeCustom", openServerWeekday) | 
|---|
|  |  |  | GameWorld.Log("    本周定制的副本活动条数: %s" % len(customIpyDataList)) | 
|---|
|  |  |  | if not customIpyDataList: | 
|---|
|  |  |  | customIpyDataList = [] | 
|---|
|  |  |  | GameWorld.Log("    本周定制的开服副本活动条数: %s" % len(customIpyDataList)) | 
|---|
|  |  |  | customIDList = [] # 本周定制的数据表ID | 
|---|
|  |  |  | todayCustomIDList = [] # 今天定制的数据表ID | 
|---|
|  |  |  | for customIpyData in customIpyDataList: | 
|---|
|  |  |  | 
|---|
|  |  |  | customIDList.append(dataID) | 
|---|
|  |  |  | if customIpyData.GetOpenServerDay() == openServerDay: | 
|---|
|  |  |  | todayCustomIDList.append(dataID) | 
|---|
|  |  |  | isCustom, startWeekDay, endWeekDay = True, curWeekDay, curWeekDay | 
|---|
|  |  |  | fbStateTimeInfoList.append([isCustom, startWeekDay, endWeekDay, customIpyData]) | 
|---|
|  |  |  | GameWorld.Log("    今天要处理的副本状态配置: 是否定制=%s,dataID=%s" % (isCustom, dataID)) | 
|---|
|  |  |  | GameWorld.Log("    本周定制的配置表ID列表: %s" % (customIDList)) | 
|---|
|  |  |  | GameWorld.Log("    本周定制的副本地图列表: %s" % (customMapIDList)) | 
|---|
|  |  |  | GameWorld.Log("    今天定制的表ID列表=%s" % (todayCustomIDList)) | 
|---|
|  |  |  | customType, startWeekDay, endWeekDay = 1, curWeekDay, curWeekDay | 
|---|
|  |  |  | fbStateTimeInfoList.append([customType, startWeekDay, endWeekDay, customIpyData]) | 
|---|
|  |  |  | GameWorld.Log("    今天要处理的开服副本状态配置: customType=%s,dataID=%s" % (customType, dataID)) | 
|---|
|  |  |  | GameWorld.Log("    本周定制的开服副本表ID列表: %s" % (customIDList)) | 
|---|
|  |  |  | GameWorld.Log("    本周定制的开服副本地图列表: %s" % (customMapIDList)) | 
|---|
|  |  |  | GameWorld.Log("    今天定制的开服副本表ID列表=%s" % (todayCustomIDList)) | 
|---|
|  |  |  | elif isMixServer and mixServerDay <= maxCustomServerDayMix: | 
|---|
|  |  |  | todayCustomIDList = [] # 今天定制的数据表ID | 
|---|
|  |  |  | ipyDataMgr = IpyGameDataPY.IPY_Data() | 
|---|
|  |  |  | for i in xrange(ipyDataMgr.GetFBStateTimeCustomMixCount()): | 
|---|
|  |  |  | customIpyData = ipyDataMgr.GetFBStateTimeCustomMixByIndex(i) | 
|---|
|  |  |  | dataID = customIpyData.GetID() | 
|---|
|  |  |  | dataMapID = customIpyData.GetDataMapID() | 
|---|
|  |  |  | if dataMapID not in customMapIDList: | 
|---|
|  |  |  | customMapIDList.append(dataMapID) | 
|---|
|  |  |  | if customIpyData.GetMixServerDay() == mixServerDay: | 
|---|
|  |  |  | todayCustomIDList.append(dataID) | 
|---|
|  |  |  | customType, startWeekDay, endWeekDay = 2, curWeekDay, curWeekDay | 
|---|
|  |  |  | fbStateTimeInfoList.append([customType, startWeekDay, endWeekDay, customIpyData]) | 
|---|
|  |  |  | GameWorld.Log("    今天要处理的合服副本状态配置: customType=%s,dataID=%s" % (customType, dataID)) | 
|---|
|  |  |  | GameWorld.Log("    定制的合服副本地图列表: %s" % (customMapIDList)) | 
|---|
|  |  |  | GameWorld.Log("    今天定制的合服副本表ID列表=%s" % (todayCustomIDList)) | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | GameWorld.Log("    超过最大定制开服天,不定制,走常规副本状态时间!") | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | GameWorld.Log("    dataID=%s,dataMapID=%s, 在本周定制的副本地图列表里,不处理!" % (dataID, dataMapID)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | # 暂不支持跨天的活动 | 
|---|
|  |  |  | isCustom, startWeekDay, endWeekDay = False, fbStateTimeIpyData.GetStartWeekday(), fbStateTimeIpyData.GetStartWeekday() | 
|---|
|  |  |  | customType, startWeekDay, endWeekDay = 0, fbStateTimeIpyData.GetStartWeekday(), fbStateTimeIpyData.GetStartWeekday() | 
|---|
|  |  |  | if curWeekDay != startWeekDay: | 
|---|
|  |  |  | GameWorld.Log("    dataID=%s,dataMapID=%s, 不是本天的副本活动,不处理!curWeekDay=%s,startWeekDay=%s" | 
|---|
|  |  |  | GameWorld.Log("    dataID=%s,dataMapID=%s, 不是本天的副本活动,不处理! curWeekDay=%s,startWeekDay=%s" | 
|---|
|  |  |  | % (dataID, dataMapID, curWeekDay, startWeekDay)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | fbStateTimeInfoList.append([isCustom, startWeekDay, endWeekDay, fbStateTimeIpyData]) | 
|---|
|  |  |  | GameWorld.Log("    今天要处理的副本状态配置: 是否定制=%s,dataID=%s" % (isCustom, dataID)) | 
|---|
|  |  |  | fbStateTimeInfoList.append([customType, startWeekDay, endWeekDay, fbStateTimeIpyData]) | 
|---|
|  |  |  | GameWorld.Log("    今天要处理的副本状态配置: customType=%s,dataID=%s" % (customType, dataID)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | TodayFBStateTimeInfo = IpyGameDataPY.SetConfigEx(key, [openServerDay, fbStateTimeInfoList]) | 
|---|
|  |  |  | GameWorld.Log("本日副本活动状态信息加载完毕!") | 
|---|
|  |  |  | TodayFBStateTimeInfo = IpyGameDataPY.SetConfigEx(key, [loadSign, fbStateTimeInfoList]) | 
|---|
|  |  |  | GameWorld.Log("本日副本活动状态信息加载完毕! loadSign=%s" % loadSign) | 
|---|
|  |  |  | GameWorld.Log("=============================================================") | 
|---|
|  |  |  | return TodayFBStateTimeInfo[1] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def Dispose_FBStateTime(): | 
|---|
|  |  |  | ## 副本状态时间表状态处理, 支持 goon作用,开关服状态不受影响,服务器重新启动会自动变更为所有时间段的状态值 | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | FBStateEndTimeNotResetIDList, FBStateEndTimeNotResetCustomIDList = __GetFBStateEndTimeNotResetIDList() | 
|---|
|  |  |  | openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 | 
|---|
|  |  |  | FBStateEndTimeNotResetIDList, FBStateEndTimeNotResetCustomIDList, FBStateEndTimeNotResetCustomMixIDList = __GetFBStateEndTimeNotResetIDList() | 
|---|
|  |  |  | #openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 | 
|---|
|  |  |  | curDateTime = GameWorld.GetServerTime() | 
|---|
|  |  |  | curWeekDay, curHour, curMinute = curDateTime.weekday() + 1, curDateTime.hour, curDateTime.minute | 
|---|
|  |  |  |  | 
|---|
|  |  |  | curTimeWHM = curWeekDay * 10000 + curHour * 100 + curMinute | 
|---|
|  |  |  |  | 
|---|
|  |  |  | openServerWeekday = GameWorldProcess.GetOpenServerWeekday() # 服务器开服时是星期几 | 
|---|
|  |  |  | GameWorld.DebugLog("副本状态时间表状态处理...开服是星期%s, 开服第%s天, 当前星期%s,%s点%s分" | 
|---|
|  |  |  | % (openServerWeekday, openServerDay, curWeekDay, curHour, curMinute)) | 
|---|
|  |  |  | GameWorld.DebugLog("    FBStateEndTimeNotResetIDList=%s" % (FBStateEndTimeNotResetIDList)) | 
|---|
|  |  |  | GameWorld.DebugLog("    FBStateEndTimeNotResetCustomIDList=%s" % (FBStateEndTimeNotResetCustomIDList)) | 
|---|
|  |  |  | #openServerWeekday = GameWorldProcess.GetOpenServerWeekday() # 服务器开服时是星期几 | 
|---|
|  |  |  | #GameWorld.DebugLog("副本状态时间表状态处理...开服是星期%s, 开服第%s天, 当前星期%s,%s点%s分" | 
|---|
|  |  |  | #                   % (openServerWeekday, openServerDay, curWeekDay, curHour, curMinute)) | 
|---|
|  |  |  | #GameWorld.DebugLog("    FBStateEndTimeNotResetIDList=%s" % (FBStateEndTimeNotResetIDList)) | 
|---|
|  |  |  | #GameWorld.DebugLog("    FBStateEndTimeNotResetCustomIDList=%s" % (FBStateEndTimeNotResetCustomIDList)) | 
|---|
|  |  |  | #GameWorld.DebugLog("    FBStateEndTimeNotResetCustomMixIDList=%s" % (FBStateEndTimeNotResetCustomMixIDList)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | gameWorld = GameWorld.GetGameWorld() | 
|---|
|  |  |  | fbStateTimeInfoList = __GetTodayFBStateTimeInfo() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for isCustom, startWeekDay, endWeekDay, ipyData in fbStateTimeInfoList: | 
|---|
|  |  |  | for customType, startWeekDay, endWeekDay, ipyData in fbStateTimeInfoList: | 
|---|
|  |  |  | dataID = ipyData.GetID() | 
|---|
|  |  |  | dataMapID = ipyData.GetDataMapID() | 
|---|
|  |  |  | GameWorld.DebugLog("    isCustom=%s,dataID=%s,dataMapID=%s" % (isCustom, dataID, dataMapID)) | 
|---|
|  |  |  | #GameWorld.DebugLog("    customType=%s,dataID=%s,dataMapID=%s" % (customType, dataID, dataMapID)) | 
|---|
|  |  |  | startHour, startMinute = ipyData.GetStartHour(), ipyData.GetStartMinute() | 
|---|
|  |  |  | endHour, endMinute = ipyData.GetEndHour(), ipyData.GetEndMinute() | 
|---|
|  |  |  | # 星期配置0代表每天 | 
|---|
|  |  |  | 
|---|
|  |  |  | #GameWorld.DebugLog("        当前是开始时间!") | 
|---|
|  |  |  | # 是结束时间 | 
|---|
|  |  |  | elif curTimeWHM == endTimeWHM: | 
|---|
|  |  |  | if (isCustom and dataID not in FBStateEndTimeNotResetCustomIDList) or (not isCustom and dataID not in FBStateEndTimeNotResetIDList): | 
|---|
|  |  |  | if (customType == 1 and dataID not in FBStateEndTimeNotResetCustomIDList) \ | 
|---|
|  |  |  | or (customType == 2 and dataID not in FBStateEndTimeNotResetCustomMixIDList) \ | 
|---|
|  |  |  | or (not customType and dataID not in FBStateEndTimeNotResetIDList): | 
|---|
|  |  |  | isReset = True | 
|---|
|  |  |  | #GameWorld.DebugLog("        当前是结束时间! isReset=%s,FBStateEndTimeNotResetIDList=%s" % (isReset, FBStateEndTimeNotResetIDList)) | 
|---|
|  |  |  | # 结束时间是下周 | 
|---|
|  |  |  | 
|---|
|  |  |  | #    GameWorld.DebugLog("        副本可否进入已经是该值: dataMapID=%s,updCanEnter=%s,canEnterKey=%s" % (dataMapID, updCanEnter, canEnterKey)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | fbFuncStateKey = ShareDefine.Def_Notify_WorldKey_FBFuncState % dataMapID | 
|---|
|  |  |  | if gameWorld.GetDictByKey(fbFuncStateKey) != updStateValue: | 
|---|
|  |  |  | beforeState = gameWorld.GetDictByKey(fbFuncStateKey) | 
|---|
|  |  |  | if beforeState != updStateValue: | 
|---|
|  |  |  | GameWorld.SendMapServerMsgEx(fbFuncStateKey, updStateValue) #通知Mapserver,设置字典 | 
|---|
|  |  |  | gameWorld.SetDict(fbFuncStateKey, updStateValue) #更新字典值 | 
|---|
|  |  |  | GameWorld.Log("副本状态变更: dataMapID=%s,updStateValue=%s,fbFuncStateKey=%s" % (dataMapID, updStateValue, fbFuncStateKey)) | 
|---|
|  |  |  | __DoLogic_GameServer_ActionState(fbFuncStateKey, updStateValue) | 
|---|
|  |  |  | __DoLogic_GameServer_ActionState(fbFuncStateKey, updStateValue, beforeState) | 
|---|
|  |  |  | #else: | 
|---|
|  |  |  | #    GameWorld.DebugLog("        副本状态已经是该值: dataMapID=%s,updStateValue=%s,fbFuncStateKey=%s" % (dataMapID, updStateValue, fbFuncStateKey)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_FBOpenRecord, fbOpenRecord) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 处理重开服务器后, 活动继续开启逻辑根据天数 | 
|---|
|  |  |  | #  @param tick 当前时间 | 
|---|
|  |  |  | #  @return None | 
|---|
|  |  |  | def Dispose_Action_GoOn_ByDay(tick): | 
|---|
|  |  |  | #已固定在每整分钟触发,故暂不需要时间间隔控制 | 
|---|
|  |  |  | #if not GameWorld.SetWorldDictKey(ChConfig.TYPE_ActionOpenAndCloseByDayCountGoOn, tick): | 
|---|
|  |  |  | #    #间隔未到 | 
|---|
|  |  |  | #    return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if GameWorld.IsMergeServer(): | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Dispose_ActionGoOnByDayKey() | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 设定上次开启活动时间距离现在天数事件 | 
|---|
|  |  |  | #  @param None: | 
|---|
|  |  |  | #  @return: None | 
|---|
|  |  |  | def DoLogic_ServerLastOpenActionDay(): | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #是跨服服务器 | 
|---|
|  |  |  | if GameWorld.IsMergeServer(): | 
|---|
|  |  |  | if not PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MergeServerOpenActionDay): | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | PlayerDBGSEvent.SetDBGSTrig_ServerTime(PlayerDBGSEvent.Def_MergeServerOpenActionDay) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #通知子服务器天数 | 
|---|
|  |  |  | SendBroadcastMergeOpenActionDay() | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | DoLogic_ActionByDayKeyOnDay() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #上次开启活动时间距离现在天数 | 
|---|
|  |  |  | lastOpenActionDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerLastOpenActionDay) | 
|---|
|  |  |  | openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) | 
|---|
|  |  |  | initDayList = ReadChConfig.GetEvalChConfig('ActionControlByDayInitOpenServerDay') | 
|---|
|  |  |  | if openServerDay < initDayList[0]: | 
|---|
|  |  |  | #开服时间未超过30天 | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #新一轮活动从头开始 | 
|---|
|  |  |  | if lastOpenActionDay >= initDayList[1] or openServerDay == initDayList[2]: | 
|---|
|  |  |  | NewRingOpenActionDay() | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | PlayerDBGSEvent.SetDBGSTrig_ServerTime(PlayerDBGSEvent.Def_ServerLastOpenActionDay) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 新一轮活动开始 | 
|---|
|  |  |  | #  @param None: | 
|---|
|  |  |  | #  @return: | 
|---|
|  |  |  | def NewRingOpenActionDay(): | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #设置字典值从1开始, 跟SetDBGSTrig_ServerTime接口同步 | 
|---|
|  |  |  | PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerLastOpenActionDay, 1) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 活动天数重设 | 
|---|
|  |  |  | OpenActionDay_Reset() | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #------------------------------------------------------------------------------ | 
|---|
|  |  |  | ## 活动天数重设 | 
|---|
|  |  |  | #  @param None | 
|---|
|  |  |  | #  @return None | 
|---|
|  |  |  | def OpenActionDay_Reset(): | 
|---|
|  |  |  | # 设置国王战开始 | 
|---|
|  |  |  | #PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MergeWarStart, 1) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ### 检查key是否处理 | 
|---|
|  |  |  | #def __CheckIsProcessDictName(dictName): | 
|---|
|  |  |  | # | 
|---|
|  |  |  | #    # 非跨服服务器不处理某些key | 
|---|
|  |  |  | #    if dictName in [ShareDefine.Def_Notify_WorldKey_Merge_King] and not GameWorld.IsMergeServer(): | 
|---|
|  |  |  | #        return False | 
|---|
|  |  |  | # | 
|---|
|  |  |  | #    return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 当前时间与指定时间比较 | 
|---|
|  |  |  | #  @param curTime 当前服务器时间 | 
|---|
|  |  |  | #  @param timeInfo 指定时间 [[3,4(星期几)], 年,月,日,时,分] | 
|---|
|  |  |  | 
|---|
|  |  |  | ##处理GameServer活动状态 | 
|---|
|  |  |  | # @param dictName 字典名 | 
|---|
|  |  |  | # @param isOpen 是否开启 | 
|---|
|  |  |  | # @param beforeState 状态变更前的值,部分判断处理 | 
|---|
|  |  |  | # @return 返回值无意义 | 
|---|
|  |  |  | # @remarks | 
|---|
|  |  |  | def __DoLogic_GameServer_ActionState(dictName, isOpen): | 
|---|
|  |  |  | #=============================================================================================== | 
|---|
|  |  |  | # #领地争夺战 | 
|---|
|  |  |  | # if dictName == ShareDefine.Def_Notify_WorldKey_ManorWar: | 
|---|
|  |  |  | #    PlayerManorWar.ManorWar_ChangeState(isOpen) | 
|---|
|  |  |  | # #跨服boss | 
|---|
|  |  |  | # elif dictName == ShareDefine.Def_Notify_WorldKey_MergeBoss: | 
|---|
|  |  |  | #    GameWorldMergeBoss.MergeBoss_ChangeState(isOpen) | 
|---|
|  |  |  | # #跨服PK | 
|---|
|  |  |  | # elif dictName == ShareDefine.Def_Notify_WorldKey_Merge_PK: | 
|---|
|  |  |  | #    GameWorldMergePK.OnMergePKMatchStateChange(isOpen) | 
|---|
|  |  |  | # #跨服王者争霸 | 
|---|
|  |  |  | # elif dictName == ShareDefine.Def_Notify_WorldKey_Merge_King: | 
|---|
|  |  |  | #    GameWorldMergeKing.OnMergeKingStateChange(isOpen) | 
|---|
|  |  |  | # #答题活动 | 
|---|
|  |  |  | # elif dictName == ShareDefine.Def_Notify_WorldKey_Game_EXAM: | 
|---|
|  |  |  | #    PlayerExam.Exam_ChangeState(isOpen) | 
|---|
|  |  |  | # #特惠活动 | 
|---|
|  |  |  | # elif dictName in ShareDefine.TeHuiTypeKeyDict.values(): | 
|---|
|  |  |  | #    GameWorldActionTeHui.OnTeHuiActionChange(dictName, isOpen) | 
|---|
|  |  |  | # #商店状态变更 | 
|---|
|  |  |  | # elif dictName.startswith(ShareDefine.Def_Notify_WorldKey_ShopState[:-2]): | 
|---|
|  |  |  | #    GameWorldShopItem.OnShopStateChange(dictName, isOpen) | 
|---|
|  |  |  | #=============================================================================================== | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def __DoLogic_GameServer_ActionState(dictName, isOpen, beforeState=0): | 
|---|
|  |  |  | #仙盟宴会 | 
|---|
|  |  |  | if dictName == ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_FamilyParty: | 
|---|
|  |  |  | PlayerFamilyParty.FamilyPartyStateChange(isOpen) | 
|---|
|  |  |  | if dictName == ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyParty: | 
|---|
|  |  |  | PlayerFamilyParty.FamilyPartyStateChange(isOpen, beforeState) | 
|---|
|  |  |  | #仙盟联赛 | 
|---|
|  |  |  | elif dictName == ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_FamilyWar: | 
|---|
|  |  |  | GameWorldFamilyWar.OnFamilyWarStateChange(isOpen) | 
|---|
|  |  |  | 
|---|
|  |  |  | #骑宠争夺 | 
|---|
|  |  |  | elif dictName == ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyRobBoss: | 
|---|
|  |  |  | GameWorldBoss.OnHorsePetRobBossActionChange(isOpen) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #------------------------------------------------------------------------------ | 
|---|
|  |  |  | ## 通知子服务器天数 | 
|---|
|  |  |  | #  @param param: None | 
|---|
|  |  |  | #  @return: None | 
|---|
|  |  |  | def SendBroadcastMergeOpenActionDay(): | 
|---|
|  |  |  | mergeServerOpenActionDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MergeServerOpenActionDay) | 
|---|
|  |  |  | MergeBroadcast.SendBroadcastMerge(ChConfig.Def_MergeServerOpenActionDay, 0, {"Day":mergeServerOpenActionDay}) | 
|---|
|  |  |  | #跨服PK | 
|---|
|  |  |  | elif dictName == ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_CrossReamPK: | 
|---|
|  |  |  | CrossRealmPK.OnCrossRealmPKDailyActionStateChange(isOpen) | 
|---|
|  |  |  | #仙盟BOSS | 
|---|
|  |  |  | elif dictName in [ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_FamilyBoss1]: | 
|---|
|  |  |  | PlayerFamilyBoss.OnAllFamilyBossStateChange(isOpen) | 
|---|
|  |  |  | #骑宠BOSS | 
|---|
|  |  |  | elif dictName in [ShareDefine.Def_Notify_WorldKey_DailyActionState % ShareDefine.DailyActionID_HorsePetBoss]: | 
|---|
|  |  |  | PlayerHorsePetBoss.OnHorsePetBossStateChange(isOpen) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #------------------------------------------------------------------------------- | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 根据活动开启的活动事件OnDay | 
|---|
|  |  |  | #  @param None: | 
|---|
|  |  |  | #  @return: None | 
|---|
|  |  |  | def DoLogic_ActionByDayKeyOnDay(): | 
|---|
|  |  |  | openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) | 
|---|
|  |  |  | isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer) | 
|---|
|  |  |  | mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) | 
|---|
|  |  |  | repeatDayInfo = ReadChConfig.GetEvalChConfig('ActionControlByDayKeyRepeat') | 
|---|
|  |  |  | startRepeatOpenDay, startRepeatMixDay, repeatList = repeatDayInfo | 
|---|
|  |  |  | # 不是循环阶段 | 
|---|
|  |  |  | if openServerDay < startRepeatOpenDay or (isMixServer and mixServerDay < startRepeatMixDay): | 
|---|
|  |  |  | GameWorld.Log("没有正式进入周期循环,不处理!") | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Def_RepeatOrderKey = PlayerDBGSEvent.Def_TeHuiRepeatOrderKey | 
|---|
|  |  |  | Def_RepeatNumKey = PlayerDBGSEvent.Def_TeHuiRepeatNumKey | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 强制更新一次世界等级 | 
|---|
|  |  |  | GameWorldAverageLv.OpenWorldAverageLv() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | repeatOrder = PlayerDBGSEvent.GetDBGSTrig_ByKey(Def_RepeatOrderKey) | 
|---|
|  |  |  | repeatOrder = "" if not repeatOrder else str(repeatOrder) | 
|---|
|  |  |  | preRepeatNum = PlayerDBGSEvent.GetDBGSTrig_ByKey(Def_RepeatNumKey) | 
|---|
|  |  |  | preRepeatNum = "" if not preRepeatNum else str(preRepeatNum) | 
|---|
|  |  |  | worldAverageLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv) | 
|---|
|  |  |  | GameWorld.Log("处理周期循环: openServerDay=%s,isMixServer=%s,mixServerDay=%s" % (openServerDay, isMixServer, mixServerDay)) | 
|---|
|  |  |  | GameWorld.Log("    startRepeatOpenDay=%s,startRepeatMixDay=%s,repeatOrder=%s,preRepeatNum=%s,worldAverageLV=%s" | 
|---|
|  |  |  | % (startRepeatOpenDay, startRepeatMixDay, repeatOrder, preRepeatNum, worldAverageLV)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 开始循环 | 
|---|
|  |  |  | if openServerDay == startRepeatOpenDay or (isMixServer and mixServerDay == startRepeatMixDay): | 
|---|
|  |  |  | repeatOrder = "" | 
|---|
|  |  |  | for i, repeatInfo in enumerate(repeatList, 1): | 
|---|
|  |  |  | if i > 9: | 
|---|
|  |  |  | break | 
|---|
|  |  |  | needWorldAverageLV = repeatInfo[0] | 
|---|
|  |  |  | if worldAverageLV < needWorldAverageLV: | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | repeatOrder = "%s%s" % (repeatOrder, i) | 
|---|
|  |  |  | PlayerDBGSEvent.SetDBGSTrig_ByKey(Def_RepeatOrderKey, GameWorld.ToIntDef(repeatOrder)) | 
|---|
|  |  |  | GameWorld.Log("    开始循环, 生成循环编号顺序: %s" % repeatOrder) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 还没全部开始循环,则判断是否有动态新插入的循环 | 
|---|
|  |  |  | elif len(repeatOrder) < len(repeatList): | 
|---|
|  |  |  | GameWorld.Log("    还没全部开始循环,判断是否有动态新插入的循环..") | 
|---|
|  |  |  | for i, repeatInfo in enumerate(repeatList, 1): | 
|---|
|  |  |  | if i > 9: | 
|---|
|  |  |  | break | 
|---|
|  |  |  | if str(i) in repeatOrder: # 已经在循环里的不处理 | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | needWorldAverageLV = repeatInfo[0] | 
|---|
|  |  |  | if worldAverageLV < needWorldAverageLV: | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 插入新循环 | 
|---|
|  |  |  | if preRepeatNum in repeatOrder: | 
|---|
|  |  |  | insertIndex = repeatOrder.index(preRepeatNum) | 
|---|
|  |  |  | repeatOrder = repeatOrder[:insertIndex + 1] + str(i) + repeatOrder[insertIndex + 1:] | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | repeatOrder = str(i) | 
|---|
|  |  |  | PlayerDBGSEvent.SetDBGSTrig_ByKey(Def_RepeatOrderKey, GameWorld.ToIntDef(repeatOrder)) | 
|---|
|  |  |  | GameWorld.Log("        编号%s, needWorldAverageLV=%s,插入循环,更新循环编号顺序: %s" % (i, needWorldAverageLV, repeatOrder)) | 
|---|
|  |  |  | break | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if not repeatOrder: | 
|---|
|  |  |  | GameWorld.Log("    没有可循环的活动!") | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 进入下一天循环编号 | 
|---|
|  |  |  | if preRepeatNum and preRepeatNum in repeatOrder: | 
|---|
|  |  |  | nextRepeatIndex = repeatOrder.index(preRepeatNum) + 1 | 
|---|
|  |  |  | nextRepeatIndex = 0 if nextRepeatIndex >= len(repeatOrder) else nextRepeatIndex | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | nextRepeatIndex = 0 | 
|---|
|  |  |  | nextRepeatNum = GameWorld.ToIntDef(repeatOrder[nextRepeatIndex]) | 
|---|
|  |  |  | PlayerDBGSEvent.SetDBGSTrig_ByKey(Def_RepeatNumKey, nextRepeatNum) | 
|---|
|  |  |  | if nextRepeatNum <= 0 or nextRepeatNum > len(repeatList): | 
|---|
|  |  |  | GameWorld.Log("    下一个循环编号错误!nextRepeatNum=%s" % nextRepeatNum) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.Log("    过天变更循环活动状态, nextRepeatNum=%s" % nextRepeatNum) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | gameWorld = GameWorld.GetGameWorld() | 
|---|
|  |  |  | nextRepeatDict = repeatList[nextRepeatNum - 1][1] | 
|---|
|  |  |  | for dictName, signID in nextRepeatDict.items(): | 
|---|
|  |  |  | # 已经是这个值不处理 | 
|---|
|  |  |  | if gameWorld.GetDictByKey(dictName) == signID: | 
|---|
|  |  |  | #GameWorld.DebugLog("    已经是这个值不处理dictName=%s,signID=%s"  % (dictName,signID)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 默认当前的0点开始到当天的23点59分 | 
|---|
|  |  |  | curDay, beginDay, beginH, beginM, endDay, endH, endM = 0, 0, 0, 0, 0, 23, 59 | 
|---|
|  |  |  | __ChangeDA_ActionSign(gameWorld, dictName, signID, curDay, beginDay, beginH, beginM, endDay, endH, endM) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 处理重开服务器后, 活动继续开启逻辑根据天数key | 
|---|
|  |  |  | #  @param None | 
|---|
|  |  |  | #  @return None | 
|---|
|  |  |  | def Dispose_ActionGoOnByDayKey(): | 
|---|
|  |  |  | if GameWorld.IsMergeServer(): | 
|---|
|  |  |  | return | 
|---|
|  |  |  | GameWorld.DebugLog("处理特惠状态信息...") | 
|---|
|  |  |  | openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) | 
|---|
|  |  |  | isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer) | 
|---|
|  |  |  | mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) | 
|---|
|  |  |  | allActionGoOnInfo = ReadChConfig.GetEvalChConfig("ActionControlByDayKeyGoOn") | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if not isMixServer: | 
|---|
|  |  |  | __DoActionGoOnByDayKeyCheck(allActionGoOnInfo[0], openServerDay) | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | __DoActionGoOnByDayKeyCheck(allActionGoOnInfo[1], mixServerDay) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 按天开启可循环活动检查 | 
|---|
|  |  |  | #  @param controlList: | 
|---|
|  |  |  | #  @return: None | 
|---|
|  |  |  | def __DoActionGoOnByDayKeyCheck(goOnList, curDay): | 
|---|
|  |  |  | curTime = GameWorld.GetServerTime() | 
|---|
|  |  |  | gameWorld = GameWorld.GetGameWorld() | 
|---|
|  |  |  | for goOnControl in goOnList: | 
|---|
|  |  |  | beginDay, beginH, beginM = goOnControl[0] | 
|---|
|  |  |  | endDay, endH, endM = goOnControl[1] | 
|---|
|  |  |  | if curDay < beginDay or curDay > endDay: | 
|---|
|  |  |  | #活动不在这一时间段 | 
|---|
|  |  |  | #GameWorld.DebugLog("活动不在这一时间段curDay=%s < beginDay=%s or curDay > endDay=%s" | 
|---|
|  |  |  | #                   % (curDay,beginDay,endDay)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | dictName = goOnControl[2]  # 字典名 | 
|---|
|  |  |  | signID = goOnControl[3]  # 标记 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 已经是这个值不处理 | 
|---|
|  |  |  | if gameWorld.GetDictByKey(dictName) == signID: | 
|---|
|  |  |  | #GameWorld.DebugLog("已经是这个值不处理dictName=%s,signID=%s"  % (dictName,signID)) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | beginTime = ['-', '-', '-', '-', beginH, beginM] | 
|---|
|  |  |  | endTime = ['-', '-', '-', '-', endH, endM] | 
|---|
|  |  |  | #还没开始 | 
|---|
|  |  |  | if curDay == beginDay and CompareActTime(curTime, beginTime) == ChConfig.Def_Cmp_Lower: | 
|---|
|  |  |  | #GameWorld.DebugLog("还没开始...") | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #已经结束 | 
|---|
|  |  |  | if curDay == endDay and CompareActTime(curTime, endTime) == ChConfig.Def_Cmp_Greater: | 
|---|
|  |  |  | #GameWorld.DebugLog("已经结束...") | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | __ChangeDA_ActionSign(gameWorld, dictName, signID, curDay, beginDay, beginH, beginM, endDay, endH, endM) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def __ChangeDA_ActionSign(gameWorld, dictName, signID, curDay, beginDay, beginH, beginM, endDay, endH, endM): | 
|---|
|  |  |  | # 计算开始及结束日期 | 
|---|
|  |  |  | beginTime, endTime = GetBeginEndTimeByDay(dictName, curDay, beginDay, beginH, beginM, endDay, endH, endM) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | actionID = int(time.time()) | 
|---|
|  |  |  | GameWorld.Log('活动状态变更: dictName=%s,signID=%s,beginTime=%s,endTime=%s,actionID=%s' | 
|---|
|  |  |  | % (dictName, signID, beginTime, endTime, actionID)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #潜规则:在ChConfig活动相关设置中,提取了字典名 | 
|---|
|  |  |  | gameWorld.SetDict(dictName, signID) | 
|---|
|  |  |  | gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_DayAction_BeginTime % dictName, beginTime) | 
|---|
|  |  |  | gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_DayAction_EndTime % dictName, endTime) | 
|---|
|  |  |  | # 标记活动唯一id | 
|---|
|  |  |  | actionIDKey = ShareDefine.Def_Notify_WorldKey_DayAction_ID % dictName | 
|---|
|  |  |  | gameWorld.SetDict(actionIDKey, actionID) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #通知Mapserver,设置字典 | 
|---|
|  |  |  | GameWorld.SendMapServerMsgEx(actionIDKey, actionID) | 
|---|
|  |  |  | GameWorld.SendMapServerMsgEx(dictName, signID) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #处理GameServer活动逻辑 | 
|---|
|  |  |  | __DoLogic_GameServer_ActionState(dictName, signID) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 获取开启结束时间 | 
|---|
|  |  |  | #  @param tick | 
|---|
|  |  |  | #  @return None | 
|---|
|  |  |  | def GetBeginEndTimeByDay(dictName, curDay, beginDay, beginH, beginM, endDay, endH, endM): | 
|---|
|  |  |  | beginDiffDays = max(0, curDay - beginDay) | 
|---|
|  |  |  | beginDateTime = GameWorld.GetDatetimeBySubDays(beginDiffDays) | 
|---|
|  |  |  | beginDateTimeStr = str(beginDateTime).split(".")[0] | 
|---|
|  |  |  | beginDateTimeStr = "%s %02d:%02d:00" % (beginDateTimeStr[:10], beginH, beginM) | 
|---|
|  |  |  | beginTimeNum = GameWorld.ChangeTimeStrToNum(beginDateTimeStr, ChConfig.TYPE_Time_Format) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | endDiffDays = max(0, endDay - curDay) | 
|---|
|  |  |  | endDateTime = GameWorld.GetDatetimeByDiffDays(endDiffDays) | 
|---|
|  |  |  | endDateTimeStr = str(endDateTime).split(".")[0] | 
|---|
|  |  |  | endDateTimeStr = "%s %02d:%02d:59" % (endDateTimeStr[:10], endH, endM) | 
|---|
|  |  |  | endTimeNum = GameWorld.ChangeTimeStrToNum(endDateTimeStr, ChConfig.TYPE_Time_Format) | 
|---|
|  |  |  | return beginTimeNum, endTimeNum | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|