From 5b48407be93e85ebf82ccc8ff13e9f4c561195c4 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 16 四月 2021 14:14:37 +0800
Subject: [PATCH] 8906 【主干】【BT2】【后端】线下单笔充值活动逻辑调整(支持三种领奖模式设定;0-向下兼容,1-匹配最高档,2-精确匹配档次)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 19 ++++--
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 3 +
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActSingleRecharge.py | 104 ++++++++++++++++++++++++++++------
PySysDB/PySysDBPY.h | 1
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 19 ++++--
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 4
6 files changed, 118 insertions(+), 32 deletions(-)
diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index d0ec7bf..09fbff0 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -1690,6 +1690,7 @@
BYTE IsDayReset; //是否每天重置
BYTE CTGTypeEffValue; //充值有效类型值
BYTE IsOfflineAct; //是否线下活动
+ BYTE AwardRuleType; //领奖规则类型 0-向下兼容;1-匹配最高档;2-精确匹配对应档次
list TemplateIDList; //模板ID列表
};
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 9764be9..4d99f79 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -26073,11 +26073,12 @@
class tagMCActSingleRechargeInfo(Structure):
Head = tagHead()
- ActNum = 0 #(BYTE ActNum)//活动编号
+ ActNum = 0 #(BYTE ActNum)// 活动编号
StartDate = "" #(char StartDate[10])// 开始日期 y-m-d
EndtDate = "" #(char EndtDate[10])// 结束日期 y-m-d
- IsDayReset = 0 #(BYTE IsDayReset)//是否每天重置
+ IsDayReset = 0 #(BYTE IsDayReset)// 是否每天重置
LimitLV = 0 #(WORD LimitLV)// 限制等级
+ AwardRuleType = 0 #(BYTE AwardRuleType)// 领奖规则类型 0-向下兼容;1-匹配最高档;2-精确匹配对应档次
AwardCount = 0 #(BYTE AwardCount)// 奖励档数
AwardInfo = list() #(vector<tagMCActSingleRechargeAward> AwardInfo)// 奖励档信息
data = None
@@ -26096,6 +26097,7 @@
self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.AwardRuleType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
self.AwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
for i in range(self.AwardCount):
temAwardInfo = tagMCActSingleRechargeAward()
@@ -26113,6 +26115,7 @@
self.EndtDate = ""
self.IsDayReset = 0
self.LimitLV = 0
+ self.AwardRuleType = 0
self.AwardCount = 0
self.AwardInfo = list()
return
@@ -26125,6 +26128,7 @@
length += 10
length += 1
length += 2
+ length += 1
length += 1
for i in range(self.AwardCount):
length += self.AwardInfo[i].GetLength()
@@ -26139,6 +26143,7 @@
data = CommFunc.WriteString(data, 10, self.EndtDate)
data = CommFunc.WriteBYTE(data, self.IsDayReset)
data = CommFunc.WriteWORD(data, self.LimitLV)
+ data = CommFunc.WriteBYTE(data, self.AwardRuleType)
data = CommFunc.WriteBYTE(data, self.AwardCount)
for i in range(self.AwardCount):
data = CommFunc.WriteString(data, self.AwardInfo[i].GetLength(), self.AwardInfo[i].GetBuffer())
@@ -26152,6 +26157,7 @@
EndtDate:%s,
IsDayReset:%d,
LimitLV:%d,
+ AwardRuleType:%d,
AwardCount:%d,
AwardInfo:%s
'''\
@@ -26162,6 +26168,7 @@
self.EndtDate,
self.IsDayReset,
self.LimitLV,
+ self.AwardRuleType,
self.AwardCount,
"..."
)
@@ -26181,7 +26188,7 @@
("Cmd", c_ubyte),
("SubCmd", c_ubyte),
("ActNum", c_ubyte), #活动编号从1开始,目前支持两个累充活动同时存在且相互独立 1或2
- ("HightestSingleRecharge", c_int), # 最高单笔充值额度
+ ("CanAwardValue", c_int), #可否领奖记录,按奖励索引二进制位存储是否可领取
("AwardRecord", c_int), #奖励领奖记录,按奖励索引二进制位存储是否已领取
]
@@ -26200,7 +26207,7 @@
self.Cmd = 0xAA
self.SubCmd = 0x51
self.ActNum = 0
- self.HightestSingleRecharge = 0
+ self.CanAwardValue = 0
self.AwardRecord = 0
return
@@ -26215,14 +26222,14 @@
Cmd:%s,
SubCmd:%s,
ActNum:%d,
- HightestSingleRecharge:%d,
+ CanAwardValue:%d,
AwardRecord:%d
'''\
%(
self.Cmd,
self.SubCmd,
self.ActNum,
- self.HightestSingleRecharge,
+ self.CanAwardValue,
self.AwardRecord
)
return DumpString
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index f9d82ad..a7d3216 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3871,8 +3871,8 @@
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" # 领奖奖励值,按奖励索引二进制位代表是否可领奖,参数:(活动编号)
+Def_PDict_SingleRechargeAward = "SingleRechargeAward_%s" # 领奖记录值,按奖励索引二进制位代表是否已领奖,参数:(活动编号)
#-------------------------------------------------------------------------------
#开服活动,Def_PDictType_OpenServerCampaign
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 9764be9..4d99f79 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -26073,11 +26073,12 @@
class tagMCActSingleRechargeInfo(Structure):
Head = tagHead()
- ActNum = 0 #(BYTE ActNum)//活动编号
+ ActNum = 0 #(BYTE ActNum)// 活动编号
StartDate = "" #(char StartDate[10])// 开始日期 y-m-d
EndtDate = "" #(char EndtDate[10])// 结束日期 y-m-d
- IsDayReset = 0 #(BYTE IsDayReset)//是否每天重置
+ IsDayReset = 0 #(BYTE IsDayReset)// 是否每天重置
LimitLV = 0 #(WORD LimitLV)// 限制等级
+ AwardRuleType = 0 #(BYTE AwardRuleType)// 领奖规则类型 0-向下兼容;1-匹配最高档;2-精确匹配对应档次
AwardCount = 0 #(BYTE AwardCount)// 奖励档数
AwardInfo = list() #(vector<tagMCActSingleRechargeAward> AwardInfo)// 奖励档信息
data = None
@@ -26096,6 +26097,7 @@
self.EndtDate,_pos = CommFunc.ReadString(_lpData, _pos,10)
self.IsDayReset,_pos = CommFunc.ReadBYTE(_lpData, _pos)
self.LimitLV,_pos = CommFunc.ReadWORD(_lpData, _pos)
+ self.AwardRuleType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
self.AwardCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
for i in range(self.AwardCount):
temAwardInfo = tagMCActSingleRechargeAward()
@@ -26113,6 +26115,7 @@
self.EndtDate = ""
self.IsDayReset = 0
self.LimitLV = 0
+ self.AwardRuleType = 0
self.AwardCount = 0
self.AwardInfo = list()
return
@@ -26125,6 +26128,7 @@
length += 10
length += 1
length += 2
+ length += 1
length += 1
for i in range(self.AwardCount):
length += self.AwardInfo[i].GetLength()
@@ -26139,6 +26143,7 @@
data = CommFunc.WriteString(data, 10, self.EndtDate)
data = CommFunc.WriteBYTE(data, self.IsDayReset)
data = CommFunc.WriteWORD(data, self.LimitLV)
+ data = CommFunc.WriteBYTE(data, self.AwardRuleType)
data = CommFunc.WriteBYTE(data, self.AwardCount)
for i in range(self.AwardCount):
data = CommFunc.WriteString(data, self.AwardInfo[i].GetLength(), self.AwardInfo[i].GetBuffer())
@@ -26152,6 +26157,7 @@
EndtDate:%s,
IsDayReset:%d,
LimitLV:%d,
+ AwardRuleType:%d,
AwardCount:%d,
AwardInfo:%s
'''\
@@ -26162,6 +26168,7 @@
self.EndtDate,
self.IsDayReset,
self.LimitLV,
+ self.AwardRuleType,
self.AwardCount,
"..."
)
@@ -26181,7 +26188,7 @@
("Cmd", c_ubyte),
("SubCmd", c_ubyte),
("ActNum", c_ubyte), #活动编号从1开始,目前支持两个累充活动同时存在且相互独立 1或2
- ("HightestSingleRecharge", c_int), # 最高单笔充值额度
+ ("CanAwardValue", c_int), #可否领奖记录,按奖励索引二进制位存储是否可领取
("AwardRecord", c_int), #奖励领奖记录,按奖励索引二进制位存储是否已领取
]
@@ -26200,7 +26207,7 @@
self.Cmd = 0xAA
self.SubCmd = 0x51
self.ActNum = 0
- self.HightestSingleRecharge = 0
+ self.CanAwardValue = 0
self.AwardRecord = 0
return
@@ -26215,14 +26222,14 @@
Cmd:%s,
SubCmd:%s,
ActNum:%d,
- HightestSingleRecharge:%d,
+ CanAwardValue:%d,
AwardRecord:%d
'''\
%(
self.Cmd,
self.SubCmd,
self.ActNum,
- self.HightestSingleRecharge,
+ self.CanAwardValue,
self.AwardRecord
)
return DumpString
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index cd8d9f7..4c30592 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1332,6 +1332,7 @@
("BYTE", "IsDayReset", 0),
("BYTE", "CTGTypeEffValue", 0),
("BYTE", "IsOfflineAct", 0),
+ ("BYTE", "AwardRuleType", 0),
("list", "TemplateIDList", 0),
),
@@ -4513,6 +4514,7 @@
self.IsDayReset = 0
self.CTGTypeEffValue = 0
self.IsOfflineAct = 0
+ self.AwardRuleType = 0
self.TemplateIDList = []
return
@@ -4523,6 +4525,7 @@
def GetIsDayReset(self): return self.IsDayReset # 是否每天重置
def GetCTGTypeEffValue(self): return self.CTGTypeEffValue # 充值有效类型值
def GetIsOfflineAct(self): return self.IsOfflineAct # 是否线下活动
+ def GetAwardRuleType(self): return self.AwardRuleType # 领奖规则类型 0-向下兼容;1-匹配最高档;2-精确匹配对应档次
def GetTemplateIDList(self): return self.TemplateIDList # 模板ID列表
# 单笔累充模板表
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 f87db1e..9724dd0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActSingleRecharge.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActSingleRecharge.py
@@ -109,8 +109,8 @@
if not playerTemplateID:
return
- curRechargeValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum)
- if not curRechargeValue:
+ canAwardValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum)
+ if not canAwardValue:
return
ipyDataList = IpyGameDataPY.GetIpyGameDataList("ActSingleRechargeAward", playerTemplateID)
@@ -124,10 +124,12 @@
for ipyData in ipyDataList:
awardIndex = ipyData.GetAwardIndex()
if awardRecord & pow(2, awardIndex):
+ #GameWorld.DebugLog("单笔累充已发放过奖励!awardIndex=%s" % awardIndex)
continue
singleValue = ipyData.GetSingleRechargeValue()
- if curRechargeValue < CommFunc.RMBToCoin(singleValue):
+ if not canAwardValue & pow(2, awardIndex):
+ #GameWorld.DebugLog("单笔累充不能领奖!awardIndex=%s" % awardIndex)
continue
awardRecord |= pow(2, awardIndex)
@@ -142,8 +144,8 @@
return
-def UpdSingleRechargeValue(curPlayer, updRechargeValue, coinType):
- if updRechargeValue <= 0:
+def UpdSingleRechargeValue(curPlayer, curRechargeValue, coinType):
+ if curRechargeValue <= 0:
return
for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_SingleRecharge, {}).values():
@@ -171,16 +173,81 @@
GameWorld.ErrLog("单笔累充充值活动数据异常!cfgID=%s,templateID=%s" % (cfgID, templateID), curPlayer.GetPlayerID())
continue
- curRechargeValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum)
- if curRechargeValue >= updRechargeValue:
- GameWorld.DebugLog("单笔累充充值活动,未超过当前单笔累充额度,不更新! actNum=%s,curRechargeValue=%s >= updRechargeValue=%s"
- % (actNum, curRechargeValue, updRechargeValue), curPlayer.GetPlayerID())
+ awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActSingleRechargeAward", templateID)
+ if not awardIpyDataList:
continue
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeValue % actNum, updRechargeValue)
+ canAwardChange = False
+ canAwardValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum)
+ awardRuleType = ipyData.GetAwardRuleType()
+ GameWorld.DebugLog("单笔累充充值活动,actNum=%s,awardRuleType=%s,canAwardValue=%s,curRechargeValue=%s"
+ % (actNum, awardRuleType, canAwardValue, 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))
+
+ # 匹配最高档次
+ 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
+
+ # 精确匹配对应档次
+ elif awardRuleType == 2:
+ for awardIpyData in awardIpyDataList:
+ awardIndex = awardIpyData.GetAwardIndex()
+ singleValue = CommFunc.RMBToCoin(awardIpyData.GetSingleRechargeValue())
+ if curRechargeValue != singleValue:
+ #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))
+ 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))
+ break
+
+ else:
+ continue
+
+ if not canAwardChange:
+ continue
+
Sync_SingleRechargePlayerInfo(curPlayer, actNum)
- GameWorld.DebugLog("单笔累充充值活动更新单笔充值额度: actNum=%s,curRechargeValue=%s,updRechargeValue=%s"
- % (actNum, curRechargeValue, updRechargeValue), curPlayer.GetPlayerID())
# 线下活动,检查发放奖励
if ipyData.GetIsOfflineAct():
@@ -227,12 +294,12 @@
GameWorld.DebugLog("找不到该单笔累充活动档位索引奖励!actNum=%s,templateID=%s,awardIndex=%s" % (actNum, templateID, awardIndex), playerID)
return
- singleValue = CommFunc.RMBToCoin(awardIpyData.GetSingleRechargeValue())
- curRechargeValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum)
+ singleValue = awardIpyData.GetSingleRechargeValue()
+ canAwardValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum)
- if curRechargeValue < singleValue:
- GameWorld.DebugLog("所需单笔充值额度不足,无法领取! templateID=%s,awardIndex=%s,singleValue=(%s) > curRechargeValue(%s)"
- % (templateID, awardIndex, singleValue, curRechargeValue), playerID)
+ if not canAwardValue & pow(2, awardIndex):
+ GameWorld.DebugLog("该档次奖励无法领取! templateID=%s,awardIndex=%s,singleValue=%s,canAwardValue%s"
+ % (templateID, awardIndex, singleValue, canAwardValue), playerID)
return
actWorldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0)
@@ -278,7 +345,7 @@
playerActInfo = ChPyNetSendPack.tagMCActSingleRechargePlayerInfo()
playerActInfo.ActNum = actNum
- playerActInfo.HightestSingleRecharge = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum)
+ playerActInfo.CanAwardValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum)
playerActInfo.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeAward % actNum)
NetPackCommon.SendFakePack(curPlayer, playerActInfo)
return
@@ -315,6 +382,7 @@
clientPack.EndtDate = GameWorld.GetOperationActionDateStr(ipyData.GetEndDate(), openServerDay)
clientPack.IsDayReset = ipyData.GetIsDayReset()
clientPack.LimitLV = ipyData.GetLVLimit()
+ clientPack.AwardRuleType = ipyData.GetAwardRuleType()
clientPack.AwardInfo = []
ipyDataList = IpyGameDataPY.GetIpyGameDataList("ActSingleRechargeAward", templateID)
--
Gitblit v1.8.0