hxp
2023-08-01 8bb11f630222dfe8d264d915ca7b638167af95eb
9873 【骨折2】【主干】买1送5活动

# Conflicts:
# ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
# ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
# ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
10个文件已修改
1个文件已添加
1118 ■■■■■ 已修改文件
PySysDB/PySysDBG.h 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 342 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 342 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyOne.py 255 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBG.h
@@ -473,6 +473,22 @@
    BYTE        IsDayReset;    //是否每天重置
};
//买一送多活动表
struct tagActBuyOne
{
    DWORD        _CfgID;    //配置ID
    list        PlatformList;    //活动平台列表["平台A", "平台A", ...],配[]代表所有
    list        ServerGroupIDList;    //服务器ID列表
    BYTE        ActNum;    //活动分组编号, 活动类型 * 10 + 不同界面编号
    char        StartDate;    //开启日期
    char        EndDate;    //结束日期
    dict        NotifyInfoStart;    //全服提示信息 - 相对开始时间
    dict        NotifyInfoEnd;    //全服提示信息 - 相对结束时间
    list        NotifyInfoLoop;    //全服提示信息 - 循环广播[间隔分钟, 广播key]
    BYTE        IsDayReset;    //是否每天重置
};
//集字活动时间表
struct tagActCollectWords
PySysDB/PySysDBPY.h
@@ -1631,6 +1631,28 @@
    char        NotifyKey;        //全服广播key,默认两个参数(玩家名, 档位额度)
};
//买一送多活动表
struct tagActBuyOne
{
    DWORD        _CfgID;    //配置ID
    char        StartDate;    //开启日期
    char        EndDate;    //结束日期
    WORD        LVLimit;    //限制等级
    BYTE        IsDayReset;    //是否每天重置
    list        TemplateIDList;    //模板ID列表
};
//买一送多模板表
struct tagActBuyOneTemplate
{
    DWORD        _TemplateID;    //模板ID
    DWORD        NeedCTGID;    //需要充值ID
    BYTE        RecordIndex;    //记录索引
    dict        FreeItemInfo;    //免费领取的物品信息列表{领取记录索引:[[物品ID,个数,是否拍品]], ...}
};
//集字活动时间表
struct tagActCollectWords
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -29319,6 +29319,348 @@
#------------------------------------------------------
# AA 65 买一送多活动信息 #tagMCActBuyOneInfo
class  tagMCActBuyOneInfoFreeItem(Structure):
    _pack_ = 1
    _fields_ = [
                  ("ItemID", c_int),
                  ("ItemCount", c_ushort),
                  ("IsBind", c_ubyte),
                  ]
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.ItemID = 0
        self.ItemCount = 0
        self.IsBind = 0
        return
    def GetLength(self):
        return sizeof(tagMCActBuyOneInfoFreeItem)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// AA 65 买一送多活动信息 //tagMCActBuyOneInfo:
                                ItemID:%d,
                                ItemCount:%d,
                                IsBind:%d
                                '''\
                                %(
                                self.ItemID,
                                self.ItemCount,
                                self.IsBind
                                )
        return DumpString
class  tagMCActBuyOneInfoFreeGift(Structure):
    FreeIndex = 0    #(BYTE FreeIndex)// 免费领取索引
    FreeItemCount = 0    #(BYTE FreeItemCount)// 免费礼包数
    FreeItemList = list()    #(vector<tagMCActBuyOneInfoFreeItem> FreeItemList)// 免费礼包列表
    data = None
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        self.FreeIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.FreeItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.FreeItemCount):
            temFreeItemList = tagMCActBuyOneInfoFreeItem()
            _pos = temFreeItemList.ReadData(_lpData, _pos)
            self.FreeItemList.append(temFreeItemList)
        return _pos
    def Clear(self):
        self.FreeIndex = 0
        self.FreeItemCount = 0
        self.FreeItemList = list()
        return
    def GetLength(self):
        length = 0
        length += 1
        length += 1
        for i in range(self.FreeItemCount):
            length += self.FreeItemList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteBYTE(data, self.FreeIndex)
        data = CommFunc.WriteBYTE(data, self.FreeItemCount)
        for i in range(self.FreeItemCount):
            data = CommFunc.WriteString(data, self.FreeItemList[i].GetLength(), self.FreeItemList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                FreeIndex:%d,
                                FreeItemCount:%d,
                                FreeItemList:%s
                                '''\
                                %(
                                self.FreeIndex,
                                self.FreeItemCount,
                                "..."
                                )
        return DumpString
class  tagMCActBuyOneInfoGiftbag(Structure):
    CTGID = 0    #(DWORD CTGID)//所需充值ID
    RecordIndex = 0    #(BYTE RecordIndex)// 记录索引
    FreeGiftCount = 0    #(BYTE FreeGiftCount)// 免费礼包数
    FreeGiftList = list()    #(vector<tagMCActBuyOneInfoFreeGift> FreeGiftList)// 免费礼包列表
    data = None
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        self.CTGID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.RecordIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.FreeGiftCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.FreeGiftCount):
            temFreeGiftList = tagMCActBuyOneInfoFreeGift()
            _pos = temFreeGiftList.ReadData(_lpData, _pos)
            self.FreeGiftList.append(temFreeGiftList)
        return _pos
    def Clear(self):
        self.CTGID = 0
        self.RecordIndex = 0
        self.FreeGiftCount = 0
        self.FreeGiftList = list()
        return
    def GetLength(self):
        length = 0
        length += 4
        length += 1
        length += 1
        for i in range(self.FreeGiftCount):
            length += self.FreeGiftList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteDWORD(data, self.CTGID)
        data = CommFunc.WriteBYTE(data, self.RecordIndex)
        data = CommFunc.WriteBYTE(data, self.FreeGiftCount)
        for i in range(self.FreeGiftCount):
            data = CommFunc.WriteString(data, self.FreeGiftList[i].GetLength(), self.FreeGiftList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                CTGID:%d,
                                RecordIndex:%d,
                                FreeGiftCount:%d,
                                FreeGiftList:%s
                                '''\
                                %(
                                self.CTGID,
                                self.RecordIndex,
                                self.FreeGiftCount,
                                "..."
                                )
        return DumpString
class  tagMCActBuyOneInfo(Structure):
    Head = tagHead()
    ActNum = 0    #(BYTE ActNum)//活动编号
    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
    IsDayReset = 0    #(BYTE IsDayReset)//是否每天重置
    LimitLV = 0    #(WORD LimitLV)// 限制等级
    GiftbagCount = 0    #(BYTE GiftbagCount)// 活动礼包个数
    GiftbagList = list()    #(vector<tagMCActBuyOneInfoGiftbag> GiftbagList)// 礼包列表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xAA
        self.Head.SubCmd = 0x65
        return
    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.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.GiftbagCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.GiftbagCount):
            temGiftbagList = tagMCActBuyOneInfoGiftbag()
            _pos = temGiftbagList.ReadData(_lpData, _pos)
            self.GiftbagList.append(temGiftbagList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xAA
        self.Head.SubCmd = 0x65
        self.ActNum = 0
        self.StartDate = ""
        self.EndtDate = ""
        self.IsDayReset = 0
        self.LimitLV = 0
        self.GiftbagCount = 0
        self.GiftbagList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 10
        length += 10
        length += 1
        length += 2
        length += 1
        for i in range(self.GiftbagCount):
            length += self.GiftbagList[i].GetLength()
        return length
    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.WriteBYTE(data, self.IsDayReset)
        data = CommFunc.WriteWORD(data, self.LimitLV)
        data = CommFunc.WriteBYTE(data, self.GiftbagCount)
        for i in range(self.GiftbagCount):
            data = CommFunc.WriteString(data, self.GiftbagList[i].GetLength(), self.GiftbagList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                ActNum:%d,
                                StartDate:%s,
                                EndtDate:%s,
                                IsDayReset:%d,
                                LimitLV:%d,
                                GiftbagCount:%d,
                                GiftbagList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.ActNum,
                                self.StartDate,
                                self.EndtDate,
                                self.IsDayReset,
                                self.LimitLV,
                                self.GiftbagCount,
                                "..."
                                )
        return DumpString
m_NAtagMCActBuyOneInfo=tagMCActBuyOneInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActBuyOneInfo.Head.Cmd,m_NAtagMCActBuyOneInfo.Head.SubCmd))] = m_NAtagMCActBuyOneInfo
#------------------------------------------------------
# AA 66 买一送多活动玩家信息 #tagMCActBuyOnePlayerInfo
class  tagMCActBuyOnePlayerInfo(Structure):
    Head = tagHead()
    ActNum = 0    #(BYTE ActNum)// 活动编号
    FreeRecordCount = 0    #(BYTE FreeRecordCount)// 免费礼包领奖记录个数
    FreeRecordList = list()    #(vector<DWORD> FreeRecordList)// 免费礼包领奖记录列表,按所需充值ID记录索引取记录,每个记录代表每个充值ID对应免费礼包的领取记录,按免费领取索引位运算记录是否已领取
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xAA
        self.Head.SubCmd = 0x66
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.FreeRecordCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.FreeRecordCount):
            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
            self.FreeRecordList.append(value)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xAA
        self.Head.SubCmd = 0x66
        self.ActNum = 0
        self.FreeRecordCount = 0
        self.FreeRecordList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 1
        length += 4 * self.FreeRecordCount
        return length
    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.FreeRecordCount)
        for i in range(self.FreeRecordCount):
            data = CommFunc.WriteDWORD(data, self.FreeRecordList[i])
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                ActNum:%d,
                                FreeRecordCount:%d,
                                FreeRecordList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.ActNum,
                                self.FreeRecordCount,
                                "..."
                                )
        return DumpString
m_NAtagMCActBuyOnePlayerInfo=tagMCActBuyOnePlayerInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActBuyOnePlayerInfo.Head.Cmd,m_NAtagMCActBuyOnePlayerInfo.Head.SubCmd))] = m_NAtagMCActBuyOnePlayerInfo
#------------------------------------------------------
# AA 40 集字活动信息 #tagMCActCollectWordsInfo
class  tagMCActCollectWordsNeedItem(Structure):
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -398,6 +398,19 @@
                        ("BYTE", "IsDayReset", 0),
                        ),
                "ActBuyOne":(
                        ("DWORD", "CfgID", 1),
                        ("list", "PlatformList", 0),
                        ("list", "ServerGroupIDList", 0),
                        ("BYTE", "ActNum", 0),
                        ("char", "StartDate", 0),
                        ("char", "EndDate", 0),
                        ("dict", "NotifyInfoStart", 0),
                        ("dict", "NotifyInfoEnd", 0),
                        ("list", "NotifyInfoLoop", 0),
                        ("BYTE", "IsDayReset", 0),
                        ),
                "ActCollectWords":(
                        ("DWORD", "CfgID", 1),
                        ("list", "PlatformList", 0),
@@ -1663,6 +1676,33 @@
    def GetNotifyInfoLoop(self): return self.NotifyInfoLoop # 全服提示信息 - 循环广播[间隔分钟, 广播key]
    def GetIsDayReset(self): return self.IsDayReset # 是否每天重置
# 买一送多活动表
class IPY_ActBuyOne():
    def __init__(self):
        self.CfgID = 0
        self.PlatformList = []
        self.ServerGroupIDList = []
        self.ActNum = 0
        self.StartDate = ""
        self.EndDate = ""
        self.NotifyInfoStart = {}
        self.NotifyInfoEnd = {}
        self.NotifyInfoLoop = []
        self.IsDayReset = 0
        return
    def GetCfgID(self): return self.CfgID # 配置ID
    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 GetNotifyInfoStart(self): return self.NotifyInfoStart # 全服提示信息 - 相对开始时间
    def GetNotifyInfoEnd(self): return self.NotifyInfoEnd # 全服提示信息 - 相对结束时间
    def GetNotifyInfoLoop(self): return self.NotifyInfoLoop # 全服提示信息 - 循环广播[间隔分钟, 广播key]
    def GetIsDayReset(self): return self.IsDayReset # 是否每天重置
# 集字活动时间表
class IPY_ActCollectWords():
    
@@ -2795,6 +2835,8 @@
        self.ipyActExpRateLen = len(self.ipyActExpRateCache)
        self.ipyActCostRebateCache = self.__LoadFileData("ActCostRebate", IPY_ActCostRebate)
        self.ipyActCostRebateLen = len(self.ipyActCostRebateCache)
        self.ipyActBuyOneCache = self.__LoadFileData("ActBuyOne", IPY_ActBuyOne)
        self.ipyActBuyOneLen = len(self.ipyActBuyOneCache)
        self.ipyActCollectWordsCache = self.__LoadFileData("ActCollectWords", IPY_ActCollectWords)
        self.ipyActCollectWordsLen = len(self.ipyActCollectWordsCache)
        self.ipyActGarbageSortingCache = self.__LoadFileData("ActGarbageSorting", IPY_ActGarbageSorting)
@@ -3125,6 +3167,8 @@
    def GetActExpRateByIndex(self, index): return self.ipyActExpRateCache[index]
    def GetActCostRebateCount(self): return self.ipyActCostRebateLen
    def GetActCostRebateByIndex(self, index): return self.ipyActCostRebateCache[index]
    def GetActBuyOneCount(self): return self.ipyActBuyOneLen
    def GetActBuyOneByIndex(self, index): return self.ipyActBuyOneCache[index]
    def GetActCollectWordsCount(self): return self.ipyActCollectWordsLen
    def GetActCollectWordsByIndex(self, index): return self.ipyActCollectWordsCache[index]
    def GetActGarbageSortingCount(self): return self.ipyActGarbageSortingLen
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3823,6 +3823,10 @@
Def_PDict_GrowupBuyID = "GrowupBuyID"  # 玩家身上的重置成长必买活动ID,唯一标识,取活动开始日期time值
Def_PDict_GrowupBuyState = "GrowupBuyState"  # 当前可购买的活动充值ID索引状态,按组索引位存储对应组可购买的充值ID所对应的索引
#买一送多
Def_PDict_BuyOneID = "BuyOneID_%s"  # 玩家身上的活动ID,唯一标识,取活动开始日期time,参数(活动编号)
Def_PDict_BuyOneFreeItemState = "BuyOneFreeItemState_%s_%s"  # 玩家免费礼包领取记录,参数(活动编号,记录索引)
#限时特惠活动
Def_PDict_SpringSaleID = "SpringSaleID_%s"  # 玩家身上的限时特惠活动ID,唯一标识,取活动开始日期time,参数(活动编号)
Def_PDict_SpringSaleMailState = "SpringSaleMailState_%s"  # 玩家身上的活动更新提醒邮件状态,参数(活动编号)
@@ -5718,7 +5722,8 @@
Def_RewardType_SponsorStar, #赞助星级礼包奖励 57
Def_RewardType_GubaoItemEff, #古宝特殊效果物品奖励 58
Def_RewardType_SuccessScore, #成就积分奖励 59
)= range(60)
Def_RewardType_BuyOne, #买一送多活动免费奖励 60
)= range(61)
#boss复活相关活动定义
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -29319,6 +29319,348 @@
#------------------------------------------------------
# AA 65 买一送多活动信息 #tagMCActBuyOneInfo
class  tagMCActBuyOneInfoFreeItem(Structure):
    _pack_ = 1
    _fields_ = [
                  ("ItemID", c_int),
                  ("ItemCount", c_ushort),
                  ("IsBind", c_ubyte),
                  ]
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, stringData, _pos=0, _len=0):
        self.Clear()
        memmove(addressof(self), stringData[_pos:], self.GetLength())
        return _pos + self.GetLength()
    def Clear(self):
        self.ItemID = 0
        self.ItemCount = 0
        self.IsBind = 0
        return
    def GetLength(self):
        return sizeof(tagMCActBuyOneInfoFreeItem)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// AA 65 买一送多活动信息 //tagMCActBuyOneInfo:
                                ItemID:%d,
                                ItemCount:%d,
                                IsBind:%d
                                '''\
                                %(
                                self.ItemID,
                                self.ItemCount,
                                self.IsBind
                                )
        return DumpString
class  tagMCActBuyOneInfoFreeGift(Structure):
    FreeIndex = 0    #(BYTE FreeIndex)// 免费领取索引
    FreeItemCount = 0    #(BYTE FreeItemCount)// 免费礼包数
    FreeItemList = list()    #(vector<tagMCActBuyOneInfoFreeItem> FreeItemList)// 免费礼包列表
    data = None
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        self.FreeIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.FreeItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.FreeItemCount):
            temFreeItemList = tagMCActBuyOneInfoFreeItem()
            _pos = temFreeItemList.ReadData(_lpData, _pos)
            self.FreeItemList.append(temFreeItemList)
        return _pos
    def Clear(self):
        self.FreeIndex = 0
        self.FreeItemCount = 0
        self.FreeItemList = list()
        return
    def GetLength(self):
        length = 0
        length += 1
        length += 1
        for i in range(self.FreeItemCount):
            length += self.FreeItemList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteBYTE(data, self.FreeIndex)
        data = CommFunc.WriteBYTE(data, self.FreeItemCount)
        for i in range(self.FreeItemCount):
            data = CommFunc.WriteString(data, self.FreeItemList[i].GetLength(), self.FreeItemList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                FreeIndex:%d,
                                FreeItemCount:%d,
                                FreeItemList:%s
                                '''\
                                %(
                                self.FreeIndex,
                                self.FreeItemCount,
                                "..."
                                )
        return DumpString
class  tagMCActBuyOneInfoGiftbag(Structure):
    CTGID = 0    #(DWORD CTGID)//所需充值ID
    RecordIndex = 0    #(BYTE RecordIndex)// 记录索引
    FreeGiftCount = 0    #(BYTE FreeGiftCount)// 免费礼包数
    FreeGiftList = list()    #(vector<tagMCActBuyOneInfoFreeGift> FreeGiftList)// 免费礼包列表
    data = None
    def __init__(self):
        self.Clear()
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        self.CTGID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
        self.RecordIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.FreeGiftCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.FreeGiftCount):
            temFreeGiftList = tagMCActBuyOneInfoFreeGift()
            _pos = temFreeGiftList.ReadData(_lpData, _pos)
            self.FreeGiftList.append(temFreeGiftList)
        return _pos
    def Clear(self):
        self.CTGID = 0
        self.RecordIndex = 0
        self.FreeGiftCount = 0
        self.FreeGiftList = list()
        return
    def GetLength(self):
        length = 0
        length += 4
        length += 1
        length += 1
        for i in range(self.FreeGiftCount):
            length += self.FreeGiftList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteDWORD(data, self.CTGID)
        data = CommFunc.WriteBYTE(data, self.RecordIndex)
        data = CommFunc.WriteBYTE(data, self.FreeGiftCount)
        for i in range(self.FreeGiftCount):
            data = CommFunc.WriteString(data, self.FreeGiftList[i].GetLength(), self.FreeGiftList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                CTGID:%d,
                                RecordIndex:%d,
                                FreeGiftCount:%d,
                                FreeGiftList:%s
                                '''\
                                %(
                                self.CTGID,
                                self.RecordIndex,
                                self.FreeGiftCount,
                                "..."
                                )
        return DumpString
class  tagMCActBuyOneInfo(Structure):
    Head = tagHead()
    ActNum = 0    #(BYTE ActNum)//活动编号
    StartDate = ""    #(char StartDate[10])// 开始日期 y-m-d
    EndtDate = ""    #(char EndtDate[10])// 结束日期 y-m-d
    IsDayReset = 0    #(BYTE IsDayReset)//是否每天重置
    LimitLV = 0    #(WORD LimitLV)// 限制等级
    GiftbagCount = 0    #(BYTE GiftbagCount)// 活动礼包个数
    GiftbagList = list()    #(vector<tagMCActBuyOneInfoGiftbag> GiftbagList)// 礼包列表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xAA
        self.Head.SubCmd = 0x65
        return
    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.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
        self.GiftbagCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.GiftbagCount):
            temGiftbagList = tagMCActBuyOneInfoGiftbag()
            _pos = temGiftbagList.ReadData(_lpData, _pos)
            self.GiftbagList.append(temGiftbagList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xAA
        self.Head.SubCmd = 0x65
        self.ActNum = 0
        self.StartDate = ""
        self.EndtDate = ""
        self.IsDayReset = 0
        self.LimitLV = 0
        self.GiftbagCount = 0
        self.GiftbagList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 10
        length += 10
        length += 1
        length += 2
        length += 1
        for i in range(self.GiftbagCount):
            length += self.GiftbagList[i].GetLength()
        return length
    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.WriteBYTE(data, self.IsDayReset)
        data = CommFunc.WriteWORD(data, self.LimitLV)
        data = CommFunc.WriteBYTE(data, self.GiftbagCount)
        for i in range(self.GiftbagCount):
            data = CommFunc.WriteString(data, self.GiftbagList[i].GetLength(), self.GiftbagList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                ActNum:%d,
                                StartDate:%s,
                                EndtDate:%s,
                                IsDayReset:%d,
                                LimitLV:%d,
                                GiftbagCount:%d,
                                GiftbagList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.ActNum,
                                self.StartDate,
                                self.EndtDate,
                                self.IsDayReset,
                                self.LimitLV,
                                self.GiftbagCount,
                                "..."
                                )
        return DumpString
m_NAtagMCActBuyOneInfo=tagMCActBuyOneInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActBuyOneInfo.Head.Cmd,m_NAtagMCActBuyOneInfo.Head.SubCmd))] = m_NAtagMCActBuyOneInfo
#------------------------------------------------------
# AA 66 买一送多活动玩家信息 #tagMCActBuyOnePlayerInfo
class  tagMCActBuyOnePlayerInfo(Structure):
    Head = tagHead()
    ActNum = 0    #(BYTE ActNum)// 活动编号
    FreeRecordCount = 0    #(BYTE FreeRecordCount)// 免费礼包领奖记录个数
    FreeRecordList = list()    #(vector<DWORD> FreeRecordList)// 免费礼包领奖记录列表,按所需充值ID记录索引取记录,每个记录代表每个充值ID对应免费礼包的领取记录,按免费领取索引位运算记录是否已领取
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xAA
        self.Head.SubCmd = 0x66
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.ActNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.FreeRecordCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.FreeRecordCount):
            value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
            self.FreeRecordList.append(value)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xAA
        self.Head.SubCmd = 0x66
        self.ActNum = 0
        self.FreeRecordCount = 0
        self.FreeRecordList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 1
        length += 4 * self.FreeRecordCount
        return length
    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.FreeRecordCount)
        for i in range(self.FreeRecordCount):
            data = CommFunc.WriteDWORD(data, self.FreeRecordList[i])
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                ActNum:%d,
                                FreeRecordCount:%d,
                                FreeRecordList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.ActNum,
                                self.FreeRecordCount,
                                "..."
                                )
        return DumpString
m_NAtagMCActBuyOnePlayerInfo=tagMCActBuyOnePlayerInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActBuyOnePlayerInfo.Head.Cmd,m_NAtagMCActBuyOnePlayerInfo.Head.SubCmd))] = m_NAtagMCActBuyOnePlayerInfo
#------------------------------------------------------
# AA 40 集字活动信息 #tagMCActCollectWordsInfo
class  tagMCActCollectWordsNeedItem(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
@@ -611,6 +611,13 @@
        return {}
    return actNumDict[actNum]
def GetTemplateID(ipyData, cfgID, dayIndex):
    if cfgID == None or dayIndex == None or not ipyData:
        return 0
    templateIDList = ipyData.GetTemplateIDList()
    templateID = templateIDList[-1] if dayIndex >= len(templateIDList) else templateIDList[dayIndex]
    return templateID
def GetOperationActionDateStr(ipyData):
    ## 获取运营活动对应日期,存数字代表开服天配置,需要转化为对应的日期
    curDateTime = datetime.datetime.today()
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1298,6 +1298,22 @@
                        ("char", "NotifyKey", 0),
                        ),
                "ActBuyOne":(
                        ("DWORD", "CfgID", 1),
                        ("char", "StartDate", 0),
                        ("char", "EndDate", 0),
                        ("WORD", "LVLimit", 0),
                        ("BYTE", "IsDayReset", 0),
                        ("list", "TemplateIDList", 0),
                        ),
                "ActBuyOneTemplate":(
                        ("DWORD", "TemplateID", 1),
                        ("DWORD", "NeedCTGID", 0),
                        ("BYTE", "RecordIndex", 0),
                        ("dict", "FreeItemInfo", 0),
                        ),
                "ActCollectWords":(
                        ("DWORD", "CfgID", 1),
                        ("char", "StartDate", 0),
@@ -4749,6 +4765,40 @@
    def GetAwardItemList(self): return self.AwardItemList # 返利物品信息列表 {世界等级范围:[({职业:物品ID,..},个数,是否绑定), ...]}
    def GetNotifyKey(self): return self.NotifyKey # 全服广播key,默认两个参数(玩家名, 档位额度)
# 买一送多活动表
class IPY_ActBuyOne():
    def __init__(self):
        self.CfgID = 0
        self.StartDate = ""
        self.EndDate = ""
        self.LVLimit = 0
        self.IsDayReset = 0
        self.TemplateIDList = []
        return
    def GetCfgID(self): return self.CfgID # 配置ID
    def GetStartDate(self): return self.StartDate # 开启日期
    def GetEndDate(self): return self.EndDate # 结束日期
    def GetLVLimit(self): return self.LVLimit # 限制等级
    def GetIsDayReset(self): return self.IsDayReset # 是否每天重置
    def GetTemplateIDList(self): return self.TemplateIDList # 模板ID列表
# 买一送多模板表
class IPY_ActBuyOneTemplate():
    def __init__(self):
        self.TemplateID = 0
        self.NeedCTGID = 0
        self.RecordIndex = 0
        self.FreeItemInfo = {}
        return
    def GetTemplateID(self): return self.TemplateID # 模板ID
    def GetNeedCTGID(self): return self.NeedCTGID # 需要充值ID
    def GetRecordIndex(self): return self.RecordIndex # 记录索引
    def GetFreeItemInfo(self): return self.FreeItemInfo # 免费领取的物品信息列表{领取记录索引:[[物品ID,个数,是否拍品]], ...}
# 集字活动时间表
class IPY_ActCollectWords():
    
@@ -6702,6 +6752,10 @@
        self.ipyActCostRebateLen = len(self.ipyActCostRebateCache)
        self.ipyCostRebateTemplateCache = self.__LoadFileData("CostRebateTemplate", IPY_CostRebateTemplate)
        self.ipyCostRebateTemplateLen = len(self.ipyCostRebateTemplateCache)
        self.ipyActBuyOneCache = self.__LoadFileData("ActBuyOne", IPY_ActBuyOne)
        self.ipyActBuyOneLen = len(self.ipyActBuyOneCache)
        self.ipyActBuyOneTemplateCache = self.__LoadFileData("ActBuyOneTemplate", IPY_ActBuyOneTemplate)
        self.ipyActBuyOneTemplateLen = len(self.ipyActBuyOneTemplateCache)
        self.ipyActCollectWordsCache = self.__LoadFileData("ActCollectWords", IPY_ActCollectWords)
        self.ipyActCollectWordsLen = len(self.ipyActCollectWordsCache)
        self.ipyCollectWordsExchangeCache = self.__LoadFileData("CollectWordsExchange", IPY_CollectWordsExchange)
@@ -7294,6 +7348,10 @@
    def GetActCostRebateByIndex(self, index): return self.ipyActCostRebateCache[index]
    def GetCostRebateTemplateCount(self): return self.ipyCostRebateTemplateLen
    def GetCostRebateTemplateByIndex(self, index): return self.ipyCostRebateTemplateCache[index]
    def GetActBuyOneCount(self): return self.ipyActBuyOneLen
    def GetActBuyOneByIndex(self, index): return self.ipyActBuyOneCache[index]
    def GetActBuyOneTemplateCount(self): return self.ipyActBuyOneTemplateLen
    def GetActBuyOneTemplateByIndex(self, index): return self.ipyActBuyOneTemplateCache[index]
    def GetActCollectWordsCount(self): return self.ipyActCollectWordsLen
    def GetActCollectWordsByIndex(self, index): return self.ipyActCollectWordsCache[index]
    def GetCollectWordsExchangeCount(self): return self.ipyCollectWordsExchangeLen
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyOne.py
New file
@@ -0,0 +1,255 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Player.PlayerActBuyOne
#
# @todo:买一送多活动
# @author hxp
# @date 2023-08-01
# @version 1.0
#
# 详细描述: 买一送多活动
#
#-------------------------------------------------------------------------------
#"""Version = 2023-08-01 16:00"""
#-------------------------------------------------------------------------------
import PyGameData
import ShareDefine
import PlayerControl
import IpyGameDataPY
import ChPyNetSendPack
import DataRecordPack
import NetPackCommon
import ItemControler
import IPY_GameWorld
import PlayerCoin
import GameWorld
import ChConfig
RecordIndexMax = 10 # 每个模板最大支持充值ID数
def OnPlayerLogin(curPlayer):
    for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_BuyOne, {}).values():
        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
        isReset = __CheckPlayerBuyOneAction(curPlayer, actNum)
        # 活动中同步活动信息
        if not isReset and actInfo.get(ShareDefine.ActKey_State):
            Sync_BuyOneActionInfo(curPlayer, actNum)
            Sync_BuyOnePlayerInfo(curPlayer, actNum)
    return
def RefreshBuyOneActionInfo(actNum):
    ## 收到GameServer同步的活动信息,刷新活动信息
    playerManager = GameWorld.GetPlayerManager()
    for index in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(index)
        if curPlayer.GetID() == 0:
            continue
        __CheckPlayerBuyOneAction(curPlayer, actNum)
    return
def __CheckPlayerBuyOneAction(curPlayer, actNum):
    ## 检查玩活动数据信息
    playerID = curPlayer.GetPlayerID()
    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BuyOne, 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)
    playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyOneID % actNum) # 玩家身上的活动ID
    # 活动ID 相同的话不处理
    if actID == playerActID:
        GameWorld.DebugLog("买一送多活动ID不变,不处理! actID=%s" % actID, curPlayer.GetPlayerID())
        return
    GameWorld.DebugLog("买一送多活动重置! actID=%s,playerActID=%s,state=%s" % (actID, playerActID, state), playerID)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyOneID % actNum, actID)
    for i in range(RecordIndexMax):
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, i), 0)
    if state:
        # 重置充值ID充值记录
        __ResetCTGIDCount(curPlayer, actInfo)
        Sync_BuyOneActionInfo(curPlayer, actNum)
        Sync_BuyOnePlayerInfo(curPlayer, actNum)
    return True
def __ResetCTGIDCount(curPlayer, actInfo):
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
    dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0)
    ipyData = IpyGameDataPY.GetIpyGameData("ActBuyOne", cfgID)
    if not ipyData:
        return
    templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex)
    if not templateID:
        return
    tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBuyOneTemplate", templateID)
    if not tempIpyDataList:
        return
    resetCTGIDList = []
    for tempIpyData in tempIpyDataList:
        resetCTGIDList.append(tempIpyData.GetNeedCTGID())
    PlayerCoin.DoResetCTGCountByIDList(curPlayer, "ActBuyOne", resetCTGIDList)
    return
def GetBuyOneFreeAward(curPlayer, awardIndex, actNum):
    '''活动免费奖励
    @param awardIndex: 奖励索引 = recordIndex*100 + freeIndex
    @param actNum: 活动编号,如11 或  12 代表不同的活动
    '''
    playerID = curPlayer.GetPlayerID()
    actNum = GameWorld.ToIntDef(actNum, 0)
    if actNum <= 0:
        GameWorld.Log("没有指定领取的活动编号! actNum=%s" % actNum, playerID)
        return
    recordIndex = awardIndex / 100
    freeIndex = awardIndex % 100
    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BuyOne, actNum)
    if not actInfo.get(ShareDefine.ActKey_State):
        GameWorld.Log("买一送一非活动中无法领取奖励! actNum=%s" % actNum, playerID)
        return
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
    dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0)
    ipyData = IpyGameDataPY.GetIpyGameData("ActBuyOne", cfgID)
    if not ipyData:
        return
    templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex)
    if not templateID:
        return
    tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBuyOneTemplate", templateID)
    if not tempIpyDataList:
        return
    needCTGID = 0
    freeItemList = []
    for tempIpyData in tempIpyDataList:
        if recordIndex != tempIpyData.GetRecordIndex():
            continue
        needCTGID = tempIpyData.GetNeedCTGID()
        freeItemInfo = tempIpyData.GetFreeItemInfo()
        freeItemList = freeItemInfo.get(freeIndex, [])
        break
    if not needCTGID or not freeItemList:
        GameWorld.ErrLog("买一送一活动没有该奖励信息! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,freeIndex=%s"
                         % (actNum, cfgID, templateID, recordIndex, freeIndex), playerID)
        return
    totalBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CTGGoodsBuyCount % needCTGID)
    if not totalBuyCount:
        GameWorld.Log("买一送一活动该奖励未充值,无法免费领取! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,needCTGID=%s"
                      % (actNum, cfgID, templateID, recordIndex, needCTGID), playerID)
        return
    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, recordIndex))
    if awardRecord & pow(2, freeIndex):
        GameWorld.Log("买一送一活动已经领取过该免费奖励! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,freeIndex=%s"
                      % (actNum, cfgID, templateID, recordIndex, freeIndex), playerID)
        return
    # 检查背包
    if not ItemControler.CheckPackSpaceEnough(curPlayer, freeItemList):
        return
    awardRecord |= pow(2, freeIndex)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, recordIndex), awardRecord)
    Sync_BuyOnePlayerInfo(curPlayer, actNum)
    for itemID, itemCount, isAuctionItem in freeItemList:
        ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem])
    addDataDict = {"templateID":templateID, "cfgID":cfgID, "recordIndex":recordIndex, "freeIndex":freeIndex,
                   "freeItemList":str(freeItemList), "actNum":actNum}
    DataRecordPack.DR_FuncGiveItem(curPlayer, "ActBuyOne", addDataDict)
    GameWorld.Log("买一送一活动领取免费奖励! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,freeIndex=%s,freeItemList=%s"
                  % (actNum, cfgID, templateID, recordIndex, freeIndex, freeItemList), playerID)
    return
def Sync_BuyOnePlayerInfo(curPlayer, actNum):
    ## 通知玩家数据信息
    clientPack = ChPyNetSendPack.tagMCActBuyOnePlayerInfo()
    clientPack.ActNum = actNum
    clientPack.FreeRecordList = []
    for i in range(RecordIndexMax):
        awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, i))
        clientPack.FreeRecordList.append(awardRecord)
    clientPack.FreeRecordCount = len(clientPack.FreeRecordList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
def Sync_BuyOneActionInfo(curPlayer, actNum):
    ## 通知活动信息
    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BuyOne, actNum)
    if not actInfo.get(ShareDefine.ActKey_State):
        return
    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
    dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0)
    ipyData = IpyGameDataPY.GetIpyGameData("ActBuyOne", cfgID)
    if not ipyData:
        return
    templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex)
    if not templateID:
        return
    tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBuyOneTemplate", templateID)
    if not tempIpyDataList:
        return
    startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData)
    startDateSync = actInfo.get(ShareDefine.ActKey_StartDateSync, startDateStr)
    actInfo = ChPyNetSendPack.tagMCActBuyOneInfo()
    actInfo.ActNum = actNum
    actInfo.StartDate = startDateSync
    actInfo.EndtDate = endDateStr
    actInfo.LimitLV = ipyData.GetLVLimit()
    actInfo.IsDayReset = ipyData.GetIsDayReset()
    actInfo.GiftbagList = []
    for tempIpyData in tempIpyDataList:
        giftbag = ChPyNetSendPack.tagMCActBuyOneInfoGiftbag()
        giftbag.CTGID = tempIpyData.GetNeedCTGID()
        giftbag.RecordIndex = tempIpyData.GetRecordIndex()
        giftbag.FreeGiftList = []
        freeItemInfo = tempIpyData.GetFreeItemInfo()
        freeIndexList = freeItemInfo.keys()
        freeIndexList.sort()
        for freeIndex in freeIndexList:
            freeGift = ChPyNetSendPack.tagMCActBuyOneInfoFreeGift()
            freeGift.FreeIndex = freeIndex
            freeGift.FreeItemList = []
            freeItemList = freeItemInfo[freeIndex]
            for itemID, itemCount, isAuctionItem in freeItemList:
                freeItem = ChPyNetSendPack.tagMCActBuyOneInfoFreeItem()
                freeItem.ItemID = itemID
                freeItem.ItemCount = itemCount
                freeItem.IsBind = isAuctionItem
                freeGift.FreeItemList.append(freeItem)
            freeGift.FreeItemCount = len(freeGift.FreeItemList)
            giftbag.FreeGiftList.append(freeGift)
        giftbag.FreeGiftCount = len(giftbag.FreeGiftList)
        actInfo.GiftbagList.append(giftbag)
    actInfo.GiftbagCount = len(actInfo.GiftbagList)
    NetPackCommon.SendFakePack(curPlayer, actInfo)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
@@ -145,6 +145,25 @@
    Sync_CoinToGoldCountInfo(curPlayer)
    return
def DoResetCTGCountByIDList(curPlayer, resetEvent, resetCTGIDList):
    # 重置充值次数
    if not resetCTGIDList:
        return
    playerID = curPlayer.GetPlayerID()
    for recordID in resetCTGIDList:
        totalBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CTGGoodsBuyCount % recordID)
        todayBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TodayCTGCount % recordID)
        if not totalBuyCount and not todayBuyCount:
            continue
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CTGGoodsBuyCount % recordID, 0)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TodayCTGCount % recordID, 0)
        drDict = {"PlayerID":curPlayer.GetPlayerID(),"AccID":curPlayer.GetAccID(), "ResetEvent":resetEvent,
                  "totalBuyCount":totalBuyCount, "todayBuyCount":todayBuyCount, "recordID":recordID}
        DataRecordPack.SendEventPack("ResetCTGCount", drDict, curPlayer)
        GameWorld.Log("重置充值次数: resetEvent=%s,recordID=%s,totalBuyCount=%s,todayBuyCount=%s"
                      % (resetEvent, recordID, totalBuyCount, todayBuyCount), playerID)
    Sync_CoinToGoldCountInfo(curPlayer, resetCTGIDList)
    return
def OnDay(curPlayer):
    ## 充值相关过天
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -89,6 +89,7 @@
import PlayerActRechargePrize
import PlayerActGrowupBuy
import PlayerActTurntable
import PlayerActBuyOne
import PlayerSpringSale
import PlayerBossReborn
import PlayerWeekParty
@@ -1428,7 +1429,10 @@
                
            elif actionName == ShareDefine.OperationActionName_DailyGiftbag:
                PlayerDailyGiftbag.RefreshDailyGiftbagActionInfo()
            elif actionName == ShareDefine.OperationActionName_BuyOne:
                PlayerActBuyOne.RefreshBuyOneActionInfo(actNum)
            elif actionName == ShareDefine.OperationActionName_FairyCeremony:
                PlayerFairyCeremony.RefreshOperationAction_FairyCeremony()