From f194ca807c0ef437b866e74db7cd4dcb02e531c3 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 14 二月 2019 17:54:57 +0800
Subject: [PATCH] 6211 【后端】【1.6】合服任务单(运营活动支持合服定制)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py |  108 +++++++++++++++++++++++++++++++++---------------------
 1 files changed, 66 insertions(+), 42 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
index 4f1976e..0dc634d 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
@@ -120,11 +120,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
@@ -134,19 +136,21 @@
     curDateTime = datetime.datetime.strptime(curDateTimeStr, ChConfig.TYPE_Time_Format)
     
     customMaxServerDay = IpyGameDataPY.GetFuncCfg("OperationAction", 1) # 定制运营活动最大开服天
+    maxCustomServerDayMix = IpyGameDataPY.GetFuncCfg("MixServer", 1) # 定制运营活动最大合服天
     operationActionDict = {}
     mapServerOperationActionDict = {}
-    serverID = GameWorld.GetServerID()
+    serverGroupID = GameWorld.GetServerGroupID()
     ipyDataMgr = IpyGameDataPY.IPY_Data()
     
-    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))
     
     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)))
         needStartList = [] # [startDateTime, ...]
         needEndList = [] # [endDateTime, ...]
         needNotifyDict = {} # {notifyDateTime:[notifyKey, [参数]], ...}
@@ -154,11 +158,13 @@
         # 注意:每个活动配置会有多个活动时间点,但是有且只能生效一条活动配置,换句话说就是每个活动配置时间不允许交叉
         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 startDateStr.isdigit() and endDateStr.isdigit():
                 startServerDay, endServerDay = int(startDateStr), int(endDateStr)
@@ -171,6 +177,20 @@
                 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 actName not in ShareDefine.FeastOperationActionNameList:
                 if openServerDay <= customMaxServerDay:
                     GameWorld.Log("        按日期开的在开服定制限制天内,不处理! cfgID=%s,%s ~ %s,openServerDay=%s" % (cfgID, startDateStr, endDateStr, openServerDay))
@@ -182,6 +202,18 @@
                     GameWorld.Log("        按日期开的开始日期在开服定制限制天内,不处理! cfgID=%s,curStartDateTime=%s,customMaxServerDateTime=%s" % (cfgID, curStartDateTime, customMaxServerDateTime))
                     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()
@@ -351,50 +383,42 @@
         
     return True, OperationActionInfo
 
-def __GetOperationActionServerIpyDataList(ipyDataMgr, serverID, actName):
+def __GetOperationActionServerIpyDataList(ipyDataMgr, serverGroupID, actName):
     ## 获取运营活动本服务器对应的配置数据列表
     
     if not hasattr(ipyDataMgr, "Get%sCount" % actName):
         GameWorld.ErrLog("没有该运营活动类型对应活动时间表! actName=%s" % actName)
         return []
     
-    # 所有配置先按活动标识归组
-    platform = GameWorld.GetPlatform()
-    actGroupDict = {} # {ActMark:{ServerIDTuple:[ipyData, ...], ...}, ...}
+    curServerActIpyDataList = []
     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())
+        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 Dispose_OperationActionState(reloadRefresh=False):

--
Gitblit v1.8.0