diff --git a/dbproxy/svc/l_redpacket.go b/dbproxy/svc/l_redpacket.go index b94c6ef..6ce45a1 100644 --- a/dbproxy/svc/l_redpacket.go +++ b/dbproxy/svc/l_redpacket.go @@ -27,7 +27,7 @@ func (r *RedPacketService) GetAll(plt *string, res *[]*model.RedPacket) error { list, err := d.GetAll() if err != nil { - logger.Logger.Errorf("GetAll error: %v", err) + logger.Logger.Errorf("RedPacketService.GetAll error: %v", err) return err } @@ -36,17 +36,19 @@ func (r *RedPacketService) GetAll(plt *string, res *[]*model.RedPacket) error { return nil } -func (r *RedPacketService) UpdateAll(plt *string, list []*model.RedPacket) error { - d, err := mongox.GetDao(*plt, dao.NewRedPacket) +func (r *RedPacketService) UpdateAll(req *model.UpdateRedPacketAllReq, res *bool) error { + d, err := mongox.GetDao(req.Plt, dao.NewRedPacket) if err != nil { return err } - err = d.UpdateAll(list) + err = d.UpdateAll(req.List) if err != nil { - logger.Logger.Errorf("UpdateAll error: %v", err) + logger.Logger.Errorf("RedPacketService.UpdateAll error: %v", err) return err } + *res = true + return nil } diff --git a/model/player.go b/model/player.go index dceed8d..6eb5c6d 100644 --- a/model/player.go +++ b/model/player.go @@ -548,6 +548,11 @@ type DiamondBankData struct { TakeRecord map[int32]int64 // 每次领取记录 } +type RedPacketData struct { + N int64 // 领取次数 + RN int64 // 非空奖次数 +} + type WelfareData struct { ReliefFundTimes int32 //救济金领取次数 Sign7 *NewSignData //七日签到 @@ -564,7 +569,7 @@ type WelfareData struct { DiamondBank *DiamondBankData // 钻石储存罐 PermitAward map[int32]int64 // 赛季通行证奖励领取时间 PermitExchange map[int32][]int64 // 赛季通行证兑换次数, 多次的兑换时间 - RedPacket map[int64]int // 红包活动 活动id:领取次数 + RedPacket map[int64]*RedPacketData // 红包活动 活动id:领取次数 } func NewWelfareData() *WelfareData { @@ -581,7 +586,7 @@ func NewWelfareData() *WelfareData { }, PermitAward: make(map[int32]int64), PermitExchange: make(map[int32][]int64), - RedPacket: make(map[int64]int), + RedPacket: make(map[int64]*RedPacketData), } } diff --git a/model/redpacket.go b/model/redpacket.go index 9dc3645..6c49c65 100644 --- a/model/redpacket.go +++ b/model/redpacket.go @@ -30,6 +30,8 @@ func GetRedPacketAll(plt string) (res []*RedPacket, err error) { return nil, errors.New("rpc client is nil") } + res = make([]*RedPacket, 0) + err = rpcCli.CallWithTimeout("RedPacketService.GetAll", &plt, &res, time.Second*30) if err != nil { logger.Logger.Errorf("GetRedPacketAll error: %v", err) @@ -39,13 +41,23 @@ func GetRedPacketAll(plt string) (res []*RedPacket, err error) { return res, nil } +type UpdateRedPacketAllReq struct { + Plt string + List []*RedPacket +} + func UpdateRedPacketAll(plt string, list []*RedPacket) error { if rpcCli == nil { logger.Logger.Error("model.UpdateRedPacketAll rpcCli == 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 { logger.Logger.Errorf("UpdateRedPacketAll error: %v", err) return err diff --git a/worldsrv/activity_redpacket.go b/worldsrv/activity_redpacket.go index d697b57..7394d17 100644 --- a/worldsrv/activity_redpacket.go +++ b/worldsrv/activity_redpacket.go @@ -133,36 +133,21 @@ func (m *RedPacketMgr) GetRemainTimesByConfig(p *Player, cfg *webapiproto.RedPac return 0, 0 } - var limit int32 - 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 { + if cfg.GetMaxCount() <= 0 { return -1, -1 } + n := 0 if p.WelfData != nil && p.WelfData.RedPacket != nil { 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 { remainCount = 0 } - return int64(limit), remainCount + return cfg.GetMaxCount(), remainCount } // AddUse 添加使用红包 diff --git a/worldsrv/welfmgr.go b/worldsrv/welfmgr.go index 7f439e3..386ebf7 100644 --- a/worldsrv/welfmgr.go +++ b/worldsrv/welfmgr.go @@ -3,6 +3,7 @@ package main import ( "fmt" "math" + "math/rand" "slices" "time" @@ -2254,7 +2255,15 @@ func (this *WelfareMgr) GetRedPacket(p *Player, id int64) *welfare.SCRedPacketDr 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 for _, v := range this.GetConfig(p.Platform).RedPacketConfig.GetList() { if v.GetId() == id { @@ -2271,17 +2280,8 @@ func (this *WelfareMgr) GetRedPacket(p *Player, id int64) *welfare.SCRedPacketDr } // 次数限制 - n := 0 - if p.WelfData != nil && p.WelfData.RedPacket != nil { - if _, exist := p.WelfData.RedPacket[id]; exist { - n = p.WelfData.RedPacket[id] - } - } + n := int(data.N) - if playerLimit > 0 && n >= int(playerLimit) { - Send(welfare.OpResultCode_OPRC_NoTimes) - return pack - } if cfg.GetMaxCount() > 0 && cfg.GetMaxCount() <= int64(n) { Send(welfare.OpResultCode_OPRC_NoTimes) return pack @@ -2290,28 +2290,70 @@ func (this *WelfareMgr) GetRedPacket(p *Player, id int64) *welfare.SCRedPacketDr // 余额检查 var reward int64 // 红包奖金 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]++ - RedPacketMgrInst.AddUse(p.Platform, id, reward) - if reward > 0 { - BagMgrSingleton.AddItems(&model.AddItemParam{ - Platform: p.Platform, - SnId: p.GetSnId(), - Change: []*model.Item{{ItemId: cfg.GetItemId(), ItemNum: reward}}, - GainWay: common.GainWayRedPacket, - Operator: "system", - Remark: "红包奖励", - }) + // 总奖池没有了或非空奖红包数量已经达到上限 + if remain <= 0 || (playerLimit > 0 && playerRN >= playerLimit) { + // 空奖 + } else { + f := func() { + // 概率抽奖 + rate := 0 + n := rand.Int63n(100) + for _, v := range cfg.GetRedList() { + rate += int(v.GetRate()) + 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 抽奖记录 @@ -2352,7 +2394,7 @@ func init() { OnPlayerDayChangedFunc: func(p *Player, isLogin, isContinue bool) { 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) },