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 ++++++++++++++++++++++--------------
 ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py                         |   45 ++++++---------
 PySysDB/PySysDBG.h                                                                      |   15 ++---
 3 files changed, 90 insertions(+), 78 deletions(-)

diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index 04b5240..5b33bd4 100644
--- a/PySysDB/PySysDBG.h
+++ b/PySysDB/PySysDBG.h
@@ -311,9 +311,8 @@
 struct tagActExpRate
 {
 	DWORD		_CfgID;	//配置ID
-	char		ActMark;	//活动组标记
-	list		PlatformList;	//活动平台列表["平台A", "平台A", ...],配[]代表所有
-	list		ServerIDList;	//服务器ID列表
+	list		ServerGroupIDList;	//服务器组ID列表
+	list		ServerGroupIDListExcept;	//排除的服务器组ID列表
 	char		StartDate;	//开启日期
 	char		EndDate;	//结束日期
 	list		StartTimeList;	//开启时间列表, 支持多个时段
@@ -346,9 +345,8 @@
 struct tagActBossReborn
 {
 	DWORD		_CfgID;	//配置ID
-	char		ActMark;	//活动组标记
-	list		PlatformList;	//活动平台列表["平台A", "平台A", ...],配[]代表所有
-	list		ServerIDList;	//服务器ID列表
+	list		ServerGroupIDList;	//服务器组ID列表
+	list		ServerGroupIDListExcept;	//排除的服务器组ID列表
 	char		StartDate;	//开启日期
 	char		EndDate;	//结束日期
 	BYTE		ResetType;	//重置类型,0-0点重置;1-5点重置
@@ -438,9 +436,8 @@
 struct tagActWishingWell
 {
 	DWORD		_CfgID;	//配置ID
-	char		ActMark;	//活动组标记
-	list		PlatformList;	//活动平台列表["平台A", "平台A", ...],配[]代表所有
-	list		ServerIDList;	//服务器ID列表
+	list		ServerGroupIDList;	//服务器组ID列表
+	list		ServerGroupIDListExcept;	//排除的服务器组ID列表
 	char		StartDate;	//开启日期
 	char		EndDate;	//结束日期
 	BYTE		IsDayReset;	//是否每天重置
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):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index 820e263..ff1ecf0 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -269,9 +269,8 @@
 
                 "ActExpRate":(
                         ("DWORD", "CfgID", 1),
-                        ("char", "ActMark", 0),
-                        ("list", "PlatformList", 0),
-                        ("list", "ServerIDList", 0),
+                        ("list", "ServerGroupIDList", 0),
+                        ("list", "ServerGroupIDListExcept", 0),
                         ("char", "StartDate", 0),
                         ("char", "EndDate", 0),
                         ("list", "StartTimeList", 0),
@@ -298,9 +297,8 @@
 
                 "ActBossReborn":(
                         ("DWORD", "CfgID", 1),
-                        ("char", "ActMark", 0),
-                        ("list", "PlatformList", 0),
-                        ("list", "ServerIDList", 0),
+                        ("list", "ServerGroupIDList", 0),
+                        ("list", "ServerGroupIDListExcept", 0),
                         ("char", "StartDate", 0),
                         ("char", "EndDate", 0),
                         ("BYTE", "ResetType", 0),
@@ -371,9 +369,8 @@
 
                 "ActWishingWell":(
                         ("DWORD", "CfgID", 1),
-                        ("char", "ActMark", 0),
-                        ("list", "PlatformList", 0),
-                        ("list", "ServerIDList", 0),
+                        ("list", "ServerGroupIDList", 0),
+                        ("list", "ServerGroupIDListExcept", 0),
                         ("char", "StartDate", 0),
                         ("char", "EndDate", 0),
                         ("BYTE", "IsDayReset", 0),
@@ -1011,9 +1008,8 @@
     
     def __init__(self):
         self.CfgID = 0
-        self.ActMark = ""
-        self.PlatformList = []
-        self.ServerIDList = []
+        self.ServerGroupIDList = []
+        self.ServerGroupIDListExcept = []
         self.StartDate = ""
         self.EndDate = ""
         self.StartTimeList = []
@@ -1026,9 +1022,8 @@
         return
         
     def GetCfgID(self): return self.CfgID # 配置ID
-    def GetActMark(self): return self.ActMark # 活动组标记
-    def GetPlatformList(self): return self.PlatformList # 活动平台列表["平台A", "平台A", ...],配[]代表所有
-    def GetServerIDList(self): return self.ServerIDList # 服务器ID列表
+    def GetServerGroupIDList(self): return self.ServerGroupIDList # 服务器组ID列表
+    def GetServerGroupIDListExcept(self): return self.ServerGroupIDListExcept # 排除的服务器组ID列表
     def GetStartDate(self): return self.StartDate # 开启日期
     def GetEndDate(self): return self.EndDate # 结束日期
     def GetStartTimeList(self): return self.StartTimeList # 开启时间列表, 支持多个时段
@@ -1071,9 +1066,8 @@
     
     def __init__(self):
         self.CfgID = 0
-        self.ActMark = ""
-        self.PlatformList = []
-        self.ServerIDList = []
+        self.ServerGroupIDList = []
+        self.ServerGroupIDListExcept = []
         self.StartDate = ""
         self.EndDate = ""
         self.ResetType = 0
@@ -1084,9 +1078,8 @@
         return
         
     def GetCfgID(self): return self.CfgID # 配置ID
-    def GetActMark(self): return self.ActMark # 活动组标记
-    def GetPlatformList(self): return self.PlatformList # 活动平台列表["平台A", "平台A", ...],配[]代表所有
-    def GetServerIDList(self): return self.ServerIDList # 服务器ID列表
+    def GetServerGroupIDList(self): return self.ServerGroupIDList # 服务器组ID列表
+    def GetServerGroupIDListExcept(self): return self.ServerGroupIDListExcept # 排除的服务器组ID列表
     def GetStartDate(self): return self.StartDate # 开启日期
     def GetEndDate(self): return self.EndDate # 结束日期
     def GetResetType(self): return self.ResetType # 重置类型,0-0点重置;1-5点重置
@@ -1223,9 +1216,8 @@
     
     def __init__(self):
         self.CfgID = 0
-        self.ActMark = ""
-        self.PlatformList = []
-        self.ServerIDList = []
+        self.ServerGroupIDList = []
+        self.ServerGroupIDListExcept = []
         self.StartDate = ""
         self.EndDate = ""
         self.IsDayReset = 0
@@ -1237,9 +1229,8 @@
         return
         
     def GetCfgID(self): return self.CfgID # 配置ID
-    def GetActMark(self): return self.ActMark # 活动组标记
-    def GetPlatformList(self): return self.PlatformList # 活动平台列表["平台A", "平台A", ...],配[]代表所有
-    def GetServerIDList(self): return self.ServerIDList # 服务器ID列表
+    def GetServerGroupIDList(self): return self.ServerGroupIDList # 服务器组ID列表
+    def GetServerGroupIDListExcept(self): return self.ServerGroupIDListExcept # 排除的服务器组ID列表
     def GetStartDate(self): return self.StartDate # 开启日期
     def GetEndDate(self): return self.EndDate # 结束日期
     def GetIsDayReset(self): return self.IsDayReset # 是否每天重置

--
Gitblit v1.8.0