add 红包活动
This commit is contained in:
parent
7876fa34f9
commit
2b8ef577f5
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 添加使用红包
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue