github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/game/internal/redpacket_task.go (about)

     1  package internal
     2  
     3  import (
     4  	"msg"
     5  	"time"
     6  
     7  	"conf"
     8  
     9  	"github.com/name5566/leaf/log"
    10  	mgo "gopkg.in/mgo.v2"
    11  	"gopkg.in/mgo.v2/bson"
    12  )
    13  
    14  var (
    15  	primaryRedpacket = []float64{0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0}
    16  	middleRedpacket  = []float64{1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0}
    17  	highRedpacket    = []float64{1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0}
    18  )
    19  
    20  type RedpacketTaskList struct {
    21  	UserID int // 用户ID
    22  	Tasks  []msg.RedPacketTask
    23  }
    24  
    25  func (user *User) sendRedpacketTask(level int) {
    26  	if user.isRobot() {
    27  		user.delRedPacketTask()
    28  		return
    29  
    30  	}
    31  	data := make([]msg.RedPacketTask, 0)
    32  	if level > 3 {
    33  		if user.baseData.NoReceiveRedpacketTask == nil {
    34  			user.baseData.NoReceiveRedpacketTask = make([]msg.RedPacketTask, 0)
    35  		}
    36  		data = append(user.baseData.NoReceiveRedpacketTask, data[:]...)
    37  		user.baseData.NoReceiveRedpacketTask = make([]msg.RedPacketTask, 0)
    38  		user.baseData.redPacketTaskList = data
    39  
    40  		user.baseData.TaskId = user.getPlayingTask()
    41  
    42  		user.WriteMsg(&msg.S2C_RedpacketTask{
    43  			Tasks:          data,
    44  			Chips:          ChangeChips[user.baseData.userData.Level],
    45  			FreeChangeTime: user.baseData.userData.FreeChangedAt,
    46  		})
    47  		user.saveRedPacketTask(data)
    48  		return
    49  	}
    50  	switch level {
    51  	case 1:
    52  		//已经完成的任务
    53  		//当前的任务
    54  		//玩家没有任务,分配第一个任务
    55  		for _, value := range conf.GetCfgPrimaryTask() {
    56  			task := msg.RedPacketTask{
    57  				ID:    value.ID,
    58  				Real:  value.Real,
    59  				Total: value.Total,
    60  				Fee:   value.Fee,
    61  				Desc:  value.Desc,
    62  				Jump:  value.Jump,
    63  				Type:  value.Type,
    64  			}
    65  			data = append(data, task)
    66  		}
    67  	case 2:
    68  		for _, value := range conf.GetCfgMiddleTask() {
    69  			task := msg.RedPacketTask{
    70  				ID:    value.ID,
    71  				Real:  value.Real,
    72  				Total: value.Total,
    73  				Fee:   value.Fee,
    74  				Desc:  value.Desc,
    75  				Jump:  value.Jump,
    76  				Type:  value.Type,
    77  			}
    78  			data = append(data, task)
    79  		}
    80  	case 3:
    81  		for _, value := range conf.GetCfgHighTask() {
    82  			task := msg.RedPacketTask{
    83  				ID:    value.ID,
    84  				Real:  value.Real,
    85  				Total: value.Total,
    86  				Fee:   value.Fee,
    87  				Desc:  value.Desc,
    88  				Jump:  value.Jump,
    89  				Type:  value.Type,
    90  			}
    91  			data = append(data, task)
    92  		}
    93  	}
    94  	/*
    95  	  查找当自己的任务类型
    96  	*/
    97  	db := mongoDB.Ref()
    98  	defer mongoDB.UnRef(db)
    99  	tasks := new(RedpacketTaskList)
   100  	err := db.DB(DB).C("userDoRedpakcetTask").Find(bson.M{"userid": user.baseData.userData.UserID}).One(tasks)
   101  	if err != nil && err != mgo.ErrNotFound {
   102  		log.Release("查看用户的红包任务报错:%v", err)
   103  		return
   104  	}
   105  	if err == mgo.ErrNotFound {
   106  		data[0].StartTime = time.Now().Unix()
   107  		data[0].State = 1
   108  		data[0].PlayTimes = 0
   109  
   110  	}
   111  	if err == nil {
   112  		if len(tasks.Tasks) == 0 {
   113  			user.baseData.userData.Level++
   114  			user.delRedPacketTask()
   115  			user.sendRedpacketTask(user.baseData.userData.Level)
   116  			return
   117  		}
   118  		data = tasks.Tasks
   119  		index := data[len(data)-1].ID
   120  		for _, value1 := range data {
   121  			if value1.ID > index {
   122  				index = value1.ID
   123  			}
   124  		}
   125  
   126  		//判断是否添加了新的红包任务,添加新的红包任务
   127  		if user.baseData.userData.Level == 1 {
   128  			for key, value := range tasks.Tasks {
   129  				for _, v := range conf.GetCfgPrimaryTask() {
   130  					if value.ID == v.ID && value.Desc != v.Desc {
   131  						tasks.Tasks[key].Desc = v.Desc
   132  						tasks.Tasks[key].Fee = v.Fee
   133  						tasks.Tasks[key].Total = v.Total
   134  						break
   135  					}
   136  				}
   137  			}
   138  			if index < conf.GetCfgPrimaryTask()[len(conf.GetCfgPrimaryTask())-1].ID {
   139  				for _, value := range conf.GetCfgPrimaryTask() {
   140  					if index < value.ID {
   141  						task := msg.RedPacketTask{
   142  							ID:    value.ID,
   143  							Real:  value.Real,
   144  							Total: value.Total,
   145  							Fee:   value.Fee,
   146  							Desc:  value.Desc,
   147  							Jump:  value.Jump,
   148  							Type:  value.Type,
   149  						}
   150  						data = append(data, task)
   151  					}
   152  				}
   153  			}
   154  		}
   155  
   156  		if user.baseData.userData.Level == 2 {
   157  			for key, value := range tasks.Tasks {
   158  				for _, v := range conf.GetCfgMiddleTask() {
   159  					if value.ID == v.ID && value.Desc != v.Desc {
   160  						tasks.Tasks[key].Desc = v.Desc
   161  						tasks.Tasks[key].Fee = v.Fee
   162  						tasks.Tasks[key].Total = v.Total
   163  						break
   164  					}
   165  				}
   166  			}
   167  			if index < conf.GetCfgMiddleTask()[len(conf.GetCfgMiddleTask())-1].ID {
   168  				for _, value := range conf.GetCfgMiddleTask() {
   169  					if index < value.ID {
   170  						task := msg.RedPacketTask{
   171  							ID:    value.ID,
   172  							Real:  value.Real,
   173  							Total: value.Total,
   174  							Fee:   value.Fee,
   175  							Desc:  value.Desc,
   176  							Jump:  value.Jump,
   177  							Type:  value.Type,
   178  						}
   179  						data = append(data, task)
   180  					}
   181  				}
   182  			}
   183  		}
   184  		if user.baseData.userData.Level == 3 {
   185  			for key, value := range tasks.Tasks {
   186  				for _, v := range conf.GetCfgHighTask() {
   187  					if value.ID == v.ID && value.Desc != v.Desc {
   188  						tasks.Tasks[key].Desc = v.Desc
   189  						tasks.Tasks[key].Fee = v.Fee
   190  						tasks.Tasks[key].Total = v.Total
   191  						break
   192  					}
   193  				}
   194  			}
   195  			if index < conf.GetCfgHighTask()[len(conf.GetCfgHighTask())-1].ID {
   196  				for _, value := range conf.GetCfgHighTask() {
   197  					if index < value.ID {
   198  						task := msg.RedPacketTask{
   199  							ID:    value.ID,
   200  							Real:  value.Real,
   201  							Total: value.Total,
   202  							Fee:   value.Fee,
   203  							Desc:  value.Desc,
   204  							Jump:  value.Jump,
   205  							Type:  value.Type,
   206  						}
   207  						data = append(data, task)
   208  					}
   209  				}
   210  			}
   211  		}
   212  	}
   213  	if user.baseData.NoReceiveRedpacketTask == nil {
   214  		user.baseData.NoReceiveRedpacketTask = make([]msg.RedPacketTask, 0)
   215  	}
   216  	data = append(user.baseData.NoReceiveRedpacketTask, data[:]...)
   217  	user.baseData.NoReceiveRedpacketTask = make([]msg.RedPacketTask, 0)
   218  	user.baseData.redPacketTaskList = data
   219  
   220  	user.baseData.TaskId = user.getPlayingTask()
   221  
   222  	user.WriteMsg(&msg.S2C_RedpacketTask{
   223  		Tasks:          data,
   224  		Chips:          ChangeChips[user.baseData.userData.Level],
   225  		FreeChangeTime: user.baseData.userData.FreeChangedAt,
   226  	})
   227  	user.saveRedPacketTask(data)
   228  }
   229  
   230  //存储当前的任务
   231  func (user *User) saveRedPacketTask(list []msg.RedPacketTask) {
   232  	if user.isRobot() {
   233  		return
   234  
   235  	}
   236  	db := mongoDB.Ref()
   237  	defer mongoDB.UnRef(db)
   238  	update := &struct {
   239  		Tasks     []msg.RedPacketTask
   240  		UpdatedAt int64
   241  	}{
   242  		Tasks:     list,
   243  		UpdatedAt: time.Now().Unix(),
   244  	}
   245  	_, err := db.DB(DB).C("userDoRedpakcetTask").Upsert(bson.M{"userid": user.baseData.userData.UserID}, bson.M{"$set": update})
   246  	if err != nil {
   247  		log.Release("update userID: %v usertasklist error: %v", user.baseData.userData.UserID, err)
   248  	}
   249  }
   250  
   251  //删除当前的任务
   252  func (user *User) delRedPacketTask() {
   253  	db := mongoDB.Ref()
   254  	defer mongoDB.UnRef(db)
   255  	err := db.DB(DB).C("userDoRedpakcetTask").Remove(bson.M{"userid": user.baseData.userData.UserID})
   256  	if err != nil {
   257  		log.Release("remove userID: %v usertasklist error: %v", user.baseData.userData.UserID, err)
   258  	}
   259  }
   260  
   261  //更新当前任务
   262  
   263  func (user *User) updateRedPacketTask(taskId int) {
   264  	if v, ok := userIDRooms[user.baseData.userData.UserID]; ok {
   265  		r := v.(*LandlordRoom)
   266  		if r.rule.RoomType != roomBaseScoreMatching && taskId != 1003 {
   267  			return
   268  		}
   269  	}
   270  	if user.isRobot() {
   271  		return
   272  
   273  	}
   274  	db := mongoDB.Ref()
   275  	defer mongoDB.UnRef(db)
   276  	if user.getPlayingTask() == taskId && user.LastTaskId == 0 {
   277  		err := db.DB(DB).C("userDoRedpakcetTask").Update(bson.M{"userid": user.baseData.userData.UserID, "tasks.id": taskId}, bson.M{"$inc": bson.M{"tasks.$.playtimes": 1}})
   278  		if err != nil {
   279  			log.Release("update userID: %v usertasklist error: %v", user.baseData.userData.UserID, err)
   280  		}
   281  		//刷新当前任务列表
   282  		lable := user.getPlayingTaskIndex()
   283  		user.baseData.redPacketTaskList[lable].PlayTimes++
   284  		//当前任务已经完成,重置下一条任务
   285  		if user.baseData.redPacketTaskList[lable].Total == user.baseData.redPacketTaskList[lable].PlayTimes {
   286  			user.baseData.redPacketTaskList[lable].State = 2 //状态变成领取
   287  			user.baseData.TaskCount++
   288  			//完成10个任务,玩家自动升级等级
   289  			if user.baseData.TaskCount >= conf.Server.Level {
   290  				user.baseData.userData.Level++
   291  				/*
   292  										删除玩家原来的红包任务,但是不可以删除未被领取的红包任务
   293  					                    当前等级完成的任务清零
   294  										保留未被领取的任务红包
   295  				*/
   296  				for _, value := range user.baseData.redPacketTaskList {
   297  					if value.State == 2 && value.Total == value.PlayTimes {
   298  						user.baseData.NoReceiveRedpacketTask = append(user.baseData.NoReceiveRedpacketTask, value)
   299  					}
   300  				}
   301  				user.delRedPacketTask()
   302  				user.baseData.TaskCount = 0
   303  				user.sendRedpacketTask(user.baseData.userData.Level)
   304  				return
   305  			}
   306  			user.LastTaskId = user.baseData.redPacketTaskList[lable].ID
   307  			if lable != len(user.baseData.redPacketTaskList)-1 {
   308  				user.baseData.redPacketTaskList[lable+1].StartTime = time.Now().Unix()
   309  				user.baseData.redPacketTaskList[lable+1].State = 1
   310  				user.baseData.redPacketTaskList[lable+1].PlayTimes = 0
   311  				user.baseData.TaskId = user.baseData.redPacketTaskList[lable+1].ID
   312  			}
   313  		}
   314  		user.saveRedPacketTask(user.baseData.redPacketTaskList)
   315  		user.WriteMsg(&msg.S2C_RedpacketTask{
   316  			Tasks:          user.baseData.redPacketTaskList,
   317  			Chips:          ChangeChips[user.baseData.userData.Level],
   318  			FreeChangeTime: user.baseData.userData.FreeChangedAt,
   319  		})
   320  	}
   321  
   322  }
   323  
   324  //更新连续完成的任务
   325  
   326  func (user *User) clearRedPacketTask(taskId int) {
   327  	if user.isRobot() {
   328  		return
   329  
   330  	}
   331  	db := mongoDB.Ref()
   332  	defer mongoDB.UnRef(db)
   333  	if user.getPlayingTask() == taskId {
   334  		_, err := db.DB(DB).C("userDoRedpakcetTask").Upsert(bson.M{"userid": user.baseData.userData.UserID}, bson.M{"$set": bson.M{"playtimes": 0}})
   335  		if err != nil {
   336  			log.Release("update userID: %v usertasklist error: %v", user.baseData.userData.UserID, err)
   337  		}
   338  		//刷新当前任务列表
   339  		user.baseData.redPacketTaskList[user.getPlayingTaskIndex()].PlayTimes = 0
   340  		user.WriteMsg(&msg.S2C_RedpacketTask{
   341  			Tasks:          user.baseData.redPacketTaskList,
   342  			Chips:          ChangeChips[user.baseData.userData.Level],
   343  			FreeChangeTime: user.baseData.userData.FreeChangedAt,
   344  		})
   345  		user.saveRedPacketTask(user.baseData.redPacketTaskList)
   346  	}
   347  }
   348  
   349  //获取玩家当前执行的任务
   350  func (user *User) getPlayingTask() int {
   351  	for _, value := range user.baseData.redPacketTaskList {
   352  		if value.State == 1 {
   353  			return value.ID
   354  		}
   355  	}
   356  	return 0
   357  }
   358  
   359  //获取当前执行任务的下标(通过下标修改玩家任务进度)
   360  func (user *User) getPlayingTaskIndex() int {
   361  	for key, value := range user.baseData.redPacketTaskList {
   362  		if value.State == 1 {
   363  			return key
   364  		}
   365  	}
   366  	return 0
   367  }
   368  
   369  //获取某个特定任务的数据
   370  func (user *User) getRedpacketTask(taskId int) msg.RedPacketTask {
   371  	for _, value := range user.baseData.redPacketTaskList {
   372  		if value.ID == taskId {
   373  			return value
   374  		}
   375  	}
   376  	return msg.RedPacketTask{}
   377  }
   378  
   379  var (
   380  	ChangeChips = map[int]int64{
   381  		1: 5000,
   382  		2: 10000,
   383  		3: 30000,
   384  	}
   385  )
   386  
   387  //更换红包任务
   388  func (user *User) changeRedPacketTask(m *msg.C2S_ChangeTask) {
   389  	//新人任务无法进行更换
   390  	if user.getRedpacketTask(user.getPlayingTask()).Type < 3 {
   391  		user.WriteMsg(&msg.S2C_ChangeTask{
   392  			Error: msg.S2C_NewPlayer_NotChange,
   393  		})
   394  		return
   395  	}
   396  	//24小时后免费更换
   397  	Free := false
   398  	if m.Free {
   399  		log.Release("*******************:%v", user.baseData.userData.FreeChangedAt)
   400  		if user.baseData.userData.FreeChangedAt > time.Now().Unix() {
   401  			user.WriteMsg(&msg.S2C_ChangeTask{
   402  				Error: msg.S2C_ChangeTask_NotReachTime,
   403  			})
   404  			return
   405  		}
   406  		Free = true
   407  		user.baseData.userData.FreeChangedAt = time.Now().Unix() + conf.Server.TaskFreeChange*60*60
   408  	}
   409  	//消耗金币更换 初 中 高 对应的金币比例是5000 10000 30000金币
   410  	if !Free {
   411  		if user.baseData.userData.Chips < ChangeChips[user.baseData.userData.Level] {
   412  			user.WriteMsg(&msg.S2C_ChangeTask{
   413  				Error: msg.S2C_ChipsLack,
   414  			})
   415  			return
   416  		}
   417  		/*
   418  			if r, ok := userIDRooms[user.baseData.userData.UserID]; ok {
   419  				Room := r.(*Room)
   420  				if Room.rule.RoomType == roomMatch {
   421  					if user.baseData.userData.Chips < ChangeChips[user.baseData.userData.Level]+int64(Room.rule) {
   422  						user.WriteMsg(&msg.S2C_ChangeTask{
   423  							Error: msg.S2C_ChipsLack,
   424  						})
   425  						return
   426  					}
   427  
   428  				}
   429  			}
   430  		*/
   431  
   432  	}
   433  	if len(user.baseData.redPacketTaskList) == 1 {
   434  		user.WriteMsg(&msg.S2C_ChangeTask{
   435  			Error: msg.S2C_NoTaskChange,
   436  		})
   437  		return
   438  	}
   439  	if !Free {
   440  		user.baseData.userData.Chips -= ChangeChips[user.baseData.userData.Level]
   441  		user.WriteMsg(&msg.S2C_UpdateUserChips{
   442  			Chips: user.baseData.userData.Chips,
   443  		})
   444  	}
   445  	tasks := make([]msg.RedPacketTask, 0)
   446  	label := 0
   447  	for key, value := range user.baseData.redPacketTaskList {
   448  		if value.ID == user.getPlayingTask() {
   449  
   450  			if key == len(user.baseData.redPacketTaskList)-1 {
   451  				user.WriteMsg(&msg.S2C_ChangeTask{
   452  					Error: msg.S2C_NoTaskChange,
   453  				})
   454  				return
   455  			}
   456  			user.baseData.redPacketTaskList[key].StartTime = 0
   457  			user.baseData.redPacketTaskList[key].State = 0
   458  			user.baseData.redPacketTaskList[key].PlayTimes = 0
   459  			label = key
   460  			break
   461  		}
   462  	}
   463  	//先整理领取状态的任务
   464  	for _, value := range user.baseData.redPacketTaskList {
   465  		if value.State == 2 {
   466  			tasks = append(tasks, value)
   467  		}
   468  	}
   469  	//整理更换后排序的任务
   470  	user.baseData.redPacketTaskList[label+1].StartTime = time.Now().Unix()
   471  	user.baseData.redPacketTaskList[label+1].State = 1
   472  	tasks = append(tasks, user.baseData.redPacketTaskList[label+1])
   473  	for key, value := range user.baseData.redPacketTaskList {
   474  		if key == label {
   475  			continue
   476  		}
   477  		if value.State == 0 {
   478  			tasks = append(tasks, value)
   479  		}
   480  	}
   481  	tasks = append(tasks, user.baseData.redPacketTaskList[label])
   482  	user.baseData.TaskId = user.baseData.redPacketTaskList[label+1].ID
   483  	user.baseData.redPacketTaskList = tasks
   484  	user.WriteMsg(&msg.S2C_ChangeTask{})
   485  	user.WriteMsg(&msg.S2C_RedpacketTask{
   486  		Tasks:          user.baseData.redPacketTaskList,
   487  		Chips:          ChangeChips[user.baseData.userData.Level],
   488  		FreeChangeTime: user.baseData.userData.FreeChangedAt,
   489  	})
   490  	user.saveRedPacketTask(user.baseData.redPacketTaskList)
   491  }
   492  
   493  //红包领取记录
   494  type TasksRecord struct {
   495  	UserID int // 用户ID
   496  	Tasks  []msg.RedpacketTaskRecord
   497  }
   498  
   499  func (user *User) redpacketTaskRecord() {
   500  	if user.isRobot() {
   501  		return
   502  
   503  	}
   504  	db := mongoDB.Ref()
   505  	defer mongoDB.UnRef(db)
   506  	record := new(TasksRecord)
   507  	err := db.DB(DB).C("redpacketTaskRecord").Find(bson.M{"_id": user.baseData.userData.UserID}).One(&record)
   508  	if err != nil && err != mgo.ErrNotFound {
   509  		log.Release("查看用户的红包任务记录报错:%v", err)
   510  		return
   511  	}
   512  	if err == mgo.ErrNotFound {
   513  		record.Tasks = make([]msg.RedpacketTaskRecord, 0)
   514  	}
   515  	if len(record.Tasks) > 10 {
   516  		record.Tasks = record.Tasks[:10]
   517  	}
   518  	user.WriteMsg(&msg.S2C_RedPacketTaskRecord{
   519  		TaskRecords: record.Tasks,
   520  	})
   521  	user.countRedpacketTaskRecord()
   522  }
   523  
   524  func (user *User) saveRedPacketTaskRecord(r *msg.RedpacketTaskRecord) {
   525  	selector := user.baseData.userData.UserID
   526  	update := bson.M{"$push": bson.M{"tasks": bson.M{"$each": []msg.RedpacketTaskRecord{*r}, "$sort": bson.M{"createdat": -1}}}}
   527  	db := mongoDB.Ref()
   528  	defer mongoDB.UnRef(db)
   529  	_, err := db.DB(DB).C("redpacketTaskRecord").UpsertId(selector, update)
   530  	if err != nil && err != mgo.ErrNotFound {
   531  		log.Release("******************:%v", err)
   532  	}
   533  }
   534  
   535  //获取用户当前等级的
   536  func (user *User) countRedpacketTaskRecord() {
   537  	db := mongoDB.Ref()
   538  	defer mongoDB.UnRef(db)
   539  	record := new(TasksRecord)
   540  	err := db.DB(DB).C("redpacketTaskRecord").Find(bson.M{"_id": user.baseData.userData.UserID}).One(&record)
   541  	if err != nil && err != mgo.ErrNotFound {
   542  		return
   543  	}
   544  	if err == mgo.ErrNotFound {
   545  		record.Tasks = make([]msg.RedpacketTaskRecord, 0)
   546  	}
   547  	//已领取的任务红包
   548  	for _, value := range record.Tasks {
   549  
   550  		if value.ID/1000 == user.baseData.userData.Level && value.Type > 2 {
   551  			user.baseData.TaskCount++
   552  		}
   553  	}
   554  	//任务已经完成,还没有领取的红包任务
   555  	for _, value := range user.baseData.redPacketTaskList {
   556  
   557  		if user.baseData.userData.Level == value.ID/1000 && value.State == 2 && value.Type > 2 {
   558  			user.baseData.TaskCount++
   559  		}
   560  	}
   561  	log.Release("**************************完成的当前级别红包任务次数:%v", user.baseData.TaskCount)
   562  }