From 65d8c41c3e62313deb9ff6a3b9b701a55b662d5b Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期六, 07 十月 2023 01:38:11 +0800
Subject: [PATCH] 9905 【BT0.1】【主干】新增每周、每月限购(累充支持线下活动)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTotalRecharge.py |   65 ++++++++++++++++++++++++--------
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                 |    6 +++
 PySysDB/PySysDBPY.h                                                                                  |    2 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                      |    8 ++++
 4 files changed, 64 insertions(+), 17 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 3be9fa4..ade19ea 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1961,6 +1961,8 @@
 	char		EndDate;	//结束日期
 	WORD		LVLimit;	//限制等级
 	BYTE		IsDayReset;	//是否每天重置
+	BYTE		CTGTypeEffValue;	//充值有效类型值
+	BYTE		IsOfflineAct;	//是否线下活动
 	list		TemplateIDList;	//模板ID列表
 };
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 06e446a..3cd2686 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -5955,3 +5955,11 @@
 TTLTaskType_FamilyPartyAnswerRight, # 仙盟答题答对x次 17
 TTLTaskType_CrossBoss, # 跨服boss击杀x次 18
 ) = range(1, 1 + 18)
+
+# 充值点券处理类型
+(
+CoinType_Gold, # 直接充仙玉 0
+CoinType_Buy, # 直购,非直接充仙玉的,如RMB直接购买某个物品或激活某个功能 1
+CoinType_ItemSuper, # 使用超级现金卡物品,类充值仙玉效果,但是有某些功能上的限制,一般是bt版本赠送 2
+CoinType_ItemCash, # 使用现金卡物品,类充值仙玉效果,但是有某些功能上的限制,一般是bt版本赠送 3
+) = range(4)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 9e0d17f..db7dd13 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1544,6 +1544,8 @@
                         ("char", "EndDate", 0),
                         ("WORD", "LVLimit", 0),
                         ("BYTE", "IsDayReset", 0),
+                        ("BYTE", "CTGTypeEffValue", 0),
+                        ("BYTE", "IsOfflineAct", 0),
                         ("list", "TemplateIDList", 0),
                         ),
 
@@ -5302,6 +5304,8 @@
         self.EndDate = ""
         self.LVLimit = 0
         self.IsDayReset = 0
+        self.CTGTypeEffValue = 0
+        self.IsOfflineAct = 0
         self.TemplateIDList = []
         return
         
@@ -5310,6 +5314,8 @@
     def GetEndDate(self): return self.EndDate # 结束日期
     def GetLVLimit(self): return self.LVLimit # 限制等级
     def GetIsDayReset(self): return self.IsDayReset # 是否每天重置
+    def GetCTGTypeEffValue(self): return self.CTGTypeEffValue # 充值有效类型值
+    def GetIsOfflineAct(self): return self.IsOfflineAct # 是否线下活动
     def GetTemplateIDList(self): return self.TemplateIDList # 模板ID列表
 
 # 累计充值模板表
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTotalRecharge.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTotalRecharge.py
index a6eca4e..208725e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTotalRecharge.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActTotalRecharge.py
@@ -39,14 +39,6 @@
     templateID = templateIDList[-1] if dayIndex >= len(templateIDList) else templateIDList[dayIndex]
     return templateID
 
-def GetActInfo(actNum):
-    if ShareDefine.OperationActionName_TotalRecharge not in PyGameData.g_operationActionDict:
-        return {}
-    actNumDict = PyGameData.g_operationActionDict[ShareDefine.OperationActionName_TotalRecharge]
-    if actNum not in actNumDict:
-        return {}
-    return actNumDict[actNum]
-
 def OnPlayerLogin(curPlayer):
     
     for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge, {}).values():
@@ -74,7 +66,7 @@
     ## 检查玩家累计充值活动数据信息
     
     playerID = curPlayer.GetPlayerID()
-    actInfo = GetActInfo(actNum)
+    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_TotalRecharge, actNum)
     TotalRechargeID = actInfo.get(ShareDefine.ActKey_ID, 0)
     state = actInfo.get(ShareDefine.ActKey_State, 0)
     
@@ -106,7 +98,7 @@
     return True
 
 def __SendTotalRechargeMail(curPlayer, playerTemplateID, playerWorldLV, actNum):
-    # 未领取的奖励邮件发放
+    # 邮件发放奖励,适用于活动结束后补发未领取奖励        或        线下活动自动发放满足领取条件的奖励
     
     if not playerTemplateID:
         return
@@ -140,8 +132,7 @@
         
     if batchPlayerIDList:
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalRechargeAwardRecord % actNum, awardRecord)
-        actType = actNum / 10
-        PlayerControl.SendMailBatch("TotalRechargeMail%s" % actType, batchPlayerIDList, batchAddItemList, batchParamList)
+        PlayerControl.SendMailBatch("TotalRechargeMail%s" % actNum, batchPlayerIDList, batchAddItemList, batchParamList)
         
     return
 
@@ -155,14 +146,29 @@
         return itemInfoDict[str(job)]
     
 
-def AddTotalRechargeGold(curPlayer, addGold):
+def AddTotalRechargeGold(curPlayer, addGold, coinType):
     if addGold <= 0:
         return
     
     for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_TotalRecharge, {}).values():
         actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
+        
         if not actInfo.get(ShareDefine.ActKey_State):
             GameWorld.DebugLog("累计充值活动当前未开启! actNum=%s" % actNum)
+            continue
+        
+        cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
+        if not cfgID:
+            continue
+        
+        ipyData = IpyGameDataPY.GetIpyGameData("ActTotalRecharge", cfgID)
+        if not ipyData:
+            continue
+        
+        ctgTypeEffValue = ipyData.GetCTGTypeEffValue()
+        if not ctgTypeEffValue & pow(2, coinType):
+            GameWorld.DebugLog("玩家累计充值活动,充值类型对该活动无效! actNum=%s,coinType=%s,ctgTypeEffValue=%s" 
+                               % (actNum, coinType, ctgTypeEffValue), curPlayer.GetPlayerID())
             continue
         
         actID = actInfo.get(ShareDefine.ActKey_ID)
@@ -179,10 +185,17 @@
         Sync_TotalRechargeInfo(curPlayer, actNum)
         GameWorld.DebugLog("玩家累计充值活动: actNum=%s,actID=%s,templateID=%s,curRechargeGold=%s,addGold=%s,updRechargeGold=%s" 
                            % (actNum, actID, templateID, curRechargeGold, addGold, updRechargeGold), curPlayer.GetPlayerID())
+        
+        # 线下活动,检查发放奖励
+        if ipyData.GetIsOfflineAct():
+            playerWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeWorldLV % actNum)
+            __SendTotalRechargeMail(curPlayer, templateID, playerWorldLV, actNum)
+            
     return
-
+    
+    
 def OnGetTotalRechargeAward(curPlayer, awardIndex, actNum):
-    '''OnGetTotalRechargeAward
+    '''领取累计充值奖励
     @param awardIndex: 奖励索引
     @param actNum: 活动编号,如11 或  12 代表不同的活动
     '''
@@ -191,7 +204,7 @@
         GameWorld.DebugLog("没有指定领取的累充活动编号! actNum=%s" % actNum)
         return
     playerID = curPlayer.GetPlayerID()
-    actInfo = GetActInfo(actNum)
+    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_TotalRecharge, actNum)
                 
     TotalRechargeID = actInfo.get(ShareDefine.ActKey_ID, 0)
     state = actInfo.get(ShareDefine.ActKey_State, 0)
@@ -255,6 +268,20 @@
 
 def Sync_TotalRechargeInfo(curPlayer, actNum):
     ## 通知累计充值玩家数据信息
+    
+    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_TotalRecharge, actNum)
+    if not actInfo.get(ShareDefine.ActKey_State):
+        return
+    
+    cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
+    ipyData = IpyGameDataPY.GetIpyGameData("ActTotalRecharge", cfgID)
+    if not ipyData:
+        return
+    
+    if ipyData.GetIsOfflineAct():
+        #线下活动不下发
+        return
+    
     playerActInfo = ChPyNetSendPack.tagMCTotalRechargePlayerInfo()
     playerActInfo.ActNum = actNum
     playerActInfo.GoldTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalRechargeGold % actNum)
@@ -265,7 +292,7 @@
 def Sync_TotalRechargeActionInfo(curPlayer, actNum):
     ## 通知累计充值活动信息
     
-    actInfo = GetActInfo(actNum)
+    actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_TotalRecharge, actNum)
     if not actInfo.get(ShareDefine.ActKey_State):
         return
     
@@ -274,6 +301,10 @@
     if not ipyData:
         return
     
+    if ipyData.GetIsOfflineAct():
+        #线下活动不下发
+        return
+    
     templateIDList = ipyData.GetTemplateIDList()
     if not templateIDList:
         return

--
Gitblit v1.8.0