From 215a4edca77b43f1a60cf43c07049eb0a133d43a Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 13 二月 2019 14:42:06 +0800 Subject: [PATCH] Merge branch 'master' of http://192.168.0.87:10010/r/SnxxServerCode --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py | 269 ++++++++--------------------------------------------- 1 files changed, 44 insertions(+), 225 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py index 60050fd..8954560 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py @@ -36,7 +36,10 @@ import PlayerXMZZ import PlayerFamilySWRH import GameWorldBoss +import PlayerFamilyRedPacket import PlayerFairyCeremony +import PlayerNewFairyCeremony +import PlayerUniversalGameRec import GameWorldProcess import ChPyNetSendPack import NetPackCommon @@ -76,12 +79,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(): @@ -161,7 +176,7 @@ 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: + elif actName not in ShareDefine.FeastOperationActionNameList: if openServerDay <= customMaxServerDay: GameWorld.Log(" 按日期开的在开服定制限制天内,不处理! cfgID=%s,%s ~ %s,openServerDay=%s" % (cfgID, startDateStr, endDateStr, openServerDay)) continue @@ -341,6 +356,10 @@ def __GetOperationActionServerIpyDataList(ipyDataMgr, serverID, actName): ## 获取运营活动本服务器对应的配置数据列表 + if not hasattr(ipyDataMgr, "Get%sCount" % actName): + GameWorld.ErrLog("没有该运营活动类型对应活动时间表! actName=%s" % actName) + return [] + # 所有配置先按活动标识归组 platform = GameWorld.GetPlatform() actGroupDict = {} # {ActMark:{ServerIDTuple:[ipyData, ...], ...}, ...} @@ -437,7 +456,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: #记录开启时世界等级 @@ -451,10 +471,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 @@ -474,13 +503,18 @@ 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) # 运营活动不单独通知活动状态,需与活动信息整合后一起通知 @@ -1057,21 +1091,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.IsCrossServer(): - return - - Dispose_ActionGoOnByDayKey() - return - ## 当前时间与指定时间比较 # @param curTime 当前服务器时间 # @param timeInfo 指定时间 [[3,4(星期几)], 年,月,日,时,分] @@ -1168,203 +1187,3 @@ 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.IsCrossServer(): - 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