From 794d31c3d9615701ef8f04a199417737ddf60bd7 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期五, 11 一月 2019 09:59:57 +0800
Subject: [PATCH] 5762 子 【开发】【1.5】新增300级后的成长基金 / 【后端】【1.5】新增300级后的成长基金
---
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py | 166 ++++++++++++++++++-------------------------------------
1 files changed, 54 insertions(+), 112 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
index 2da65a4..60050fd 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
@@ -25,14 +25,11 @@
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
@@ -43,12 +40,11 @@
import GameWorldProcess
import ChPyNetSendPack
import NetPackCommon
+import PlayerStore
from types import IntType
import time
#---------------------------------------------------------------------
-
-MaxCustomServerDay = 14 # 最大定制开服天数
#年月日时间格式
Time_YmdFormat = ChConfig.TYPE_Time_YmdFormat
@@ -127,7 +123,7 @@
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) # 定制运营活动最大开服天
operationActionDict = {}
mapServerOperationActionDict = {}
serverID = GameWorld.GetServerID()
@@ -156,7 +152,8 @@
# 按开服天开的
if startDateStr.isdigit() and endDateStr.isdigit():
startServerDay, endServerDay = int(startDateStr), int(endDateStr)
- if openServerDay > endServerDay:
+ #结束日可能还需要处理广播之类,所以这里需要+1
+ if openServerDay > endServerDay + 1:
GameWorld.Log(" 当前开服天超过活动结束开服天,不处理! cfgID=%s,%s ~ %s < openServerDay(%s)" % (cfgID, startDateStr, endDateStr, openServerDay))
continue
openServerDateTime = curDateTime + datetime.timedelta(days=(startServerDay-openServerDay))
@@ -164,11 +161,17 @@
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
- elif openServerDay <= customMaxServerDay:
- GameWorld.Log(" 按日期开的在开服定制限制天内,不处理! cfgID=%s,%s ~ %s,openServerDay=%s" % (cfgID, startDateStr, endDateStr, openServerDay))
- continue
-
if hasattr(ipyData, "GetStartTimeList") and hasattr(ipyData, "GetEndTimeList"):
startHMStrList = ipyData.GetStartTimeList()
endHMStrList = ipyData.GetEndTimeList()
@@ -178,7 +181,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"
@@ -189,6 +192,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点
@@ -205,6 +211,7 @@
isActivity = False # 有需要处理开关时间的(开始、结束)
isNotify = False
isAdvanceNotice = False
+ isEnd = False
# 没配置时分的代表全天, 只要开始或结束时分没配都算
if not startHMStrList or not endHMStrList:
startDateTime = startDayDate
@@ -217,10 +224,12 @@
needStartList.append(startDateTime)
needEndList.append(endDateTime)
isActivity = True
+ isEnd = (curDateTime == endDayDate)
# 每天按时段开启的,支持多时段
else:
if startDayDate <= curDateTime <= endDayDate:
+ isEnd = (curDateTime == endDayDate)
for hmIndex, startHMStr in enumerate(startHMStrList):
endHMStr = endHMStrList[hmIndex]
# 每天开的, 实际开关时间只取今天的日期; 这里有个问题,全服广播的时间不是今天的, 暂不做支持,之后真有这种需求再说
@@ -263,9 +272,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
@@ -287,10 +297,10 @@
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 activityIpyData.GetStartDate() < ipyData.GetStartDate():
+ if not activityIpyData or (isActivity and not isEnd):
activityIpyData = ipyData
activityInfoDict = {ShareDefine.ActKey_CfgID:cfgID}
@@ -332,11 +342,16 @@
## 获取运营活动本服务器对应的配置数据列表
# 所有配置先按活动标识归组
+ platform = GameWorld.GetPlatform()
actGroupDict = {} # {ActMark:{ServerIDTuple:[ipyData, ...], ...}, ...}
actCfgCount = getattr(ipyDataMgr, "Get%sCount" % actName)()
for cfgIndex in xrange(actCfgCount):
ipyData = getattr(ipyDataMgr, "Get%sByIndex" % actName)(cfgIndex)
actMark = ipyData.GetActMark()
+ platformList = [] if not hasattr(ipyData, "GetPlatformList") else ipyData.GetPlatformList()
+ if platformList and platform not in platformList:
+ GameWorld.Log("非本平台活动,不取!platform=%s,platformList=%s,actName=%s,cfgID=%s" % (platform, platformList, actName, ipyData.GetCfgID()))
+ continue
serverIDTuple = tuple(ipyData.GetServerIDList())
serverIpyDataDict = actGroupDict.get(actMark, {})
@@ -439,7 +454,7 @@
- if state == 1 and actName in ShareDefine.NeedWorldLVOperationActNameList:
+ if state >= 1 and actName in ShareDefine.NeedWorldLVOperationActNameList:
actWorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_OActWorldLV % actName)
sendMapServerMsgDict[ShareDefine.ActKey_WorldLV] = actWorldLV
@@ -462,6 +477,11 @@
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)
+
#通知Mapserver,设置字典
#GameWorld.SendMapServerMsgEx(dictName, state) # 运营活动不单独通知活动状态,需与活动信息整合后一起通知
@@ -476,10 +496,11 @@
return
if len(ipyData.GetStartTimeList()) != len(ipyData.GetEndTimeList()):
return
+ openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1
multiExpRateInfo = ChPyNetSendPack.tagGCMultiExpRateInfo()
multiExpRateInfo.Clear()
- multiExpRateInfo.StartDate = ipyData.GetStartDate()
- multiExpRateInfo.EndtDate = ipyData.GetEndDate()
+ multiExpRateInfo.StartDate = GameWorld.GetOperationActionDateStr(ipyData.GetStartDate(), openServerDay)
+ multiExpRateInfo.EndtDate = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)
multiExpRateInfo.ActivityTime = []
for i, startTime in enumerate(ipyData.GetStartTimeList()):
endTime = ipyData.GetEndTimeList()[i]
@@ -508,12 +529,14 @@
##多倍修行点活动信息通知
if not ipyData:
return
+ openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1
multiRealmPointInfo = ChPyNetSendPack.tagGCMultiRealmPointInfo()
multiRealmPointInfo.Clear()
- multiRealmPointInfo.StartDate = ipyData.GetStartDate()
- multiRealmPointInfo.EndtDate = ipyData.GetEndDate()
+ multiRealmPointInfo.StartDate = GameWorld.GetOperationActionDateStr(ipyData.GetStartDate(), openServerDay)
+ 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()
@@ -546,7 +569,7 @@
curDateStr = GameWorld.ChangeTimeNumToStr(curTime, ChConfig.TYPE_Time_YmdFormat) # 当天日期
openServerWeekday = GameWorldProcess.GetOpenServerWeekday() # 服务器开服时是星期几
- curMaxCustomServerDay = MaxCustomServerDay - openServerWeekday + 1 # 最大有效定制开服天
+ curMaxCustomServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) - openServerWeekday + 1 # 最大有效定制开服天
GameWorld.Log("===== 加载今天日常活动信息 =====")
GameWorld.Log(" 开服是星期%s, 开服第%s天, 当前星期%s" % (openServerWeekday, openServerDay, weekDay))
GameWorld.Log(" 最大有效定制开服天: %s" % (curMaxCustomServerDay))
@@ -798,7 +821,7 @@
GameWorld.ErrLog("获取开服是星期几数据错误!openServerWeekday=%s" % openServerWeekday)
return []
- curMaxCustomServerDay = MaxCustomServerDay - openServerWeekday + 1 # 最大有效定制开服天
+ curMaxCustomServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) - openServerWeekday + 1 # 最大有效定制开服天
GameWorld.Log("===== 加载今天副本状态时间表 =====")
GameWorld.Log(" 开服是星期%s, 开服第%s天, 当前星期%s,%s点%s分 !" % (openServerWeekday, openServerDay, curWeekDay, curHour, curMinute))
GameWorld.Log(" 最大有效定制开服天: %s" % (curMaxCustomServerDay))
@@ -1043,77 +1066,11 @@
# #间隔未到
# return
- if GameWorld.IsMergeServer():
+ if GameWorld.IsCrossServer():
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 当前服务器时间
@@ -1179,15 +1136,6 @@
# #领地争夺战
# 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)
@@ -1214,15 +1162,9 @@
#骑宠争夺
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)
return
#-------------------------------------------------------------------------------
@@ -1329,7 +1271,7 @@
# @param None
# @return None
def Dispose_ActionGoOnByDayKey():
- if GameWorld.IsMergeServer():
+ if GameWorld.IsCrossServer():
return
GameWorld.DebugLog("处理特惠状态信息...")
openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay)
--
Gitblit v1.8.0