role_task.go 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479
  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_REWARD_STATE_DELETE = 3 //困难模式可删除状态
  30. TASK_CONDITION_NONE = 4
  31. TASK_CONDITION_CHANGE = 5
  32. TASK_CONDITION_OK = 6
  33. )
  34. type ConditionInfo struct {
  35. HeroId int32 //伙伴ID
  36. TaskId uint32 //条件列表ID
  37. CondInfo *serverproto.TaskData
  38. }
  39. type RoleTask struct {
  40. SaveObject
  41. loadTaskData *serverproto.RoleTask
  42. jobCondition []*serverproto.ChangeJob //只针对主角//伙伴转职出案子再做
  43. roleHeadCond serverproto.RoleHeadCond
  44. taskTypeList map[int32]set.Interface //根据枚举类型对任务做区分[serverproto.TaskType, taslidlist]
  45. dailyTaskList map[uint32]*serverproto.TaskData
  46. weekTaskList map[uint32]*serverproto.TaskData
  47. mainTaskList map[uint32]*serverproto.TaskData
  48. mapHardTaskList map[uint32]*serverproto.TaskData //困难模式任务
  49. mapGroupHardTaskList map[uint32]*serverproto.TaskData //困难模式组任务
  50. dailyTaskScore serverproto.KeyValueType //活跃度/活跃度对应的奖励,按位处理(完成任务累加的积分)
  51. weekTaskScore serverproto.KeyValueType
  52. saveTaskDataList []*serverproto.TaskData
  53. recTypeCnt map[int32]*serverproto.KeyValueType
  54. //任务通用累计计数
  55. totalAddZeny uint64
  56. }
  57. func newRoleTask(r *Role) *RoleTask {
  58. roleTask := &RoleTask{
  59. SaveObject: SaveObject{
  60. role: r,
  61. },
  62. loadTaskData: &serverproto.RoleTask{},
  63. dailyTaskList: map[uint32]*serverproto.TaskData{},
  64. weekTaskList: map[uint32]*serverproto.TaskData{},
  65. mainTaskList: map[uint32]*serverproto.TaskData{},
  66. mapHardTaskList: map[uint32]*serverproto.TaskData{},
  67. mapGroupHardTaskList: map[uint32]*serverproto.TaskData{},
  68. taskTypeList: map[int32]set.Interface{},
  69. recTypeCnt: map[int32]*serverproto.KeyValueType{},
  70. roleHeadCond: serverproto.RoleHeadCond{},
  71. }
  72. return roleTask
  73. }
  74. func (this *RoleTask) Load(msg interface{}) bool {
  75. dbRole := msg.(*serverproto.Role)
  76. if dbRole != nil && dbRole.RoleBase != nil {
  77. //daily/week/game task
  78. if dbRole.RoleTask != nil {
  79. this.loadTaskData = dbRole.RoleTask
  80. if dbRole.RoleTask.DailyTaskScore != nil {
  81. this.dailyTaskScore = *dbRole.RoleTask.DailyTaskScore
  82. }
  83. if dbRole.RoleTask.WeekTaskScore != nil {
  84. this.weekTaskScore = *dbRole.RoleTask.WeekTaskScore
  85. }
  86. //util.InfoF("qqqqqqdb:%v", dbRole.RoleTask.TaskList)
  87. for idx := range dbRole.RoleTask.TaskList {
  88. taskInfo := dbRole.RoleTask.TaskList[idx]
  89. if taskInfo.TaskType == model.TASK_TYPE_HARD {
  90. _, ok := model.HardMissionTaskList[taskInfo.TaskId]
  91. if !ok {
  92. continue
  93. }
  94. } else if taskInfo.TaskType == model.TASK_TYPE_HARD_GROUP {
  95. _, ok := model.HardGroupMissionTaskList[taskInfo.TaskId]
  96. if !ok {
  97. continue
  98. }
  99. } else {
  100. _, ok := model.ConvertTaskList[taskInfo.TaskId]
  101. if !ok {
  102. continue
  103. }
  104. }
  105. if taskInfo.TaskType == model.TASK_TYPE_DAILY {
  106. this.dailyTaskList[taskInfo.TaskId] = taskInfo
  107. } else if taskInfo.TaskType == model.TASK_TYPE_WEEK {
  108. this.weekTaskList[taskInfo.TaskId] = taskInfo
  109. } else if taskInfo.TaskType == model.TASK_TYPE_MAIN {
  110. this.mainTaskList[taskInfo.TaskId] = taskInfo
  111. } else if taskInfo.TaskType == model.TASK_TYPE_HARD {
  112. this.mapHardTaskList[taskInfo.TaskId] = taskInfo
  113. } else if taskInfo.TaskType == model.TASK_TYPE_HARD_GROUP {
  114. this.mapGroupHardTaskList[taskInfo.TaskId] = taskInfo
  115. }
  116. }
  117. //util.InfoF("qqqqqq:%v bbbbbb:%v", this.mapHardTaskList, this.mapGroupHardTaskList)
  118. this.initTaskDataFromConfig()
  119. for _, valueType := range dbRole.RoleTask.TypeRecCount {
  120. this.recTypeCnt[valueType.Key] = valueType
  121. }
  122. }
  123. if len(dbRole.RoleTask.Condition) <= 0 { //账号初始化主角
  124. this.role.roleTask.GetChangeJobTask(this.role.GetRoleBase().RoleData().HeroData.Id, 0, false)
  125. }
  126. if len(this.jobCondition) <= 0 {
  127. this.jobCondition = dbRole.RoleTask.Condition
  128. }
  129. //this.role.roleTask.InitJobTask()
  130. dbRole.RoleTask.Condition = this.jobCondition
  131. //}
  132. //if len(dbRole.RoleTask.Condition) > 0 {
  133. // this.jobCondition = dbRole.RoleTask.Condition
  134. //}
  135. if dbRole.RoleTask.HeadCond != nil {
  136. this.roleHeadCond = *dbRole.RoleTask.HeadCond
  137. }
  138. this.totalAddZeny = dbRole.RoleTask.TotalAddZeny
  139. }
  140. return true
  141. }
  142. func (this *RoleTask) OnlineProcess() {
  143. this.role.roleTask.InitJobTask()
  144. }
  145. func (this *RoleTask) CopyData() *serverproto.RoleTask {
  146. //this.loadTaskData.DailyTaskScore = &this.dailyTaskScore
  147. //this.loadTaskData.WeekTaskScore = &this.weekTaskScore
  148. //this.loadTaskData.Condition = this.jobCondition
  149. //this.loadTaskData.HeadCond = &this.roleHeadCond
  150. //
  151. //this.loadTaskData.Latest5HourTime = util.GetLatest5Hour()
  152. //this.loadTaskData.LatestWeek5HourTime = util.GetLatestWeek5Hour()
  153. //util.DebugF("Online Pack RoleTask =%v", this.loadTaskData)
  154. //return this.loadTaskData
  155. tmpRoleTask := &serverproto.RoleTask{
  156. DailyTaskScore: &this.dailyTaskScore,
  157. WeekTaskScore: &this.weekTaskScore,
  158. Condition: this.jobCondition,
  159. HeadCond: &this.roleHeadCond,
  160. Latest5HourTime: util.GetLatest5Hour(),
  161. LatestWeek5HourTime: util.GetLatestWeek5Hour(0),
  162. }
  163. for _, val := range this.dailyTaskList {
  164. tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
  165. }
  166. for _, val := range this.weekTaskList {
  167. tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
  168. }
  169. for _, val := range this.mainTaskList {
  170. tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
  171. }
  172. //var groupId uint32
  173. //for _, val := range this.mapHardTaskList {
  174. // if val.State != TASK_REWARD_STATE_REWARD {
  175. // groupId = model.HardMissionTaskList[val.TaskId].GroupTaskId
  176. // tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
  177. // continue
  178. // }
  179. // if groupId == 0 && model.HardMissionTaskList[val.TaskId].GroupTaskId == groupId {
  180. // tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
  181. // }
  182. //}
  183. for _, val := range this.mapHardTaskList {
  184. tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
  185. }
  186. for _, val := range this.mapGroupHardTaskList {
  187. tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
  188. }
  189. util.InfoF("send task group:%v task:%v all task:%v", this.mapGroupHardTaskList, this.mapHardTaskList, tmpRoleTask.TaskList)
  190. for _, val := range this.recTypeCnt {
  191. tmpRoleTask.TypeRecCount = append(tmpRoleTask.TypeRecCount, val)
  192. }
  193. return tmpRoleTask
  194. }
  195. func (this *RoleTask) Save() {
  196. this.SetDirty(false)
  197. saveMsg := &serverproto.SSTaskDataSaveReq{
  198. Task: &serverproto.RoleTask{
  199. DailyTaskScore: &this.dailyTaskScore,
  200. WeekTaskScore: &this.weekTaskScore,
  201. },
  202. }
  203. saveMsg.Task.Condition = this.jobCondition
  204. saveMsg.Task.HeadCond = &this.roleHeadCond
  205. saveMsg.Task.TaskList = append(this.saveTaskDataList)
  206. this.saveTaskDataList = this.saveTaskDataList[:0]
  207. saveMsg.Task.TotalAddZeny = this.totalAddZeny
  208. for _, val := range this.recTypeCnt {
  209. saveMsg.Task.TypeRecCount = append(saveMsg.Task.TypeRecCount, val)
  210. }
  211. this.role.SendDb(saveMsg)
  212. }
  213. // 记录任务事件计数, 触发该记录事件前先调用该函数进行计数累加
  214. func (this *RoleTask) AddTypeCnt(recType serverproto.TaskType, cnt int32) {
  215. rec := int32(recType)
  216. val, ok := this.recTypeCnt[rec]
  217. if !ok {
  218. val = &serverproto.KeyValueType{Key: rec}
  219. }
  220. val.Value += cnt
  221. this.recTypeCnt[rec] = val
  222. this.SetDirty(true)
  223. }
  224. // 记录任务事件计数, 触发该记录事件前先调用该函数进行计数累加
  225. func (this *RoleTask) SetTypeCnt(recType serverproto.TaskType, cnt int32) {
  226. rec := int32(recType)
  227. val, ok := this.recTypeCnt[rec]
  228. if !ok {
  229. val = &serverproto.KeyValueType{Key: rec}
  230. }
  231. val.Value = cnt
  232. this.recTypeCnt[rec] = val
  233. this.SetDirty(true)
  234. }
  235. func (this *RoleTask) GetTypeCnt(recType int32) int32 {
  236. val, ok := this.recTypeCnt[recType]
  237. if !ok {
  238. return 0
  239. }
  240. return val.Value
  241. }
  242. func (this *RoleTask) DailyReset(notify bool, oldDailyResetTimeStamp uint64) {
  243. ntfMsg := &serverproto.SCTaskChangeNtf{
  244. DailyTaskScore: &this.dailyTaskScore,
  245. WeekTaskScore: &this.weekTaskScore,
  246. Latest5HourTime: util.GetLatest5Hour(),
  247. LatestWeek5HourTime: util.GetLatestWeek5Hour(0),
  248. }
  249. this.resetDailyTask(ntfMsg)
  250. //每日重置时判断是否是每周重置
  251. if util.IsInSameWeek(oldDailyResetTimeStamp, util.GetTimeMilliseconds()) {
  252. this.resetWeekTask(ntfMsg)
  253. }
  254. this.AddTypeCnt(serverproto.TaskType_Eve_Login_Day, 1)
  255. TaskMagCheck(this.role, serverproto.TaskType_Eve_Login_Day, 1)
  256. this.SetDirty(true)
  257. if notify {
  258. this.role.ReplayGate(ntfMsg, true)
  259. }
  260. }
  261. func (this *RoleTask) resetDailyTask(ntfMsg *serverproto.SCTaskChangeNtf) {
  262. this.dailyTaskScore.Key = 0
  263. this.dailyTaskScore.Value = 0
  264. for _, val := range this.dailyTaskList {
  265. if val.State != TASK_REWARD_STATE_NONE || len(val.Progress) > 0 {
  266. val.State = TASK_REWARD_STATE_NONE
  267. val.Progress = val.Progress[:0]
  268. this.saveTaskDataList = append(this.saveTaskDataList, val)
  269. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, val)
  270. }
  271. }
  272. }
  273. func (this *RoleTask) resetWeekTask(ntfMsg *serverproto.SCTaskChangeNtf) {
  274. this.weekTaskScore.Key = 0
  275. this.weekTaskScore.Value = 0
  276. for _, val := range this.weekTaskList {
  277. if val.State != TASK_REWARD_STATE_NONE || len(val.Progress) > 0 {
  278. val.State = TASK_REWARD_STATE_NONE
  279. val.Progress = val.Progress[:0]
  280. this.saveTaskDataList = append(this.saveTaskDataList, val)
  281. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, val)
  282. }
  283. }
  284. }
  285. func (this *RoleTask) initTaskDataFromConfig() {
  286. var tmpOriginalMainTask = map[uint32]struct{}{} //originalTaskId
  287. for _, mainTaskData := range this.mainTaskList {
  288. tmpId := model.ConvertMainTaskOriginalList[mainTaskData.TaskId]
  289. tmpOriginalMainTask[tmpId] = struct{}{}
  290. }
  291. //daily/week/game 添加新任务后,重新登陆即可自动接取
  292. for _, val := range model.ConvertAddTaskList {
  293. switch val.TaskType {
  294. case model.TASK_TYPE_DAILY:
  295. if _, ok := this.dailyTaskList[val.TaskId]; !ok {
  296. taskInfo := &serverproto.TaskData{
  297. TaskId: val.TaskId,
  298. State: TASK_REWARD_STATE_NONE,
  299. //BeginTime: util.GetTimeMilliseconds(),
  300. TaskType: val.TaskType,
  301. }
  302. this.dailyTaskList[val.TaskId] = taskInfo
  303. this.loadTaskData.TaskList = append(this.loadTaskData.TaskList, taskInfo)
  304. }
  305. case model.TASK_TYPE_WEEK:
  306. if _, ok := this.weekTaskList[val.TaskId]; !ok {
  307. taskInfo := &serverproto.TaskData{
  308. TaskId: val.TaskId,
  309. State: TASK_REWARD_STATE_NONE,
  310. //BeginTime: util.GetTimeMilliseconds(),
  311. TaskType: val.TaskType,
  312. }
  313. this.weekTaskList[val.TaskId] = taskInfo
  314. this.loadTaskData.TaskList = append(this.loadTaskData.TaskList, taskInfo)
  315. }
  316. case model.TASK_TYPE_MAIN:
  317. if _, ok := tmpOriginalMainTask[val.TaskId]; !ok {
  318. taskInfo := &serverproto.TaskData{
  319. TaskId: val.TaskId,
  320. State: TASK_REWARD_STATE_NONE,
  321. //BeginTime: util.GetTimeMilliseconds(),
  322. TaskType: val.TaskType,
  323. }
  324. this.mainTaskList[val.TaskId] = taskInfo
  325. this.loadTaskData.TaskList = append(this.loadTaskData.TaskList, taskInfo)
  326. }
  327. }
  328. }
  329. //util.InfoF("uuid:%v init hard task1:%v", this.role.GetUUid(), this.mapHardTaskList)
  330. var curId uint32
  331. var bSave bool
  332. if len(this.mapHardTaskList) > 0 {
  333. for _, v := range this.mapHardTaskList {
  334. if curId <= v.TaskId {
  335. curId = v.TaskId
  336. }
  337. }
  338. }
  339. for _, val := range model.HardMissionTaskIdList {
  340. //每组任务3个,目前只初始化5组所以是15个任务
  341. if len(this.mapHardTaskList) >= 15 {
  342. break
  343. }
  344. if val < curId {
  345. continue
  346. }
  347. bSave = true
  348. data := model.HardMissionTaskList[val]
  349. if data != nil {
  350. taskInfo := &serverproto.TaskData{
  351. TaskId: data.TaskId,
  352. State: TASK_REWARD_STATE_NONE,
  353. //BeginTime: util.GetTimeMilliseconds(),
  354. TaskType: data.TaskType,
  355. }
  356. this.mapHardTaskList[data.TaskId] = taskInfo
  357. this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
  358. }
  359. }
  360. util.InfoF("uuid:%v init hard task2:%v", this.role.GetUUid(), this.mapHardTaskList)
  361. var curGroupId uint32
  362. if len(this.mapGroupHardTaskList) > 0 {
  363. for _, v := range this.mapGroupHardTaskList {
  364. if curGroupId <= v.TaskId {
  365. curGroupId = v.TaskId
  366. }
  367. }
  368. }
  369. //util.InfoF("uuid:%v init hard task group1:%v", this.role.GetUUid(), this.mapGroupHardTaskList)
  370. for _, val := range model.HardGroupMissionTaskIdList {
  371. //初始化5组 组任务
  372. if len(this.mapGroupHardTaskList) >= 5 {
  373. break
  374. }
  375. if val < curGroupId {
  376. continue
  377. }
  378. bSave = true
  379. data := model.HardGroupMissionTaskList[val]
  380. if data != nil {
  381. taskInfo := &serverproto.TaskData{
  382. TaskId: data.GroupTaskId,
  383. State: TASK_REWARD_STATE_NONE,
  384. //BeginTime: util.GetTimeMilliseconds(),
  385. TaskType: data.TaskType,
  386. }
  387. this.mapGroupHardTaskList[data.GroupTaskId] = taskInfo
  388. this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
  389. }
  390. }
  391. if bSave {
  392. this.SetDirty(true)
  393. }
  394. util.InfoF("uuid:%v init hard task group2:%v", this.role.GetUUid(), this.mapGroupHardTaskList)
  395. }
  396. func (this *RoleTask) getTaskData(taskId uint32) *serverproto.TaskData {
  397. if taskInfo, ok := this.dailyTaskList[taskId]; ok {
  398. return taskInfo
  399. }
  400. if taskInfo, ok := this.weekTaskList[taskId]; ok {
  401. return taskInfo
  402. }
  403. if taskInfo, ok := this.mainTaskList[taskId]; ok {
  404. return taskInfo
  405. }
  406. //if taskInfo, ok := this.mapHardTaskList[taskId]; ok {
  407. // return taskInfo
  408. //}
  409. return nil
  410. }
  411. func (this *RoleTask) getTaskHardAllData(taskId uint32) *serverproto.TaskData {
  412. if taskInfo, ok := this.mapHardTaskList[taskId]; ok {
  413. return taskInfo
  414. }
  415. if taskInfo, ok := this.mapGroupHardTaskList[taskId]; ok {
  416. return taskInfo
  417. }
  418. return nil
  419. }
  420. func (this *RoleTask) getTaskHardData(taskId uint32) *serverproto.TaskData {
  421. if taskInfo, ok := this.mapHardTaskList[taskId]; ok {
  422. return taskInfo
  423. }
  424. return nil
  425. }
  426. func (this *RoleTask) getGroupTaskHardData(taskId uint32) *serverproto.TaskData {
  427. if taskInfo, ok := this.mapGroupHardTaskList[taskId]; ok {
  428. return taskInfo
  429. }
  430. return nil
  431. }
  432. func (this *RoleTask) initTaskTypeList() {
  433. if len(this.taskTypeList) <= 0 {
  434. //dailyTaskList
  435. for _, taskInfo := range this.dailyTaskList {
  436. convertData, ok := model.ConvertTaskList[taskInfo.TaskId]
  437. if !ok {
  438. continue
  439. }
  440. for key := range convertData.Condition {
  441. if _, ok := this.taskTypeList[key]; !ok {
  442. this.taskTypeList[key] = set.New(set.NonThreadSafe)
  443. }
  444. this.taskTypeList[key].Add(taskInfo.TaskId)
  445. }
  446. }
  447. //weekTaskList
  448. for _, taskInfo := range this.weekTaskList {
  449. convertData, ok := model.ConvertTaskList[taskInfo.TaskId]
  450. if !ok {
  451. continue
  452. }
  453. for key := range convertData.Condition {
  454. if _, ok := this.taskTypeList[key]; !ok {
  455. this.taskTypeList[key] = set.New(set.NonThreadSafe)
  456. }
  457. this.taskTypeList[key].Add(taskInfo.TaskId)
  458. }
  459. }
  460. //mainTaskList
  461. //主线已经完成的不再完成
  462. for _, taskInfo := range this.mainTaskList {
  463. if taskInfo.State == TASK_REWARD_STATE_COMPLETED {
  464. continue
  465. }
  466. convertData, ok := model.ConvertTaskList[taskInfo.TaskId]
  467. if !ok {
  468. continue
  469. }
  470. for key := range convertData.Condition {
  471. if _, ok := this.taskTypeList[key]; !ok {
  472. this.taskTypeList[key] = set.New(set.NonThreadSafe)
  473. }
  474. this.taskTypeList[key].Add(taskInfo.TaskId)
  475. }
  476. }
  477. for _, taskInfo := range this.mapHardTaskList {
  478. if taskInfo.State == TASK_REWARD_STATE_COMPLETED {
  479. continue
  480. }
  481. convertData, ok := model.HardMissionTaskList[taskInfo.TaskId]
  482. if !ok {
  483. continue
  484. }
  485. for key := range convertData.Condition {
  486. if _, ok := this.taskTypeList[key]; !ok {
  487. this.taskTypeList[key] = set.New(set.NonThreadSafe)
  488. }
  489. this.taskTypeList[key].Add(taskInfo.TaskId)
  490. }
  491. }
  492. for _, taskInfo := range this.mapGroupHardTaskList {
  493. if taskInfo.State == TASK_REWARD_STATE_COMPLETED {
  494. continue
  495. }
  496. convertData, ok := model.HardGroupMissionTaskList[taskInfo.TaskId]
  497. if !ok {
  498. continue
  499. }
  500. for key := range convertData.Condition {
  501. if _, ok := this.taskTypeList[key]; !ok {
  502. this.taskTypeList[key] = set.New(set.NonThreadSafe)
  503. }
  504. this.taskTypeList[key].Add(taskInfo.TaskId)
  505. }
  506. }
  507. }
  508. }
  509. func (this *RoleTask) TaskCheck(taskType serverproto.TaskType, count int32) {
  510. this.initTaskTypeList()
  511. typeList, ok := this.taskTypeList[int32(taskType)]
  512. if !ok || typeList.Size() <= 0 {
  513. return
  514. }
  515. ntfMsg := &serverproto.SCTaskChangeNtf{
  516. DailyTaskScore: &this.dailyTaskScore,
  517. WeekTaskScore: &this.weekTaskScore,
  518. }
  519. for _, val := range this.taskTypeList[int32(taskType)].List() {
  520. tmpTaskId := val.(uint32)
  521. if taskType == serverproto.TaskType_Level_Hard_Battle_Count {
  522. if taskInfo := this.getTaskHardAllData(tmpTaskId); taskInfo != nil {
  523. if taskInfo.TaskType == model.TASK_TYPE_HARD {
  524. convertTaskData, ok := model.HardMissionTaskList[taskInfo.TaskId]
  525. if !ok {
  526. util.ErrorF("uid=%v TaskCheck TaskCfgData not exist", this.role.GetUUid(), taskInfo)
  527. continue
  528. }
  529. if taskInfo.State != TASK_REWARD_STATE_COMPLETED &&
  530. taskInfo.State != TASK_REWARD_STATE_REWARD {
  531. util.InfoF("uid=%v TaskCheck before taskInfo=%v", this.role.GetUUid(), taskInfo)
  532. }
  533. //多条件处理
  534. ret := TaskConditionCheck(this.role, taskInfo, taskType, convertTaskData.Condition, count, false)
  535. if ret {
  536. this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
  537. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
  538. this.SetDirty(true)
  539. }
  540. } else if taskInfo.TaskType == model.TASK_TYPE_HARD_GROUP {
  541. convertTaskData, ok := model.HardGroupMissionTaskList[taskInfo.TaskId]
  542. if !ok {
  543. util.ErrorF("uid=%v TaskCheck TaskCfgData not exist", this.role.GetUUid(), taskInfo)
  544. continue
  545. }
  546. if taskInfo.State != TASK_REWARD_STATE_COMPLETED &&
  547. taskInfo.State != TASK_REWARD_STATE_REWARD {
  548. util.InfoF("uid=%v TaskCheck before taskInfo=%v", this.role.GetUUid(), taskInfo)
  549. }
  550. //多条件处理
  551. ret := TaskConditionCheck(this.role, taskInfo, taskType, convertTaskData.Condition, count, false)
  552. if ret {
  553. this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
  554. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
  555. this.SetDirty(true)
  556. }
  557. }
  558. }
  559. } else {
  560. if taskInfo := this.getTaskData(tmpTaskId); taskInfo != nil {
  561. convertTaskData, ok := model.ConvertTaskList[taskInfo.TaskId]
  562. if !ok {
  563. util.ErrorF("uid=%v TaskCheck TaskCfgData not exist", this.role.GetUUid(), taskInfo)
  564. continue
  565. }
  566. if taskInfo.State != TASK_REWARD_STATE_COMPLETED &&
  567. taskInfo.State != TASK_REWARD_STATE_REWARD {
  568. util.InfoF("uid=%v TaskCheck before taskInfo=%v", this.role.GetUUid(), taskInfo)
  569. }
  570. //多条件处理
  571. ret := TaskConditionCheck(this.role, taskInfo, taskType, convertTaskData.Condition, count, false)
  572. if ret {
  573. this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
  574. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
  575. this.SetDirty(true)
  576. }
  577. }
  578. }
  579. }
  580. //追加困难模式任务
  581. if taskType == serverproto.TaskType_Level_Hard_Battle_Count {
  582. this.AddHardTask()
  583. }
  584. if len(ntfMsg.TaskChangeList) > 0 {
  585. this.role.ReplayGate(ntfMsg, true)
  586. util.InfoF("uid=%v TaskCheck changelist=%v", this.role.GetUUid(), ntfMsg.TaskChangeList)
  587. }
  588. }
  589. func (this *RoleTask) jobConditionChangeNtf(changedId []int32) {
  590. ntfMsg := &serverproto.SCHeroConditinDataNtf{}
  591. for _, heroId := range changedId {
  592. for index, data := range this.jobCondition {
  593. if data.HeroId == heroId {
  594. ntfMsg.Condition = append(ntfMsg.Condition, this.jobCondition[index])
  595. }
  596. }
  597. }
  598. this.role.ReplayGate(ntfMsg, true)
  599. this.role.GetRoleBase().SetDirty(true)
  600. util.DebugF("uid=%v jobcondition=%v", this.role.GetUUid(), this.jobCondition)
  601. }
  602. func (this *RoleTask) checkTaskInfo(taskInfo *serverproto.TaskData) bool {
  603. convertData, ok := model.ConvertTaskList[taskInfo.TaskId]
  604. if !ok {
  605. return false
  606. }
  607. return TaskConditionCheck(this.role, taskInfo, 0, convertData.Condition, 0, true)
  608. }
  609. func (this *RoleTask) GetTaskReward(taskId uint32) serverproto.ErrorCode {
  610. this.initTaskTypeList()
  611. taskInfo := this.getTaskData(taskId)
  612. if taskInfo == nil {
  613. return serverproto.ErrorCode_ERROR_FAIL
  614. }
  615. if taskInfo.State == TASK_REWARD_STATE_REWARD {
  616. return serverproto.ErrorCode_ERROR_TASK_REWARDED
  617. }
  618. //应对玩家任务条件调整
  619. if taskInfo.State != TASK_REWARD_STATE_COMPLETED {
  620. if this.checkTaskInfo(taskInfo) {
  621. if taskInfo.State != TASK_REWARD_STATE_COMPLETED {
  622. return serverproto.ErrorCode_ERROR_TASK_REWARDED
  623. }
  624. } else {
  625. return serverproto.ErrorCode_ERROR_TASK_REWARDED
  626. }
  627. }
  628. convertTaskData, ok := model.ConvertTaskList[taskInfo.TaskId]
  629. if !ok {
  630. return serverproto.ErrorCode_ERROR_FAIL
  631. }
  632. //获取奖励
  633. var addItemList = map[int32]int32{}
  634. for _, value := range convertTaskData.TaskReward {
  635. addItemList[value.Key] = value.Value
  636. }
  637. //无道具有积分
  638. if len(addItemList) > 0 {
  639. //道具入背包
  640. if ret := this.role.CanAddItemList(addItemList); ret != serverproto.ErrorCode_ERROR_OK {
  641. return ret
  642. }
  643. this.role.AddItemList(addItemList, AddFrom_Task, true)
  644. }
  645. ntfMsg := &serverproto.SCTaskChangeNtf{
  646. DailyTaskScore: &this.dailyTaskScore,
  647. WeekTaskScore: &this.weekTaskScore,
  648. }
  649. //是否有后续任务,自动接取后续任务
  650. taskInfo.State = TASK_REWARD_STATE_REWARD
  651. switch taskInfo.TaskType {
  652. case model.TASK_TYPE_DAILY:
  653. this.dailyTaskScore.Value += convertTaskData.TaskScore
  654. case model.TASK_TYPE_WEEK:
  655. this.weekTaskScore.Value += convertTaskData.TaskScore
  656. }
  657. if rune := this.role.GetRoleRune(); rune != nil {
  658. rune.AddMissionExp(convertTaskData.TaskScore)
  659. }
  660. this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
  661. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
  662. if convertTaskData.NextTaskId != 0 {
  663. ////获取下一个任务的继承数值
  664. //var preTaskCount int32 = 0
  665. //if _, tmpOk := convertTaskData.Condition[int32(serverproto.TaskType_Get_Silver_Count)]; tmpOk {
  666. // for idx := 0; idx < len(taskInfo.Progress); idx++ {
  667. // if taskInfo.Progress[idx].Key == int32(serverproto.TaskType_Get_Silver_Count) {
  668. // preTaskCount = taskInfo.Progress[idx].Value
  669. // }
  670. // }
  671. //}
  672. if taskInfo.TaskType == model.TASK_TYPE_MAIN {
  673. taskInfo.Progress = taskInfo.Progress[:0]
  674. for key, _ := range convertTaskData.Condition {
  675. if _, ok := this.taskTypeList[key]; ok {
  676. this.taskTypeList[key].Remove(taskInfo.TaskId)
  677. }
  678. }
  679. delete(this.mainTaskList, taskInfo.TaskId)
  680. }
  681. nextTaskInfo := this.genNextTask(convertTaskData.NextTaskId, 0)
  682. if nextTaskInfo != nil {
  683. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, nextTaskInfo)
  684. }
  685. }
  686. this.SetDirty(true)
  687. this.role.ReplayGate(ntfMsg, true)
  688. //发送奖励数据(客户端显示)
  689. ackMsg := &serverproto.SCGetTaskRewardAck{
  690. Error: int32(serverproto.ErrorCode_ERROR_OK),
  691. }
  692. ackMsg.ItemList = append(convertTaskData.TaskReward)
  693. this.role.ReplayGate(ackMsg, true)
  694. //任务完成活跃度增加
  695. cfgData, ok := serverproto.MissionCfgLoader[int32(taskId)]
  696. if ok {
  697. this.role.roleGuild.AddGuildActivity(cfgData.Active)
  698. }
  699. util.DebugF("uid=%v SCGetTaskRewardAck current task reward=%v", this.role.GetUUid(), convertTaskData.TaskId)
  700. util.DebugF("uid=%v SCTaskChangeNtf msg=%v", this.role.GetUUid(), ntfMsg)
  701. return serverproto.ErrorCode_ERROR_OK
  702. }
  703. func (this *RoleTask) AddHardTask() bool {
  704. var (
  705. count2 int32 //未完成任务组数量
  706. maxGroupId uint32 //最后一组 组id
  707. //ggId uint32
  708. )
  709. for _, v := range this.mapGroupHardTaskList {
  710. if v.State == TASK_REWARD_STATE_NONE {
  711. count2++
  712. //if maxGroupId < v.TaskId {
  713. // maxGroupId = v.TaskId
  714. //}
  715. break
  716. }
  717. if maxGroupId < v.TaskId {
  718. maxGroupId = v.TaskId
  719. }
  720. }
  721. if count2 < 1 {
  722. ////一下全部完成了任务
  723. //if maxGroupId == 0 {
  724. // maxGroupId = ggId
  725. //}
  726. var (
  727. count3 int32
  728. count4 int32
  729. maxId uint32 //最后一个小任务id
  730. )
  731. if v, ok := model.HardGroupMissionTaskList[maxGroupId]; ok {
  732. maxId = v.TaskId
  733. }
  734. ntfMsg := &serverproto.SCTaskChangeNtf{
  735. DailyTaskScore: &this.dailyTaskScore,
  736. WeekTaskScore: &this.weekTaskScore,
  737. }
  738. for _, val := range model.HardGroupMissionTaskIdList {
  739. //初始化5组 组任务
  740. if count3 >= 5 {
  741. break
  742. }
  743. if val <= maxGroupId {
  744. continue
  745. }
  746. data := model.HardGroupMissionTaskList[val]
  747. if data != nil {
  748. taskInfo := &serverproto.TaskData{
  749. TaskId: data.GroupTaskId,
  750. State: TASK_REWARD_STATE_NONE,
  751. //BeginTime: util.GetTimeMilliseconds(),
  752. TaskType: data.TaskType,
  753. }
  754. passNum := this.role.GetRoleBattle().GetPassHardBattleIdNum(data.Condition[int32(serverproto.TaskType_Level_Hard_Battle_Count)][1])
  755. if passNum == 1 {
  756. taskInfo.State = TASK_REWARD_STATE_COMPLETED
  757. taskInfo.Progress = []*serverproto.TaskProgressType{{Key: 102, Value: 1, State: 1}}
  758. }
  759. this.mapGroupHardTaskList[data.GroupTaskId] = taskInfo
  760. //role.roleTask.loadTaskData.TaskList = append(role.roleTask.loadTaskData.TaskList, taskInfo)
  761. this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
  762. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
  763. //util.InfoF("add task gg:%v", taskInfo)
  764. count3++
  765. }
  766. }
  767. for _, val := range model.HardMissionTaskIdList {
  768. //每组任务3个,目前只初始化5组所以是15个任务
  769. if count4 >= 15 {
  770. break
  771. }
  772. if val <= maxId {
  773. continue
  774. }
  775. data := model.HardMissionTaskList[val]
  776. if data != nil {
  777. taskInfo := &serverproto.TaskData{
  778. TaskId: data.TaskId,
  779. State: TASK_REWARD_STATE_NONE,
  780. //BeginTime: util.GetTimeMilliseconds(),
  781. TaskType: data.TaskType,
  782. }
  783. passNum := this.role.GetRoleBattle().GetPassHardBattleIdNum(data.Condition[int32(serverproto.TaskType_Level_Hard_Battle_Count)][1])
  784. if passNum == 1 {
  785. taskInfo.State = TASK_REWARD_STATE_COMPLETED
  786. taskInfo.Progress = []*serverproto.TaskProgressType{{Key: 102, Value: 1, State: 1}}
  787. }
  788. this.mapHardTaskList[data.TaskId] = taskInfo
  789. //this.loadTaskData.TaskList = append(this.loadTaskData.TaskList, taskInfo)
  790. this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
  791. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
  792. //util.InfoF("add task gg2:%v", taskInfo)
  793. count4++
  794. }
  795. }
  796. for _, taskInfo := range this.mapHardTaskList {
  797. if taskInfo.State == TASK_REWARD_STATE_COMPLETED {
  798. continue
  799. }
  800. convertData, ok := model.HardMissionTaskList[taskInfo.TaskId]
  801. if !ok {
  802. continue
  803. }
  804. for key := range convertData.Condition {
  805. if _, ok := this.taskTypeList[key]; !ok {
  806. this.taskTypeList[key] = set.New(set.NonThreadSafe)
  807. }
  808. this.taskTypeList[key].Add(taskInfo.TaskId)
  809. }
  810. }
  811. for _, taskInfo := range this.mapGroupHardTaskList {
  812. if taskInfo.State == TASK_REWARD_STATE_COMPLETED {
  813. continue
  814. }
  815. convertData, ok := model.HardGroupMissionTaskList[taskInfo.TaskId]
  816. if !ok {
  817. continue
  818. }
  819. for key := range convertData.Condition {
  820. if _, ok := this.taskTypeList[key]; !ok {
  821. this.taskTypeList[key] = set.New(set.NonThreadSafe)
  822. }
  823. this.taskTypeList[key].Add(taskInfo.TaskId)
  824. }
  825. }
  826. this.role.ReplayGate(ntfMsg, true)
  827. this.role.roleTask.SetDirty(true)
  828. util.InfoF("uuid:%v add start hard group taskId:%v little taskId:%v task info:%v group info:%v", this.role.GetUUid(), maxGroupId, maxId, this.role.roleTask.mapHardTaskList, this.role.roleTask.mapGroupHardTaskList)
  829. if len(ntfMsg.TaskChangeList) > 0 {
  830. return true
  831. } else {
  832. return false
  833. }
  834. }
  835. return false
  836. }
  837. func (this *RoleTask) GetTaskScoreReward(rewardType, rewardIdx uint32) serverproto.ErrorCode {
  838. this.initTaskTypeList()
  839. if (rewardIdx <= 0 || rewardIdx > 32) && rewardType != model.TASK_TYPE_HARD && rewardType != model.TASK_TYPE_HARD_GROUP {
  840. return serverproto.ErrorCode_ERROR_FAIL
  841. }
  842. //发送奖励数据(客户端显示)
  843. ackMsg := &serverproto.SCGetTaskScoreRewardAck{
  844. Error: int32(serverproto.ErrorCode_ERROR_OK),
  845. }
  846. //获取奖励
  847. var addItemList = map[int32]int32{}
  848. if rewardType == model.TASK_TYPE_DAILY { //daily
  849. if this.dailyTaskScore.Key&(1<<rewardIdx) > 0 {
  850. return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_REWARDED
  851. }
  852. convertData, ok := model.ConvertDailyTaskScoreRewardList[rewardIdx]
  853. if !ok {
  854. return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_NOT_FOUND
  855. }
  856. if convertData.Active > this.dailyTaskScore.Value {
  857. return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_NOT_ENOUGH
  858. }
  859. for _, value := range convertData.RewardList {
  860. addItemList[value.Key] = value.Value
  861. }
  862. //活动掉落指定道具
  863. for _, value := range convertData.HDRewardList {
  864. if !CheckHDItemAdd(value.Key, this.role) {
  865. continue
  866. }
  867. addItemList[value.Key] = value.Value
  868. }
  869. if ret := this.role.CanAddItemList(addItemList); ret != serverproto.ErrorCode_ERROR_OK {
  870. return ret
  871. }
  872. this.dailyTaskScore.Key |= 1 << rewardIdx
  873. this.SetDirty(true)
  874. } else if rewardType == model.TASK_TYPE_WEEK { //week
  875. if this.weekTaskScore.Key&(1<<rewardIdx) > 0 {
  876. return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_REWARDED
  877. }
  878. convertData, ok := model.ConvertWeekTaskScoreRewardList[rewardIdx]
  879. if !ok {
  880. return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_NOT_FOUND
  881. }
  882. if convertData.Active > this.weekTaskScore.Value {
  883. return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_NOT_ENOUGH
  884. }
  885. for _, value := range convertData.RewardList {
  886. addItemList[value.Key] = value.Value
  887. }
  888. //活动掉落指定道具
  889. for _, value := range convertData.HDRewardList {
  890. if !CheckHDItemAdd(value.Key, this.role) {
  891. continue
  892. }
  893. addItemList[value.Key] = value.Value
  894. }
  895. if ret := this.role.CanAddItemList(addItemList); ret != serverproto.ErrorCode_ERROR_OK {
  896. return ret
  897. }
  898. this.weekTaskScore.Key |= 1 << rewardIdx
  899. this.SetDirty(true)
  900. } else if rewardType == model.TASK_TYPE_HARD {
  901. taskInfo := this.getTaskHardData(rewardIdx)
  902. if taskInfo == nil {
  903. return serverproto.ErrorCode_ERROR_FAIL
  904. }
  905. if taskInfo.State == TASK_REWARD_STATE_REWARD || taskInfo.State == TASK_REWARD_STATE_NONE {
  906. return serverproto.ErrorCode_ERROR_TASK_REWARDED
  907. }
  908. convertData, ok := model.HardMissionTaskList[rewardIdx]
  909. if !ok {
  910. return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_NOT_FOUND
  911. }
  912. for _, value := range convertData.TaskReward {
  913. addItemList[value.Key] = value.Value
  914. }
  915. if ret := this.role.CanAddItemList(addItemList); ret != serverproto.ErrorCode_ERROR_OK {
  916. return ret
  917. }
  918. taskInfo.State = TASK_REWARD_STATE_REWARD
  919. this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
  920. this.SetDirty(true)
  921. } else if rewardType == model.TASK_TYPE_HARD_GROUP {
  922. taskInfo := this.getGroupTaskHardData(rewardIdx)
  923. if taskInfo == nil {
  924. return serverproto.ErrorCode_ERROR_FAIL
  925. }
  926. if taskInfo.State == TASK_REWARD_STATE_REWARD || taskInfo.State == TASK_REWARD_STATE_NONE {
  927. return serverproto.ErrorCode_ERROR_TASK_REWARDED
  928. }
  929. convertData, ok := model.HardGroupMissionTaskList[rewardIdx]
  930. if !ok {
  931. return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_NOT_FOUND
  932. }
  933. //没找到这组的奖励
  934. if len(convertData.GroupTaskReward) == 0 {
  935. for _, v := range model.HardMissionTaskList {
  936. if v.GroupTaskId == convertData.GroupTaskId {
  937. if len(v.GroupTaskReward) != 0 {
  938. convertData.GroupTaskReward = v.GroupTaskReward
  939. break
  940. }
  941. }
  942. }
  943. }
  944. for _, value := range convertData.GroupTaskReward {
  945. addItemList[value.Key] = value.Value
  946. }
  947. if ret := this.role.CanAddItemList(addItemList); ret != serverproto.ErrorCode_ERROR_OK {
  948. return ret
  949. }
  950. taskInfo.State = TASK_REWARD_STATE_REWARD
  951. this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
  952. this.SetDirty(true)
  953. }
  954. for key, val := range addItemList {
  955. ackMsg.ItemList = append(ackMsg.ItemList, &serverproto.KeyValueType{
  956. Key: key,
  957. Value: val,
  958. })
  959. }
  960. ntfMsg := &serverproto.SCTaskChangeNtf{
  961. DailyTaskScore: &this.dailyTaskScore,
  962. WeekTaskScore: &this.weekTaskScore,
  963. }
  964. if rewardType == model.TASK_TYPE_HARD {
  965. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, this.getTaskHardData(rewardIdx))
  966. }
  967. if rewardType == model.TASK_TYPE_HARD_GROUP {
  968. ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, this.getGroupTaskHardData(rewardIdx))
  969. }
  970. this.role.ReplayGate(ntfMsg, true)
  971. if rewardType == model.TASK_TYPE_HARD {
  972. this.CheckHardTaskAndDelete(rewardIdx)
  973. }
  974. if rewardType == model.TASK_TYPE_HARD_GROUP {
  975. this.CheckHardGroupTaskAndDelete(rewardIdx)
  976. }
  977. this.role.AddItemList(addItemList, AddFrom_Task, true)
  978. this.role.ReplayGate(ackMsg, true)
  979. util.DebugF("uid=%v, GetTaskScoreReward current task type=%v idx=%v additemlist=%v",
  980. this.role.GetUUid(), rewardType, rewardIdx, addItemList)
  981. return serverproto.ErrorCode_ERROR_OK
  982. }
  983. func (this *RoleTask) CheckHardGroupTaskAndDelete(groupTaskId uint32) {
  984. groupTask := this.getGroupTaskHardData(groupTaskId)
  985. isDelete := true
  986. list := make([]uint32, 0)
  987. for _, v := range this.mapHardTaskList {
  988. if v2, ok := model.HardMissionTaskList[v.TaskId]; ok {
  989. if v2.GroupTaskId == groupTask.TaskId {
  990. list = append(list, v.TaskId)
  991. if v.State != TASK_REWARD_STATE_REWARD {
  992. isDelete = false
  993. break
  994. }
  995. }
  996. }
  997. }
  998. if isDelete {
  999. //最后一组任务删除前新增任务
  1000. if len(this.mapGroupHardTaskList) == 1 {
  1001. if !this.AddHardTask() {
  1002. return
  1003. }
  1004. }
  1005. for _, v := range list {
  1006. task := this.getTaskHardData(v)
  1007. task.HardState = TASK_REWARD_STATE_DELETE
  1008. this.saveTaskDataList = append(this.saveTaskDataList, task)
  1009. delete(this.mapHardTaskList, v)
  1010. }
  1011. task2 := this.getGroupTaskHardData(groupTaskId)
  1012. if task2 != nil {
  1013. task2.HardState = TASK_REWARD_STATE_DELETE
  1014. }
  1015. this.saveTaskDataList = append(this.saveTaskDataList, task2)
  1016. this.SetDirty(true)
  1017. delete(this.mapGroupHardTaskList, groupTaskId)
  1018. util.InfoF("uuid:%v delete groupId:%v saveTask:%v ", this.role.GetUUid(), groupTaskId, this.saveTaskDataList)
  1019. }
  1020. }
  1021. func (this *RoleTask) CheckHardTaskAndDelete(TaskId uint32) {
  1022. var (
  1023. groupId uint32
  1024. isOver bool
  1025. isGroupOver bool
  1026. )
  1027. list := make([]uint32, 0)
  1028. if g, ok := model.HardMissionTaskList[TaskId]; ok {
  1029. groupId = g.GroupTaskId
  1030. }
  1031. if v, ok := this.mapGroupHardTaskList[groupId]; ok {
  1032. if v.State != TASK_REWARD_STATE_REWARD {
  1033. isGroupOver = true
  1034. }
  1035. }
  1036. for _, v := range this.mapHardTaskList {
  1037. if v2, ok := model.HardMissionTaskList[v.TaskId]; ok {
  1038. if v2.GroupTaskId == groupId {
  1039. list = append(list, v.TaskId)
  1040. if v.State != TASK_REWARD_STATE_REWARD {
  1041. isOver = true
  1042. break
  1043. }
  1044. }
  1045. }
  1046. }
  1047. if !isOver && !isGroupOver {
  1048. //for _, v := range list {
  1049. // delete(this.mapHardTaskList, v)
  1050. //}
  1051. //delete(this.mapGroupHardTaskList, groupId)
  1052. //最后一组任务不删除
  1053. if len(this.mapGroupHardTaskList) == 1 {
  1054. if !this.AddHardTask() {
  1055. return
  1056. }
  1057. }
  1058. for _, v := range list {
  1059. task := this.getTaskHardData(v)
  1060. task.HardState = TASK_REWARD_STATE_DELETE
  1061. this.saveTaskDataList = append(this.saveTaskDataList, task)
  1062. delete(this.mapHardTaskList, v)
  1063. }
  1064. task2 := this.getGroupTaskHardData(groupId)
  1065. if task2 != nil {
  1066. task2.HardState = TASK_REWARD_STATE_DELETE
  1067. }
  1068. this.saveTaskDataList = append(this.saveTaskDataList, task2)
  1069. delete(this.mapGroupHardTaskList, groupId)
  1070. this.SetDirty(true)
  1071. util.InfoF("uuid:%v delete groupId2:%v hard task:%v ", this.role.GetUUid(), groupId, list)
  1072. }
  1073. }
  1074. // 来自上一个任务的继承数值preTaskCount
  1075. func (this *RoleTask) genNextTask(nextTaskId uint32, preTaskCount int32) *serverproto.TaskData {
  1076. convertTaskData, ok := model.ConvertTaskList[nextTaskId]
  1077. if ok && convertTaskData.TaskType == model.TASK_TYPE_MAIN {
  1078. util.DebugF("uid=%v, genNextTask next task=%v", this.role.GetUUid(), nextTaskId)
  1079. //接取下个任务后自动判断
  1080. nextTaskInfo := &serverproto.TaskData{
  1081. TaskId: nextTaskId,
  1082. State: TASK_REWARD_STATE_NONE,
  1083. //BeginTime: util.GetTimeMilliseconds(),
  1084. TaskType: convertTaskData.TaskType,
  1085. }
  1086. for key := range convertTaskData.Condition {
  1087. if _, ok := this.taskTypeList[key]; !ok {
  1088. this.taskTypeList[key] = set.New(set.NonThreadSafe)
  1089. }
  1090. this.taskTypeList[key].Add(nextTaskId)
  1091. }
  1092. TaskConditionCheck(this.role, nextTaskInfo, serverproto.TaskType_NONE,
  1093. convertTaskData.Condition, preTaskCount, false)
  1094. this.SetDirty(true)
  1095. //save db
  1096. this.saveTaskDataList = append(this.saveTaskDataList, nextTaskInfo)
  1097. this.loadTaskData.TaskList = append(this.loadTaskData.TaskList, nextTaskInfo)
  1098. this.mainTaskList[nextTaskInfo.TaskId] = nextTaskInfo
  1099. return nextTaskInfo
  1100. }
  1101. return nil
  1102. }
  1103. func (this *RoleTask) InitJobTask() {
  1104. for _, data := range this.jobCondition {
  1105. if data.JobFushState > 0 {
  1106. continue
  1107. }
  1108. heroData := this.role.roleHero.GetHero(data.HeroId)
  1109. if heroData == nil {
  1110. continue
  1111. }
  1112. data.JobFushState = 1
  1113. dbIndex := model.GetJobChangeKey(this.role.roleHero.IsMainHero(data.HeroId), heroData.ConfigId)
  1114. db, ok := model.DBJobChange[dbIndex]
  1115. if !ok {
  1116. util.InfoF("ChangeJob JobCfgLoader data not found cfgid=%v, %v", heroData.ConfigId, dbIndex)
  1117. return
  1118. }
  1119. //if len(data.TaskList) == len(db.ChangeCond) {
  1120. // continue
  1121. //}
  1122. data.TaskList = data.TaskList[0:0]
  1123. for _, condData := range db.ChangeCond { //遍历当前可转职任务
  1124. var taskProgressType []*serverproto.TaskProgressType
  1125. condId, _ := model.Str2Num(condData)
  1126. condCfg, condOk := serverproto.ConditionCfgLoader[int32(condId)]
  1127. if !condOk || len(condCfg.Condition[0]) < 2 {
  1128. util.ErrorF("ChangeJob ConditionCfgLoader data not found cfgid=%v", condId)
  1129. continue
  1130. }
  1131. //一个任务ID之对应一个条件,所以直接去第一个参数作为TaskType
  1132. taskInfo := strings.Split(condCfg.Condition[0], ":")
  1133. taskType, _ := model.Str2Num(taskInfo[0])
  1134. taskProgressType = append(taskProgressType, &serverproto.TaskProgressType{
  1135. Key: int32(taskType),
  1136. Value: 0,
  1137. })
  1138. data.TaskList = append(data.TaskList, &serverproto.TaskData{
  1139. TaskId: uint32(condId),
  1140. Progress: taskProgressType,
  1141. })
  1142. }
  1143. //刷新任务状态
  1144. for _, task := range data.TaskList {
  1145. for _, data := range task.Progress {
  1146. TaskMagCheck(this.role, serverproto.TaskType(data.Key), 0)
  1147. }
  1148. }
  1149. }
  1150. this.SetDirty(true)
  1151. }
  1152. func (this *RoleTask) GetChangeJobTask(heroId int32, changeType int32, bNtf bool) {
  1153. //获取转职的伙伴数据
  1154. heroData := this.role.roleHero.GetHero(heroId)
  1155. if heroData == nil {
  1156. util.InfoF("uid=%v ChangeJob game hero not found", this.role.GetUUid())
  1157. return
  1158. }
  1159. //获取可转职职业ID列表
  1160. var changeCondition []string
  1161. if this.role.roleHero.IsMainHero(heroId) {
  1162. jobCfg, jobOk := serverproto.JobCfgLoader[heroData.ConfigId]
  1163. if !jobOk {
  1164. util.InfoF("ChangeJob JobCfgLoader data not found cfgid=%v", heroData.ConfigId)
  1165. return
  1166. }
  1167. changeCondition = jobCfg.ChangeCond
  1168. } else {
  1169. jobCfg, jobOk := serverproto.ParterCfgLoader[heroData.ConfigId]
  1170. if !jobOk {
  1171. util.InfoF("ChangeJob ParterCfgLoader data not found cfgid=%v", heroData.ConfigId)
  1172. return
  1173. }
  1174. changeCondition = jobCfg.ChangeCond
  1175. }
  1176. //是否有这个伙伴的转职任务列表
  1177. var newJobCondition serverproto.ChangeJob
  1178. var bFind bool = false
  1179. for _, data := range this.jobCondition {
  1180. if data.HeroId == heroId {
  1181. newJobCondition = *data
  1182. bFind = true
  1183. }
  1184. }
  1185. if !bFind {
  1186. this.jobCondition = append(this.jobCondition, &newJobCondition)
  1187. }
  1188. //清空当前的所有任务list
  1189. if len(newJobCondition.TaskList) > 0 {
  1190. newJobCondition.TaskList = newJobCondition.TaskList[0:0]
  1191. }
  1192. newJobCondition.HeroId = heroId
  1193. //小任务加入任务列表
  1194. for _, condData := range changeCondition { //遍历当前可转职任务
  1195. var taskProgressType []*serverproto.TaskProgressType
  1196. condId, _ := model.Str2Num(condData)
  1197. condCfg, condOk := serverproto.ConditionCfgLoader[int32(condId)]
  1198. if !condOk || len(condCfg.Condition[0]) < 2 {
  1199. util.ErrorF("ChangeJob ConditionCfgLoader data not found cfgid=%v", condId)
  1200. continue
  1201. }
  1202. //一个任务ID之对应一个条件,所以直接去第一个参数作为TaskType
  1203. taskInfo := strings.Split(condCfg.Condition[0], ":")
  1204. taskType, _ := model.Str2Num(taskInfo[0])
  1205. taskProgressType = append(taskProgressType, &serverproto.TaskProgressType{
  1206. Key: int32(taskType),
  1207. Value: 0,
  1208. })
  1209. newJobCondition.TaskList = append(newJobCondition.TaskList, &serverproto.TaskData{
  1210. TaskId: uint32(condId),
  1211. Progress: taskProgressType,
  1212. })
  1213. }
  1214. //如果是替换职业,并且,
  1215. if len(newJobCondition.TaskList) > 0 {
  1216. for _, task := range newJobCondition.TaskList {
  1217. for _, data := range task.Progress {
  1218. //转职条件处理
  1219. this.jobConditionCheck(serverproto.TaskType(data.Key), 0)
  1220. }
  1221. }
  1222. }
  1223. if bNtf {
  1224. this.jobConditionChangeNtf([]int32{heroId})
  1225. }
  1226. this.SetDirty(true)
  1227. }
  1228. func (this *RoleTask) jobConditionCheck(taskType serverproto.TaskType, count int32) {
  1229. this.heroConditionCheck(taskType, count)
  1230. }
  1231. func (this *RoleTask) heroConditionCheck(taskType serverproto.TaskType, count int32) {
  1232. roleData := this.role.GetRoleBase().RoleData()
  1233. if roleData == nil {
  1234. return
  1235. }
  1236. //遍历查找
  1237. var changedIds []int32
  1238. for _, data := range this.jobCondition {
  1239. var bChanged bool = false
  1240. for _, subData := range data.TaskList {
  1241. taskInfo := subData.Progress[0]
  1242. cond, ok := model.ChangeJobCond[int32(subData.TaskId)]
  1243. if !ok {
  1244. util.InfoF("heroConditionCheck ChangeJobCond data not found taskid=%v", subData.TaskId)
  1245. continue
  1246. }
  1247. if taskInfo.Key != int32(taskType) || taskInfo.State == 1 { //不是条件任务。或者已经完成
  1248. continue
  1249. }
  1250. bChanged = TaskConditionCheck(this.role, subData,
  1251. taskType, cond.Condition, count, false)
  1252. }
  1253. if bChanged {
  1254. changedIds = append(changedIds, data.HeroId)
  1255. this.SetDirty(true)
  1256. }
  1257. }
  1258. if len(changedIds) > 0 {
  1259. this.jobConditionChangeNtf(changedIds)
  1260. }
  1261. }
  1262. //------- 头像解锁条件 ----------------------------------
  1263. func (this *RoleTask) OnlineCheckNewHead() {
  1264. //上线检查头像是否有更新
  1265. headVersion, ok := serverproto.GlobalCfgLoader[int32(serverproto.GlobalType_Global_Cur_Head_Version)]
  1266. if !ok {
  1267. util.ErrorF(" headpic config not found")
  1268. return
  1269. }
  1270. if this.role.GetRoleBase().roleBase.Head_Info.HeadVersion >= headVersion.IVal {
  1271. util.ErrorF("headpic version error version=%v val=%v", this.role.GetRoleBase().roleBase.Head_Info.HeadVersion, headVersion.IVal)
  1272. return
  1273. }
  1274. //遍历新的头像
  1275. for _, data := range serverproto.HeadPortraitCfgLoader {
  1276. //老版本已经加载过
  1277. if this.role.GetRoleBase().roleBase.Head_Info.HeadVersion >= data.HeadLoadId {
  1278. continue
  1279. }
  1280. //性别不一致
  1281. if this.role.GetRoleBase().GetRoleSex() != data.HeadPortraitSex {
  1282. continue
  1283. }
  1284. //没有解锁要求,默认解锁激活
  1285. if data.UnlockCondition == 0 {
  1286. this.role.GetRoleBase().roleBase.Head_Info.HeadList = append(this.role.GetRoleBase().roleBase.Head_Info.HeadList, data.HeadPortraitId)
  1287. continue
  1288. }
  1289. //后续版本的头像都加入到条件列表中来
  1290. condCfg, condOk := model.ChangeJobCond[data.UnlockCondition]
  1291. if !condOk {
  1292. util.ErrorF("headpic ChangeJobCond not find condition=%v", data.UnlockCondition)
  1293. continue
  1294. }
  1295. //把当前头像加入到
  1296. var headCond serverproto.HeadCond
  1297. headCond.HeadId = data.HeadPortraitId
  1298. var taskData serverproto.TaskData
  1299. taskData.TaskId = uint32(data.UnlockCondition)
  1300. for key, _ := range condCfg.Condition {
  1301. taskData.Progress = append(taskData.Progress, &serverproto.TaskProgressType{
  1302. Key: key,
  1303. Value: 0,
  1304. State: 0,
  1305. })
  1306. }
  1307. headCond.TaskList = append(headCond.TaskList, &taskData)
  1308. this.roleHeadCond.Conditions = append(this.roleHeadCond.Conditions, &headCond)
  1309. }
  1310. //设置当前最新版本
  1311. this.role.GetRoleBase().roleBase.Head_Info.HeadVersion = headVersion.IVal
  1312. this.SetDirty(true)
  1313. }
  1314. // 检查头像是否解锁
  1315. func (this *RoleTask) CheckHeadUnlocked(headId int32) bool {
  1316. for _, data := range this.roleHeadCond.Conditions {
  1317. if data.HeadId != headId {
  1318. continue
  1319. }
  1320. for _, taskData := range data.TaskList {
  1321. for _, taskInfo := range taskData.Progress {
  1322. if taskInfo.State == 0 {
  1323. return false
  1324. }
  1325. }
  1326. }
  1327. }
  1328. return true
  1329. }
  1330. func (this *RoleTask) headConditionCheck(taskType serverproto.TaskType, count int32) {
  1331. this.headUnlockCheck(taskType, count)
  1332. }
  1333. func (this *RoleTask) headUnlockCheck(taskType serverproto.TaskType, count int32) {
  1334. //遍历查找
  1335. var bRet bool = false
  1336. for _, data := range this.roleHeadCond.Conditions {
  1337. for _, taskData := range data.TaskList {
  1338. if taskData.State == TASK_REWARD_STATE_REWARD {
  1339. continue
  1340. }
  1341. for _, taskInfo := range taskData.Progress {
  1342. cond, ok := model.ChangeJobCond[int32(taskData.TaskId)]
  1343. if !ok {
  1344. util.InfoF("headUnlockCheck ChangeJobCond not found taskid=%v", taskData.TaskId)
  1345. continue
  1346. }
  1347. if taskInfo.Key != int32(taskType) || taskInfo.State == 1 { //不是条件任务。或者已经完成
  1348. continue
  1349. }
  1350. bRet = TaskConditionCheck(this.role, taskData,
  1351. taskType, cond.Condition, count, false)
  1352. if !bRet {
  1353. continue
  1354. }
  1355. this.SetDirty(true)
  1356. }
  1357. }
  1358. }
  1359. if bRet == true {
  1360. //通知客户端
  1361. // this.headConditionChangeNtf()
  1362. }
  1363. }