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 }