From 78ad2ba94e205bc05882289ff82441987e681141 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 16 十一月 2023 14:46:00 +0800
Subject: [PATCH] 10009 【后端】【BT0.1】【主干】【港台】单笔充值活动增加每日可领取次数,每个档位每日20次

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                |  116 +++++++++++++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                  |    5 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActSingleRecharge.py |  165 +++++++++++------------
 PySysDB/PySysDBPY.h                                                                                   |    3 
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                     |  116 +++++++++++++---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                       |    3 
 6 files changed, 267 insertions(+), 141 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index d917d22..204ad62 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -2152,7 +2152,8 @@
 {
 	DWORD		_TemplateID;	//模板ID
 	float		SingleRechargeValue;	//单笔充值额度
-	BYTE		AwardIndex;		//返利奖励索引0~31,同个模板中不重复
+	BYTE		AwardIndex;		//同个模板中不重复
+	WORD		AwardCountMax;	//最大领奖次数,最大999次
 	dict		AwardItem;	//返利物品信息列表 {职业:[(物品ID,个数,是否绑定),...]}
 	char		NotifyKey;		//全服广播key,默认两个参数(玩家名, 档位额度)
 };
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 71137b8..c9a1d79 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -34216,7 +34216,8 @@
 
 
 class  tagMCActSingleRechargeAward(Structure):
-    AwardIndex = 0    #(BYTE AwardIndex)// 奖励索引 0~31
+    AwardIndex = 0    #(BYTE AwardIndex)// 奖励索引
+    AwardCountMax = 0    #(WORD AwardCountMax)// 最大领奖次数
     SingleRechargeValue = 0    #(DWORD SingleRechargeValue)// 单笔所需充值额度
     AwardItemCount = 0    #(BYTE AwardItemCount)// 奖励物品数
     AwardItem = list()    #(vector<tagMCActSingleRechargeAwardItem> AwardItem)// 奖励物品信息
@@ -34229,6 +34230,7 @@
     def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
         self.AwardIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.AwardCountMax,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.SingleRechargeValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.AwardItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.AwardItemCount):
@@ -34239,6 +34241,7 @@
 
     def Clear(self):
         self.AwardIndex = 0
+        self.AwardCountMax = 0
         self.SingleRechargeValue = 0
         self.AwardItemCount = 0
         self.AwardItem = list()
@@ -34247,6 +34250,7 @@
     def GetLength(self):
         length = 0
         length += 1
+        length += 2
         length += 4
         length += 1
         for i in range(self.AwardItemCount):
@@ -34257,6 +34261,7 @@
     def GetBuffer(self):
         data = ''
         data = CommFunc.WriteBYTE(data, self.AwardIndex)
+        data = CommFunc.WriteWORD(data, self.AwardCountMax)
         data = CommFunc.WriteDWORD(data, self.SingleRechargeValue)
         data = CommFunc.WriteBYTE(data, self.AwardItemCount)
         for i in range(self.AwardItemCount):
@@ -34266,12 +34271,14 @@
     def OutputString(self):
         DumpString = '''
                                 AwardIndex:%d,
+                                AwardCountMax:%d,
                                 SingleRechargeValue:%d,
                                 AwardItemCount:%d,
                                 AwardItem:%s
                                 '''\
                                 %(
                                 self.AwardIndex,
+                                self.AwardCountMax,
                                 self.SingleRechargeValue,
                                 self.AwardItemCount,
                                 "..."
@@ -34390,20 +34397,16 @@
 #------------------------------------------------------
 # AA 51 单笔累充活动玩家信息 #tagMCActSingleRechargePlayerInfo
 
-class  tagMCActSingleRechargePlayerInfo(Structure):
+class  tagMCActSingleRechargePlayerAward(Structure):
     _pack_ = 1
     _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("ActNum", c_ubyte),    #活动编号从1开始,目前支持两个累充活动同时存在且相互独立 1或2
-                  ("CanAwardValue", c_int),    #可否领奖记录,按奖励索引二进制位存储是否可领取
-                  ("AwardRecord", c_int),    #奖励领奖记录,按奖励索引二进制位存储是否已领取
+                  ("AwardIndex", c_ubyte),    # 奖励索引
+                  ("CanGetCount", c_ushort),    # 可领奖次数
+                  ("GetCount", c_ushort),    # 已领奖次数
                   ]
 
     def __init__(self):
         self.Clear()
-        self.Cmd = 0xAA
-        self.SubCmd = 0x51
         return
 
     def ReadData(self, stringData, _pos=0, _len=0):
@@ -34412,39 +34415,102 @@
         return _pos + self.GetLength()
 
     def Clear(self):
-        self.Cmd = 0xAA
-        self.SubCmd = 0x51
-        self.ActNum = 0
-        self.CanAwardValue = 0
-        self.AwardRecord = 0
+        self.AwardIndex = 0
+        self.CanGetCount = 0
+        self.GetCount = 0
         return
 
     def GetLength(self):
-        return sizeof(tagMCActSingleRechargePlayerInfo)
+        return sizeof(tagMCActSingleRechargePlayerAward)
 
     def GetBuffer(self):
         return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
         DumpString = '''// AA 51 单笔累充活动玩家信息 //tagMCActSingleRechargePlayerInfo:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                ActNum:%d,
-                                CanAwardValue:%d,
-                                AwardRecord:%d
+                                AwardIndex:%d,
+                                CanGetCount:%d,
+                                GetCount:%d
                                 '''\
                                 %(
-                                self.Cmd,
-                                self.SubCmd,
+                                self.AwardIndex,
+                                self.CanGetCount,
+                                self.GetCount
+                                )
+        return DumpString
+
+
+class  tagMCActSingleRechargePlayerInfo(Structure):
+    Head = tagHead()
+    ActNum = 0    #(BYTE ActNum)//活动编号从1开始,目前支持两个累充活动同时存在且相互独立 1或2
+    RecordCount = 0    #(BYTE RecordCount)
+    AwardRecordList = list()    #(vector<tagMCActSingleRechargePlayerAward> AwardRecordList)// 领奖次数记录列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x51
+        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.RecordCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.RecordCount):
+            temAwardRecordList = tagMCActSingleRechargePlayerAward()
+            _pos = temAwardRecordList.ReadData(_lpData, _pos)
+            self.AwardRecordList.append(temAwardRecordList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x51
+        self.ActNum = 0
+        self.RecordCount = 0
+        self.AwardRecordList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 1
+        for i in range(self.RecordCount):
+            length += self.AwardRecordList[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.WriteBYTE(data, self.RecordCount)
+        for i in range(self.RecordCount):
+            data = CommFunc.WriteString(data, self.AwardRecordList[i].GetLength(), self.AwardRecordList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ActNum:%d,
+                                RecordCount:%d,
+                                AwardRecordList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
                                 self.ActNum,
-                                self.CanAwardValue,
-                                self.AwardRecord
+                                self.RecordCount,
+                                "..."
                                 )
         return DumpString
 
 
 m_NAtagMCActSingleRechargePlayerInfo=tagMCActSingleRechargePlayerInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActSingleRechargePlayerInfo.Cmd,m_NAtagMCActSingleRechargePlayerInfo.SubCmd))] = m_NAtagMCActSingleRechargePlayerInfo
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActSingleRechargePlayerInfo.Head.Cmd,m_NAtagMCActSingleRechargePlayerInfo.Head.SubCmd))] = m_NAtagMCActSingleRechargePlayerInfo
 
 
 #------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 8f0af4f..0317678 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4008,8 +4008,7 @@
 Def_PDict_SingleRechargeID = "SingleRechargeID_%s"  # 玩家身上的活动ID,唯一标识,取活动开始日期time值,参数:(活动编号)
 Def_PDict_SingleRechargeTemplateID = "SingleRechargeTempID_%s"  # 玩家身上的活动模板ID,参数:(活动编号)
 Def_PDict_SingleRechargeWorldLV = "SingleRechargeWorldLV_%s" #玩家身上的活动世界等级,参数:(活动编号)
-Def_PDict_SingleRechargeValue = "SingleRechargeValue_%s"  # 领奖奖励值,按奖励索引二进制位代表是否可领奖,参数:(活动编号)
-Def_PDict_SingleRechargeAward = "SingleRechargeAward_%s"  # 领奖记录值,按奖励索引二进制位代表是否已领奖,参数:(活动编号)
+Def_PDict_SingleRechargeValue = "SingleRechargeValue_%s_%s"  # 领奖值,已领奖次数*1000+可领奖次数,参数:(活动编号,档位索引)
 
 #转盘活动
 Def_PDict_TurntableID = "TurntableID_%s"  # 玩家身上的活动ID,唯一标识,取活动开始日期time值,参数:(活动编号)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 71137b8..c9a1d79 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -34216,7 +34216,8 @@
 
 
 class  tagMCActSingleRechargeAward(Structure):
-    AwardIndex = 0    #(BYTE AwardIndex)// 奖励索引 0~31
+    AwardIndex = 0    #(BYTE AwardIndex)// 奖励索引
+    AwardCountMax = 0    #(WORD AwardCountMax)// 最大领奖次数
     SingleRechargeValue = 0    #(DWORD SingleRechargeValue)// 单笔所需充值额度
     AwardItemCount = 0    #(BYTE AwardItemCount)// 奖励物品数
     AwardItem = list()    #(vector<tagMCActSingleRechargeAwardItem> AwardItem)// 奖励物品信息
@@ -34229,6 +34230,7 @@
     def ReadData(self, _lpData, _pos=0, _Len=0):
         self.Clear()
         self.AwardIndex,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.AwardCountMax,_pos = CommFunc.ReadWORD(_lpData, _pos)
         self.SingleRechargeValue,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.AwardItemCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.AwardItemCount):
@@ -34239,6 +34241,7 @@
 
     def Clear(self):
         self.AwardIndex = 0
+        self.AwardCountMax = 0
         self.SingleRechargeValue = 0
         self.AwardItemCount = 0
         self.AwardItem = list()
@@ -34247,6 +34250,7 @@
     def GetLength(self):
         length = 0
         length += 1
+        length += 2
         length += 4
         length += 1
         for i in range(self.AwardItemCount):
@@ -34257,6 +34261,7 @@
     def GetBuffer(self):
         data = ''
         data = CommFunc.WriteBYTE(data, self.AwardIndex)
+        data = CommFunc.WriteWORD(data, self.AwardCountMax)
         data = CommFunc.WriteDWORD(data, self.SingleRechargeValue)
         data = CommFunc.WriteBYTE(data, self.AwardItemCount)
         for i in range(self.AwardItemCount):
@@ -34266,12 +34271,14 @@
     def OutputString(self):
         DumpString = '''
                                 AwardIndex:%d,
+                                AwardCountMax:%d,
                                 SingleRechargeValue:%d,
                                 AwardItemCount:%d,
                                 AwardItem:%s
                                 '''\
                                 %(
                                 self.AwardIndex,
+                                self.AwardCountMax,
                                 self.SingleRechargeValue,
                                 self.AwardItemCount,
                                 "..."
@@ -34390,20 +34397,16 @@
 #------------------------------------------------------
 # AA 51 单笔累充活动玩家信息 #tagMCActSingleRechargePlayerInfo
 
-class  tagMCActSingleRechargePlayerInfo(Structure):
+class  tagMCActSingleRechargePlayerAward(Structure):
     _pack_ = 1
     _fields_ = [
-                  ("Cmd", c_ubyte),
-                  ("SubCmd", c_ubyte),
-                  ("ActNum", c_ubyte),    #活动编号从1开始,目前支持两个累充活动同时存在且相互独立 1或2
-                  ("CanAwardValue", c_int),    #可否领奖记录,按奖励索引二进制位存储是否可领取
-                  ("AwardRecord", c_int),    #奖励领奖记录,按奖励索引二进制位存储是否已领取
+                  ("AwardIndex", c_ubyte),    # 奖励索引
+                  ("CanGetCount", c_ushort),    # 可领奖次数
+                  ("GetCount", c_ushort),    # 已领奖次数
                   ]
 
     def __init__(self):
         self.Clear()
-        self.Cmd = 0xAA
-        self.SubCmd = 0x51
         return
 
     def ReadData(self, stringData, _pos=0, _len=0):
@@ -34412,39 +34415,102 @@
         return _pos + self.GetLength()
 
     def Clear(self):
-        self.Cmd = 0xAA
-        self.SubCmd = 0x51
-        self.ActNum = 0
-        self.CanAwardValue = 0
-        self.AwardRecord = 0
+        self.AwardIndex = 0
+        self.CanGetCount = 0
+        self.GetCount = 0
         return
 
     def GetLength(self):
-        return sizeof(tagMCActSingleRechargePlayerInfo)
+        return sizeof(tagMCActSingleRechargePlayerAward)
 
     def GetBuffer(self):
         return string_at(addressof(self), self.GetLength())
 
     def OutputString(self):
         DumpString = '''// AA 51 单笔累充活动玩家信息 //tagMCActSingleRechargePlayerInfo:
-                                Cmd:%s,
-                                SubCmd:%s,
-                                ActNum:%d,
-                                CanAwardValue:%d,
-                                AwardRecord:%d
+                                AwardIndex:%d,
+                                CanGetCount:%d,
+                                GetCount:%d
                                 '''\
                                 %(
-                                self.Cmd,
-                                self.SubCmd,
+                                self.AwardIndex,
+                                self.CanGetCount,
+                                self.GetCount
+                                )
+        return DumpString
+
+
+class  tagMCActSingleRechargePlayerInfo(Structure):
+    Head = tagHead()
+    ActNum = 0    #(BYTE ActNum)//活动编号从1开始,目前支持两个累充活动同时存在且相互独立 1或2
+    RecordCount = 0    #(BYTE RecordCount)
+    AwardRecordList = list()    #(vector<tagMCActSingleRechargePlayerAward> AwardRecordList)// 领奖次数记录列表
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x51
+        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.RecordCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.RecordCount):
+            temAwardRecordList = tagMCActSingleRechargePlayerAward()
+            _pos = temAwardRecordList.ReadData(_lpData, _pos)
+            self.AwardRecordList.append(temAwardRecordList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xAA
+        self.Head.SubCmd = 0x51
+        self.ActNum = 0
+        self.RecordCount = 0
+        self.AwardRecordList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        length += 1
+        for i in range(self.RecordCount):
+            length += self.AwardRecordList[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.WriteBYTE(data, self.RecordCount)
+        for i in range(self.RecordCount):
+            data = CommFunc.WriteString(data, self.AwardRecordList[i].GetLength(), self.AwardRecordList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                ActNum:%d,
+                                RecordCount:%d,
+                                AwardRecordList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
                                 self.ActNum,
-                                self.CanAwardValue,
-                                self.AwardRecord
+                                self.RecordCount,
+                                "..."
                                 )
         return DumpString
 
 
 m_NAtagMCActSingleRechargePlayerInfo=tagMCActSingleRechargePlayerInfo()
-ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActSingleRechargePlayerInfo.Cmd,m_NAtagMCActSingleRechargePlayerInfo.SubCmd))] = m_NAtagMCActSingleRechargePlayerInfo
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCActSingleRechargePlayerInfo.Head.Cmd,m_NAtagMCActSingleRechargePlayerInfo.Head.SubCmd))] = m_NAtagMCActSingleRechargePlayerInfo
 
 
 #------------------------------------------------------
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 07a7a6e..e5ac6f5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1691,6 +1691,7 @@
                         ("DWORD", "TemplateID", 1),
                         ("float", "SingleRechargeValue", 0),
                         ("BYTE", "AwardIndex", 0),
+                        ("WORD", "AwardCountMax", 0),
                         ("dict", "AwardItem", 0),
                         ("char", "NotifyKey", 0),
                         ),
@@ -5682,13 +5683,15 @@
         self.TemplateID = 0
         self.SingleRechargeValue = 0.0
         self.AwardIndex = 0
+        self.AwardCountMax = 0
         self.AwardItem = {}
         self.NotifyKey = ""
         return
         
     def GetTemplateID(self): return self.TemplateID # 模板ID
     def GetSingleRechargeValue(self): return self.SingleRechargeValue # 单笔充值额度
-    def GetAwardIndex(self): return self.AwardIndex # 返利奖励索引0~31,同个模板中不重复
+    def GetAwardIndex(self): return self.AwardIndex # 同个模板中不重复
+    def GetAwardCountMax(self): return self.AwardCountMax # 最大领奖次数,最大999次
     def GetAwardItem(self): return self.AwardItem # 返利物品信息列表 {职业:[(物品ID,个数,是否绑定),...]}
     def GetNotifyKey(self): return self.NotifyKey # 全服广播key,默认两个参数(玩家名, 档位额度)
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActSingleRecharge.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActSingleRecharge.py
index ee58b80..9be0a44 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActSingleRecharge.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActSingleRecharge.py
@@ -96,21 +96,31 @@
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeID % actNum, actID)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeTemplateID % actNum, templateID)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeWorldLV % actNum, actWorldLV)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeValue % actNum, 0)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeAward % actNum, 0)
-    
+    if actID and templateID:
+        ipyDataList = IpyGameDataPY.GetIpyGameDataList("ActSingleRechargeAward", templateID)
+        if ipyDataList:
+            for ipyData in ipyDataList:
+                awardIndex = ipyData.GetAwardIndex()
+                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeValue % (actNum, awardIndex), 0)
+                
     Sync_SingleRechargeActionInfo(curPlayer, actNum)
     Sync_SingleRechargePlayerInfo(curPlayer, actNum)
     return True
+
+def GetAwardCountInfo(curPlayer, actNum, awardIndex):
+    valueInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % (actNum, awardIndex))
+    getCount = valueInfo / 1000
+    canGetCount = valueInfo % 1000
+    return getCount, canGetCount
+def SetAwardCountInfo(curPlayer, actNum, awardIndex, getCount, canGetCount):
+    valueInfo = getCount * 1000 + canGetCount
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeValue % (actNum, awardIndex), valueInfo)
+    return valueInfo
 
 def __SendSingleRechargeMail(curPlayer, playerTemplateID, playerWorldLV, actNum):
     # 未领取的奖励邮件发放
     
     if not playerTemplateID:
-        return
-    
-    canAwardValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum)
-    if not canAwardValue:
         return
     
     ipyDataList = IpyGameDataPY.GetIpyGameDataList("ActSingleRechargeAward", playerTemplateID)
@@ -119,27 +129,24 @@
     
     playerID = curPlayer.GetPlayerID()
     batchPlayerIDList, batchAddItemList, batchParamList = [], [], []
-    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeAward % actNum)
     
     for ipyData in ipyDataList:
         awardIndex = ipyData.GetAwardIndex()
-        if awardRecord & pow(2, awardIndex):
-            #GameWorld.DebugLog("单笔累充已发放过奖励!awardIndex=%s" % awardIndex)
+        getCount, canGetCount = GetAwardCountInfo(curPlayer, actNum, awardIndex)
+        if getCount >= canGetCount:
+            #GameWorld.DebugLog("单笔累充已经全部领奖!awardIndex=%s" % awardIndex)
             continue
+        SetAwardCountInfo(curPlayer, actNum, awardIndex, canGetCount, canGetCount)
         
+        unGetCount = canGetCount - getCount
         singleValue = ipyData.GetSingleRechargeValue()
-        if not canAwardValue & pow(2, awardIndex):
-            #GameWorld.DebugLog("单笔累充不能领奖!awardIndex=%s" % awardIndex)
-            continue
-        awardRecord |= pow(2, awardIndex) 
-        
         awardItemList = GameWorld.GetDictValueByRangeKey(ipyData.GetAwardItem(), playerWorldLV, [])
-        batchPlayerIDList.append([playerID])
-        batchAddItemList.append(awardItemList)
-        batchParamList.append([singleValue])
-        
+        for _ in range(unGetCount):
+            batchPlayerIDList.append([playerID])
+            batchAddItemList.append(awardItemList)
+            batchParamList.append([singleValue])
+            
     if batchPlayerIDList:
-        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeAward % actNum, awardRecord)
         PlayerControl.SendMailBatch("SingleRechargeMail%s" % actNum, batchPlayerIDList, batchAddItemList, batchParamList)
         
     return
@@ -177,50 +184,15 @@
         if not awardIpyDataList:
             continue
         
-        canAwardChange = False
-        canAwardValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum)
+        awardIndexList = []
         awardRuleType = ipyData.GetAwardRuleType()
-        GameWorld.DebugLog("单笔累充充值活动,actNum=%s,awardRuleType=%s,canAwardValue=%s,curRechargeValue=%s" 
-                           % (actNum, awardRuleType, canAwardValue, curRechargeValue))
+        GameWorld.DebugLog("单笔累充充值活动,actNum=%s,awardRuleType=%s,curRechargeValue=%s" % (actNum, awardRuleType, curRechargeValue))
         # 向下兼容所有档次
         if awardRuleType == 0:
-            for awardIpyData in awardIpyDataList:
-                awardIndex = awardIpyData.GetAwardIndex()
-                singleValue = CommFunc.RMBToCoin(awardIpyData.GetSingleRechargeValue())
-                if canAwardValue & pow(2, awardIndex):
-                    #GameWorld.DebugLog("    已经可领奖,不处理!awardRuleType=%s,awardIndex=%s" % (awardRuleType, awardIndex))
-                    continue
-                if curRechargeValue < singleValue:
-                    #GameWorld.DebugLog("    未达到档次额度,不处理!awardRuleType=%s,awardIndex=%s,singleValue=%s" 
-                    #                   % (awardRuleType, awardIndex, singleValue))
-                    continue
-                
-                canAwardChange = True
-                canAwardValue |= pow(2, awardIndex)
-                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeValue % actNum, canAwardValue)
-                GameWorld.DebugLog("    设置档次可领取!awardRuleType=%s,awardIndex=%s,singleValue=%s,canAwardValue=%s" 
-                                   % (awardRuleType, awardIndex, singleValue, canAwardValue))
-                
+            pass
         # 匹配最高档次
         elif awardRuleType == 1:
-            for awardIpyData in awardIpyDataList[::-1]:
-                awardIndex = awardIpyData.GetAwardIndex()
-                singleValue = CommFunc.RMBToCoin(awardIpyData.GetSingleRechargeValue())
-                if canAwardValue & pow(2, awardIndex):
-                    #GameWorld.DebugLog("    已经可领奖,不处理!awardRuleType=%s,awardIndex=%s" % (awardRuleType, awardIndex))
-                    continue
-                if curRechargeValue < singleValue:
-                    #GameWorld.DebugLog("    未达到档次额度,不处理!awardRuleType=%s,awardIndex=%s,singleValue=%s" 
-                    #                   % (awardRuleType, awardIndex, singleValue))
-                    continue
-                
-                canAwardChange = True
-                canAwardValue |= pow(2, awardIndex)
-                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeValue % actNum, canAwardValue)
-                GameWorld.DebugLog("    设置最高档次可领取!awardRuleType=%s,awardIndex=%s,singleValue=%s,canAwardValue=%s" 
-                                   % (awardRuleType, awardIndex, singleValue, canAwardValue))
-                break
-        
+            pass        
         # 精确匹配对应档次
         elif awardRuleType == 2:
             for awardIpyData in awardIpyDataList:
@@ -230,24 +202,26 @@
                     #GameWorld.DebugLog("    不等于档次额度,不处理!awardRuleType=%s,awardIndex=%s,singleValue=%s" 
                     #                   % (awardRuleType, awardIndex, singleValue))
                     continue
-                if canAwardValue & pow(2, awardIndex):
-                    #GameWorld.DebugLog("    已经可领奖,不处理!awardRuleType=%s,awardIndex=%s" % (awardRuleType, awardIndex))
+                awardCountMax = awardIpyData.GetAwardCountMax()
+                getCount, canGetCount = GetAwardCountInfo(curPlayer, actNum, awardIndex)
+                if canGetCount >= awardCountMax:
+                    GameWorld.DebugLog("    已达最大可领奖次数,不处理!awardRuleType=%s,awardIndex=%s,awardCountMax=%s" % (awardRuleType, awardIndex, awardCountMax))
                     break
                 
-                canAwardChange = True
-                canAwardValue |= pow(2, awardIndex)
-                PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeValue % actNum, canAwardValue)
-                GameWorld.DebugLog("    设置精确档次可领取!awardRuleType=%s,awardIndex=%s,singleValue=%s,canAwardValue=%s" 
-                                   % (awardRuleType, awardIndex, singleValue, canAwardValue))
+                awardIndexList.append(awardIndex)
+                canGetCount += 1
+                SetAwardCountInfo(curPlayer, actNum, awardIndex, getCount, canGetCount)
+                GameWorld.DebugLog("    设置精确档次可领取!awardRuleType=%s,awardIndex=%s,singleValue=%s,canGetCount=%s" 
+                                   % (awardRuleType, awardIndex, singleValue, canGetCount))
                 break
             
         else:
             continue
         
-        if not canAwardChange:
+        if not awardIndexList:
             continue
         
-        Sync_SingleRechargePlayerInfo(curPlayer, actNum)
+        Sync_SingleRechargePlayerInfo(curPlayer, actNum, awardIndexList)
         
         # 线下活动,检查发放奖励
         if ipyData.GetIsOfflineAct():
@@ -275,11 +249,6 @@
         GameWorld.DebugLog("该单笔累充活动非活动中,无法领奖!actNum=%s,state=%s,templateID=%s" % (actNum, state, templateID), playerID)
         return
     
-    awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeAward % actNum)
-    if awardRecord & pow(2, awardIndex):
-        GameWorld.DebugLog("已经领取过该单笔累充活动奖励! actNum=%s,awardIndex=%s" % (actNum, awardIndex), playerID)
-        return
-    
     ipyDataList = IpyGameDataPY.GetIpyGameDataList("ActSingleRechargeAward", templateID)
     if not ipyDataList:
         return
@@ -294,13 +263,12 @@
         GameWorld.DebugLog("找不到该单笔累充活动档位索引奖励!actNum=%s,templateID=%s,awardIndex=%s" % (actNum, templateID, awardIndex), playerID)
         return
     
-    singleValue = awardIpyData.GetSingleRechargeValue()
-    canAwardValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum)
-    
-    if not canAwardValue & pow(2, awardIndex):
-        GameWorld.DebugLog("该档次奖励无法领取! templateID=%s,awardIndex=%s,singleValue=%s,canAwardValue%s" 
-                           % (templateID, awardIndex, singleValue, canAwardValue), playerID)
+    getCount, canGetCount = GetAwardCountInfo(curPlayer, actNum, awardIndex)
+    if getCount >= canGetCount:
+        GameWorld.DebugLog("该单笔累充活动奖励已达最大可领奖次数! actNum=%s,awardIndex=%s,getCount(%s) >= canGetCount(%s)" % (actNum, awardIndex, getCount, canGetCount), playerID)
         return
+    
+    singleValue = awardIpyData.GetSingleRechargeValue()
     
     actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeWorldLV % actNum)
     awardItemList = GameWorld.GetDictValueByRangeKey(ipyData.GetAwardItem(), actWorldLV, [])
@@ -308,12 +276,12 @@
     if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList):
         return
     
-    awardRecord |= pow(2, awardIndex)
-    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeAward % actNum, awardRecord)
-    Sync_SingleRechargePlayerInfo(curPlayer, actNum)
+    getCount += 1
+    SetAwardCountInfo(curPlayer, actNum, awardIndex, getCount, canGetCount)
+    Sync_SingleRechargePlayerInfo(curPlayer, actNum, [awardIndex])
     
-    GameWorld.DebugLog("    领取成功! actNum=%s,templateID=%s,awardIndex=%s,singleValue=%s,awardRecord=%s" 
-                       % (actNum, templateID, awardIndex, singleValue, awardRecord))
+    GameWorld.DebugLog("    领取成功! actNum=%s,templateID=%s,awardIndex=%s,singleValue=%s,getCount=%s,canGetCount=%s" 
+                       % (actNum, templateID, awardIndex, singleValue, getCount, canGetCount))
     
     notifyKey = awardIpyData.GetNotifyKey()
     if notifyKey:
@@ -324,7 +292,7 @@
         
     return
 
-def Sync_SingleRechargePlayerInfo(curPlayer, actNum):
+def Sync_SingleRechargePlayerInfo(curPlayer, actNum, awardIndexList=None):
     ## 通知玩家数据信息
     
     actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_SingleRecharge, actNum)
@@ -343,10 +311,32 @@
         #线下活动不下发
         return
     
+    if awardIndexList == None:
+        awardIndexList = []
+        templateID = GetTemplateID(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0))
+        if not templateID:
+            return
+        ipyDataList = IpyGameDataPY.GetIpyGameDataList("ActSingleRechargeAward", templateID)
+        if not ipyDataList:
+            return
+        for awardIpyData in ipyDataList:
+            awardIndexList.append(awardIpyData.GetAwardIndex())
+            
+    if not awardIndexList:
+        return
+    
     playerActInfo = ChPyNetSendPack.tagMCActSingleRechargePlayerInfo()
     playerActInfo.ActNum = actNum
-    playerActInfo.CanAwardValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum)
-    playerActInfo.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeAward % actNum)
+    playerActInfo.AwardRecordList = []
+    for awardIndex in awardIndexList:
+        getCount, canGetCount = GetAwardCountInfo(curPlayer, actNum, awardIndex)
+        awardRecord = ChPyNetSendPack.tagMCActSingleRechargePlayerAward()
+        awardRecord.Clear()
+        awardRecord.AwardIndex = awardIndex
+        awardRecord.CanGetCount = canGetCount
+        awardRecord.GetCount = getCount
+        playerActInfo.AwardRecordList.append(awardRecord)
+    playerActInfo.RecordCount = len(playerActInfo.AwardRecordList)
     NetPackCommon.SendFakePack(curPlayer, playerActInfo)
     return
 
@@ -390,6 +380,7 @@
         for awardIpyData in ipyDataList:
             awardInfo = ChPyNetSendPack.tagMCActSingleRechargeAward()
             awardInfo.AwardIndex = awardIpyData.GetAwardIndex()
+            awardInfo.AwardCountMax = awardIpyData.GetAwardCountMax()
             awardInfo.SingleRechargeValue = CommFunc.RMBToCoin(awardIpyData.GetSingleRechargeValue())
             awardInfo.AwardItem = []
             awardItemList = GameWorld.GetDictValueByRangeKey(awardIpyData.GetAwardItem(), actWorldLV, [])

--
Gitblit v1.8.0