| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- package user
- import (
- "bet24.com/log"
- "bet24.com/servers/common"
- "bet24.com/servers/micros/audioroom/handler/config"
- pb "bet24.com/servers/micros/audioroom/proto"
- "bet24.com/servers/micros/audioroom/transaction/database"
- "math"
- "sort"
- )
- // 任务列表
- func (this *UserRoom) GetTaskList(roomId int) []*pb.UserRoomTask {
- // 判断是否是成员
- if this.UserRoomInfo(roomId) == nil {
- return nil
- }
- list, ok := this.GetUserTask(roomId)
- if ok {
- for k := range list {
- if !common.IsSameDay(list[k].TimeStamp, common.GetTimeStamp()) {
- list[k].Schedule = 0
- list[k].CurrNum = 0
- list[k].Status = 0
- }
- }
- return list
- }
- // TODO: 从数据库获取
- list = database.GetUserTaskList(this.userId, roomId)
- // 初始化任务
- for _, v := range config.Mgr.GetSysTask(false) {
- isExist := false
- for _, t := range list {
- if v.Id != t.TaskId {
- continue
- }
- isExist = true
- break
- }
- if isExist {
- continue
- }
- info := &pb.UserRoomTask{
- RoomTask: pb.RoomTask{
- TaskId: v.Id,
- Schedule: 0,
- CurrNum: 0,
- TimeStamp: common.GetTimeStamp(),
- },
- Status: 0,
- }
- list = append(list, info)
- // TODO:更新数据库
- go database.UpdateUserTask(this.userId, roomId, info)
- }
- sort.SliceStable(list, func(i, j int) bool {
- return list[i].TaskId < list[j].TaskId
- })
- this.SetUserTask(roomId, list)
- return list
- }
- // 获取用户任务
- func (this *UserRoom) GetUserTask(roomId int) ([]*pb.UserRoomTask, bool) {
- this.lock.RLock()
- defer this.lock.RUnlock()
- list, ok := this.taskList[roomId]
- return list, ok
- }
- // 设置用户任务
- func (this *UserRoom) SetUserTask(roomId int, list []*pb.UserRoomTask) {
- this.lock.Lock()
- defer this.lock.Unlock()
- this.taskList[roomId] = list
- }
- // 触发房间任务
- func (this *UserRoom) DoTaskAction(roomId, action, num, ext int) {
- //log.Debug("user_roomtask.doTaskAction userId=%d roomId=%d action=%d num=%d ext=%d",
- // this.userId, roomId, action, num, ext)
- r := this.UserRoomInfo(roomId)
- if r == nil {
- log.Release("user_roomtask.doTaskAction userId=%d roomId=%d action=%d num=%d is nil",
- this.userId, roomId, action, num)
- return
- }
- // 遍历房间任务
- for _, v := range this.GetTaskList(roomId) {
- // 获取任务配置
- cfg := config.Mgr.GetTaskConfig(v.TaskId, false)
- if cfg == nil {
- log.Debug("user_roomtask.doTaskAction userId=%d roomId=%d taskId %d not found", this.userId, roomId, v.TaskId)
- continue
- }
- // 判断触发动作
- if cfg.Action != action {
- continue
- }
- // 判断是否过期
- if !common.IsSameDay(v.TimeStamp, common.GetTimeStamp()) {
- v.Schedule = 0
- v.CurrNum = 0
- v.Status = 0
- }
- // 判断任务是否完成
- if cfg.Target > 0 && v.Schedule >= cfg.Target {
- continue
- }
- // 当前数值
- v.CurrNum += num
- if len(cfg.Exps) <= 0 || ext > len(cfg.Exps) {
- log.Debug("user_roomtask.doTaskAction userId=%d roomId=%d taskId exps=%+v is invalid", this.userId, roomId, v.TaskId, cfg.Exps)
- return
- }
- // 计算经验值
- exps := int(math.Floor(float64(v.CurrNum/cfg.NeedNum)*cfg.Exps[ext] + 0.5))
- if cfg.Target > 0 && v.Schedule+exps > cfg.Target {
- exps = cfg.Target - v.Schedule
- }
- // 经验值不够,累计数值积累
- if exps <= 0 {
- // TODO:更新数据库
- go database.UpdateUserTask(this.userId, r.RoomId, v)
- continue
- }
- // 扣掉升级的所需数值
- v.CurrNum = v.CurrNum % cfg.NeedNum
- // 任务进度
- v.Schedule += exps
- // 更新时间戳
- v.TimeStamp = common.GetTimeStamp()
- // 达到统计阈值
- if cfg.StatValue > 0 && v.Schedule >= cfg.StatValue {
- v.Status = 1
- }
- // 添加房间经验
- r.Exps += exps
- r.DayExps += exps
- // 判断是否升级
- if newLevel := config.Mgr.GetLevel(r.Exps, false); newLevel > r.Level {
- r.Level = newLevel
- // 发送通知
- go this.levelNotify(r.RoomId)
- }
- // 同步房间成员等级经验
- go this.roomMgr.UpdateMemberLevel(this.userId, r.RoomId, r.Level, r.Exps)
- // TODO:更新数据库
- go database.UpdateUserTask(this.userId, r.RoomId, v)
- go database.UpdateUserExps(this.userId, r.RoomId, r.Level, r.Exps)
- }
- return
- }
- // 清理任务
- func (this *UserRoom) DelTask(roomId int) {
- this.lock.Lock()
- defer this.lock.Unlock()
- delete(this.taskList, roomId)
- }
|