ecs/servers/game/handler/player_lottery.go
2025-07-16 10:05:22 +08:00

102 lines
3.0 KiB
Go

package handler
import (
"ecs/proto"
"ecs/proto/pb"
"ecs/servers/game/logic"
"github.com/oylshe1314/framework/net"
"github.com/oylshe1314/framework/util"
)
func (this *PlayerHandler) LotteryDraw(player *logic.Player, msg *net.Message) {
var req = new(pb.LotteryDrawReq)
var err = msg.Read(req)
if err != nil {
this.Logger().Error("Read message failed, ", err)
_ = player.TipNotice(proto.TipMessageError)
return
}
if req.PoolId == 0 {
this.Logger().Error("Parameter error, req.PoolId == 0")
_ = player.TipNotice(proto.TipParameterError)
return
}
if req.Times == 0 {
this.Logger().Error("Parameter error, req.Times == 0")
_ = player.TipNotice(proto.TipParameterError)
return
}
var poolTable = this.tables.LotteryPool.Find(int(req.PoolId))
if poolTable == nil {
this.Logger().Error("Parameter or data error, table 'LotteryPool' was not found, req.PoolId: ", req.PoolId)
_ = player.TipNotice(proto.TipDataTablesError)
return
}
var times = util.SliceFindValue(poolTable.LotteryTimes, func(i int) bool {
return uint32(poolTable.LotteryTimes[i]) == req.Times
})
if times == 0 {
this.Logger().Errorf("Parameter error, incorrect times, req.PoolId: %d, req.Times: %d", req.PoolId, req.Times)
_ = player.TipNotice(proto.TipParameterError)
return
}
var r = util.NewRand()
var items [][2]uint32
var counter = player.GetCounterDaily(pb.CounterType_LotteryOrdinary, util.Compose2uint32(uint32(poolTable.Id), uint32(poolTable.OrdinaryBoxId)))
for range times {
var boxId = poolTable.OrdinaryBoxId
if poolTable.FinalBoxId > 0 && poolTable.FinalTimes > 0 && counter >= uint32(poolTable.FinalTimes) {
boxId = poolTable.FinalBoxId
} else {
if poolTable.AdvancedBoxId > 0 && poolTable.AdvancedTimes > 0 && counter >= uint32(poolTable.AdvancedTimes) {
boxId = poolTable.AdvancedBoxId
} else {
var factor = r.Float64() * 10000.0
if factor <= float64(poolTable.AdvancedBaseRate)+float64(poolTable.AdvancedAddRate)*float64(counter) {
boxId = poolTable.AdvancedBoxId
}
}
}
var lotteryBox = this.tables.LotteryConfig.Find(poolTable.Id, boxId)
if lotteryBox == nil {
continue
}
var weights = float64(lotteryBox.Weights)
var factor = r.Float64() * weights
for _, configTable := range lotteryBox.Tables {
weights -= float64(configTable.ItemWeight)
if factor >= weights {
items = append(items, [2]uint32{uint32(configTable.ItemId), uint32(configTable.ItemNum)})
break
}
}
if lotteryBox.BoxId == poolTable.OrdinaryBoxId {
counter += 1
} else {
counter = 0
}
}
player.SetCounter(pb.CounterType_LotteryOrdinary, util.Compose2uint32(uint32(poolTable.Id), uint32(poolTable.OrdinaryBoxId)), counter, true)
var itemList []*pb.Item
for i := range items {
player.AddItem(items[i][0], items[i][1], logic.LogTypeItemObtainByLottery)
itemList = append(itemList, &pb.Item{ItemId: items[i][0], ItemNum: items[i][1]})
}
_ = player.Send(pb.ModId_ModuleLottery, pb.MsgId_ModLotteryDraw, &pb.LotteryDrawAck{
PoolId: req.PoolId,
ItemList: itemList,
})
}