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, }) }