From 78eba407c2b7d68096500e9013add9141b13f52c Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 21 九月 2018 23:37:11 +0800
Subject: [PATCH] 3798 【后端】运营活动时间优化,开服日常限时活动定制时间优化

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py          |   10 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py               |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py           |   96 +++++++-----
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py                      |   13 +
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetWorldLV.py                         |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashGiftbag.py |    5 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSpringSale.py   |    5 
 ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py                                |   13 -
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                |   96 +++++++-----
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py                         |   25 +++
 ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py                                      |   13 +
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearOpenServerDay.py                 |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCostRebate.py   |    5 
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py                |   25 +--
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFairyCeremony.py                     |    5 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py           |   12 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py                 |   13 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBossReborn.py   |    5 
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetOpenServerWeekday.py               |    8 
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GetOpenServerDay.py                   |    5 
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                    |    2 
 21 files changed, 225 insertions(+), 144 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index a8171fe..437b971 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -311,78 +311,92 @@
 #A0 05 同步开服天数 #tagOpenServerDay
 
 class  tagOpenServerDay(Structure):
-    Head = tagHead()
-    Day = 0    #(WORD Day)// 已开服天数,从0开始
-    IsMixServer = 0    #(BYTE IsMixServer)//是否是合服服务器
-    MixDay = 0    #(WORD MixDay)// 已合服天数,从0开始
-    OpenServerTime = ""    #(char OpenServerTime[19])//开服时间yyyy-MM-dd HH:mm:ss
-    data = None
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("Day", c_ushort),    # 已开服天数,从0开始
+                  ("IsMixServer", c_ubyte),    #是否是合服服务器
+                  ("MixDay", c_ushort),    # 已合服天数,从0开始
+                  ("OpenWeekday", c_ubyte),    #开服是周几,1代表周一
+                  ("NowYear", c_ushort),    #服务器当前时间 - 年
+                  ("NowMonth", c_ubyte),    
+                  ("NowDay", c_ubyte),    
+                  ("NowHour", c_ubyte),    
+                  ("NowMinute", c_ubyte),    
+                  ("NowSecond", c_ubyte),    
+                  ("NowMicSecond", c_int),    
+                  ]
 
     def __init__(self):
         self.Clear()
-        self.Head.Cmd = 0xA0
-        self.Head.SubCmd = 0x05
+        self.Cmd = 0xA0
+        self.SubCmd = 0x05
         return
 
-    def ReadData(self, _lpData, _pos=0, _Len=0):
+    def ReadData(self, stringData, _pos=0, _len=0):
         self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.Day,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.IsMixServer,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.MixDay,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.OpenServerTime,_pos = CommFunc.ReadString(_lpData, _pos,19)
-        return _pos
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
 
     def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xA0
-        self.Head.SubCmd = 0x05
+        self.Cmd = 0xA0
+        self.SubCmd = 0x05
         self.Day = 0
         self.IsMixServer = 0
         self.MixDay = 0
-        self.OpenServerTime = ""
+        self.OpenWeekday = 0
+        self.NowYear = 0
+        self.NowMonth = 0
+        self.NowDay = 0
+        self.NowHour = 0
+        self.NowMinute = 0
+        self.NowSecond = 0
+        self.NowMicSecond = 0
         return
 
     def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 2
-        length += 1
-        length += 2
-        length += 19
-
-        return length
+        return sizeof(tagOpenServerDay)
 
     def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteWORD(data, self.Day)
-        data = CommFunc.WriteBYTE(data, self.IsMixServer)
-        data = CommFunc.WriteWORD(data, self.MixDay)
-        data = CommFunc.WriteString(data, 19, self.OpenServerTime)
-        return data
+        return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
-        DumpString = '''
-                                Head:%s,
+        DumpString = '''//A0 05 同步开服天数 //tagOpenServerDay:
+                                Cmd:%s,
+                                SubCmd:%s,
                                 Day:%d,
                                 IsMixServer:%d,
                                 MixDay:%d,
-                                OpenServerTime:%s
+                                OpenWeekday:%d,
+                                NowYear:%d,
+                                NowMonth:%d,
+                                NowDay:%d,
+                                NowHour:%d,
+                                NowMinute:%d,
+                                NowSecond:%d,
+                                NowMicSecond:%d
                                 '''\
                                 %(
-                                self.Head.OutputString(),
+                                self.Cmd,
+                                self.SubCmd,
                                 self.Day,
                                 self.IsMixServer,
                                 self.MixDay,
-                                self.OpenServerTime
+                                self.OpenWeekday,
+                                self.NowYear,
+                                self.NowMonth,
+                                self.NowDay,
+                                self.NowHour,
+                                self.NowMinute,
+                                self.NowSecond,
+                                self.NowMicSecond
                                 )
         return DumpString
 
 
 m_NAtagOpenServerDay=tagOpenServerDay()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagOpenServerDay.Head.Cmd,m_NAtagOpenServerDay.Head.SubCmd))] = m_NAtagOpenServerDay
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagOpenServerDay.Cmd,m_NAtagOpenServerDay.SubCmd))] = m_NAtagOpenServerDay
 
 
 #------------------------------------------------------
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearOpenServerDay.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearOpenServerDay.py
index 3fa96c6..76e9dda 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearOpenServerDay.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearOpenServerDay.py
@@ -62,8 +62,7 @@
     GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_MixServerDay, 0)
     
     curTime = int(time.time())
-    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime, curTime)
-    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_SetOpenServerTime, curTime)
+    PlayerDBGSEvent.SetInitOpenServerTime(curTime)
     
     # 重置数据记录及领奖状态
     for campaignType in ShareDefine.Def_Campaign_Type_List:
@@ -103,9 +102,8 @@
     
     if curPlayer:
         PlayerEventCounter.Sync_OpenServerDay(curPlayer)
-        GameWorld.DebugAnswer(curPlayer, '开服时间:%s, 星期%s, 天数:%s 是否合服:%s, 合服天数:%s'%\
-                              (GameWorld.ChangeTimeNumToStr(PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime)),
-                               GameWorldProcess.GetOpenServerWeekday(), 
+        GameWorld.DebugAnswer(curPlayer, '开服星期%s, 天数:%s 是否合服:%s, 合服天数:%s'%\
+                              (GameWorldProcess.GetOpenServerWeekday(), 
                                PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1,
                                PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer),
                                PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) + 1))
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GetOpenServerDay.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GetOpenServerDay.py
index 0f6d517..1325f03 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GetOpenServerDay.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GetOpenServerDay.py
@@ -26,9 +26,8 @@
 #  @return None
 #  @remarks 函数详细说明.
 def OnExec(curPlayer, cmdList):
-    GameWorld.DebugAnswer(curPlayer, '开服时间:%s, 星期%s, 天数:%s 是否合服:%s, 合服天数:%s'%\
-                          (GameWorld.ChangeTimeNumToStr(PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime)),
-                           GameWorldProcess.GetOpenServerWeekday(), 
+    GameWorld.DebugAnswer(curPlayer, '开服星期%s, 天数:%s 是否合服:%s, 合服天数:%s'%\
+                          (GameWorldProcess.GetOpenServerWeekday(), 
                            PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1,
                            PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer),
                            PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) + 1))
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetOpenServerWeekday.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetOpenServerWeekday.py
index 789bdf2..e077d5f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetOpenServerWeekday.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetOpenServerWeekday.py
@@ -46,11 +46,9 @@
     openDateTime = curDateTime + datetime.timedelta(days = -diffDays)
     openServerTime = int(time.mktime(openDateTime.timetuple()))
     
-    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime, openServerTime)
-    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_SetOpenServerTime, openServerTime)
-    GameWorld.DebugAnswer(curPlayer, "开服时间:%s,星期%s,开服天%s" 
-                          % (GameWorld.ChangeTimeNumToStr(openServerTime), 
-                             GameWorldProcess.GetOpenServerWeekday(), 
+    PlayerDBGSEvent.SetInitOpenServerTime(openServerTime)
+    GameWorld.DebugAnswer(curPlayer, "开服星期%s,开服天%s" 
+                          % (GameWorldProcess.GetOpenServerWeekday(), 
                              PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1))
     PlayerEventCounter.Sync_OpenServerDay(curPlayer)
     return
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetWorldLV.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetWorldLV.py
index eba6af0..9f84d3e 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetWorldLV.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetWorldLV.py
@@ -54,8 +54,7 @@
     initOpenServerTime = curTime - worldLVIpyData.GetOpenServerSecond()
     if extraTime:
         PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_WorldLVExtraTime, extraTime)
-    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime, initOpenServerTime)
-    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_SetOpenServerTime, initOpenServerTime)
+    PlayerDBGSEvent.SetInitOpenServerTime(initOpenServerTime)
     GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_WorldAverageLv, worldLV)
     PlayerDBGSEvent.SetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv, worldLV)
     GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_WorldAverageLv, worldLV)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
index 4742007..6992c9c 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
@@ -535,6 +535,19 @@
     return tagPlayer.GetRealMapID()
 
 #---------------------------------------------------------------------
+
+def GetOperationActionDateStr(dateInfo, openServerDay):
+    '''获取运营活动对应日期,存数字代表开服天配置,需要转化为对应的日期
+    @param dateInfo: 运营活动表配置的日期信息, 如果是纯数字代表开服天
+    @param openServerDay: 当前开服天
+    '''
+    if not dateInfo.isdigit():
+        return dateInfo
+    actionServerDay = int(dateInfo)
+    curDateTime = datetime.datetime.today()
+    actionDateTime = curDateTime + datetime.timedelta(days=(actionServerDay-openServerDay))
+    return "%d-%d-%d" % (actionDateTime.year, actionDateTime.month, actionDateTime.day)
+
 ##获得系统时间
 # @param 无意义
 # @return 系统时间
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
index 07dd7b7..ce5664f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
@@ -477,10 +477,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]
@@ -509,10 +510,11 @@
     ##多倍修行点活动信息通知
     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()
     if not curPlayer:
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
index 7f6f5b1..036a7cb 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -1208,6 +1208,12 @@
     GameWorld.GetGameWorld().SetDict(ChConfig.Def_WorldKey_IsGameWorldInit, 1)
     #初始化游戏时钟
     GameWorld.GetGameWorld().SetTickTypeCount(ChConfig.TYPE_Tick_Count)
+    #初始话开服时间、星期几
+    initOpenServerTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime)
+    openServerWeekday = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_OpenServerWeekday)
+    if initOpenServerTime <= 0 or openServerWeekday <= 0:
+        #记录首次开发时间(现实时间戳)
+        PlayerDBGSEvent.SetInitOpenServerTime(initOpenServerTime if initOpenServerTime else int(time.time()))
     #初始化家族数量
     GameWorld.GetFamilyManager().SetFamilyUpperLimitCount(ChConfig.Def_Family_MaxCnt)
     #排序元宝交易平台
@@ -1225,10 +1231,6 @@
     #事件汇报初始化
     EventReport.InitDllAppID()
     
-    initOpenServerTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime)
-    if initOpenServerTime <= 0:
-        #记录首次开发时间(现实时间戳)
-        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime, int(time.time()))
     #ReloadModule.RefreshModuleFileCMTime(True)
     #合服首次启动加载处理
     __DoMixServerInit()
@@ -1322,16 +1324,11 @@
     
     AllMapServerInitOK(tick)
     
-    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime, setOpenServerTime)
+    PlayerDBGSEvent.SetInitOpenServerTime(setOpenServerTime)
     return
 
-def GetOpenServerWeekday():
-    # 服务器开服时是星期几
-    openServerTime = PlayerDBGSEvent.GetDBGSTrig_ByKey( PlayerDBGSEvent.Def_InitOpenServerTime)
-    if not openServerTime:
-        return 0
-    openDatetime = GameWorld.ChangeTimeNumToDatetime(openServerTime)
-    return openDatetime.weekday() + 1
+## 服务器开服时是星期几
+def GetOpenServerWeekday(): return PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_OpenServerWeekday)
 
 ## 所有地图服务器初始化成功后(封包注册)
 #  @param tick 当前时间
@@ -1371,8 +1368,8 @@
     # 通知开服天数
     openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay)
     GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ServerDay, openServerDay)
-    openServerTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime)
-    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_InitOpenServerTime, openServerTime)
+    openServerWeekday = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_OpenServerWeekday)
+    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_OpenServerWeekday, openServerWeekday)
     # 合服状态
     isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer)
     GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_IsMixServer, isMixServer)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
index 3222e6e..e6e8440 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
@@ -269,19 +269,6 @@
     #PlayerCanGetReward.SynClient_CanGetRewardList(curPlayer)
     return
 
-
-## 通知首次开服时间
-#  @param curPlayer: 玩家实例
-#  @return: None
-def Sync_InitOpenServerTime(curPlayer):
-#    initOpenServerTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime)
-#    packData = ChPyNetSendPack.tagInitOpenServerTime()
-#    packData.Clear()
-#    packData.Time = initOpenServerTime
-#    NetPackCommon.SendFakePack(curPlayer, packData)
-    return
-    
-
 ## 运营登陆信息处理
 #  @param curPlayer
 #  @return None
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
index 82917dc..a75a629 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
@@ -66,6 +66,9 @@
 #服务器运行了几天
 Def_ServerDay = 'ServerDay'
 
+#开服是周几, 1代表周一
+Def_OpenServerWeekday = 'OpenServerWeekday'
+
 #服务器是否是合服服务器
 Def_IsMixServer = 'IsMixServer'
 
@@ -81,9 +84,14 @@
 #上次开服天数开启的活动时的时间(Def_ServerDay的值)
 Def_ServerLastOpenActionDay = "ServerLastOpenActionDay"
 
-#首次开服时间
+#首次开服时间,注意不要用该日期做开服天相关的功能逻辑,如果要用开服天,请用 Def_ServerDay
+''' 原因: 
+因为目前开服天的逻辑大部分是用 Def_ServerDay,当出现服务器宕机超过24小时时,就会导致 Def_ServerDay 与 Def_InitOpenServerTime 不对应
+所以为了功能逻辑和数据的统一性,开服天相关的功能逻辑必须用 Def_ServerDay
+Def_InitOpenServerTime 目前仅用于预先设置开服日期用
+'''
 Def_InitOpenServerTime = 'InitOpenServerTime'
-Def_SetOpenServerTime = 'SetOpenServerTime' # 设置的开服时间
+Def_SetOpenServerTime = 'SetOpenServerTime' # GM工具预定的开服时间
 
 #仙盟联赛当前战斗轮次
 Def_FamilyWar_Round = 'FamilyWar_Round'
@@ -149,6 +157,19 @@
 #boss复活活动已复活次数
 Def_BossRebornCnt = "BossRebornCnt"
 
+def SetInitOpenServerTime(initTime):
+    openDatetime = GameWorld.ChangeTimeNumToDatetime(initTime)
+    openServerWeekday = openDatetime.weekday() + 1
+    SetDBGSTrig_ByKey(Def_InitOpenServerTime, initTime)
+    SetDBGSTrig_ByKey(Def_OpenServerWeekday, openServerWeekday)
+    GameWorld.Log("设置开服时间: %s(%s), 周%s" % (openDatetime, initTime, openServerWeekday))
+    # 需要这个参数主要是GM工具会判断是否有设置过,所以该值一般只有GM命令或工具才能设置
+    setOpenServerTime = GetDBGSTrig_ByKey(Def_SetOpenServerTime)
+    if setOpenServerTime and setOpenServerTime != initTime:
+        SetDBGSTrig_ByKey(Def_SetOpenServerTime, initTime)
+        GameWorld.Log("    同步更新 Def_SetOpenServerTime=%s" % initTime)
+    return
+
 ## 查找事件
 #  @param findID 查找的ID
 #  @param key 与ID组合成key
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py
index 91b793c..b0386b1 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py
@@ -285,6 +285,10 @@
 #  @param curPlayer: 玩家实例
 #  @return: None
 def Sync_OpenServerDay(curPlayer):
+    # 服务器时间
+    serverTime = GameWorld.GetServerTime()
+    if not serverTime:
+        return
     openDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay)
     isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer)
     mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay)
@@ -293,7 +297,14 @@
     packData.Day = openDay
     packData.IsMixServer = isMixServer
     packData.MixDay = mixServerDay
-    packData.OpenServerTime = GameWorld.ChangeTimeNumToStr(PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime))
+    packData.OpenWeekday = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime)
+    packData.NowYear = serverTime.year
+    packData.NowMonth = serverTime.month
+    packData.NowDay = serverTime.day
+    packData.NowHour = serverTime.hour
+    packData.NowMinute = serverTime.minute
+    packData.NowSecond = serverTime.second
+    packData.NowMicSecond = serverTime.microsecond
     NetPackCommon.SendFakePack(curPlayer, packData)
     return
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFairyCeremony.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFairyCeremony.py
index 1495e8a..1bd55cf 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFairyCeremony.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFairyCeremony.py
@@ -88,10 +88,11 @@
     if not ipyData:
         return
     
+    openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1
     fairyCeremonyInfo = ChPyNetSendPack.tagGCFairyCeremonyInfo()
     fairyCeremonyInfo.Clear()
-    fairyCeremonyInfo.StartDate = ipyData.GetStartDate()
-    fairyCeremonyInfo.EndtDate = ipyData.GetEndDate()
+    fairyCeremonyInfo.StartDate = GameWorld.GetOperationActionDateStr(ipyData.GetStartDate(), openServerDay)
+    fairyCeremonyInfo.EndtDate = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)
     fairyCeremonyInfo.WorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_OActWorldLV % ShareDefine.OperationActionName_FairyCeremony)
     fairyCeremonyInfo.LimitLV = ipyData.GetLVLimit()
     if not curPlayer:
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 1306ea2..caec547 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -127,7 +127,7 @@
 Def_Notify_Separator = '+'
 
 #通知地图服务器并设置该字典值
-Def_Notify_WorldKey_InitOpenServerTime = 'InitOpenServerTime'   # 开服时间
+Def_Notify_WorldKey_OpenServerWeekday = 'OpenServerWeekday'     # 开服是周几, 1代表周一
 Def_Notify_WorldKey_ServerDay = 'ServerDay'               # 开服天数
 Def_Notify_WorldKey_IsMixServer = 'IsMixServer'           # 是否合服服务器
 Def_Notify_WorldKey_MixServerDay = 'MixServerDay'         # 合服天数
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index a8171fe..437b971 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -311,78 +311,92 @@
 #A0 05 同步开服天数 #tagOpenServerDay
 
 class  tagOpenServerDay(Structure):
-    Head = tagHead()
-    Day = 0    #(WORD Day)// 已开服天数,从0开始
-    IsMixServer = 0    #(BYTE IsMixServer)//是否是合服服务器
-    MixDay = 0    #(WORD MixDay)// 已合服天数,从0开始
-    OpenServerTime = ""    #(char OpenServerTime[19])//开服时间yyyy-MM-dd HH:mm:ss
-    data = None
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("Day", c_ushort),    # 已开服天数,从0开始
+                  ("IsMixServer", c_ubyte),    #是否是合服服务器
+                  ("MixDay", c_ushort),    # 已合服天数,从0开始
+                  ("OpenWeekday", c_ubyte),    #开服是周几,1代表周一
+                  ("NowYear", c_ushort),    #服务器当前时间 - 年
+                  ("NowMonth", c_ubyte),    
+                  ("NowDay", c_ubyte),    
+                  ("NowHour", c_ubyte),    
+                  ("NowMinute", c_ubyte),    
+                  ("NowSecond", c_ubyte),    
+                  ("NowMicSecond", c_int),    
+                  ]
 
     def __init__(self):
         self.Clear()
-        self.Head.Cmd = 0xA0
-        self.Head.SubCmd = 0x05
+        self.Cmd = 0xA0
+        self.SubCmd = 0x05
         return
 
-    def ReadData(self, _lpData, _pos=0, _Len=0):
+    def ReadData(self, stringData, _pos=0, _len=0):
         self.Clear()
-        _pos = self.Head.ReadData(_lpData, _pos)
-        self.Day,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.IsMixServer,_pos = CommFunc.ReadBYTE(_lpData, _pos)
-        self.MixDay,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.OpenServerTime,_pos = CommFunc.ReadString(_lpData, _pos,19)
-        return _pos
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
 
     def Clear(self):
-        self.Head = tagHead()
-        self.Head.Clear()
-        self.Head.Cmd = 0xA0
-        self.Head.SubCmd = 0x05
+        self.Cmd = 0xA0
+        self.SubCmd = 0x05
         self.Day = 0
         self.IsMixServer = 0
         self.MixDay = 0
-        self.OpenServerTime = ""
+        self.OpenWeekday = 0
+        self.NowYear = 0
+        self.NowMonth = 0
+        self.NowDay = 0
+        self.NowHour = 0
+        self.NowMinute = 0
+        self.NowSecond = 0
+        self.NowMicSecond = 0
         return
 
     def GetLength(self):
-        length = 0
-        length += self.Head.GetLength()
-        length += 2
-        length += 1
-        length += 2
-        length += 19
-
-        return length
+        return sizeof(tagOpenServerDay)
 
     def GetBuffer(self):
-        data = ''
-        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
-        data = CommFunc.WriteWORD(data, self.Day)
-        data = CommFunc.WriteBYTE(data, self.IsMixServer)
-        data = CommFunc.WriteWORD(data, self.MixDay)
-        data = CommFunc.WriteString(data, 19, self.OpenServerTime)
-        return data
+        return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
-        DumpString = '''
-                                Head:%s,
+        DumpString = '''//A0 05 同步开服天数 //tagOpenServerDay:
+                                Cmd:%s,
+                                SubCmd:%s,
                                 Day:%d,
                                 IsMixServer:%d,
                                 MixDay:%d,
-                                OpenServerTime:%s
+                                OpenWeekday:%d,
+                                NowYear:%d,
+                                NowMonth:%d,
+                                NowDay:%d,
+                                NowHour:%d,
+                                NowMinute:%d,
+                                NowSecond:%d,
+                                NowMicSecond:%d
                                 '''\
                                 %(
-                                self.Head.OutputString(),
+                                self.Cmd,
+                                self.SubCmd,
                                 self.Day,
                                 self.IsMixServer,
                                 self.MixDay,
-                                self.OpenServerTime
+                                self.OpenWeekday,
+                                self.NowYear,
+                                self.NowMonth,
+                                self.NowDay,
+                                self.NowHour,
+                                self.NowMinute,
+                                self.NowSecond,
+                                self.NowMicSecond
                                 )
         return DumpString
 
 
 m_NAtagOpenServerDay=tagOpenServerDay()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagOpenServerDay.Head.Cmd,m_NAtagOpenServerDay.Head.SubCmd))] = m_NAtagOpenServerDay
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagOpenServerDay.Cmd,m_NAtagOpenServerDay.SubCmd))] = m_NAtagOpenServerDay
 
 
 #------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
index d6faac5..3498980 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
@@ -590,6 +590,19 @@
     return curTimeStr
 
 #---------------------------------------------------------------------
+
+def GetOperationActionDateStr(dateInfo, openServerDay):
+    '''获取运营活动对应日期,存数字代表开服天配置,需要转化为对应的日期
+    @param dateInfo: 运营活动表配置的日期信息, 如果是纯数字代表开服天
+    @param openServerDay: 当前开服天
+    '''
+    if not dateInfo.isdigit():
+        return dateInfo
+    actionServerDay = int(dateInfo)
+    curDateTime = datetime.datetime.today()
+    actionDateTime = curDateTime + datetime.timedelta(days=(actionServerDay-openServerDay))
+    return "%d-%d-%d" % (actionDateTime.year, actionDateTime.month, actionDateTime.day)
+
 ##获得服务器系统时间
 # @param 无
 # @return 返回值. 时间Data格式
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index cf37216..eda9b03 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -5334,13 +5334,23 @@
 #  @param curPlayer: 玩家实例
 #  @return: None
 def Sync_OpenServerDay(curPlayer):
+    serverTime = GameWorld.GetCurrentTime()
+    if not serverTime:
+        return
     gw = GameWorld.GetGameWorld()
     packData = ChPyNetSendPack.tagOpenServerDay()
     packData.Clear()
     packData.Day = gw.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
     packData.IsMixServer = gw.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_IsMixServer)
     packData.MixDay = gw.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_MixServerDay)
-    packData.OpenServerTime = GameWorld.ChangeTimeNumToStr(gw.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_InitOpenServerTime))
+    packData.OpenWeekday = gw.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_OpenServerWeekday)
+    packData.NowYear = serverTime.year
+    packData.NowMonth = serverTime.month
+    packData.NowDay = serverTime.day
+    packData.NowHour = serverTime.hour
+    packData.NowMinute = serverTime.minute
+    packData.NowSecond = serverTime.second
+    packData.NowMicSecond = serverTime.microsecond
     NetPackCommon.SendFakePack(curPlayer, packData)
     return
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBossReborn.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBossReborn.py
index fb1100f..12184dd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBossReborn.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerBossReborn.py
@@ -224,10 +224,11 @@
     ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("BossReborn", {'TemplateID':templateID}, True)
     if not ipyDataList:
         return
+    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
     actInfo = ChPyNetSendPack.tagMCBossRebornInfo()
     actInfo.Clear()
-    actInfo.StartDate = actBossIpyData.GetStartDate()
-    actInfo.EndtDate = actBossIpyData.GetEndDate()
+    actInfo.StartDate = GameWorld.GetOperationActionDateStr(actBossIpyData.GetStartDate(), openServerDay)
+    actInfo.EndtDate = GameWorld.GetOperationActionDateStr(actBossIpyData.GetEndDate(), openServerDay)
     actInfo.ResetType = actBossIpyData.GetResetType()
     actInfo.LimitLV = actBossIpyData.GetLVLimit()
     actInfo.TaskInfo = []
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCostRebate.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCostRebate.py
index a393361..b5ee561 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCostRebate.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCostRebate.py
@@ -251,9 +251,10 @@
     if not templateIDList:
         return
     
+    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
     actInfo = ChPyNetSendPack.tagMCCostRebateInfo()
-    actInfo.StartDate = ipyData.GetStartDate()
-    actInfo.EndtDate = ipyData.GetEndDate()
+    actInfo.StartDate = GameWorld.GetOperationActionDateStr(ipyData.GetStartDate(), openServerDay)
+    actInfo.EndtDate = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)
     actInfo.LimitLV = ipyData.GetLVLimit()
     actInfo.IsDayReset = ipyData.GetIsDayReset()
     actInfo.AwardDayInfo = []
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashGiftbag.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashGiftbag.py
index 92242fe..87e8612 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashGiftbag.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashGiftbag.py
@@ -237,9 +237,10 @@
     # 取玩家APPID,混服使用
     appID = GameWorld.GetPlayerPlatform(curPlayer.GetAccID())
     
+    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
     packInfo = ChPyNetSendPack.tagMCFlashGiftbagInfo()
-    packInfo.StartDate = flashGiftbagIpyData.GetStartDate()
-    packInfo.EndtDate = flashGiftbagIpyData.GetEndDate()
+    packInfo.StartDate = GameWorld.GetOperationActionDateStr(flashGiftbagIpyData.GetStartDate(), openServerDay)
+    packInfo.EndtDate = GameWorld.GetOperationActionDateStr(flashGiftbagIpyData.GetEndDate(), openServerDay)
     packInfo.AdvanceMinutes = flashGiftbagIpyData.GetAdvanceMinutes()
     packInfo.ActivityTime = []
     for i, startTime in enumerate(startTimeList):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSpringSale.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSpringSale.py
index d7bee14..374e2d7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSpringSale.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSpringSale.py
@@ -111,9 +111,10 @@
         GameWorld.ErrLog("限时特惠开关时间时分配置错误!cfgID=%s" % cfgID)
         return
     
+    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
     packInfo = ChPyNetSendPack.tagMCSpringSaleInfo()
-    packInfo.StartDate = springSaleIpyData.GetStartDate()
-    packInfo.EndtDate = springSaleIpyData.GetEndDate()
+    packInfo.StartDate = GameWorld.GetOperationActionDateStr(springSaleIpyData.GetStartDate(), openServerDay)
+    packInfo.EndtDate = GameWorld.GetOperationActionDateStr(springSaleIpyData.GetEndDate(), openServerDay)
     packInfo.AdvanceMinutes = springSaleIpyData.GetAdvanceMinutes()
     packInfo.ActivityTime = []
     for i, startTime in enumerate(startTimeList):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 1306ea2..caec547 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -127,7 +127,7 @@
 Def_Notify_Separator = '+'
 
 #通知地图服务器并设置该字典值
-Def_Notify_WorldKey_InitOpenServerTime = 'InitOpenServerTime'   # 开服时间
+Def_Notify_WorldKey_OpenServerWeekday = 'OpenServerWeekday'     # 开服是周几, 1代表周一
 Def_Notify_WorldKey_ServerDay = 'ServerDay'               # 开服天数
 Def_Notify_WorldKey_IsMixServer = 'IsMixServer'           # 是否合服服务器
 Def_Notify_WorldKey_MixServerDay = 'MixServerDay'         # 合服天数

--
Gitblit v1.8.0