8650 【主干】【BT2】活动规则优化(限时抢购支持多活动编号同时开启);
12个文件已修改
212 ■■■■ 已修改文件
PySysDB/PySysDBG.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashSale.py 141 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBG.h
@@ -530,9 +530,9 @@
struct tagActFlashSale
{
    DWORD        _CfgID;    //配置ID
    char        ActMark;    //活动组标记
    list        PlatformList;    //活动平台列表["平台A", "平台A", ...],配[]代表所有
    list        ServerGroupIDList;    //服务器ID列表
    BYTE        ActNum;    //活动分组编号, 活动类型 * 10 + 不同界面编号
    char        StartDate;    //开启日期
    char        EndDate;    //结束日期
    list        StartTimeList;    //开启时间列表, 支持多个时段
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -13545,6 +13545,7 @@
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("ActNum", c_ubyte),    #活动编号
                  ("GoodsID", c_int),    # 抢购商品标识
                  ("State", c_ubyte),    # 1-预约 0-取消
                  ]
@@ -13563,6 +13564,7 @@
    def Clear(self):
        self.Cmd = 0xAA
        self.SubCmd = 0x05
        self.ActNum = 0
        self.GoodsID = 0
        self.State = 0
        return
@@ -13577,12 +13579,14 @@
        DumpString = '''// AA 05 限时抢购预约 //tagCMFlashSaleAppointment:
                                Cmd:%s,
                                SubCmd:%s,
                                ActNum:%d,
                                GoodsID:%d,
                                State:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.ActNum,
                                self.GoodsID,
                                self.State
                                )
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -29585,6 +29585,7 @@
class  tagMCFlashSaleAppointmentInfo(Structure):
    Head = tagHead()
    ActNum = 0    #(BYTE ActNum)//活动编号
    IsAll = 0    #(BYTE IsAll)// 是否全部
    GoodsCount = 0    #(WORD GoodsCount)// 商品数
    GoodsList = list()    #(vector<tagMCFlashSaleAppointmentState> GoodsList)// 预约的商品
@@ -29599,6 +29600,7 @@
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.IsAll,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.GoodsCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
        for i in range(self.GoodsCount):
@@ -29612,6 +29614,7 @@
        self.Head.Clear()
        self.Head.Cmd = 0xAA
        self.Head.SubCmd = 0x18
        self.ActNum = 0
        self.IsAll = 0
        self.GoodsCount = 0
        self.GoodsList = list()
@@ -29620,6 +29623,7 @@
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 1
        length += 2
        for i in range(self.GoodsCount):
@@ -29630,6 +29634,7 @@
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.ActNum)
        data = CommFunc.WriteBYTE(data, self.IsAll)
        data = CommFunc.WriteWORD(data, self.GoodsCount)
        for i in range(self.GoodsCount):
@@ -29639,12 +29644,14 @@
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                ActNum:%d,
                                IsAll:%d,
                                GoodsCount:%d,
                                GoodsList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.ActNum,
                                self.IsAll,
                                self.GoodsCount,
                                "..."
@@ -29837,6 +29844,7 @@
class  tagMCFlashSaleInfo(Structure):
    Head = tagHead()
    ActNum = 0    #(BYTE ActNum)//活动编号
    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
    AdvanceMinutes = 0    #(WORD AdvanceMinutes)// 提前显示分钟
@@ -29857,6 +29865,7 @@
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
        self.AdvanceMinutes,_pos = CommFunc.ReadWORD(_lpData, _pos)
@@ -29879,6 +29888,7 @@
        self.Head.Clear()
        self.Head.Cmd = 0xAA
        self.Head.SubCmd = 0x17
        self.ActNum = 0
        self.StartDate = ""
        self.EndtDate = ""
        self.AdvanceMinutes = 0
@@ -29893,6 +29903,7 @@
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 10
        length += 10
        length += 2
@@ -29910,6 +29921,7 @@
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.ActNum)
        data = CommFunc.WriteString(data, 10, self.StartDate)
        data = CommFunc.WriteString(data, 10, self.EndtDate)
        data = CommFunc.WriteWORD(data, self.AdvanceMinutes)
@@ -29926,6 +29938,7 @@
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                ActNum:%d,
                                StartDate:%s,
                                EndtDate:%s,
                                AdvanceMinutes:%d,
@@ -29938,6 +29951,7 @@
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.ActNum,
                                self.StartDate,
                                self.EndtDate,
                                self.AdvanceMinutes,
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -443,9 +443,9 @@
                "ActFlashSale":(
                        ("DWORD", "CfgID", 1),
                        ("char", "ActMark", 0),
                        ("list", "PlatformList", 0),
                        ("list", "ServerGroupIDList", 0),
                        ("BYTE", "ActNum", 0),
                        ("char", "StartDate", 0),
                        ("char", "EndDate", 0),
                        ("list", "StartTimeList", 0),
@@ -1546,9 +1546,9 @@
    
    def __init__(self):
        self.CfgID = 0
        self.ActMark = ""
        self.PlatformList = []
        self.ServerGroupIDList = []
        self.ActNum = 0
        self.StartDate = ""
        self.EndDate = ""
        self.StartTimeList = []
@@ -1563,9 +1563,9 @@
        return
        
    def GetCfgID(self): return self.CfgID # 配置ID
    def GetActMark(self): return self.ActMark # 活动组标记
    def GetPlatformList(self): return self.PlatformList # 活动平台列表["平台A", "平台A", ...],配[]代表所有
    def GetServerGroupIDList(self): return self.ServerGroupIDList # 服务器ID列表
    def GetActNum(self): return self.ActNum # 活动分组编号, 活动类型 * 10 + 不同界面编号
    def GetStartDate(self): return self.StartDate # 开启日期
    def GetEndDate(self): return self.EndDate # 结束日期
    def GetStartTimeList(self): return self.StartTimeList # 开启时间列表, 支持多个时段
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -265,7 +265,7 @@
#支持多活动分组编号的活动名
MultiActNumOperationActNameList = [OperationActionName_TotalRecharge, OperationActionName_CollectWords,
                                   OperationActionName_FlashGiftbag, OperationActionName_CostRebate,
                                   OperationActionName_SpringSale,
                                   OperationActionName_SpringSale, OperationActionName_FlashSale,
                                   ]
#跨服运营活动表名定义
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3768,10 +3768,10 @@
Def_PDict_BindJadeWheelHistoryCnt = "BindJadeWheelHistoryCnt"  # 历史已转次数
#限时抢购活动
Def_PDict_FlashSaleID = "FlashSaleID"  # 玩家身上的限时抢购活动ID,唯一标识,取活动开始日期time
Def_PDict_FlashSaleState = "FlashSaleState"  # 玩家身上的限时抢购活动state
Def_PDict_FlashSaleMailState = "FlashSaleMailState"  # 玩家身上的活动更新提醒邮件状态
Def_PDict_FlashSaleYY = "FlashSaleYY_%s"  # 玩家预约限时抢购商品
Def_PDict_FlashSaleID = "FlashSaleID_%s"  # 玩家身上的限时抢购活动ID,唯一标识,取活动开始日期time,参数(活动编号)
Def_PDict_FlashSaleState = "FlashSaleState_%s"  # 玩家身上的限时抢购活动state,参数(活动编号)
Def_PDict_FlashSaleMailState = "FlashSaleMailState_%s"  # 玩家身上的活动更新提醒邮件状态,参数(活动编号)
Def_PDict_FlashSaleYY = "FlashSaleYY_%s_%s"  # 玩家预约限时抢购商品,参数(活动编号, 商品标识)
#许愿池活动
Def_PDict_WishingWellID = "WishingWellID"  # 玩家身上的许愿池活动ID,唯一标识,取活动开始日期time值
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -13545,6 +13545,7 @@
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("ActNum", c_ubyte),    #活动编号
                  ("GoodsID", c_int),    # 抢购商品标识
                  ("State", c_ubyte),    # 1-预约 0-取消
                  ]
@@ -13563,6 +13564,7 @@
    def Clear(self):
        self.Cmd = 0xAA
        self.SubCmd = 0x05
        self.ActNum = 0
        self.GoodsID = 0
        self.State = 0
        return
@@ -13577,12 +13579,14 @@
        DumpString = '''// AA 05 限时抢购预约 //tagCMFlashSaleAppointment:
                                Cmd:%s,
                                SubCmd:%s,
                                ActNum:%d,
                                GoodsID:%d,
                                State:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.ActNum,
                                self.GoodsID,
                                self.State
                                )
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -29585,6 +29585,7 @@
class  tagMCFlashSaleAppointmentInfo(Structure):
    Head = tagHead()
    ActNum = 0    #(BYTE ActNum)//活动编号
    IsAll = 0    #(BYTE IsAll)// 是否全部
    GoodsCount = 0    #(WORD GoodsCount)// 商品数
    GoodsList = list()    #(vector<tagMCFlashSaleAppointmentState> GoodsList)// 预约的商品
@@ -29599,6 +29600,7 @@
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.IsAll,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.GoodsCount,_pos = CommFunc.ReadWORD(_lpData, _pos)
        for i in range(self.GoodsCount):
@@ -29612,6 +29614,7 @@
        self.Head.Clear()
        self.Head.Cmd = 0xAA
        self.Head.SubCmd = 0x18
        self.ActNum = 0
        self.IsAll = 0
        self.GoodsCount = 0
        self.GoodsList = list()
@@ -29620,6 +29623,7 @@
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 1
        length += 2
        for i in range(self.GoodsCount):
@@ -29630,6 +29634,7 @@
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.ActNum)
        data = CommFunc.WriteBYTE(data, self.IsAll)
        data = CommFunc.WriteWORD(data, self.GoodsCount)
        for i in range(self.GoodsCount):
@@ -29639,12 +29644,14 @@
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                ActNum:%d,
                                IsAll:%d,
                                GoodsCount:%d,
                                GoodsList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.ActNum,
                                self.IsAll,
                                self.GoodsCount,
                                "..."
@@ -29837,6 +29844,7 @@
class  tagMCFlashSaleInfo(Structure):
    Head = tagHead()
    ActNum = 0    #(BYTE ActNum)//活动编号
    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
    AdvanceMinutes = 0    #(WORD AdvanceMinutes)// 提前显示分钟
@@ -29857,6 +29865,7 @@
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.StartDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
        self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
        self.AdvanceMinutes,_pos = CommFunc.ReadWORD(_lpData, _pos)
@@ -29879,6 +29888,7 @@
        self.Head.Clear()
        self.Head.Cmd = 0xAA
        self.Head.SubCmd = 0x17
        self.ActNum = 0
        self.StartDate = ""
        self.EndtDate = ""
        self.AdvanceMinutes = 0
@@ -29893,6 +29903,7 @@
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 10
        length += 10
        length += 2
@@ -29910,6 +29921,7 @@
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.ActNum)
        data = CommFunc.WriteString(data, 10, self.StartDate)
        data = CommFunc.WriteString(data, 10, self.EndtDate)
        data = CommFunc.WriteWORD(data, self.AdvanceMinutes)
@@ -29926,6 +29938,7 @@
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                ActNum:%d,
                                StartDate:%s,
                                EndtDate:%s,
                                AdvanceMinutes:%d,
@@ -29938,6 +29951,7 @@
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.ActNum,
                                self.StartDate,
                                self.EndtDate,
                                self.AdvanceMinutes,
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/FunctionNPCCommon.py
@@ -558,18 +558,7 @@
        if not PlayerSpringSale.IsSpringSaleShopType(shopType):
            return
    elif operationActionShopType == 2:
        actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {})
        state = actInfo.get(ShareDefine.ActKey_State, 0)
        if not state:
            GameWorld.DebugLog("限时抢购非活动中!state=%s" % (state), curPlayer.GetPlayerID())
            return
        shopTypeList = PlayerFlashSale.GetShopTypeList(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0), state, actInfo.get(ShareDefine.ActKey_WorldLV, 0))
        if not shopTypeList:
            return
        actShopType = shopTypeList[0]
        if shopType != actShopType:
            GameWorld.DebugLog("限时抢购非活动中的商店类型!state=%s,shopType=%s,actShopType=%s,shopTypeList=%s"
                               % (state, shopType, actShopType, shopTypeList), curPlayer.GetPlayerID())
        if not PlayerFlashSale.IsFlashSaleShopType(shopType):
            return
        
    # 物品信息
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -1376,7 +1376,7 @@
                PlayerNewFairyCeremony.RefreshOperationAction_NewFairyCeremony()
                
            elif actionName == ShareDefine.OperationActionName_FlashSale:
                PlayerFlashSale.RefreshflashSaleActionInfo()
                PlayerFlashSale.RefreshflashSaleActionInfo(actNum)
                
            elif actionName == ShareDefine.OperationActionName_WishingWell:
                PlayerWishingWell.RefreshWishingWellAction()
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFlashSale.py
@@ -42,35 +42,86 @@
def OnPlayerLogin(curPlayer):
    __CheckPlayerflashSaleAction(curPlayer)
    TransferPlayerActDBKeyValue(curPlayer)
    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {}).values():
        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
        __CheckPlayerflashSaleAction(curPlayer, actNum)
    return
def TransferPlayerActDBKeyValue(curPlayer):
    ## 玩家登录时调用,旧版本玩家活动数据转移到新版本字典,线上版本维护之后的版本可删除此代码,线上版本分支 gt_1.100.4
def RefreshflashSaleActionInfo():
    #限时抢购活动
    Def_PDict_FlashSaleID = "FlashSaleID"  # 玩家身上的限时抢购活动ID,唯一标识,取活动开始日期time
    Def_PDict_FlashSaleState = "FlashSaleState"  # 玩家身上的限时抢购活动state
    Def_PDict_FlashSaleMailState = "FlashSaleMailState"  # 玩家身上的活动更新提醒邮件状态
    Def_PDict_FlashSaleYY = "FlashSaleYY_%s"  # 玩家预约限时抢购商品
    playerActID = curPlayer.NomalDictGetProperty(Def_PDict_FlashSaleID, 0, ChConfig.Def_PDictType_FlashSale)
    if not playerActID:
        return
    tagActNum = 10
    playerState = curPlayer.NomalDictGetProperty(Def_PDict_FlashSaleState, 0, ChConfig.Def_PDictType_FlashSale)
    playerMailState = curPlayer.NomalDictGetProperty(Def_PDict_FlashSaleMailState, 0, ChConfig.Def_PDictType_FlashSale)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleID % tagActNum, playerActID, ChConfig.Def_PDictType_FlashSale)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleState % tagActNum, playerState, ChConfig.Def_PDictType_FlashSale)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleMailState % tagActNum, playerMailState, ChConfig.Def_PDictType_FlashSale)
    PlayerControl.NomalDictSetProperty(curPlayer, Def_PDict_FlashSaleID, 0, ChConfig.Def_PDictType_FlashSale)
    PlayerControl.NomalDictSetProperty(curPlayer, Def_PDict_FlashSaleState, 0, ChConfig.Def_PDictType_FlashSale)
    PlayerControl.NomalDictSetProperty(curPlayer, Def_PDict_FlashSaleMailState, 0, ChConfig.Def_PDictType_FlashSale)
    GameWorld.Log("限时抢购转移玩家活动字典记录: tagActNum=%s,playerActID=%s,playerState=%s,playerMailState=%s"
                  % (tagActNum, playerActID, playerState, playerMailState), curPlayer.GetPlayerID())
    for dayIndex in xrange(7): # 支持7天
        for timeIndex in xrange(2): # 支持2个时段
            for i in xrange(10): # 支持10个物品
                goodsMark = dayIndex * 10000 + timeIndex * 100 + i  #商品标识
                isAppointment = curPlayer.NomalDictGetProperty(Def_PDict_FlashSaleYY % goodsMark, 0, ChConfig.Def_PDictType_FlashSale)
                if not isAppointment:
                    continue
                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleYY % (tagActNum, goodsMark), isAppointment, ChConfig.Def_PDictType_FlashSale)
                PlayerControl.NomalDictSetProperty(curPlayer, Def_PDict_FlashSaleYY % goodsMark, 0, ChConfig.Def_PDictType_FlashSale)
                GameWorld.Log("    转移预约状态: dayIndex=%s,timeIndex=%s,i=%s,goodsMark=%s, %s"
                              % (dayIndex, timeIndex, i, goodsMark, isAppointment), curPlayer.GetPlayerID())
    return
def RefreshflashSaleActionInfo(actNum):
    ## 收到GameServer同步的活动信息,刷新活动信息
    playerManager = GameWorld.GetPlayerManager()
    for index in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(index)
        if curPlayer.GetID() == 0:
            continue
        __CheckPlayerflashSaleAction(curPlayer)
        __CheckPlayerflashSaleAction(curPlayer, actNum)
    return
def __CheckPlayerflashSaleAction(curPlayer):
def __CheckPlayerflashSaleAction(curPlayer, actNum):
    ## 检查玩家限时抢购活动数据信息
    
    playerID = curPlayer.GetPlayerID()
    
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {})
    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashSale, actNum)
    actID = actInfo.get(ShareDefine.ActKey_ID, 0)
    state = actInfo.get(ShareDefine.ActKey_State, 0)
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
    dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0)
    woldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0)
    playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleID, 0, ChConfig.Def_PDictType_FlashSale)  # 玩家身上的活动ID
    playerActState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleState, 0, ChConfig.Def_PDictType_FlashSale)  # 玩家身上的活动State
    playerMailState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleMailState, 0, ChConfig.Def_PDictType_FlashSale)  # 玩家身上的活动提醒邮件状态
    playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleID % actNum, 0, ChConfig.Def_PDictType_FlashSale)  # 玩家身上的活动ID
    playerActState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleState % actNum, 0, ChConfig.Def_PDictType_FlashSale)  # 玩家身上的活动State
    playerMailState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleMailState % actNum, 0, ChConfig.Def_PDictType_FlashSale)  # 玩家身上的活动提醒邮件状态
    isReset = False
    if actID != playerActID or (state != playerActState):
        isReset = True
@@ -88,45 +139,65 @@
        shopTypeList = GetShopTypeList(cfgID, dayIndex, state, woldLV)
        if shopTypeList:
            FunctionNPCCommon.ResetShopItemBuyCountByShopType(curPlayer, shopTypeList)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleID, actID, ChConfig.Def_PDictType_FlashSale)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleState, state, ChConfig.Def_PDictType_FlashSale)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleID % actNum, actID, ChConfig.Def_PDictType_FlashSale)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleState % actNum, state, ChConfig.Def_PDictType_FlashSale)
        #Sync_flashSaleActionInfo(curPlayer)
        GameWorld.DebugLog("限时抢购单场重置! actID=%s,playerActID=%s,dayIndex=%s,state=%s,playerActState=%s,shopTypeList=%s,playerMailState=%s" % (actID, playerActID, dayIndex, state, playerActState, shopTypeList,playerMailState), playerID)
        GameWorld.DebugLog("限时抢购单场重置! actNum=%s,actID=%s,playerActID=%s,dayIndex=%s,state=%s,playerActState=%s,shopTypeList=%s,playerMailState=%s" % (actNum, actID, playerActID, dayIndex, state, playerActState, shopTypeList,playerMailState), playerID)
    else:
        GameWorld.DebugLog("限时抢购活动ID不变,不处理!", playerID)
        GameWorld.DebugLog("限时抢购活动ID不变,不处理!actNum=%s,actID=%s,state=%s" % (actNum, actID, state), playerID)
        
    if cfgID:
        Sync_flashSaleActionInfo(curPlayer)
        Sync_FlashSaleAppointmentInfo(curPlayer)
        Sync_flashSaleActionInfo(curPlayer, actNum)
        Sync_FlashSaleAppointmentInfo(curPlayer, actNum)
    return isReset
def IsFlashSaleShopType(shopType):
    ## 判断是否活动中的商店
    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {}).values():
        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
        state = actInfo.get(ShareDefine.ActKey_State, 0)
        if not state:
            continue
        shopTypeList = GetShopTypeList(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0), state, actInfo.get(ShareDefine.ActKey_WorldLV, 0))
        if not shopTypeList:
            continue
        actShopType = shopTypeList[0]
        if shopType == actShopType:
            GameWorld.DebugLog("限时抢购活动中的商店类型: actNum=%s,shopType=%s" % (actNum, shopType))
            return True
    GameWorld.DebugLog("限时抢购非活动中或非活动中的商店类型!shopType=%s" % (shopType))
    return False
def ProcessFlashSaleMail(curPlayer, tick):
    if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_FlashSale, tick):
        return
    playerMailState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleMailState, 0, ChConfig.Def_PDictType_FlashSale)  # 玩家身上的活动提醒邮件状态
    if playerMailState:
        return
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {})
    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {}).values():
        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
    if not actInfo:
        return
            continue
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
    if not cfgID:
        return
            continue
        playerMailState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleMailState % actNum, 0, ChConfig.Def_PDictType_FlashSale)  # 玩家身上的活动提醒邮件状态
        if playerMailState:
            continue
    flashSaleIpyData = IpyGameDataPY.GetIpyGameData("ActFlashSale", cfgID)
    if not flashSaleIpyData:
        return
            continue
    mailKey = flashSaleIpyData.GetMailKey()
    LVLimit = flashSaleIpyData.GetLVLimit()
    if not mailKey or curPlayer.GetLV() < LVLimit:
        return
            continue
    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
    startDate = GameWorld.GetOperationActionDateStr(flashSaleIpyData.GetStartDate(), openServerDay)
    endDate = GameWorld.GetOperationActionDateStr(flashSaleIpyData.GetEndDate(), openServerDay)
    startTimeList = flashSaleIpyData.GetStartTimeList()
    endTimeList = flashSaleIpyData.GetEndTimeList()
    if not startTimeList or not endTimeList:
        return
            continue
    advanceMinutes = flashSaleIpyData.GetAdvanceMinutes()
    startTime = datetime.datetime.strptime("%s %s:00" % (startDate, startTimeList[0]), ChConfig.TYPE_Time_Format) + datetime.timedelta(minutes=-advanceMinutes)
    endTime = datetime.datetime.strptime("%s %s:00" % (endDate, endTimeList[-1]), ChConfig.TYPE_Time_Format)
@@ -135,16 +206,16 @@
        paramList = [startDate.replace('-','/'), endDate.replace('-','/'), GameWorld.GbkToCode('、').join(startTimeList)]
        PlayerControl.SendMailByKey(mailKey, [curPlayer.GetID()], flashSaleIpyData.GetMailItemPrize(), paramList)
        startTimeNum = GameWorld.ChangeTimeStrToNum(startDate, timeFormat=ChConfig.TYPE_Time_Format_Day)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleMailState, startTimeNum, ChConfig.Def_PDictType_FlashSale)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleMailState % actNum, startTimeNum, ChConfig.Def_PDictType_FlashSale)
        GameWorld.DebugLog("    发送新限时抢购邮件提醒!", curPlayer.GetID())
#    else:
#        GameWorld.DebugLog("    发送新限时抢购邮件提醒  时间没到!startTime=%s,endTime=%s,curDateTime=%s"%(startTime,endTime,curDateTime), curPlayer.GetID())
    return
def Sync_flashSaleActionInfo(curPlayer):
def Sync_flashSaleActionInfo(curPlayer, actNum):
    ## 通知限时抢购活动信息
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {})
    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashSale, actNum)
    if not actInfo:
        return
    
@@ -169,6 +240,7 @@
    job = curPlayer.GetJob()
    openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
    packInfo = ChPyNetSendPack.tagMCFlashSaleInfo()
    packInfo.ActNum = actNum
    packInfo.StartDate = GameWorld.GetOperationActionDateStr(flashSaleIpyData.GetStartDate(), openServerDay)
    packInfo.EndtDate = GameWorld.GetOperationActionDateStr(flashSaleIpyData.GetEndDate(), openServerDay)
    packInfo.AdvanceMinutes = flashSaleIpyData.GetAdvanceMinutes()
@@ -222,27 +294,29 @@
#struct     tagCMFlashSaleAppointment
#{
#    tagHead        Head;
#    BYTE        ActNum;        //活动编号
#    DWORD        GoodsID;         // 抢购商品标识
#    BYTE        State;         // 1-预约 0-取消
#};
def OnFlashSaleAppointment(index, packData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    actNum = packData.ActNum
    goodsID = packData.GoodsID
    
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {})
    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashSale, actNum)
    if not actInfo:
        return
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
    if not cfgID:
        return
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleYY % goodsID, packData.State, ChConfig.Def_PDictType_FlashSale)
    Sync_FlashSaleAppointmentInfo(curPlayer, goodsID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashSaleYY % (actNum, goodsID), packData.State, ChConfig.Def_PDictType_FlashSale)
    Sync_FlashSaleAppointmentInfo(curPlayer, actNum, goodsID)
    return
def Sync_FlashSaleAppointmentInfo(curPlayer, goodsID=0):
def Sync_FlashSaleAppointmentInfo(curPlayer, actNum, goodsID=0):
    ##通知限时抢购预约情况
    actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashSale, {})
    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashSale, actNum)
    if not actInfo:
        return
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
@@ -254,6 +328,7 @@
    woldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0)
    
    packInfo = ChPyNetSendPack.tagMCFlashSaleAppointmentInfo()
    packInfo.ActNum = actNum
    packInfo.GoodsList = []
    if goodsID == 0:
        packInfo.IsAll = 1
@@ -265,7 +340,7 @@
                    continue
                for i in xrange(len(shopItemIpyDataList)):
                    goodsMark = dayIndex * 10000 + timeIndex * 100 + i  #商品标识
                    isAppointment = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleYY % goodsMark, 0, ChConfig.Def_PDictType_FlashSale)
                    isAppointment = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleYY % (actNum, goodsMark), 0, ChConfig.Def_PDictType_FlashSale)
                    if isAppointment:
                        appoinetmentPack = ChPyNetSendPack.tagMCFlashSaleAppointmentState()
                        appoinetmentPack.GoodsMark = goodsMark
@@ -273,7 +348,7 @@
                        packInfo.GoodsList.append(appoinetmentPack)
    else:
        packInfo.IsAll = 0
        isAppointment = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleYY % goodsID, 0, ChConfig.Def_PDictType_FlashSale)
        isAppointment = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashSaleYY % (actNum, goodsID), 0, ChConfig.Def_PDictType_FlashSale)
        appoinetmentPack = ChPyNetSendPack.tagMCFlashSaleAppointmentState()
        appoinetmentPack.GoodsMark = goodsID
        appoinetmentPack.State = isAppointment
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -265,7 +265,7 @@
#支持多活动分组编号的活动名
MultiActNumOperationActNameList = [OperationActionName_TotalRecharge, OperationActionName_CollectWords,
                                   OperationActionName_FlashGiftbag, OperationActionName_CostRebate,
                                   OperationActionName_SpringSale,
                                   OperationActionName_SpringSale, OperationActionName_FlashSale,
                                   ]
#跨服运营活动表名定义