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/Player/PlayerActSingleRecharge.py |  165 ++++++++++++++++++++++++++-----------------------------
 1 files changed, 78 insertions(+), 87 deletions(-)

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