role_task.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965
  1. package model
  2. import (
  3. "rocommon/util"
  4. "roserver/baseserver/model"
  5. "roserver/baseserver/set"
  6. "roserver/serverproto"
  7. "strings"
  8. )
  9. func (this *Role) GetTaskReward(taskId uint32) {
  10. if this.roleTask != nil {
  11. ret := this.roleTask.GetTaskReward(taskId)
  12. if ret != serverproto.ErrorCode_ERROR_OK {
  13. this.ReplayGate(&serverproto.SCGetTaskRewardAck{Error: int32(ret)}, true)
  14. }
  15. }
  16. }
  17. func (this *Role) GetTaskScoreReward(rewardType, rewardIdx int32) {
  18. if this.roleTask != nil {
  19. ret := this.roleTask.GetTaskScoreReward(uint32(rewardType), uint32(rewardIdx))
  20. if ret != serverproto.ErrorCode_ERROR_OK {
  21. this.ReplayGate(&serverproto.SCGetTaskScoreRewardAck{Error: int32(ret)}, true)
  22. }
  23. }
  24. }
  25. const (
  26. TASK_REWARD_STATE_NONE = 0 //未完成
  27. TASK_REWARD_STATE_COMPLETED = 1 //任务完成未领取奖励
  28. TASK_REWARD_STATE_REWARD = 2 //已经领取奖励
  29. TASK_CONDITION_NONE = 4
  30. TASK_CONDITION_CHANGE = 5
  31. TASK_CONDITION_OK = 6
  32. )
  33. type ConditionInfo struct {
  34. HeroId int32 //伙伴ID
  35. TaskId uint32 //条件列表ID
  36. CondInfo *serverproto.TaskData
  37. }
  38. type RoleTask struct {
  39. SaveObject
  40. loadTaskData *serverproto.RoleTask
  41. jobCondition []*serverproto.ChangeJob //只针对主角//伙伴转职出案子再做
  42. roleHeadCond serverproto.RoleHeadCond
  43. taskTypeList map[int32]set.Interface //根据枚举类型对任务做区分[serverproto.TaskType, taslidlist]
  44. dailyTaskList map[uint32]*serverproto.TaskData
  45. weekTaskList map[uint32]*serverproto.TaskData
  46. mainTaskList map[uint32]*serverproto.TaskData
  47. dailyTaskScore serverproto.KeyValueType //活跃度/活跃度对应的奖励,按位处理(完成任务累加的积分)
  48. weekTaskScore serverproto.KeyValueType
  49. saveTaskDataList []*serverproto.TaskData
  50. recTypeCnt map[int32]*serverproto.KeyValueType
  51. //任务通用累计计数
  52. totalAddZeny uint64
  53. }
  54. func newRoleTask(r *Role) *RoleTask {
  55. roleTask := &RoleTask{
  56. SaveObject: SaveObject{
  57. role: r,
  58. },
  59. loadTaskData: &serverproto.RoleTask{},
  60. dailyTaskList: map[uint32]*serverproto.TaskData{},
  61. weekTaskList: map[uint32]*serverproto.TaskData{},
  62. mainTaskList: map[uint32]*serverproto.TaskData{},
  63. taskTypeList: map[int32]set.Interface{},
  64. recTypeCnt: map[int32]*serverproto.KeyValueType{},
  65. roleHeadCond: serverproto.RoleHeadCond{},
  66. }
  67. return roleTask
  68. }
  69. func (this *RoleTask) Load(msg interface{}) bool {
  70. dbRole := msg.(*serverproto.Role)
  71. if dbRole != nil && dbRole.RoleBase != nil {
  72. //daily/week/main task
  73. if dbRole.RoleTask != nil {
  74. this.loadTaskData = dbRole.RoleTask
  75. if dbRole.RoleTask.DailyTaskScore != nil {
  76. this.dailyTaskScore = *dbRole.RoleTask.DailyTaskScore
  77. }
  78. if dbRole.RoleTask.WeekTaskScore != nil {
  79. this.weekTaskScore = *dbRole.RoleTask.WeekTaskScore
  80. }
  81. for idx := range dbRole.RoleTask.TaskList {
  82. taskInfo := dbRole.RoleTask.TaskList[idx]
  83. _, ok := model.ConvertTaskList[taskInfo.TaskId]
  84. if !ok {
  85. continue
  86. }
  87. if taskInfo.TaskType == model.TASK_TYPE_DAILY {
  88. this.dailyTaskList[taskInfo.TaskId] = taskInfo
  89. } else if taskInfo.TaskType == model.TASK_TYPE_WEEK {
  90. this.weekTaskList[taskInfo.TaskId] = taskInfo
  91. } else if taskInfo.TaskType == model.TASK_TYPE_MAIN {
  92. this.mainTaskList[taskInfo.TaskId] = taskInfo
  93. }
  94. }
  95. this.initTaskDataFromConfig()
  96. for _, valueType := range dbRole.RoleTask.TypeRecCount {
  97. this.recTypeCnt[valueType.Key] = valueType
  98. }
  99. }
  100. if len(dbRole.RoleTask.Condition) <= 0 { //账号初始化主角
  101. this.role.roleTask.GetChangeJobTask(this.role.GetRoleBase().RoleData().HeroData.Id, 0, false)
  102. }
  103. if len(this.jobCondition) <= 0 {
  104. this.jobCondition = dbRole.RoleTask.Condition
  105. }
  106. //this.role.roleTask.InitJobTask()
  107. dbRole.RoleTask.Condition = this.jobCondition
  108. //}
  109. //if len(dbRole.RoleTask.Condition) > 0 {
  110. // this.jobCondition = dbRole.RoleTask.Condition
  111. //}
  112. if dbRole.RoleTask.HeadCond != nil {
  113. this.roleHeadCond = *dbRole.RoleTask.HeadCond
  114. }
  115. this.totalAddZeny = dbRole.RoleTask.TotalAddZeny
  116. }
  117. return true
  118. }
  119. func (this *RoleTask) OnlineProcess() {
  120. this.role.roleTask.InitJobTask()
  121. }
  122. func (this *RoleTask) CopyData() *serverproto.RoleTask {
  123. //this.loadTaskData.DailyTaskScore = &this.dailyTaskScore
  124. //this.loadTaskData.WeekTaskScore = &this.weekTaskScore
  125. //this.loadTaskData.Condition = this.jobCondition
  126. //this.loadTaskData.HeadCond = &this.roleHeadCond
  127. //
  128. //this.loadTaskData.Latest5HourTime = util.GetLatest5Hour()
  129. //this.loadTaskData.LatestWeek5HourTime = util.GetLatestWeek5Hour()
  130. //util.DebugF("Online Pack RoleTask =%v", this.loadTaskData)
  131. //return this.loadTaskData
  132. tmpRoleTask := &serverproto.RoleTask{
  133. DailyTaskScore: &this.dailyTaskScore,
  134. WeekTaskScore: &this.weekTaskScore,
  135. Condition: this.jobCondition,
  136. HeadCond: &this.roleHeadCond,
  137. Latest5HourTime: util.GetLatest5Hour(),
  138. LatestWeek5HourTime: util.GetLatestWeek5Hour(0),
  139. }
  140. for _, val := range this.dailyTaskList {
  141. tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
  142. }
  143. for _, val := range this.weekTaskList {
  144. tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
  145. }
  146. for _, val := range this.mainTaskList {
  147. tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
  148. }
  149. for _, val := range this.recTypeCnt {
  150. tmpRoleTask.TypeRecCount = append(tmpRoleTask.TypeRecCount, val)
  151. }
  152. return tmpRoleTask
  153. }
  154. func (this *RoleTask) Save() {
  155. this.SetDirty(false)
  156. saveMsg := &serverproto.SSTaskDataSaveReq{
  157. Task: &serverproto.RoleTask{
  158. DailyTaskScore: &this.dailyTaskScore,
  159. WeekTaskScore: &this.weekTaskScore,
  160. },
  161. }
  162. saveMsg.Task.Condition = this.jobCondition
  163. saveMsg.Task.HeadCond = &this.roleHeadCond
  164. saveMsg.Task.TaskList = append(this.saveTaskDataList)
  165. this.saveTaskDataList = this.saveTaskDataList[:0]
  166. saveMsg.Task.TotalAddZeny = this.totalAddZeny
  167. for _, val := range this.recTypeCnt {
  168. saveMsg.Task.TypeRecCount = append(saveMsg.Task.TypeRecCount, val)
  169. }
  170. this.role.SendDb(saveMsg)
  171. }
  172. // 记录任务事件计数, 触发该记录事件前先调用该函数进行计数累加
  173. func (this *RoleTask) AddTypeCnt(recType serverproto.TaskType, cnt int32) {
  174. rec := int32(recType)
  175. val, ok := this.recTypeCnt[rec]
  176. if !ok {
  177. val = &serverproto.KeyValueType{Key: rec}
  178. }
  179. val.Value += cnt
  180. this.recTypeCnt[rec] = val
  181. this.SetDirty(true)
  182. }
  183. // 记录任务事件计数, 触发该记录事件前先调用该函数进行计数累加
  184. func (this *RoleTask) SetTypeCnt(recType serverproto.TaskType, cnt int32) {
  185. rec := int32(recType)
  186. val, ok := this.recTypeCnt[rec]
  187. if !ok {
  188. val = &serverproto.KeyValueType{Key: rec}
  189. }
  190. val.Value = cnt
  191. this.recTypeCnt[rec] = val
  192. this.SetDirty(true)
  193. }
  194. func (this *RoleTask) GetTypeCnt(recType int32) int32 {
  195. val, ok := this.recTypeCnt[recType]
  196. if !ok {
  197. return 0
  198. }
  199. return val.Value
  200. }
  201. func (this *RoleTask) DailyReset(notify bool, oldDailyResetTimeStamp uint64) {
  202. ntfMsg := &serverproto.SCTaskChangeNtf{
  203. DailyTaskScore: &this.dailyTaskScore,
  204. WeekTaskScore: &this.weekTaskScore,
  205. Latest5HourTime: util.GetLatest5Hour(),
  206. LatestWeek5HourTime: util.GetLatestWeek5Hour(0),
  207. }
  208. this.resetDailyTask(ntfMsg)
  209. //每日重置时判断是否是每周重置
  210. if util.IsInSameWeek(oldDailyResetTimeStamp, util.GetTimeMilliseconds()) {
  211. this.resetWeekTask(ntfMsg)
  212. }
  213. this.AddTypeCnt(serverproto.TaskType_Eve_Login_Day, 1)
  214. TaskMagCheck(this.role, serverproto.TaskType_Eve_Login_Day, 1)
  215. this.SetDirty(true)
  216. if notify {
  217. this.role.ReplayGate(ntfMsg, true)
  218. }
  219. }
  220. func (this *RoleTask) resetDailyTask(ntfMsg *serverproto.SCTaskChangeNtf) {
  221. this.dailyTaskScore.Key = 0
  222. this.dailyTaskScore.Value = 0
  223. for _, val := range this.dailyTaskList {
  224. if val.State != TASK_REWARD_STATE_NONE || len(val.Progress) > 0 {
  225. val.State = TASK_REWARD_STATE_NONE
  226. val.Progress = val.Progress[:0]
  227. this.saveTaskDataList = append(this.saveTaskDataList, val)
  228. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, val)
  229. }
  230. }
  231. }
  232. func (this *RoleTask) resetWeekTask(ntfMsg *serverproto.SCTaskChangeNtf) {
  233. this.weekTaskScore.Key = 0
  234. this.weekTaskScore.Value = 0
  235. for _, val := range this.weekTaskList {
  236. if val.State != TASK_REWARD_STATE_NONE || len(val.Progress) > 0 {
  237. val.State = TASK_REWARD_STATE_NONE
  238. val.Progress = val.Progress[:0]
  239. this.saveTaskDataList = append(this.saveTaskDataList, val)
  240. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, val)
  241. }
  242. }
  243. }
  244. func (this *RoleTask) initTaskDataFromConfig() {
  245. var tmpOriginalMainTask = map[uint32]struct{}{} //originalTaskId
  246. for _, mainTaskData := range this.mainTaskList {
  247. tmpId := model.ConvertMainTaskOriginalList[mainTaskData.TaskId]
  248. tmpOriginalMainTask[tmpId] = struct{}{}
  249. }
  250. //daily/week/main 添加新任务后,重新登陆即可自动接取
  251. for _, val := range model.ConvertAddTaskList {
  252. switch val.TaskType {
  253. case model.TASK_TYPE_DAILY:
  254. if _, ok := this.dailyTaskList[val.TaskId]; !ok {
  255. taskInfo := &serverproto.TaskData{
  256. TaskId: val.TaskId,
  257. State: TASK_REWARD_STATE_NONE,
  258. //BeginTime: util.GetTimeMilliseconds(),
  259. TaskType: val.TaskType,
  260. }
  261. this.dailyTaskList[val.TaskId] = taskInfo
  262. this.loadTaskData.TaskList = append(this.loadTaskData.TaskList, taskInfo)
  263. }
  264. case model.TASK_TYPE_WEEK:
  265. if _, ok := this.weekTaskList[val.TaskId]; !ok {
  266. taskInfo := &serverproto.TaskData{
  267. TaskId: val.TaskId,
  268. State: TASK_REWARD_STATE_NONE,
  269. //BeginTime: util.GetTimeMilliseconds(),
  270. TaskType: val.TaskType,
  271. }
  272. this.weekTaskList[val.TaskId] = taskInfo
  273. this.loadTaskData.TaskList = append(this.loadTaskData.TaskList, taskInfo)
  274. }
  275. case model.TASK_TYPE_MAIN:
  276. if _, ok := tmpOriginalMainTask[val.TaskId]; !ok {
  277. taskInfo := &serverproto.TaskData{
  278. TaskId: val.TaskId,
  279. State: TASK_REWARD_STATE_NONE,
  280. //BeginTime: util.GetTimeMilliseconds(),
  281. TaskType: val.TaskType,
  282. }
  283. this.mainTaskList[val.TaskId] = taskInfo
  284. this.loadTaskData.TaskList = append(this.loadTaskData.TaskList, taskInfo)
  285. }
  286. }
  287. }
  288. }
  289. func (this *RoleTask) getTaskData(taskId uint32) *serverproto.TaskData {
  290. if taskInfo, ok := this.dailyTaskList[taskId]; ok {
  291. return taskInfo
  292. }
  293. if taskInfo, ok := this.weekTaskList[taskId]; ok {
  294. return taskInfo
  295. }
  296. if taskInfo, ok := this.mainTaskList[taskId]; ok {
  297. return taskInfo
  298. }
  299. return nil
  300. }
  301. func (this *RoleTask) initTaskTypeList() {
  302. if len(this.taskTypeList) <= 0 {
  303. //dailyTaskList
  304. for _, taskInfo := range this.dailyTaskList {
  305. convertData, ok := model.ConvertTaskList[taskInfo.TaskId]
  306. if !ok {
  307. continue
  308. }
  309. for key := range convertData.Condition {
  310. if _, ok := this.taskTypeList[key]; !ok {
  311. this.taskTypeList[key] = set.New(set.NonThreadSafe)
  312. }
  313. this.taskTypeList[key].Add(taskInfo.TaskId)
  314. }
  315. }
  316. //weekTaskList
  317. for _, taskInfo := range this.weekTaskList {
  318. convertData, ok := model.ConvertTaskList[taskInfo.TaskId]
  319. if !ok {
  320. continue
  321. }
  322. for key := range convertData.Condition {
  323. if _, ok := this.taskTypeList[key]; !ok {
  324. this.taskTypeList[key] = set.New(set.NonThreadSafe)
  325. }
  326. this.taskTypeList[key].Add(taskInfo.TaskId)
  327. }
  328. }
  329. //mainTaskList
  330. //主线已经完成的不再完成
  331. for _, taskInfo := range this.mainTaskList {
  332. if taskInfo.State == TASK_REWARD_STATE_COMPLETED {
  333. continue
  334. }
  335. convertData, ok := model.ConvertTaskList[taskInfo.TaskId]
  336. if !ok {
  337. continue
  338. }
  339. for key := range convertData.Condition {
  340. if _, ok := this.taskTypeList[key]; !ok {
  341. this.taskTypeList[key] = set.New(set.NonThreadSafe)
  342. }
  343. this.taskTypeList[key].Add(taskInfo.TaskId)
  344. }
  345. }
  346. }
  347. }
  348. func (this *RoleTask) TaskCheck(taskType serverproto.TaskType, count int32) {
  349. this.initTaskTypeList()
  350. typeList, ok := this.taskTypeList[int32(taskType)]
  351. if !ok || typeList.Size() <= 0 {
  352. return
  353. }
  354. ntfMsg := &serverproto.SCTaskChangeNtf{
  355. DailyTaskScore: &this.dailyTaskScore,
  356. WeekTaskScore: &this.weekTaskScore,
  357. }
  358. for _, val := range this.taskTypeList[int32(taskType)].List() {
  359. tmpTaskId := val.(uint32)
  360. if taskInfo := this.getTaskData(tmpTaskId); taskInfo != nil {
  361. convertTaskData, ok := model.ConvertTaskList[taskInfo.TaskId]
  362. if !ok {
  363. util.ErrorF("uid=%v TaskCheck TaskCfgData not exist", this.role.GetUUid(), taskInfo)
  364. continue
  365. }
  366. if taskInfo.State != TASK_REWARD_STATE_COMPLETED &&
  367. taskInfo.State != TASK_REWARD_STATE_REWARD {
  368. util.InfoF("uid=%v TaskCheck before taskInfo=%v", this.role.GetUUid(), taskInfo)
  369. }
  370. //多条件处理
  371. ret := TaskConditionCheck(this.role, taskInfo, taskType, convertTaskData.Condition, count, false)
  372. if ret {
  373. this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
  374. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
  375. this.SetDirty(true)
  376. }
  377. }
  378. }
  379. if len(ntfMsg.TaskChangeList) > 0 {
  380. this.role.ReplayGate(ntfMsg, true)
  381. util.InfoF("uid=%v TaskCheck changelist=%v", this.role.GetUUid(), ntfMsg.TaskChangeList)
  382. }
  383. }
  384. func (this *RoleTask) jobConditionChangeNtf(changedId []int32) {
  385. ntfMsg := &serverproto.SCHeroConditinDataNtf{}
  386. for _, heroId := range changedId {
  387. for index, data := range this.jobCondition {
  388. if data.HeroId == heroId {
  389. ntfMsg.Condition = append(ntfMsg.Condition, this.jobCondition[index])
  390. }
  391. }
  392. }
  393. this.role.ReplayGate(ntfMsg, true)
  394. this.role.GetRoleBase().SetDirty(true)
  395. util.DebugF("uid=%v jobcondition=%v", this.role.GetUUid(), this.jobCondition)
  396. }
  397. func (this *RoleTask) checkTaskInfo(taskInfo *serverproto.TaskData) bool {
  398. convertData, ok := model.ConvertTaskList[taskInfo.TaskId]
  399. if !ok {
  400. return false
  401. }
  402. return TaskConditionCheck(this.role, taskInfo, 0, convertData.Condition, 0, true)
  403. }
  404. func (this *RoleTask) GetTaskReward(taskId uint32) serverproto.ErrorCode {
  405. this.initTaskTypeList()
  406. taskInfo := this.getTaskData(taskId)
  407. if taskInfo == nil {
  408. return serverproto.ErrorCode_ERROR_FAIL
  409. }
  410. if taskInfo.State == TASK_REWARD_STATE_REWARD {
  411. return serverproto.ErrorCode_ERROR_TASK_REWARDED
  412. }
  413. //应对玩家任务条件调整
  414. if taskInfo.State != TASK_REWARD_STATE_COMPLETED {
  415. if this.checkTaskInfo(taskInfo) {
  416. if taskInfo.State != TASK_REWARD_STATE_COMPLETED {
  417. return serverproto.ErrorCode_ERROR_TASK_REWARDED
  418. }
  419. } else {
  420. return serverproto.ErrorCode_ERROR_TASK_REWARDED
  421. }
  422. }
  423. convertTaskData, ok := model.ConvertTaskList[taskInfo.TaskId]
  424. if !ok {
  425. return serverproto.ErrorCode_ERROR_FAIL
  426. }
  427. //获取奖励
  428. var addItemList = map[int32]int32{}
  429. for _, value := range convertTaskData.TaskReward {
  430. addItemList[value.Key] = value.Value
  431. }
  432. //无道具有积分
  433. if len(addItemList) > 0 {
  434. //道具入背包
  435. if ret := this.role.CanAddItemList(addItemList); ret != serverproto.ErrorCode_ERROR_OK {
  436. return ret
  437. }
  438. this.role.AddItemList(addItemList, AddFrom_Task, true)
  439. }
  440. ntfMsg := &serverproto.SCTaskChangeNtf{
  441. DailyTaskScore: &this.dailyTaskScore,
  442. WeekTaskScore: &this.weekTaskScore,
  443. }
  444. //是否有后续任务,自动接取后续任务
  445. taskInfo.State = TASK_REWARD_STATE_REWARD
  446. switch taskInfo.TaskType {
  447. case model.TASK_TYPE_DAILY:
  448. this.dailyTaskScore.Value += convertTaskData.TaskScore
  449. case model.TASK_TYPE_WEEK:
  450. this.weekTaskScore.Value += convertTaskData.TaskScore
  451. }
  452. if rune := this.role.GetRoleRune(); rune != nil {
  453. rune.AddMissionExp(convertTaskData.TaskScore)
  454. }
  455. this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
  456. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
  457. if convertTaskData.NextTaskId != 0 {
  458. ////获取下一个任务的继承数值
  459. //var preTaskCount int32 = 0
  460. //if _, tmpOk := convertTaskData.Condition[int32(serverproto.TaskType_Get_Silver_Count)]; tmpOk {
  461. // for idx := 0; idx < len(taskInfo.Progress); idx++ {
  462. // if taskInfo.Progress[idx].Key == int32(serverproto.TaskType_Get_Silver_Count) {
  463. // preTaskCount = taskInfo.Progress[idx].Value
  464. // }
  465. // }
  466. //}
  467. if taskInfo.TaskType == model.TASK_TYPE_MAIN {
  468. taskInfo.Progress = taskInfo.Progress[:0]
  469. for key, _ := range convertTaskData.Condition {
  470. if _, ok := this.taskTypeList[key]; ok {
  471. this.taskTypeList[key].Remove(taskInfo.TaskId)
  472. }
  473. }
  474. delete(this.mainTaskList, taskInfo.TaskId)
  475. }
  476. nextTaskInfo := this.genNextTask(convertTaskData.NextTaskId, 0)
  477. if nextTaskInfo != nil {
  478. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, nextTaskInfo)
  479. }
  480. }
  481. this.SetDirty(true)
  482. this.role.ReplayGate(ntfMsg, true)
  483. //发送奖励数据(客户端显示)
  484. ackMsg := &serverproto.SCGetTaskRewardAck{
  485. Error: int32(serverproto.ErrorCode_ERROR_OK),
  486. }
  487. ackMsg.ItemList = append(convertTaskData.TaskReward)
  488. this.role.ReplayGate(ackMsg, true)
  489. //任务完成活跃度增加
  490. cfgData, ok := serverproto.MissionCfgLoader[int32(taskId)]
  491. if ok {
  492. this.role.roleGuild.AddGuildActivity(cfgData.Active)
  493. }
  494. util.DebugF("uid=%v SCGetTaskRewardAck current task reward=%v", this.role.GetUUid(), convertTaskData.TaskId)
  495. util.DebugF("uid=%v SCTaskChangeNtf msg=%v", this.role.GetUUid(), ntfMsg)
  496. return serverproto.ErrorCode_ERROR_OK
  497. }
  498. func (this *RoleTask) GetTaskScoreReward(rewardType, rewardIdx uint32) serverproto.ErrorCode {
  499. this.initTaskTypeList()
  500. if rewardIdx <= 0 || rewardIdx > 32 {
  501. return serverproto.ErrorCode_ERROR_FAIL
  502. }
  503. //发送奖励数据(客户端显示)
  504. ackMsg := &serverproto.SCGetTaskScoreRewardAck{
  505. Error: int32(serverproto.ErrorCode_ERROR_OK),
  506. }
  507. //获取奖励
  508. var addItemList = map[int32]int32{}
  509. if rewardType == model.TASK_TYPE_DAILY { //daily
  510. if this.dailyTaskScore.Key&(1<<rewardIdx) > 0 {
  511. return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_REWARDED
  512. }
  513. convertData, ok := model.ConvertDailyTaskScoreRewardList[rewardIdx]
  514. if !ok {
  515. return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_NOT_FOUND
  516. }
  517. if convertData.Active > this.dailyTaskScore.Value {
  518. return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_NOT_ENOUGH
  519. }
  520. for _, value := range convertData.RewardList {
  521. addItemList[value.Key] = value.Value
  522. }
  523. //活动掉落指定道具
  524. for _, value := range convertData.HDRewardList {
  525. if !CheckHDItemAdd(value.Key, this.role) {
  526. continue
  527. }
  528. addItemList[value.Key] = value.Value
  529. }
  530. if ret := this.role.CanAddItemList(addItemList); ret != serverproto.ErrorCode_ERROR_OK {
  531. return ret
  532. }
  533. this.dailyTaskScore.Key |= 1 << rewardIdx
  534. this.SetDirty(true)
  535. } else if rewardType == model.TASK_TYPE_WEEK { //week
  536. if this.weekTaskScore.Key&(1<<rewardIdx) > 0 {
  537. return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_REWARDED
  538. }
  539. convertData, ok := model.ConvertWeekTaskScoreRewardList[rewardIdx]
  540. if !ok {
  541. return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_NOT_FOUND
  542. }
  543. if convertData.Active > this.weekTaskScore.Value {
  544. return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_NOT_ENOUGH
  545. }
  546. for _, value := range convertData.RewardList {
  547. addItemList[value.Key] = value.Value
  548. }
  549. //活动掉落指定道具
  550. for _, value := range convertData.HDRewardList {
  551. if !CheckHDItemAdd(value.Key, this.role) {
  552. continue
  553. }
  554. addItemList[value.Key] = value.Value
  555. }
  556. if ret := this.role.CanAddItemList(addItemList); ret != serverproto.ErrorCode_ERROR_OK {
  557. return ret
  558. }
  559. this.weekTaskScore.Key |= 1 << rewardIdx
  560. this.SetDirty(true)
  561. }
  562. for key, val := range addItemList {
  563. ackMsg.ItemList = append(ackMsg.ItemList, &serverproto.KeyValueType{
  564. Key: key,
  565. Value: val,
  566. })
  567. }
  568. ntfMsg := &serverproto.SCTaskChangeNtf{
  569. DailyTaskScore: &this.dailyTaskScore,
  570. WeekTaskScore: &this.weekTaskScore,
  571. }
  572. this.role.ReplayGate(ntfMsg, true)
  573. this.role.AddItemList(addItemList, AddFrom_Task, true)
  574. this.role.ReplayGate(ackMsg, true)
  575. util.DebugF("uid=%v, GetTaskScoreReward current task type=%v idx=%v additemlist=%v",
  576. this.role.GetUUid(), rewardType, rewardIdx, addItemList)
  577. return serverproto.ErrorCode_ERROR_OK
  578. }
  579. //来自上一个任务的继承数值preTaskCount
  580. func (this *RoleTask) genNextTask(nextTaskId uint32, preTaskCount int32) *serverproto.TaskData {
  581. convertTaskData, ok := model.ConvertTaskList[nextTaskId]
  582. if ok && convertTaskData.TaskType == model.TASK_TYPE_MAIN {
  583. util.DebugF("uid=%v, genNextTask next task=%v", this.role.GetUUid(), nextTaskId)
  584. //接取下个任务后自动判断
  585. nextTaskInfo := &serverproto.TaskData{
  586. TaskId: nextTaskId,
  587. State: TASK_REWARD_STATE_NONE,
  588. //BeginTime: util.GetTimeMilliseconds(),
  589. TaskType: convertTaskData.TaskType,
  590. }
  591. for key := range convertTaskData.Condition {
  592. if _, ok := this.taskTypeList[key]; !ok {
  593. this.taskTypeList[key] = set.New(set.NonThreadSafe)
  594. }
  595. this.taskTypeList[key].Add(nextTaskId)
  596. }
  597. TaskConditionCheck(this.role, nextTaskInfo, serverproto.TaskType_NONE,
  598. convertTaskData.Condition, preTaskCount, false)
  599. this.SetDirty(true)
  600. //save db
  601. this.saveTaskDataList = append(this.saveTaskDataList, nextTaskInfo)
  602. this.loadTaskData.TaskList = append(this.loadTaskData.TaskList, nextTaskInfo)
  603. this.mainTaskList[nextTaskInfo.TaskId] = nextTaskInfo
  604. return nextTaskInfo
  605. }
  606. return nil
  607. }
  608. func (this *RoleTask) InitJobTask() {
  609. for _, data := range this.jobCondition {
  610. if data.JobFushState > 0 {
  611. continue
  612. }
  613. heroData := this.role.roleHero.GetHero(data.HeroId)
  614. if heroData == nil {
  615. continue
  616. }
  617. data.JobFushState = 1
  618. dbIndex := model.GetJobChangeKey(this.role.roleHero.IsMainHero(data.HeroId), heroData.ConfigId)
  619. db, ok := model.DBJobChange[dbIndex]
  620. if !ok {
  621. util.InfoF("ChangeJob JobCfgLoader data not found cfgid=%v, %v", heroData.ConfigId, dbIndex)
  622. return
  623. }
  624. //if len(data.TaskList) == len(db.ChangeCond) {
  625. // continue
  626. //}
  627. data.TaskList = data.TaskList[0:0]
  628. for _, condData := range db.ChangeCond { //遍历当前可转职任务
  629. var taskProgressType []*serverproto.TaskProgressType
  630. condId, _ := model.Str2Num(condData)
  631. condCfg, condOk := serverproto.ConditionCfgLoader[int32(condId)]
  632. if !condOk || len(condCfg.Condition[0]) < 2 {
  633. util.ErrorF("ChangeJob ConditionCfgLoader data not found cfgid=%v", condId)
  634. continue
  635. }
  636. //一个任务ID之对应一个条件,所以直接去第一个参数作为TaskType
  637. taskInfo := strings.Split(condCfg.Condition[0], ":")
  638. taskType, _ := model.Str2Num(taskInfo[0])
  639. taskProgressType = append(taskProgressType, &serverproto.TaskProgressType{
  640. Key: int32(taskType),
  641. Value: 0,
  642. })
  643. data.TaskList = append(data.TaskList, &serverproto.TaskData{
  644. TaskId: uint32(condId),
  645. Progress: taskProgressType,
  646. })
  647. }
  648. //刷新任务状态
  649. for _, task := range data.TaskList {
  650. for _, data := range task.Progress {
  651. TaskMagCheck(this.role, serverproto.TaskType(data.Key), 0)
  652. }
  653. }
  654. }
  655. this.SetDirty(true)
  656. }
  657. func (this *RoleTask) GetChangeJobTask(heroId int32, changeType int32, bNtf bool) {
  658. //获取转职的伙伴数据
  659. heroData := this.role.roleHero.GetHero(heroId)
  660. if heroData == nil {
  661. util.InfoF("uid=%v ChangeJob main hero not found", this.role.GetUUid())
  662. return
  663. }
  664. //获取可转职职业ID列表
  665. var changeCondition []string
  666. if this.role.roleHero.IsMainHero(heroId) {
  667. jobCfg, jobOk := serverproto.JobCfgLoader[heroData.ConfigId]
  668. if !jobOk {
  669. util.InfoF("ChangeJob JobCfgLoader data not found cfgid=%v", heroData.ConfigId)
  670. return
  671. }
  672. changeCondition = jobCfg.ChangeCond
  673. } else {
  674. jobCfg, jobOk := serverproto.ParterCfgLoader[heroData.ConfigId]
  675. if !jobOk {
  676. util.InfoF("ChangeJob ParterCfgLoader data not found cfgid=%v", heroData.ConfigId)
  677. return
  678. }
  679. changeCondition = jobCfg.ChangeCond
  680. }
  681. //是否有这个伙伴的转职任务列表
  682. var newJobCondition serverproto.ChangeJob
  683. var bFind bool = false
  684. for _, data := range this.jobCondition {
  685. if data.HeroId == heroId {
  686. newJobCondition = *data
  687. bFind = true
  688. }
  689. }
  690. if !bFind {
  691. this.jobCondition = append(this.jobCondition, &newJobCondition)
  692. }
  693. //清空当前的所有任务list
  694. if len(newJobCondition.TaskList) > 0 {
  695. newJobCondition.TaskList = newJobCondition.TaskList[0:0]
  696. }
  697. newJobCondition.HeroId = heroId
  698. //小任务加入任务列表
  699. for _, condData := range changeCondition { //遍历当前可转职任务
  700. var taskProgressType []*serverproto.TaskProgressType
  701. condId, _ := model.Str2Num(condData)
  702. condCfg, condOk := serverproto.ConditionCfgLoader[int32(condId)]
  703. if !condOk || len(condCfg.Condition[0]) < 2 {
  704. util.ErrorF("ChangeJob ConditionCfgLoader data not found cfgid=%v", condId)
  705. continue
  706. }
  707. //一个任务ID之对应一个条件,所以直接去第一个参数作为TaskType
  708. taskInfo := strings.Split(condCfg.Condition[0], ":")
  709. taskType, _ := model.Str2Num(taskInfo[0])
  710. taskProgressType = append(taskProgressType, &serverproto.TaskProgressType{
  711. Key: int32(taskType),
  712. Value: 0,
  713. })
  714. newJobCondition.TaskList = append(newJobCondition.TaskList, &serverproto.TaskData{
  715. TaskId: uint32(condId),
  716. Progress: taskProgressType,
  717. })
  718. }
  719. //如果是替换职业,并且,
  720. if len(newJobCondition.TaskList) > 0 {
  721. for _, task := range newJobCondition.TaskList {
  722. for _, data := range task.Progress {
  723. //转职条件处理
  724. this.jobConditionCheck(serverproto.TaskType(data.Key), 0)
  725. }
  726. }
  727. }
  728. if bNtf {
  729. this.jobConditionChangeNtf([]int32{heroId})
  730. }
  731. this.SetDirty(true)
  732. }
  733. func (this *RoleTask) jobConditionCheck(taskType serverproto.TaskType, count int32) {
  734. this.heroConditionCheck(taskType, count)
  735. }
  736. func (this *RoleTask) heroConditionCheck(taskType serverproto.TaskType, count int32) {
  737. roleData := this.role.GetRoleBase().RoleData()
  738. if roleData == nil {
  739. return
  740. }
  741. //遍历查找
  742. var changedIds []int32
  743. for _, data := range this.jobCondition {
  744. var bChanged bool = false
  745. for _, subData := range data.TaskList {
  746. taskInfo := subData.Progress[0]
  747. cond, ok := model.ChangeJobCond[int32(subData.TaskId)]
  748. if !ok {
  749. util.InfoF("heroConditionCheck ChangeJobCond data not found taskid=%v", subData.TaskId)
  750. continue
  751. }
  752. if taskInfo.Key != int32(taskType) || taskInfo.State == 1 { //不是条件任务。或者已经完成
  753. continue
  754. }
  755. bChanged = TaskConditionCheck(this.role, subData,
  756. taskType, cond.Condition, count, false)
  757. }
  758. if bChanged {
  759. changedIds = append(changedIds, data.HeroId)
  760. this.SetDirty(true)
  761. }
  762. }
  763. if len(changedIds) > 0 {
  764. this.jobConditionChangeNtf(changedIds)
  765. }
  766. }
  767. //------- 头像解锁条件 ----------------------------------
  768. func (this *RoleTask) OnlineCheckNewHead() {
  769. //上线检查头像是否有更新
  770. headVersion, ok := serverproto.GlobalCfgLoader[int32(serverproto.GlobalType_Global_Cur_Head_Version)]
  771. if !ok {
  772. util.ErrorF(" headpic config not found")
  773. return
  774. }
  775. if this.role.GetRoleBase().roleBase.Head_Info.HeadVersion >= headVersion.IVal {
  776. util.ErrorF("headpic version error version=%v val=%v", this.role.GetRoleBase().roleBase.Head_Info.HeadVersion, headVersion.IVal)
  777. return
  778. }
  779. //遍历新的头像
  780. for _, data := range serverproto.HeadPortraitCfgLoader {
  781. //老版本已经加载过
  782. if this.role.GetRoleBase().roleBase.Head_Info.HeadVersion >= data.HeadLoadId {
  783. continue
  784. }
  785. //性别不一致
  786. if this.role.GetRoleBase().GetRoleSex() != data.HeadPortraitSex {
  787. continue
  788. }
  789. //没有解锁要求,默认解锁激活
  790. if data.UnlockCondition == 0 {
  791. this.role.GetRoleBase().roleBase.Head_Info.HeadList = append(this.role.GetRoleBase().roleBase.Head_Info.HeadList, data.HeadPortraitId)
  792. continue
  793. }
  794. //后续版本的头像都加入到条件列表中来
  795. condCfg, condOk := model.ChangeJobCond[data.UnlockCondition]
  796. if !condOk {
  797. util.ErrorF("headpic ChangeJobCond not find condition=%v", data.UnlockCondition)
  798. continue
  799. }
  800. //把当前头像加入到
  801. var headCond serverproto.HeadCond
  802. headCond.HeadId = data.HeadPortraitId
  803. var taskData serverproto.TaskData
  804. taskData.TaskId = uint32(data.UnlockCondition)
  805. for key, _ := range condCfg.Condition {
  806. taskData.Progress = append(taskData.Progress, &serverproto.TaskProgressType{
  807. Key: key,
  808. Value: 0,
  809. State: 0,
  810. })
  811. }
  812. headCond.TaskList = append(headCond.TaskList, &taskData)
  813. this.roleHeadCond.Conditions = append(this.roleHeadCond.Conditions, &headCond)
  814. }
  815. //设置当前最新版本
  816. this.role.GetRoleBase().roleBase.Head_Info.HeadVersion = headVersion.IVal
  817. this.SetDirty(true)
  818. }
  819. //检查头像是否解锁
  820. func (this *RoleTask) CheckHeadUnlocked(headId int32) bool {
  821. for _, data := range this.roleHeadCond.Conditions {
  822. if data.HeadId != headId {
  823. continue
  824. }
  825. for _, taskData := range data.TaskList {
  826. for _, taskInfo := range taskData.Progress {
  827. if taskInfo.State == 0 {
  828. return false
  829. }
  830. }
  831. }
  832. }
  833. return true
  834. }
  835. func (this *RoleTask) headConditionCheck(taskType serverproto.TaskType, count int32) {
  836. this.headUnlockCheck(taskType, count)
  837. }
  838. func (this *RoleTask) headUnlockCheck(taskType serverproto.TaskType, count int32) {
  839. //遍历查找
  840. var bRet bool = false
  841. for _, data := range this.roleHeadCond.Conditions {
  842. for _, taskData := range data.TaskList {
  843. if taskData.State == TASK_REWARD_STATE_REWARD {
  844. continue
  845. }
  846. for _, taskInfo := range taskData.Progress {
  847. cond, ok := model.ChangeJobCond[int32(taskData.TaskId)]
  848. if !ok {
  849. util.InfoF("headUnlockCheck ChangeJobCond not found taskid=%v", taskData.TaskId)
  850. continue
  851. }
  852. if taskInfo.Key != int32(taskType) || taskInfo.State == 1 { //不是条件任务。或者已经完成
  853. continue
  854. }
  855. bRet = TaskConditionCheck(this.role, taskData,
  856. taskType, cond.Condition, count, false)
  857. if !bRet {
  858. continue
  859. }
  860. this.SetDirty(true)
  861. }
  862. }
  863. }
  864. if bRet == true {
  865. //通知客户端
  866. // this.headConditionChangeNtf()
  867. }
  868. }