3245 【后端】开服限时活动定制;
增加设置开服是星期几的GM命令: SetOpenServerWeekday
12个文件已修改
1个文件已添加
575 ■■■■ 已修改文件
PySysDB/PySysDBG.h 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearOpenServerDay.py 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GetOpenServerDay.py 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetOpenServerWeekday.py 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetWorldLV.py 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py 135 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py 100 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBG.h
@@ -64,8 +64,20 @@
struct tagDailyAction
{
    DWORD        _DailyID;    //活动ID
    BYTE        OpenServerDay;    //开服第几天开始开启,0为不限制
    char        OpenTime;    //开启时间
    dict        OpenTimeDict;    //开启时间
    DWORD        Duration;    //持续时间, 0为不限制
    dict        NotifyInfo;    //广播提示信息
};
//日常活动表定制表
struct tagDailyActionCustom
{
    DWORD        ID;    //ID
    BYTE        _OpenServerWeek;    //开服是周几
    DWORD        _OpenServerDay;    //开服第几天
    BYTE        DailyID;    //日常活动ID
    list        OpenTimeList;    //开启时间列表
    DWORD        Duration;    //持续时间, 0为不限制
    dict        NotifyInfo;    //广播提示信息
};
@@ -76,12 +88,26 @@
{
    DWORD        _ID;    //ID
    DWORD        DataMapID;    //所属的玩法数据地图ID
    BYTE        OpenServerWeek;    //开服X周后开放
    BYTE        OpenServerDay;    //开服X天后开放
    BYTE        StartWeekday;    //开始星期
    BYTE        StartHour;    //开始时
    BYTE        StartMinute;    //开始分
    BYTE        EndWeekday;    //结束星期
    BYTE        EndHour;    //结束时
    BYTE        EndMinute;    //结束分
    BYTE        CanEnter;    //是否可进入副本
    BYTE        StateValue;    //״ֵ̬
    dict        NotifyInfoDict;    //广播提示信息
};
//副本状态时间定制表
struct tagFBStateTimeCustom
{
    DWORD        ID;        //ID
    BYTE        _OpenServerWeek;    //开服是周几
    DWORD        _OpenServerDay;    //开服第几天
    DWORD        DataMapID;    //所属的玩法数据地图ID
    BYTE        StartHour;    //开始时
    BYTE        StartMinute;    //开始分
    BYTE        EndHour;    //结束时
    BYTE        EndMinute;    //结束分
    BYTE        CanEnter;    //是否可进入副本
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -311,60 +311,78 @@
#A0 05 同步开服天数 #tagOpenServerDay
class  tagOpenServerDay(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("Day", c_ushort),    # 已开服天数,从0开始
                  ("IsMixServer", c_ubyte),    #是否是合服服务器
                  ("MixDay", c_ushort),    # 已合服天数,从0开始
                  ]
    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
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA0
        self.SubCmd = 0x05
        self.Head.Cmd = 0xA0
        self.Head.SubCmd = 0x05
        return
    def ReadData(self, stringData, _pos=0, _len=0):
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
        _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
    def Clear(self):
        self.Cmd = 0xA0
        self.SubCmd = 0x05
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA0
        self.Head.SubCmd = 0x05
        self.Day = 0
        self.IsMixServer = 0
        self.MixDay = 0
        self.OpenServerTime = ""
        return
    def GetLength(self):
        return sizeof(tagOpenServerDay)
        length = 0
        length += self.Head.GetLength()
        length += 2
        length += 1
        length += 2
        length += 19
        return length
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
        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
    def OutputString(self):
        DumpString = '''//A0 05 同步开服天数 //tagOpenServerDay:
                                Cmd:%s,
                                SubCmd:%s,
        DumpString = '''
                                Head:%s,
                                Day:%d,
                                IsMixServer:%d,
                                MixDay:%d
                                MixDay:%d,
                                OpenServerTime:%s
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.Head.OutputString(),
                                self.Day,
                                self.IsMixServer,
                                self.MixDay
                                self.MixDay,
                                self.OpenServerTime
                                )
        return DumpString
m_NAtagOpenServerDay=tagOpenServerDay()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagOpenServerDay.Cmd,m_NAtagOpenServerDay.SubCmd))] = m_NAtagOpenServerDay
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagOpenServerDay.Head.Cmd,m_NAtagOpenServerDay.Head.SubCmd))] = m_NAtagOpenServerDay
#------------------------------------------------------
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/ClearOpenServerDay.py
@@ -30,7 +30,10 @@
import GameWorldMixServerCampaign
import PlayerUniversalGameRec
import GameWorldActionTeHui
import GameWorldProcess
import GMCommon
import time
#---------------------------------------------------------------------
## 执行逻辑
#  @param curPlayer 当前玩家
@@ -57,9 +60,10 @@
    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ServerDay, 0)
    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_IsMixServer, 0)
    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_MixServerDay, 0)
    if curPlayer:
        PlayerEventCounter.Sync_OpenServerDay(curPlayer)
    curTime = int(time.time())
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime, curTime)
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_SetOpenServerTime, curTime)
    
    # 重置数据记录及领奖状态
    for campaignType in ShareDefine.Def_Campaign_Type_List:
@@ -98,8 +102,11 @@
    GMCommon.ActionControlRefresh(tick)
    
    if curPlayer:
        GameWorld.DebugAnswer(curPlayer, '清除开服天数成功, 当前开服天数:%s, 是否合服:%s, 当前合服天数:%s'%\
                              (PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1,
        PlayerEventCounter.Sync_OpenServerDay(curPlayer)
        GameWorld.DebugAnswer(curPlayer, '开服时间:%s, 星期%s, 天数:%s 是否合服:%s, 合服天数:%s'%\
                              (GameWorld.ChangeTimeNumToStr(PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime)),
                               GameWorldProcess.GetOpenServerWeekday(),
                               PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1,
                               PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer),
                               PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) + 1))
    return
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/GetOpenServerDay.py
@@ -13,8 +13,9 @@
# @change: "2014-12-01 12:30" hxp 增加合服状态及天数
#
#------------------------------------------------------------------------------ 
"""Version = 2014-12-01 12:30"""
#"""Version = 2014-12-01 12:30"""
#------------------------------------------------------------------------------ 
import GameWorldProcess
import PlayerDBGSEvent
import GameWorld
#---------------------------------------------------------------------
@@ -25,10 +26,11 @@
#  @return None
#  @remarks 函数详细说明.
def OnExec(curPlayer, cmdList):
    day = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1
    isMixServer = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer)
    mixServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) + 1
    GameWorld.DebugAnswer(curPlayer, '当前开服天数:%s, 是否合服:%s, 当前合服天数:%s' % (day, isMixServer, mixServerDay))
    GameWorld.DebugAnswer(curPlayer, '开服时间:%s, 星期%s, 天数:%s 是否合服:%s, 合服天数:%s'%\
                          (GameWorld.ChangeTimeNumToStr(PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime)),
                           GameWorldProcess.GetOpenServerWeekday(),
                           PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1,
                           PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_IsMixServer),
                           PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_MixServerDay) + 1))
    return
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetOpenServerWeekday.py
New file
@@ -0,0 +1,59 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GM.Commands.SetOpenServerWeekday
#
# @todo:设置开服是星期几
# @author hxp
# @date 2018-09-10
# @version 1.0
#
# 详细描述: 设置开服是星期几
#
#-------------------------------------------------------------------------------
#"""Version = 2018-09-10 10:00"""
#-------------------------------------------------------------------------------
import PlayerDBGSEvent
import PlayerEventCounter
import GameWorldProcess
import GameWorld
import datetime
import time
#-------------------------------------------------------------------------------
## 执行逻辑
#  @param curPlayer 当前玩家
#  @param cmdList 参数
#  @return None
#  @remarks 函数详细说明.
def OnExec(curPlayer, cmdList):
    if not cmdList or cmdList[0] > 7 or cmdList[0] <= 0:
        GameWorld.DebugAnswer(curPlayer, "SetOpenServerWeekday 星期X(默认上星期)")
        GameWorld.DebugAnswer(curPlayer, "注:该命令仅用于设置星期几,对其他功能数据不起作用!如开服天等!")
        return
    weekday = cmdList[0]
    curOpenWeekday = GameWorldProcess.GetOpenServerWeekday()
    if weekday == curOpenWeekday:
        GameWorld.DebugAnswer(curPlayer, "开服时间已经是星期%s" % weekday)
        return
    curDateTime = GameWorld.GetServerTime()
    curWeekday = curDateTime.weekday() + 1
    diffDays = curWeekday + (7 - weekday)
    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.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1))
    PlayerEventCounter.Sync_OpenServerDay(curPlayer)
    return
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/SetWorldLV.py
@@ -31,7 +31,7 @@
def OnExec(curPlayer, cmdList):
    
    if not cmdList:
        initOpenServerTime = PlayerDBGSEvent.GetDBGSTrig_ByKey( PlayerDBGSEvent.Def_InitOpenServerTime)
        initOpenServerTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime)
        worldLV = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
        GameWorld.DebugAnswer(curPlayer, "SetWorldLV 世界等级 可选额外秒")
        GameWorld.DebugAnswer(curPlayer, "开服时间: %s" % GameWorld.ChangeTimeNumToStr(initOpenServerTime))
@@ -55,6 +55,7 @@
    if extraTime:
        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_WorldLVExtraTime, extraTime)
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime, initOpenServerTime)
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_SetOpenServerTime, 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)
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
@@ -40,6 +40,7 @@
import PlayerFamilySWRH
import GameWorldBoss
import PlayerFairyCeremony
import GameWorldProcess
import ChPyNetSendPack
import NetPackCommon
@@ -532,32 +533,52 @@
    curTime = int(time.time())
    curDateStr = GameWorld.ChangeTimeNumToStr(curTime, ChConfig.TYPE_Time_YmdFormat) # 当天日期
    
    GameWorld.Log("加载本日日常活动信息: %s, weekDay=%s,openServerDay=%s" % (curDateStr, weekDay, openServerDay))
    openServerWeekday = GameWorldProcess.GetOpenServerWeekday() # 服务器开服时是星期几
    GameWorld.Log("加载本日日常活动信息: %s, 当前星期%s,开服第%s天,开服是星期%s" % (curDateStr, weekDay, openServerDay, openServerWeekday))
    customDailyIDList = []
    dailyTimeInfoList = []
    customIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("DailyActionCustom", openServerWeekday, openServerDay)
    if customIpyDataList:
        customIDList = []
        for customIpyData in customIpyDataList:
            dataID = customIpyData.GetID()
            dailyID = customIpyData.GetDailyID()
            if dailyID not in customDailyIDList:
                customDailyIDList.append(dailyID)
            dailyTimeInfoList.append([True, customIpyData.GetOpenTimeList(), customIpyData])
            customIDList.append(dataID)
        GameWorld.Log("    本地定制日常活动条数: %s, 配置表ID列表=%s, 定制活动ID列表=%s" % (len(customIpyDataList), customIDList, customDailyIDList))
    
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    dailyActionCount = ipyDataMgr.GetDailyActionCount()
    for i in xrange(dailyActionCount):
        dailyIpyData = ipyDataMgr.GetDailyActionByIndex(i)
        dailyID = dailyIpyData.GetDailyID()
        openServerDayLimit = dailyIpyData.GetOpenServerDay()
        
        if openServerDay < openServerDayLimit:
            GameWorld.Log("    不是日常活动开启天数: dailyID=%s,openServerDayLimit=%s" % (dailyID, openServerDayLimit))
        # 是当天开服天定制活动的不处理常规活动
        if dailyID in customDailyIDList:
            GameWorld.Log("    常规活动ID配置是今天的定制活动ID,不处理!: dailyID=%s" % dailyID)
            continue
        
        openTimeDict = eval(dailyIpyData.GetOpenTime())
        openTimeDict = dailyIpyData.GetOpenTimeDict()
        # 没有时间控制的,代表永久开放
        if not openTimeDict:
            todayActionInfo.append([dailyID])
            GameWorld.Log("    增加本日日常活动信息: dailyID=%s" % dailyID)
            GameWorld.Log("    增加本日常开日常活动信息: dailyID=%s" % dailyID)
            continue
        
        #如果星期key中存在 "0" 代表每日都开启
        if "0" not in openTimeDict and weekDay not in openTimeDict:
            GameWorld.Log("    不是日常活动开启星期: dailyID=%s,openWeekLimit=%s" % (dailyID, openTimeDict.keys()))
            continue
        openTimeList = openTimeDict["0"] if "0" in openTimeDict else openTimeDict[weekDay]
        dailyTimeInfoList.append([False, openTimeList, dailyIpyData])
        
        notifyInfoDict = dailyIpyData.GetNotifyInfo()
    GameWorld.Log("    -----------------------")
    for isCustom, openTimeList, ipyData in dailyTimeInfoList:
        dailyID = ipyData.GetDailyID()
        notifyInfoDict = ipyData.GetNotifyInfo()
        
        openList = [] # [(时,分), ...]
        overList = [] # [(时,分), ...]
@@ -565,7 +586,6 @@
        notifyDict = {} # {(时,分):[notifyKey, [参数]], ...}
        OpenState = 1 # 定义开启状态为1
        
        openTimeList = openTimeDict["0"] if "0" in openTimeDict else openTimeDict[weekDay]
        for hour, minute in openTimeList:  
            openTimeStr = "%s %02d:%02d:%02d" % (curDateStr, hour, minute, 0)
            
@@ -574,7 +594,7 @@
            openList.append((openDateTime.hour, openDateTime.minute))
            
            # 精确关闭时间
            overDateTime = openDateTime + datetime.timedelta(minutes=dailyIpyData.GetDuration())
            overDateTime = openDateTime + datetime.timedelta(minutes=ipyData.GetDuration())
            overList.append((overDateTime.hour, overDateTime.minute))
            
            # goon 开启状态
@@ -591,8 +611,8 @@
                notifyDict[(notifyDateTime.hour, notifyDateTime.minute)] = notifyInfo
                
        todayActionInfo.append([dailyID, openList, overList, goonStateDict, notifyDict])
        GameWorld.Log("    增加本日日常活动信息: dailyID=%s,openList=%s,overList=%s,goonStateDict=%s,notifyDict=%s"
                      % (dailyID, openList, overList, goonStateDict, notifyDict))
        GameWorld.Log("    增加本日日常活动信息: isCustom=%s,dailyID=%s,openList=%s,overList=%s,goonStateDict=%s,notifyDict=%s"
                      % (int(isCustom), dailyID, openList, overList, goonStateDict, notifyDict))
        
    TodayDailyActionInfo = IpyGameDataPY.SetConfigEx(key, [openServerDay, todayActionInfo])
    GameWorld.Log("本日日常活动信息加载完毕!")
@@ -675,8 +695,8 @@
## -------------------------------------------------------------------------------------------------
def __GetFBStateEndTimeNotResetIDList():
    key = "FBStateEndTimeNotReset" # 结束时间状态不重置为0的数据ID
    FBStateEndTimeNotResetIDList = IpyGameDataPY.GetConfigEx(key)
    if FBStateEndTimeNotResetIDList == None:
    notResetIDList = IpyGameDataPY.GetConfigEx(key)
    if notResetIDList == None:
        mapStateTimeDict = {}
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for i in xrange(ipyDataMgr.GetFBStateTimeCount()):
@@ -684,7 +704,7 @@
            dataID = fbStateTimeIpyData.GetID()
            dataMapID = fbStateTimeIpyData.GetDataMapID()
            startWeekDay, startHour, startMinute = fbStateTimeIpyData.GetStartWeekday(), fbStateTimeIpyData.GetStartHour(), fbStateTimeIpyData.GetStartMinute()
            endWeekDay, endHour, endMinute = fbStateTimeIpyData.GetEndWeekday(), fbStateTimeIpyData.GetEndHour(), fbStateTimeIpyData.GetEndMinute()
            endWeekDay, endHour, endMinute = startWeekDay, fbStateTimeIpyData.GetEndHour(), fbStateTimeIpyData.GetEndMinute()
            startTimeList, endTimeDict = mapStateTimeDict.get(dataMapID, [[], {}])
            startTimeList.append([startWeekDay, startHour, startMinute])
            endTimeDict[dataID] = [endWeekDay, endHour, endMinute]
@@ -697,42 +717,86 @@
                # 结束时间属于某一条的开启时间,则不重置,具体状态由另一条决定
                if endTime in startTimeList:
                    FBStateEndTimeNotResetIDList.append(dataID)
        FBStateEndTimeNotResetIDList = IpyGameDataPY.SetConfigEx(key, FBStateEndTimeNotResetIDList)
        GameWorld.Log("加载副本状态结束时间不需要重置状态值的数据ID列表: %s" % FBStateEndTimeNotResetIDList)
    return FBStateEndTimeNotResetIDList
        FBStateEndTimeNotResetIDList.sort()
        # 加载定制表
        customStateTimeDict = {}
        for i in xrange(ipyDataMgr.GetFBStateTimeCustomCount()):
            customIpyData = ipyDataMgr.GetFBStateTimeCustomByIndex(i)
            dataID = customIpyData.GetID()
            dataMapID = customIpyData.GetDataMapID()
            openWeek, openDay = customIpyData.GetOpenServerWeek(), customIpyData.GetOpenServerDay()
            startHour, startMinute = customIpyData.GetStartHour(), customIpyData.GetStartMinute()
            endHour, endMinute = customIpyData.GetEndHour(), customIpyData.GetEndMinute()
            startTimeList, endTimeDict = customStateTimeDict.get(dataMapID, [[], {}])
            startTimeList.append([openWeek, openDay, startHour, startMinute])
            endTimeDict[dataID] = [openWeek, openDay, endHour, endMinute]
            customStateTimeDict[dataMapID] = [startTimeList, endTimeDict]
        FBStateEndTimeNotResetCustomIDList = []
        for dataMapID, timeInfo in customStateTimeDict.items():
            startTimeList, endTimeDict = timeInfo
            for dataID, endTime in endTimeDict.items():
                # 结束时间属于某一条的开启时间,则不重置,具体状态由另一条决定
                if endTime in startTimeList:
                    FBStateEndTimeNotResetCustomIDList.append(dataID)
        FBStateEndTimeNotResetCustomIDList.sort()
        notResetIDList = IpyGameDataPY.SetConfigEx(key, [FBStateEndTimeNotResetIDList, FBStateEndTimeNotResetCustomIDList])
        GameWorld.Log("加载副本状态结束时间不需要重置状态值的数据ID列表:")
        GameWorld.Log("    不需要重置的常规ID: %s" % FBStateEndTimeNotResetIDList)
        GameWorld.Log("    不需要重置的定制ID: %s" % FBStateEndTimeNotResetCustomIDList)
    return notResetIDList
def Dispose_FBStateTime():
    ## 副本状态时间表状态处理, 支持 goon作用,开关服状态不受影响,服务器重新启动会自动变更为所有时间段的状态值
    
    FBStateEndTimeNotResetIDList = __GetFBStateEndTimeNotResetIDList()
    openServerWeek = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerWeek) + 1
    FBStateEndTimeNotResetIDList, FBStateEndTimeNotResetCustomIDList = __GetFBStateEndTimeNotResetIDList()
    openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1
    curDateTime = GameWorld.GetServerTime()
    curWeekDay, curHour, curMinute = curDateTime.weekday() + 1, curDateTime.hour, curDateTime.minute
    
    curTimeWHM = curWeekDay * 10000 + curHour * 100 + curMinute
    GameWorld.DebugLog("副本状态时间表状态处理...openServerWeek=%s,openServerDay=%s,curWeekDay=%s,curHour=%s,curMinute=%s,FBStateEndTimeNotResetIDList=%s"
                       % (openServerWeek, openServerDay, curWeekDay, curHour, curMinute, FBStateEndTimeNotResetIDList))
    openServerWeekday = GameWorldProcess.GetOpenServerWeekday() # 服务器开服时是星期几
    GameWorld.DebugLog("副本状态时间表状态处理...开服是星期%s,开服第%s天, 当前星期%s,%s点%s分"
                       % (openServerWeekday, openServerDay, curWeekDay, curHour, curMinute))
    GameWorld.DebugLog("    FBStateEndTimeNotResetIDList=%s" % (FBStateEndTimeNotResetIDList))
    GameWorld.DebugLog("    FBStateEndTimeNotResetCustomIDList=%s" % (FBStateEndTimeNotResetCustomIDList))
    
    gameWorld = GameWorld.GetGameWorld()
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    customMapIDList = []
    fbStateTimeInfoList = []
    customIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("FBStateTimeCustom", openServerWeekday, openServerDay)
    if customIpyDataList:
        customIDList = []
        for customIpyData in customIpyDataList:
            dataID = customIpyData.GetID()
            dataMapID = customIpyData.GetDataMapID()
            if dataMapID not in customMapIDList:
                customMapIDList.append(dataMapID)
            isCustom, startWeekDay, endWeekDay = True, curWeekDay, curWeekDay
            fbStateTimeInfoList.append([isCustom, startWeekDay, endWeekDay, customIpyData])
            customIDList.append(dataID)
        GameWorld.DebugLog("    定制副本活动条数: %s, 配置表ID列表=%s" % (len(customIpyDataList), customIDList))
    for i in xrange(ipyDataMgr.GetFBStateTimeCount()):
        fbStateTimeIpyData = ipyDataMgr.GetFBStateTimeByIndex(i)
        dataID = fbStateTimeIpyData.GetID()
        dataMapID = fbStateTimeIpyData.GetDataMapID()
        openServerWeekLimit = fbStateTimeIpyData.GetOpenServerWeek()
        openServerDayLimit = fbStateTimeIpyData.GetOpenServerDay()
        if openServerWeek <= openServerWeekLimit:
            #GameWorld.DebugLog("    不是副本状态开启周: i=%s,dataMapID=%s,openServerWeekLimit=%s" % (i, dataMapID, openServerWeekLimit))
        # 是当天开服天定制活动的不处理常规活动
        if dataMapID in customMapIDList:
            continue
        isCustom, startWeekDay, endWeekDay = False, fbStateTimeIpyData.GetStartWeekday(), fbStateTimeIpyData.GetStartWeekday()
        fbStateTimeInfoList.append([isCustom, startWeekDay, endWeekDay, fbStateTimeIpyData])
        
        if openServerDay <= openServerDayLimit:
            #GameWorld.DebugLog("    不是副本状态开启天数: i=%s,dataMapID=%s,openServerDayLimit=%s" % (i, dataMapID, openServerDayLimit))
            continue
    for isCustom, startWeekDay, endWeekDay, ipyData in fbStateTimeInfoList:
        dataID = ipyData.GetID()
        dataMapID = ipyData.GetDataMapID()
        
        startWeekDay, startHour, startMinute = fbStateTimeIpyData.GetStartWeekday(), fbStateTimeIpyData.GetStartHour(), fbStateTimeIpyData.GetStartMinute()
        endWeekDay, endHour, endMinute = fbStateTimeIpyData.GetEndWeekday(), fbStateTimeIpyData.GetEndHour(), fbStateTimeIpyData.GetEndMinute()
        startHour, startMinute = ipyData.GetStartHour(), ipyData.GetStartMinute()
        endHour, endMinute = ipyData.GetEndHour(), ipyData.GetEndMinute()
        # 星期配置0代表每天
        if startWeekDay == 0:
            startWeekDay = curWeekDay
@@ -743,7 +807,7 @@
        #GameWorld.DebugLog("    ID=%s,dataMapID=%s,curTimeWHM=%s,startTimeWHM=%s,endTimeWHM=%s" % (dataID, dataMapID, curTimeWHM, startTimeWHM, endTimeWHM))
        
        # 全服广播key分钟差值对比时间为开始时间, 支持正负时间差
        notifyInfoDict = fbStateTimeIpyData.GetNotifyInfoDict()
        notifyInfoDict = ipyData.GetNotifyInfoDict()
        if notifyInfoDict:
            startDateTime = curDateTime + datetime.timedelta(days=(startWeekDay - curWeekDay))
            startDateTime = datetime.datetime(startDateTime.year, startDateTime.month, startDateTime.day, startHour, startMinute, 0)
@@ -763,7 +827,8 @@
            #GameWorld.DebugLog("        当前是开始时间!")
        # 是结束时间
        elif curTimeWHM == endTimeWHM:
            isReset = dataID not in FBStateEndTimeNotResetIDList
            if (isCustom and dataID not in FBStateEndTimeNotResetCustomIDList) or (not isCustom and dataID not in FBStateEndTimeNotResetIDList):
                isReset = True
            #GameWorld.DebugLog("        当前是结束时间! isReset=%s,FBStateEndTimeNotResetIDList=%s" % (isReset, FBStateEndTimeNotResetIDList))
        # 结束时间是下周
        elif endTimeWHM and endTimeWHM <= startTimeWHM:
@@ -777,8 +842,8 @@
            updCanEnter = 0
            updStateValue = 0
        elif isUpdate:
            updCanEnter = fbStateTimeIpyData.GetCanEnter()
            updStateValue = fbStateTimeIpyData.GetStateValue()
            updCanEnter = ipyData.GetCanEnter()
            updStateValue = ipyData.GetStateValue()
        else:
            #GameWorld.DebugLog("        当前时间副本状态不变!")
            continue
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldFamilyWar.py
@@ -223,7 +223,7 @@
        
    if familyWarRank:
        GameWorld.Log("解散仙盟,触发更新仙盟联赛排名: delFamilyID=%s,familyWarRank=%s" % (familyID, familyWarRank))
        PlayerFamily.UpdFamilyWarRank()
        UpdFamilyWarRank()
        
    # 补发未分配的连胜奖励
    AllotWinRewardBySystem(GetFamilyWarChampionRecData(), True)
@@ -294,7 +294,9 @@
    
    # 下周分组定级
    elif stateValue == FamilyWarState_NextWeekGroupRank:
        DoLogicFamilyWar_NextWeekGroupRank()
        pass
        #废弃该阶段逻辑
        #DoLogicFamilyWar_NextWeekGroupRank()
        
    else:
        GameWorld.ErrLog("不存在该仙盟联赛状态!stateValue=%s" % stateValue)
@@ -738,6 +740,34 @@
    PlayerFamily.UpdFamilyWarRank()
    return
def UpdFamilyWarRank():
    '''更新仙盟联赛排名
    注意:该逻辑在仙盟联赛周期中不可执行,仅在下周分组定级状态下可更新,由程序控制,在活动结束后结算调用
    仙盟联赛新一周期开始时、仙盟解散时 会触发该逻辑
    '''
    #gameWorld = GameWorld.GetGameWorld()
    #state = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_FamilyWar)
    #if state != GameWorldFamilyWar.FamilyWarState_NextWeekGroupRank:
    #    GameWorld.DebugLog("非下周分组定级阶段不可更新仙盟联赛排名!")
    #    return
    GameWorld.Log("=== 更新仙盟联赛排名 ===")
    familyMgr = GameWorld.GetFamilyManager()
    sortFamilyIDList = PlayerFamily.GetSortFamilyIDList()
    for rank, familyID in enumerate(sortFamilyIDList, 1):
        family = familyMgr.FindFamily(familyID)
        if not family:
            continue
        curRank = PlayerFamily.GetFamilyWarRank(family)
        if not curRank:
            break
        if curRank != rank:
            PlayerFamily.SetFamilyWarRank(family, rank)
            GameWorld.Log("    更新仙盟联赛仙盟排名: familyID=%s,curRank=%s,updRank=%s" % (family.GetID(), curRank, rank))
    return
def __DoLogicFamilyWarAllOver():
    ''' 仙盟赛全部比赛结束后逻辑
        非最高级别组: 第一名晋级
@@ -864,6 +894,8 @@
    
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_Round, 0) # 重置对战轮次
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_FamilyWar_AllOver, 1) # 设置已经处理过总结算
    UpdFamilyWarRank() # 改为比赛结束后默认更新联赛排名
    return
def UpdFamilyWarChampion(championFamilyID):
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -1225,10 +1225,10 @@
    #事件汇报初始化
    EventReport.InitDllAppID()
    
    initOpenServerTime = PlayerDBGSEvent.GetDBGSTrig_ByKey( PlayerDBGSEvent.Def_InitOpenServerTime)
    initOpenServerTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime)
    if initOpenServerTime <= 0:
        #记录首次开发时间(现实时间戳)
        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime , int(time.time()))
        PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime, int(time.time()))
    #ReloadModule.RefreshModuleFileCMTime(True)
    #合服首次启动加载处理
    __DoMixServerInit()
@@ -1325,6 +1325,14 @@
    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime, setOpenServerTime)
    return
def GetOpenServerWeekday():
    # 服务器开服时是星期几
    openServerTime = PlayerDBGSEvent.GetDBGSTrig_ByKey( PlayerDBGSEvent.Def_InitOpenServerTime)
    if not openServerTime:
        return 0
    openDatetime = GameWorld.ChangeTimeNumToDatetime(openServerTime)
    return openDatetime.weekday() + 1
## 所有地图服务器初始化成功后(封包注册)
#  @param tick 当前时间
#  @return None
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -80,8 +80,17 @@
                "DailyAction":(
                        ("DWORD", "DailyID", 1),
                        ("BYTE", "OpenServerDay", 0),
                        ("char", "OpenTime", 0),
                        ("dict", "OpenTimeDict", 0),
                        ("DWORD", "Duration", 0),
                        ("dict", "NotifyInfo", 0),
                        ),
                "DailyActionCustom":(
                        ("DWORD", "ID", 0),
                        ("BYTE", "OpenServerWeek", 1),
                        ("DWORD", "OpenServerDay", 1),
                        ("BYTE", "DailyID", 0),
                        ("list", "OpenTimeList", 0),
                        ("DWORD", "Duration", 0),
                        ("dict", "NotifyInfo", 0),
                        ),
@@ -89,12 +98,23 @@
                "FBStateTime":(
                        ("DWORD", "ID", 1),
                        ("DWORD", "DataMapID", 0),
                        ("BYTE", "OpenServerWeek", 0),
                        ("BYTE", "OpenServerDay", 0),
                        ("BYTE", "StartWeekday", 0),
                        ("BYTE", "StartHour", 0),
                        ("BYTE", "StartMinute", 0),
                        ("BYTE", "EndWeekday", 0),
                        ("BYTE", "EndHour", 0),
                        ("BYTE", "EndMinute", 0),
                        ("BYTE", "CanEnter", 0),
                        ("BYTE", "StateValue", 0),
                        ("dict", "NotifyInfoDict", 0),
                        ),
                "FBStateTimeCustom":(
                        ("DWORD", "ID", 0),
                        ("BYTE", "OpenServerWeek", 1),
                        ("DWORD", "OpenServerDay", 1),
                        ("DWORD", "DataMapID", 0),
                        ("BYTE", "StartHour", 0),
                        ("BYTE", "StartMinute", 0),
                        ("BYTE", "EndHour", 0),
                        ("BYTE", "EndMinute", 0),
                        ("BYTE", "CanEnter", 0),
@@ -363,15 +383,34 @@
    
    def __init__(self):
        self.DailyID = 0
        self.OpenServerDay = 0
        self.OpenTime = ""
        self.OpenTimeDict = {}
        self.Duration = 0
        self.NotifyInfo = {}
        return
        
    def GetDailyID(self): return self.DailyID # 活动ID
    def GetOpenServerDay(self): return self.OpenServerDay # 开服第几天开始开启,0为不限制
    def GetOpenTime(self): return self.OpenTime # 开启时间
    def GetOpenTimeDict(self): return self.OpenTimeDict # 开启时间
    def GetDuration(self): return self.Duration # 持续时间, 0为不限制
    def GetNotifyInfo(self): return self.NotifyInfo # 广播提示信息
# 日常活动表定制表
class IPY_DailyActionCustom():
    def __init__(self):
        self.ID = 0
        self.OpenServerWeek = 0
        self.OpenServerDay = 0
        self.DailyID = 0
        self.OpenTimeList = []
        self.Duration = 0
        self.NotifyInfo = {}
        return
    def GetID(self): return self.ID # ID
    def GetOpenServerWeek(self): return self.OpenServerWeek # 开服是周几
    def GetOpenServerDay(self): return self.OpenServerDay # 开服第几天
    def GetDailyID(self): return self.DailyID # 日常活动ID
    def GetOpenTimeList(self): return self.OpenTimeList # 开启时间列表
    def GetDuration(self): return self.Duration # 持续时间, 0为不限制
    def GetNotifyInfo(self): return self.NotifyInfo # 广播提示信息
@@ -381,12 +420,9 @@
    def __init__(self):
        self.ID = 0
        self.DataMapID = 0
        self.OpenServerWeek = 0
        self.OpenServerDay = 0
        self.StartWeekday = 0
        self.StartHour = 0
        self.StartMinute = 0
        self.EndWeekday = 0
        self.EndHour = 0
        self.EndMinute = 0
        self.CanEnter = 0
@@ -396,12 +432,38 @@
        
    def GetID(self): return self.ID # ID
    def GetDataMapID(self): return self.DataMapID # 所属的玩法数据地图ID
    def GetOpenServerWeek(self): return self.OpenServerWeek # 开服X周后开放
    def GetOpenServerDay(self): return self.OpenServerDay # 开服X天后开放
    def GetStartWeekday(self): return self.StartWeekday # 开始星期
    def GetStartHour(self): return self.StartHour # 开始时
    def GetStartMinute(self): return self.StartMinute # 开始分
    def GetEndWeekday(self): return self.EndWeekday # 结束星期
    def GetEndHour(self): return self.EndHour # 结束时
    def GetEndMinute(self): return self.EndMinute # 结束分
    def GetCanEnter(self): return self.CanEnter # 是否可进入副本
    def GetStateValue(self): return self.StateValue # ״ֵ̬
    def GetNotifyInfoDict(self): return self.NotifyInfoDict # 广播提示信息
# 副本状态时间定制表
class IPY_FBStateTimeCustom():
    def __init__(self):
        self.ID = 0
        self.OpenServerWeek = 0
        self.OpenServerDay = 0
        self.DataMapID = 0
        self.StartHour = 0
        self.StartMinute = 0
        self.EndHour = 0
        self.EndMinute = 0
        self.CanEnter = 0
        self.StateValue = 0
        self.NotifyInfoDict = {}
        return
    def GetID(self): return self.ID # ID
    def GetOpenServerWeek(self): return self.OpenServerWeek # 开服是周几
    def GetOpenServerDay(self): return self.OpenServerDay # 开服第几天
    def GetDataMapID(self): return self.DataMapID # 所属的玩法数据地图ID
    def GetStartHour(self): return self.StartHour # 开始时
    def GetStartMinute(self): return self.StartMinute # 开始分
    def GetEndHour(self): return self.EndHour # 结束时
    def GetEndMinute(self): return self.EndMinute # 结束分
    def GetCanEnter(self): return self.CanEnter # 是否可进入副本
@@ -774,8 +836,12 @@
        self.ipyActionControlLen = len(self.ipyActionControlCache)
        self.ipyDailyActionCache = self.__LoadFileData("DailyAction", IPY_DailyAction)
        self.ipyDailyActionLen = len(self.ipyDailyActionCache)
        self.ipyDailyActionCustomCache = self.__LoadFileData("DailyActionCustom", IPY_DailyActionCustom)
        self.ipyDailyActionCustomLen = len(self.ipyDailyActionCustomCache)
        self.ipyFBStateTimeCache = self.__LoadFileData("FBStateTime", IPY_FBStateTime)
        self.ipyFBStateTimeLen = len(self.ipyFBStateTimeCache)
        self.ipyFBStateTimeCustomCache = self.__LoadFileData("FBStateTimeCustom", IPY_FBStateTimeCustom)
        self.ipyFBStateTimeCustomLen = len(self.ipyFBStateTimeCustomCache)
        self.ipyFBLineCache = self.__LoadFileData("FBLine", IPY_FBLine)
        self.ipyFBLineLen = len(self.ipyFBLineCache)
        self.ipyChinMapCache = self.__LoadFileData("ChinMap", IPY_ChinMap)
@@ -986,8 +1052,12 @@
    def GetActionControlByIndex(self, index): return self.ipyActionControlCache[index]
    def GetDailyActionCount(self): return self.ipyDailyActionLen
    def GetDailyActionByIndex(self, index): return self.ipyDailyActionCache[index]
    def GetDailyActionCustomCount(self): return self.ipyDailyActionCustomLen
    def GetDailyActionCustomByIndex(self, index): return self.ipyDailyActionCustomCache[index]
    def GetFBStateTimeCount(self): return self.ipyFBStateTimeLen
    def GetFBStateTimeByIndex(self, index): return self.ipyFBStateTimeCache[index]
    def GetFBStateTimeCustomCount(self): return self.ipyFBStateTimeCustomLen
    def GetFBStateTimeCustomByIndex(self, index): return self.ipyFBStateTimeCustomCache[index]
    def GetFBLineCount(self): return self.ipyFBLineLen
    def GetFBLineByIndex(self, index): return self.ipyFBLineCache[index]
    def GetChinMapCount(self): return self.ipyChinMapLen
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerEventCounter.py
@@ -293,6 +293,7 @@
    packData.Day = openDay
    packData.IsMixServer = isMixServer
    packData.MixDay = mixServerDay
    packData.OpenServerTime = GameWorld.ChangeTimeNumToStr(PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime))
    NetPackCommon.SendFakePack(curPlayer, packData)
    return
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFamily.py
@@ -3345,32 +3345,6 @@
    
    return 0
def UpdFamilyWarRank():
    '''更新仙盟联赛排名
    注意:该逻辑在仙盟联赛周期中不可执行,仅在下周分组定级状态下可更新
    仙盟联赛新一周期开始时、仙盟解散时 会触发该逻辑
    '''
    gameWorld = GameWorld.GetGameWorld()
    state = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_FBFuncState % ChConfig.Def_FBMapID_FamilyWar)
    if state != GameWorldFamilyWar.FamilyWarState_NextWeekGroupRank:
        GameWorld.DebugLog("非下周分组定级阶段不可更新仙盟联赛排名!")
        return
    familyMgr = GameWorld.GetFamilyManager()
    sortFamilyIDList = GetSortFamilyIDList()
    for rank, familyID in enumerate(sortFamilyIDList, 1):
        family = familyMgr.FindFamily(familyID)
        if not family:
            continue
        curRank = GetFamilyWarRank(family)
        if not curRank:
            break
        if curRank != rank:
            SetFamilyWarRank(family, rank)
            GameWorld.Log("更新仙盟联赛仙盟排名: familyID=%s,rank=%s" % (family.GetID(), rank))
    return
#// A4 11 一键申请入盟 #tagCGOneKeyJoinFamily
#
#struct    tagCGOneKeyJoinFamily
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -311,60 +311,78 @@
#A0 05 同步开服天数 #tagOpenServerDay
class  tagOpenServerDay(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("Day", c_ushort),    # 已开服天数,从0开始
                  ("IsMixServer", c_ubyte),    #是否是合服服务器
                  ("MixDay", c_ushort),    # 已合服天数,从0开始
                  ]
    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
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA0
        self.SubCmd = 0x05
        self.Head.Cmd = 0xA0
        self.Head.SubCmd = 0x05
        return
    def ReadData(self, stringData, _pos=0, _len=0):
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
        _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
    def Clear(self):
        self.Cmd = 0xA0
        self.SubCmd = 0x05
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA0
        self.Head.SubCmd = 0x05
        self.Day = 0
        self.IsMixServer = 0
        self.MixDay = 0
        self.OpenServerTime = ""
        return
    def GetLength(self):
        return sizeof(tagOpenServerDay)
        length = 0
        length += self.Head.GetLength()
        length += 2
        length += 1
        length += 2
        length += 19
        return length
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
        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
    def OutputString(self):
        DumpString = '''//A0 05 同步开服天数 //tagOpenServerDay:
                                Cmd:%s,
                                SubCmd:%s,
        DumpString = '''
                                Head:%s,
                                Day:%d,
                                IsMixServer:%d,
                                MixDay:%d
                                MixDay:%d,
                                OpenServerTime:%s
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.Head.OutputString(),
                                self.Day,
                                self.IsMixServer,
                                self.MixDay
                                self.MixDay,
                                self.OpenServerTime
                                )
        return DumpString
m_NAtagOpenServerDay=tagOpenServerDay()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagOpenServerDay.Cmd,m_NAtagOpenServerDay.SubCmd))] = m_NAtagOpenServerDay
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagOpenServerDay.Head.Cmd,m_NAtagOpenServerDay.Head.SubCmd))] = m_NAtagOpenServerDay
#------------------------------------------------------