From 38904391ac59bc51133e66b9b5150c6b5db46ec4 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 08 十月 2019 17:58:00 +0800 Subject: [PATCH] 8301 【恺英】【后端】仙缘币货币调整(改为给灵石,刷新召唤改为消耗灵石) --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py | 790 +++++++++++++++++++++++++------------------------------- 1 files changed, 350 insertions(+), 440 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py index 6a71b4a..3f3a36e 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py @@ -20,35 +20,31 @@ 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 +import PlayerStore from types import IntType import time #--------------------------------------------------------------------- - -MaxCustomServerDay = 14 # 最大定制开服天数 #年月日时间格式 Time_YmdFormat = ChConfig.TYPE_Time_YmdFormat @@ -80,12 +76,24 @@ 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(): @@ -114,11 +122,13 @@ 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 @@ -127,20 +137,25 @@ 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 # 定制运营活动最大开服天 + 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 = __GetOperationActionDisableWeekIpyDataInfo(curDateTime, curServerActIpyDataList) needStartList = [] # [startDateTime, ...] needEndList = [] # [endDateTime, ...] needNotifyDict = {} # {notifyDateTime:[notifyKey, [参数]], ...} @@ -148,11 +163,25 @@ # 注意:每个活动配置会有多个活动时间点,但是有且只能生效一条活动配置,换句话说就是每个活动配置时间不允许交叉 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) @@ -165,11 +194,52 @@ 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)) + elif 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)) + elif actName not in ShareDefine.FeastOperationActionNameList: + if 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 curServerOpenDateTime <= curStartDateTime <= customMaxServerDateTime: + GameWorld.Log(" 按日期开的开始日期在开服定制限制天内,不处理! cfgID=%s,curServerOpenDateTime=%s<=curStartDateTime=%s<=customMaxServerDateTime=%s" % (cfgID, curServerOpenDateTime, curStartDateTime, customMaxServerDateTime)) + continue - elif openServerDay <= customMaxServerDay: - GameWorld.Log(" 按日期开的在开服定制限制天内,不处理! cfgID=%s,%s ~ %s,openServerDay=%s" % (cfgID, startDateStr, endDateStr, openServerDay)) - continue - + if isMixServer: + if 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 mixStartServerDateTime <= curStartDateTime <= customMaxServerDateTime: + 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() @@ -179,7 +249,7 @@ notifyInfoDictStart = ipyData.GetNotifyInfoStart() if hasattr(ipyData, "GetNotifyInfoStart") else {} notifyInfoDictEnd = ipyData.GetNotifyInfoEnd() if hasattr(ipyData, "GetNotifyInfoEnd") else {} - notifyInfoLoopInfo = ipyData.GetNotifyInfoLoop() if hasattr(ipyData, "GetNotifyInfoLoop") else {} # [循环分钟, 广播key] + notifyInfoLoopInfo = ipyData.GetNotifyInfoLoop() if hasattr(ipyData, "GetNotifyInfoLoop") else {} # [循环分钟, 广播key, [广播参数列表可选]] if len(startHMStrList) != len(endHMStrList): GameWorld.ErrLog(" 活动配置开始及结束时间个数不匹配! actName=%s,cfgID=%s,startHMStrList=%s,endHMStrList=%s" @@ -190,6 +260,9 @@ if resetType == 1: startDayDate = datetime.datetime.strptime("%s 05:00:00" % (startDateStr), ChConfig.TYPE_Time_Format) endDayDate = datetime.datetime.strptime("%s 05:00:00" % (endDateStr), ChConfig.TYPE_Time_Format) # 结束日期5点 + elif resetType == 2: + startDayDate = datetime.datetime.strptime("%s 05:00:00" % (startDateStr), ChConfig.TYPE_Time_Format) + endDayDate = datetime.datetime.strptime("%s 00:00:00" % (endDateStr), ChConfig.TYPE_Time_Format) + datetime.timedelta(days=1) # 结束日期隔天0点 else: startDayDate = datetime.datetime.strptime("%s 00:00:00" % (startDateStr), ChConfig.TYPE_Time_Format) endDayDate = datetime.datetime.strptime("%s 00:00:00" % (endDateStr), ChConfig.TYPE_Time_Format) + datetime.timedelta(days=1) # 结束日期隔天0点 @@ -206,6 +279,7 @@ isActivity = False # 有需要处理开关时间的(开始、结束) isNotify = False isAdvanceNotice = False + isEnd = False # 没配置时分的代表全天, 只要开始或结束时分没配都算 if not startHMStrList or not endHMStrList: startDateTime = startDayDate @@ -218,10 +292,12 @@ needStartList.append(startDateTime) needEndList.append(endDateTime) isActivity = True + isEnd = (curDateTime == endDayDate) # 每天按时段开启的,支持多时段 - else: - if startDayDate <= curDateTime <= endDayDate: + elif startDayDate <= curDateTime <= endDayDate: + isEnd = (curDateTime == endDayDate) + if not isEnd: for hmIndex, startHMStr in enumerate(startHMStrList): endHMStr = endHMStrList[hmIndex] # 每天开的, 实际开关时间只取今天的日期; 这里有个问题,全服广播的时间不是今天的, 暂不做支持,之后真有这种需求再说 @@ -264,9 +340,10 @@ isNotify = True # 广播 - 循环广播 - if notifyInfoLoopInfo and len(notifyInfoLoopInfo) == 2: - loopMinutes, loopNotifyKey = notifyInfoLoopInfo - notifyInfo = [loopNotifyKey, []] # 循环广播的默认无参数,不做支持 + if notifyInfoLoopInfo and len(notifyInfoLoopInfo) >= 2: + loopMinutes, loopNotifyKey = notifyInfoLoopInfo[:2] + loopNotifyParamList = notifyInfoLoopInfo[2] if len(notifyInfoLoopInfo) > 2 else [] + notifyInfo = [loopNotifyKey, loopNotifyParamList] # 循环广播的默认无参数 loopCount, loopMaxCount = 0, 100 while loopMinutes and loopNotifyKey and loopCount < loopMaxCount: loopCount += 1 @@ -288,12 +365,15 @@ if not isActivity and not isNotify and not isAdvanceNotice: continue - GameWorld.Log(" 需要处理的运营活动信息: cfgID=%s,isAdvanceNotice=%s,isActivity=%s,isNotify=%s" % (cfgID, isAdvanceNotice, isActivity, isNotify)) - # 当天有需要激活活动或者提前预告活动的取开始时间较早的为准 + GameWorld.Log(" 需要处理的运营活动信息: cfgID=%s,isAdvanceNotice=%s,isActivity=%s,isEnd=%s,isNotify=%s" % (cfgID, isAdvanceNotice, isActivity, isEnd, isNotify)) + # 当天有需要激活活动或者提前预告活动的取非结束的为准,如果有多个非结束的一般就是策划在活动时间上配置交叉,这种是不允许的 if isActivity or isAdvanceNotice: - if not activityIpyData or ipyData.GetStartDate() < activityIpyData.GetStartDate(): + 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 @@ -329,42 +409,79 @@ 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(curDateTime, curServerActIpyDataList): + ## 获取不可用的按星期X开启的配置数据信息,按星期X开启的 活动优先级小于按日期的,当有重叠时以日期的为准 + disableWeekIpyDataInfo = {} + curWeekday = curDateTime.weekday() + 1 # 今天星期几, 1代表星期1 + + weekIpyDataList, ymdIpyDatList = [], [] + for ipyData in curServerActIpyDataList: + startDateStr = ipyData.GetStartDate() + endDateStr = ipyData.GetEndDate() + if startDateStr.isdigit() or startDateStr.startswith("Mix"): + # 开服天、合服天的不处理 + 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: + ymdCfgID = ymdIpyData.GetCfgID() + disableWeekIpyDataInfo[cfgID] = [startWeekDate, endWeekDate, ymdCfgID, ymdStartDate, ymdEndDate] + + return disableWeekIpyDataInfo def Dispose_OperationActionState(reloadRefresh=False): # 运营活动状态处理, 每天0点会强制同步当天的运营活动详情到地图服务器 @@ -423,7 +540,8 @@ 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: #记录开启时世界等级 @@ -437,10 +555,19 @@ 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 @@ -460,9 +587,19 @@ 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_FeastRedPacket: + if isReload and ipyData: + PlayerFamilyRedPacket.Sync_FeastRedPacket(ipyData) + #通知Mapserver,设置字典 #GameWorld.SendMapServerMsgEx(dictName, state) # 运营活动不单独通知活动状态,需与活动信息整合后一起通知 @@ -517,6 +654,7 @@ 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() @@ -536,9 +674,12 @@ # 获取本日待处理的日常活动信息 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 = [] @@ -549,17 +690,21 @@ 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: @@ -570,12 +715,28 @@ 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(" 超过最大定制开服天,不定制,走常规日常配置!") @@ -603,10 +764,11 @@ 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() @@ -641,11 +803,11 @@ 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] @@ -694,7 +856,8 @@ 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 @@ -708,7 +871,7 @@ #更新字典值 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 @@ -755,7 +918,7 @@ FBStateEndTimeNotResetIDList.append(dataID) FBStateEndTimeNotResetIDList.sort() - # 加载定制表 + # 加载开服定制表 customStateTimeDict = {} for i in xrange(ipyDataMgr.GetFBStateTimeCustomCount()): customIpyData = ipyDataMgr.GetFBStateTimeCustomByIndex(i) @@ -778,18 +941,45 @@ 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 @@ -801,10 +991,12 @@ 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() @@ -813,7 +1005,9 @@ # 暂固定前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: @@ -824,12 +1018,28 @@ 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(" 超过最大定制开服天,不定制,走常规副本状态时间!") @@ -843,43 +1053,43 @@ 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代表每天 @@ -912,7 +1122,9 @@ #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)) # 结束时间是下周 @@ -944,11 +1156,12 @@ # 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)) @@ -1037,87 +1250,6 @@ 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(星期几)], 年,月,日,时,分] @@ -1175,36 +1307,13 @@ ##处理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) @@ -1217,215 +1326,16 @@ #骑宠争夺 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 - - -- Gitblit v1.8.0