102 lines
3.0 KiB
Go
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,
|
|
})
|
|
}
|