add 红包活动

This commit is contained in:
sk 2025-01-02 14:22:16 +08:00
parent 7876fa34f9
commit 2b8ef577f5
5 changed files with 104 additions and 58 deletions

View File

@ -27,7 +27,7 @@ func (r *RedPacketService) GetAll(plt *string, res *[]*model.RedPacket) error {
list, err := d.GetAll() list, err := d.GetAll()
if err != nil { if err != nil {
logger.Logger.Errorf("GetAll error: %v", err) logger.Logger.Errorf("RedPacketService.GetAll error: %v", err)
return err return err
} }
@ -36,17 +36,19 @@ func (r *RedPacketService) GetAll(plt *string, res *[]*model.RedPacket) error {
return nil return nil
} }
func (r *RedPacketService) UpdateAll(plt *string, list []*model.RedPacket) error { func (r *RedPacketService) UpdateAll(req *model.UpdateRedPacketAllReq, res *bool) error {
d, err := mongox.GetDao(*plt, dao.NewRedPacket) d, err := mongox.GetDao(req.Plt, dao.NewRedPacket)
if err != nil { if err != nil {
return err return err
} }
err = d.UpdateAll(list) err = d.UpdateAll(req.List)
if err != nil { if err != nil {
logger.Logger.Errorf("UpdateAll error: %v", err) logger.Logger.Errorf("RedPacketService.UpdateAll error: %v", err)
return err return err
} }
*res = true
return nil return nil
} }

View File

@ -548,6 +548,11 @@ type DiamondBankData struct {
TakeRecord map[int32]int64 // 每次领取记录 TakeRecord map[int32]int64 // 每次领取记录
} }
type RedPacketData struct {
N int64 // 领取次数
RN int64 // 非空奖次数
}
type WelfareData struct { type WelfareData struct {
ReliefFundTimes int32 //救济金领取次数 ReliefFundTimes int32 //救济金领取次数
Sign7 *NewSignData //七日签到 Sign7 *NewSignData //七日签到
@ -564,7 +569,7 @@ type WelfareData struct {
DiamondBank *DiamondBankData // 钻石储存罐 DiamondBank *DiamondBankData // 钻石储存罐
PermitAward map[int32]int64 // 赛季通行证奖励领取时间 PermitAward map[int32]int64 // 赛季通行证奖励领取时间
PermitExchange map[int32][]int64 // 赛季通行证兑换次数, 多次的兑换时间 PermitExchange map[int32][]int64 // 赛季通行证兑换次数, 多次的兑换时间
RedPacket map[int64]int // 红包活动 活动id:领取次数 RedPacket map[int64]*RedPacketData // 红包活动 活动id:领取次数
} }
func NewWelfareData() *WelfareData { func NewWelfareData() *WelfareData {
@ -581,7 +586,7 @@ func NewWelfareData() *WelfareData {
}, },
PermitAward: make(map[int32]int64), PermitAward: make(map[int32]int64),
PermitExchange: make(map[int32][]int64), PermitExchange: make(map[int32][]int64),
RedPacket: make(map[int64]int), RedPacket: make(map[int64]*RedPacketData),
} }
} }

View File

@ -30,6 +30,8 @@ func GetRedPacketAll(plt string) (res []*RedPacket, err error) {
return nil, errors.New("rpc client is nil") return nil, errors.New("rpc client is nil")
} }
res = make([]*RedPacket, 0)
err = rpcCli.CallWithTimeout("RedPacketService.GetAll", &plt, &res, time.Second*30) err = rpcCli.CallWithTimeout("RedPacketService.GetAll", &plt, &res, time.Second*30)
if err != nil { if err != nil {
logger.Logger.Errorf("GetRedPacketAll error: %v", err) logger.Logger.Errorf("GetRedPacketAll error: %v", err)
@ -39,13 +41,23 @@ func GetRedPacketAll(plt string) (res []*RedPacket, err error) {
return res, nil return res, nil
} }
type UpdateRedPacketAllReq struct {
Plt string
List []*RedPacket
}
func UpdateRedPacketAll(plt string, list []*RedPacket) error { func UpdateRedPacketAll(plt string, list []*RedPacket) error {
if rpcCli == nil { if rpcCli == nil {
logger.Logger.Error("model.UpdateRedPacketAll rpcCli == nil") logger.Logger.Error("model.UpdateRedPacketAll rpcCli == nil")
return errors.New("rpc client is nil") return errors.New("rpc client is nil")
} }
req := &UpdateRedPacketAllReq{
Plt: plt,
List: list,
}
res := false
err := rpcCli.CallWithTimeout("RedPacketService.UpdateAll", &plt, &list, time.Second*30) err := rpcCli.CallWithTimeout("RedPacketService.UpdateAll", req, &res, time.Second*30)
if err != nil { if err != nil {
logger.Logger.Errorf("UpdateRedPacketAll error: %v", err) logger.Logger.Errorf("UpdateRedPacketAll error: %v", err)
return err return err

View File

@ -133,36 +133,21 @@ func (m *RedPacketMgr) GetRemainTimesByConfig(p *Player, cfg *webapiproto.RedPac
return 0, 0 return 0, 0
} }
var limit int32 if cfg.GetMaxCount() <= 0 {
playerLimit := WelfareMgrSington.GetConfig(p.Platform).RedPacketConfig.GetPlayerLimit()
if playerLimit > 0 && cfg.GetMaxCount() > 0 {
if playerLimit < int32(cfg.GetMaxCount()) {
limit = playerLimit
} else {
limit = int32(cfg.GetMaxCount())
}
} else {
if playerLimit > 0 {
limit = playerLimit
}
if cfg.GetMaxCount() > 0 {
limit = int32(cfg.GetMaxCount())
}
}
if limit <= 0 {
return -1, -1 return -1, -1
} }
n := 0 n := 0
if p.WelfData != nil && p.WelfData.RedPacket != nil { if p.WelfData != nil && p.WelfData.RedPacket != nil {
if _, exist := p.WelfData.RedPacket[cfg.GetId()]; exist { if _, exist := p.WelfData.RedPacket[cfg.GetId()]; exist {
n = p.WelfData.RedPacket[cfg.GetId()] n = int(p.WelfData.RedPacket[cfg.GetId()].N)
} }
} }
remainCount := int64(limit) - int64(n) remainCount := cfg.GetMaxCount() - int64(n)
if remainCount < 0 { if remainCount < 0 {
remainCount = 0 remainCount = 0
} }
return int64(limit), remainCount return cfg.GetMaxCount(), remainCount
} }
// AddUse 添加使用红包 // AddUse 添加使用红包

View File

@ -3,6 +3,7 @@ package main
import ( import (
"fmt" "fmt"
"math" "math"
"math/rand"
"slices" "slices"
"time" "time"
@ -2254,7 +2255,15 @@ func (this *WelfareMgr) GetRedPacket(p *Player, id int64) *welfare.SCRedPacketDr
p.SendToClient(int(welfare.SPacketID_PACKET_SCRedPacketDraw), pack) p.SendToClient(int(welfare.SPacketID_PACKET_SCRedPacketDraw), pack)
} }
playerLimit := this.GetConfig(p.Platform).RedPacketConfig.GetPlayerLimit() if p.WelfData == nil {
return nil
}
if p.WelfData.RedPacket[id] == nil {
p.WelfData.RedPacket[id] = &model.RedPacketData{}
}
data := p.WelfData.RedPacket[id]
var cfg *webapi_proto.RedPacketInfo var cfg *webapi_proto.RedPacketInfo
for _, v := range this.GetConfig(p.Platform).RedPacketConfig.GetList() { for _, v := range this.GetConfig(p.Platform).RedPacketConfig.GetList() {
if v.GetId() == id { if v.GetId() == id {
@ -2271,17 +2280,8 @@ func (this *WelfareMgr) GetRedPacket(p *Player, id int64) *welfare.SCRedPacketDr
} }
// 次数限制 // 次数限制
n := 0 n := int(data.N)
if p.WelfData != nil && p.WelfData.RedPacket != nil {
if _, exist := p.WelfData.RedPacket[id]; exist {
n = p.WelfData.RedPacket[id]
}
}
if playerLimit > 0 && n >= int(playerLimit) {
Send(welfare.OpResultCode_OPRC_NoTimes)
return pack
}
if cfg.GetMaxCount() > 0 && cfg.GetMaxCount() <= int64(n) { if cfg.GetMaxCount() > 0 && cfg.GetMaxCount() <= int64(n) {
Send(welfare.OpResultCode_OPRC_NoTimes) Send(welfare.OpResultCode_OPRC_NoTimes)
return pack return pack
@ -2290,28 +2290,70 @@ func (this *WelfareMgr) GetRedPacket(p *Player, id int64) *welfare.SCRedPacketDr
// 余额检查 // 余额检查
var reward int64 // 红包奖金 var reward int64 // 红包奖金
remain := RedPacketMgrInst.GetRemainReward(p.Platform, id) remain := RedPacketMgrInst.GetRemainReward(p.Platform, id)
if remain <= 0 {
// 空奖
} else {
// 保底计算
// 概率抽奖
var playerRN int32
playerLimit := this.GetConfig(p.Platform).RedPacketConfig.GetPlayerLimit()
if playerLimit > 0 {
for _, v := range p.WelfData.RedPacket {
playerRN += int32(v.RN)
}
} }
if p.WelfData != nil { // 总奖池没有了或非空奖红包数量已经达到上限
p.WelfData.RedPacket[id]++ if remain <= 0 || (playerLimit > 0 && playerRN >= playerLimit) {
RedPacketMgrInst.AddUse(p.Platform, id, reward) // 空奖
if reward > 0 { } else {
BagMgrSingleton.AddItems(&model.AddItemParam{ f := func() {
Platform: p.Platform, // 概率抽奖
SnId: p.GetSnId(), rate := 0
Change: []*model.Item{{ItemId: cfg.GetItemId(), ItemNum: reward}}, n := rand.Int63n(100)
GainWay: common.GainWayRedPacket, for _, v := range cfg.GetRedList() {
Operator: "system", rate += int(v.GetRate())
Remark: "红包奖励", if n < int64(rate) {
}) reward = v.GetNum()
break
}
}
} }
if cfg.GetMaxCount() > 0 {
// 保底计算
if data.RN >= cfg.GetLessCount() {
f()
} else {
sub := cfg.GetLessCount() - data.RN
if cfg.GetMaxCount()-data.N <= sub {
// 必中
for i := 0; i < 1000; i++ {
f()
if reward > 0 {
break
}
}
} else {
f()
}
}
} else {
f()
}
}
if remain < reward {
reward = 0
}
data.N++
RedPacketMgrInst.AddUse(p.Platform, id, reward)
if reward > 0 {
data.RN++
BagMgrSingleton.AddItems(&model.AddItemParam{
Platform: p.Platform,
SnId: p.GetSnId(),
Change: []*model.Item{{ItemId: cfg.GetItemId(), ItemNum: reward}},
GainWay: common.GainWayRedPacket,
Operator: "system",
Remark: "红包奖励",
})
} }
//todo 抽奖记录 //todo 抽奖记录
@ -2352,7 +2394,7 @@ func init() {
OnPlayerDayChangedFunc: func(p *Player, isLogin, isContinue bool) { OnPlayerDayChangedFunc: func(p *Player, isLogin, isContinue bool) {
if p.WelfData != nil && p.WelfData.RedPacket != nil { if p.WelfData != nil && p.WelfData.RedPacket != nil {
p.WelfData.RedPacket = make(map[int64]int) p.WelfData.RedPacket = make(map[int64]*model.RedPacketData)
} }
WelfareMgrSington.OnDayChanged(p) WelfareMgrSington.OnDayChanged(p)
}, },