From 8bb11f630222dfe8d264d915ca7b638167af95eb Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 01 八月 2023 15:56:40 +0800
Subject: [PATCH] 9873 【骨折2】【主干】买1送5活动
---
ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py | 44 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 342 ++++++++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 58 +++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py | 19 +
PySysDB/PySysDBPY.h | 22 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py | 7
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyOne.py | 255 +++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py | 6
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 342 ++++++++++++++++++
PySysDB/PySysDBG.h | 16
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 7
11 files changed, 1,116 insertions(+), 2 deletions(-)
diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index 0f5f445..d61ad48 100644
--- a/PySysDB/PySysDBG.h
+++ b/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
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 2d732ce..d47397c 100644
--- a/PySysDB/PySysDBPY.h
+++ b/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
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index c2f6256..e58e723 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/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):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index e03e206..65f0b57 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 4392eb8..f704a64 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/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复活相关活动定义
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index c2f6256..e58e723 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/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):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
index 47a18b2..9b7c547 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorld.py
+++ b/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()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 92dbdec..703f7f3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyOne.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyOne.py
new file mode 100644
index 0000000..2d0fc50
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBuyOne.py
@@ -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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
index 304ec51..aa4e7f6 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerCoin.py
+++ b/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):
## 充值相关过天
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index 5a22cae..09fe777 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/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()
--
Gitblit v1.8.0