TaskDataNew.lua 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. local TaskDataNew = class("TaskDataNew", require("DataBase"))
  2. local TaskItemDataNew = require("TaskItemDataNew")
  3. local ProtocalDataNormal = require("ProtocalDataNormal")
  4. function TaskDataNew:ctor()
  5. self._data = nil
  6. self._dayTaskMessage = {};
  7. self._weekTaskMessage = {};
  8. self._mainButton = nil;
  9. self._refreshImmediately = true;
  10. self.dailyTaskEndTime = 0
  11. self.weeklyTaskEndTime = 0
  12. end
  13. function TaskDataNew:RegisterNetEvents()
  14. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_GET_TASK_REWARD_ACK, self.SCGetTaskRewardAck, self)
  15. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_GET_TASK_SCORE_REWARD_ACK, self.CSGetTaskScoreRewardAck, self)
  16. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_TASK_CHANGE_NTF,self.SCTaskChangeNtf,self)
  17. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_HERO_CONDITIN_DATA_NTF, function(data)
  18. self:RefreshChangeJobTaskData(data)
  19. end)
  20. end
  21. function TaskDataNew:Clear()
  22. self._data = nil
  23. self._dayTaskMessage = {}
  24. self._weekTaskMessage = {}
  25. self._mainButton = nil
  26. self._refreshImmediately = true
  27. self.dailyTaskEndTime = 0
  28. self.weeklyTaskEndTime = 0
  29. end
  30. function TaskDataNew:Destroy()
  31. if self.Clear then
  32. self:Clear()
  33. end
  34. self:UnRegisterNetEvents()
  35. end
  36. function TaskDataNew:UnRegisterNetEvents()
  37. end
  38. --设置当前处在那个主按钮
  39. function TaskDataNew:SetMainButton(_buttonType)
  40. self._mainButton = _buttonType;
  41. end
  42. function TaskDataNew:GetMainButton()
  43. return self._mainButton;
  44. end
  45. --[[
  46. self._data = {
  47. [Enum.TaskTag.Daily] = {TaskItemDataNew}
  48. [Enum.TaskTag.Weekly] = {TaskItemDataNew}
  49. [Enum.TaskTag.Main] = {TaskItemDataNew}
  50. }
  51. self._dayTaskMessage = {
  52. _beginTime = **
  53. _score = ***
  54. _rewardList = {}
  55. }
  56. ]]--
  57. --add是不是增量增加
  58. function TaskDataNew:CreateTaskByTable(_table, _add)
  59. if not _add or nil == self._data then
  60. self._data = {
  61. [Enum.TaskTag.Daily] = {},
  62. [Enum.TaskTag.Weekly] = {},
  63. [Enum.TaskTag.Main] = {},
  64. [Enum.TaskTag.Hard] = {},
  65. [Enum.TaskTag.HardGroup] = {},
  66. [Enum.TaskTag.Hard_S] = {},
  67. [Enum.TaskTag.HardGroup_S] = {},
  68. _changeJobTaskData = nil,
  69. _headCond = {},
  70. _heroCond = {},
  71. };
  72. end
  73. for _k, _v in ipairs(_table) do
  74. local _taskItemData = TaskItemDataNew:new();
  75. _taskItemData:RefreshTaskItem(_v);
  76. if _taskItemData._cfgData then
  77. local _taskType = _taskItemData._taskType
  78. local ls = self._data[_taskType]
  79. if ls then
  80. table.insert(ls, _taskItemData)
  81. else
  82. LogError('task is error ' .. tostring(_taskType) .. ' ' .. tostring(_taskItemData._id))
  83. end
  84. end
  85. end
  86. self:GetActRewardInCfg();
  87. end
  88. --登录之初整理一下玩家的所有当前任务的信息
  89. function TaskDataNew:InitRoleTask(_data)
  90. self.dailyTaskEndTime = tonumber(tostring(_data.latest5_hour_time/1000))
  91. self.weeklyTaskEndTime = tonumber(tostring(_data.latest_week5_hour_time/1000))
  92. local _taskList = _data.task_list;
  93. self._data = {};
  94. self:CreateTaskByTable(_taskList);
  95. self:SortTask(Enum.TaskTag.Daily);
  96. self:SortTask(Enum.TaskTag.Weekly);
  97. self:SortTask(Enum.TaskTag.Main);
  98. self:RecordScoreMessage(self._dayTaskMessage, _data.daily_task_score, Enum.TaskTag.Daily);
  99. self:RecordScoreMessage(self._weekTaskMessage, _data.week_task_score, Enum.TaskTag.Weekly);
  100. local _dayBeginTime, _weekBeginTime = 0, 0;
  101. local _dayTasks, _weekTasks = self._data[Enum.TaskTag.Daily], self._data[Enum.TaskTag.Weekly];
  102. if _dayTasks and _dayTasks[1] then
  103. _dayBeginTime = _dayTasks[1]._beginTime
  104. else
  105. LogError("Task Error :No day task!" .. Inspect(_data))
  106. end
  107. if _weekTasks and _weekTasks[1] then
  108. _weekBeginTime = _weekTasks[1]._beginTime
  109. else
  110. LogError("Task Error :No week task!" .. Inspect(_data))
  111. end
  112. self._dayTaskMessage._beginTime = _dayBeginTime;
  113. self._weekTaskMessage._beginTime = _weekBeginTime;
  114. self:RefreshChangeJobTaskData(_data);
  115. self:RefreshRedPoint();
  116. end
  117. --对任务信息进行排序
  118. function TaskDataNew:SortTask(_taskType)
  119. if not self._data[_taskType] then return; end
  120. table.sort(self._data[_taskType], function (a, b)
  121. local _sortGotA = math.fmod((a._got + 1), 3);
  122. local _sortGotB = math.fmod((b._got + 1), 3);
  123. if _sortGotA > _sortGotB then
  124. return true;
  125. elseif _sortGotA < _sortGotB then
  126. return false;
  127. else
  128. if a._progressNum > b._progressNum then
  129. return true;
  130. elseif a._progressNum < b._progressNum then
  131. return false
  132. else
  133. return a._id < b._id;
  134. end
  135. end
  136. end);
  137. if _taskType == Enum.TaskTag.Main then
  138. self:RemoveGotMainTask();
  139. end
  140. end
  141. --移除已经领取的主线任务
  142. function TaskDataNew:RemoveGotMainTask()
  143. local _mainTaskList = self._data[Enum.TaskTag.Main];
  144. for _i = #_mainTaskList, 1, -1 do
  145. if _mainTaskList[_i]._state == Enum.TaskState.GotAndHas then --已经领取过了
  146. table.remove(_mainTaskList, _i);
  147. end
  148. end
  149. end
  150. --获取活跃度奖励得表格数据,注意:主线任务是没有活跃度这个概念得
  151. function TaskDataNew:GetActRewardInCfg()
  152. if not self._dayTaskMessage._rewardList and not self._weekTaskMessage._rewardList then
  153. self._dayTaskMessage._rewardList = {}
  154. self._weekTaskMessage._rewardList = {}
  155. local _actRewardCfg = ManagerContainer.CfgMgr:GetActRewardCfg();
  156. for _k, _v in pairs(_actRewardCfg) do
  157. if _v.ActiveType == Enum.TaskTag.Daily then
  158. table.insert(self._dayTaskMessage._rewardList, {
  159. _data = _v, --表格中的信息
  160. _state = false, --领取状态,true--已领取;false--未领取
  161. });
  162. elseif _v.ActiveType == Enum.TaskTag.Weekly then
  163. table.insert(self._weekTaskMessage._rewardList, {
  164. _data = _v, --表格中的信息
  165. _state = false, --领取状态
  166. });
  167. end
  168. end
  169. self:SortRewardList(self._dayTaskMessage._rewardList);
  170. self:SortRewardList(self._weekTaskMessage._rewardList);
  171. end
  172. end
  173. --对表格中的奖励信息进行排序
  174. function TaskDataNew:SortRewardList(_rewardList)
  175. table.sort(_rewardList, function(a, b)
  176. return a._data.Active < b._data.Active;
  177. end)
  178. end
  179. --记录服务器给过来的任务的活跃度信息
  180. function TaskDataNew:RecordScoreMessage(_targetMessage ,_scoreMessage, _type)
  181. if _scoreMessage == nil then
  182. _targetMessage._score = 0;
  183. return
  184. end
  185. _targetMessage._score = _scoreMessage.value or 0;
  186. for _i = 1, #_targetMessage._rewardList do
  187. local _move = (_type - 1) * 5 + _i; --这个是任务奖励表格中的id的操作
  188. local _judgeNum = Bit.lshift(1, _move);
  189. local _stateNum = CommonUtil.And(_judgeNum, _scoreMessage.key);
  190. _targetMessage._rewardList[_i]._state = _stateNum > 0;
  191. end
  192. end
  193. --找到队对应的任务对象
  194. function TaskDataNew:GetTaskItemData(_id, _taskType)
  195. if nil == self._data or nil == self._data[_taskType] then
  196. return nil;
  197. end
  198. for _k, _v in ipairs(self._data[_taskType]) do
  199. if _v._id == _id then
  200. return _v;
  201. end
  202. end
  203. return nil
  204. end
  205. --获取不同类型的任务
  206. function TaskDataNew:GetTasksDataByType(_type)
  207. return self._data[_type];
  208. end
  209. --获取任务的活跃度信息
  210. function TaskDataNew:GetTaskMessage(_type)
  211. if _type == Enum.TaskTag.Daily then
  212. return self._dayTaskMessage;
  213. elseif _type == Enum.TaskTag.Weekly then
  214. return self._weekTaskMessage;
  215. else
  216. LogError("这种类型暂时没有活跃度信息:" .. tostring(_type));
  217. end
  218. end
  219. --开启任务面板
  220. function TaskDataNew:OpenTaskPanel()
  221. local _openTaskTag = self:RefreshRedPoint();
  222. ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UITaskNew, {
  223. openTaskTag = _openTaskTag,
  224. })
  225. end
  226. --刷新红点
  227. function TaskDataNew:RefreshRedPoint()
  228. local _dailyCanGet, _weeklyCanGet, _mainLinCanGet,_hardCanGet,_hardGroupCanGet,_hard_S_CanGet,_hardGroup_S_CanGet;
  229. _dailyCanGet = self:JudgeCanGetByType(Enum.TaskTag.Daily);
  230. _weeklyCanGet = self:JudgeCanGetByType(Enum.TaskTag.Weekly);
  231. _mainLinCanGet = self:JudgeCanGetByType(Enum.TaskTag.Main);
  232. _hardCanGet = self:JudgeCanGetByType(Enum.TaskTag.Hard)
  233. _hardGroupCanGet = self:JudgeCanGetByType(Enum.TaskTag.HardGroup)
  234. _hard_S_CanGet = self:JudgeCanGetByType(Enum.TaskTag.Hard_S)
  235. _hardGroup_S_CanGet = self:JudgeCanGetByType(Enum.TaskTag.HardGroup_S)
  236. local _openTaskTag = Enum.TaskTag.Daily;
  237. if _dailyCanGet then
  238. elseif _weeklyCanGet then
  239. _openTaskTag = Enum.TaskTag.Weekly;
  240. elseif _mainLinCanGet then
  241. _openTaskTag = Enum.TaskTag.Main;
  242. end
  243. local _canGetTask = _dailyCanGet or _weeklyCanGet or _mainLinCanGet
  244. local _canGetHardTask = _hardCanGet or _hardGroupCanGet
  245. local _canGetHard_S_Task = _hard_S_CanGet or _hardGroup_S_CanGet
  246. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.Task, _canGetTask);
  247. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.HardTask, _canGetHardTask);
  248. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.Hard_S_Task, _canGetHard_S_Task);
  249. return _openTaskTag;
  250. end
  251. --判断是否有可领取的任务
  252. function TaskDataNew:JudgeCanGetByType(_type)
  253. local _allData = self._data[_type];
  254. for _i = 1, #_allData do
  255. if _allData[_i]:JudgeCanGet() then
  256. return true;
  257. end
  258. end
  259. if _type == Enum.TaskTag.Daily then
  260. local _canGet = self:JudgeRewardList(self._dayTaskMessage);
  261. if _canGet then return true; end
  262. elseif _type == Enum.TaskTag.Weekly then
  263. local _canGet = self:JudgeRewardList(self._weekTaskMessage);
  264. if _canGet then return true; end
  265. end
  266. return false;
  267. end
  268. --判断活跃度奖励
  269. function TaskDataNew:JudgeRewardList(_message)
  270. for _i = 1, #_message._rewardList do
  271. local _data = _message._rewardList[_i];
  272. if _data._data.Active <= _message._score and not _data._state then
  273. return true;
  274. end
  275. end
  276. return false;
  277. end
  278. --判断某一级别的活跃度是否可领取
  279. function TaskDataNew:JudgeRewardByIndex(_type, _index)
  280. local _message = nil;
  281. if _type == Enum.TaskTag.Daily then
  282. _message = self._dayTaskMessage;
  283. elseif _type == Enum.TaskTag.Weekly then
  284. _message = self._weekTaskMessage;
  285. else
  286. return false
  287. end
  288. if _index <= #_message._rewardList then
  289. local _data = _message._rewardList[_index];
  290. if _data._data.Active <= _message._score and not _data._state then
  291. return true;
  292. end
  293. else
  294. LogError("index超出边界:" .. tostring(_index));
  295. LogError(Inspect(_message));
  296. end
  297. return false;
  298. end
  299. --刷新可转职业条件
  300. function TaskDataNew:RefreshChangeJobTaskData(_data)
  301. if not self._data then return end
  302. if not self._data._changeJobTaskData then
  303. self._data._changeJobTaskData = ProtocalDataNormal.ParseRoleTaskData(_data);
  304. else
  305. if _data.condition then
  306. for _, v in pairs(_data.condition) do
  307. self._data._changeJobTaskData.condition[v.hero_id] = ProtocalDataNormal.ParseTaskDataList(v.task_list)
  308. end
  309. end
  310. end
  311. ManagerContainer.RedPointMgr.HeroRPCtr:RoleTransferRedPointNotify()
  312. end
  313. --获取专职的任务数据
  314. function TaskDataNew:GetChangeJobTaskData(_heroId, _conId)
  315. if self._data == nil then return end
  316. if self._data._changeJobTaskData == nil then return end
  317. if self._data._changeJobTaskData.condition == nil then return end
  318. if self._data._changeJobTaskData.condition[_heroId] == nil then return end
  319. local _data = self._data._changeJobTaskData.condition[_heroId][_conId];
  320. return _data;
  321. end
  322. --请求服务器发放任务奖励
  323. function TaskDataNew:CSGetTaskRewardReq(_id)
  324. local _req = {
  325. task_id = _id;
  326. };
  327. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_GET_TASK_REWARD_REQ, _req);
  328. self:ReportTask(_id, true)
  329. end
  330. function TaskDataNew:ReportTask(_id, success)
  331. if not SDKMgr.Instance:IsReportAction() then
  332. return
  333. end
  334. if _id == 800001 then
  335. local datas = System.Collections.Generic.Dictionary_object_object()
  336. datas:Add('event', 'mj_maintask_clothing')
  337. datas:Add('is_achieve', (success and 1 or 0))
  338. SDKMgr.Instance:ReportAction(datas)
  339. else
  340. local _taskItemData = self:GetTaskItemData(_id, Enum.TaskTag.Main)
  341. if _taskItemData then
  342. local datas = System.Collections.Generic.Dictionary_object_object()
  343. datas:Add('event', 'mj_maintask')
  344. datas:Add('is_achieve', (success and 1 or 0))
  345. SDKMgr.Instance:ReportAction(datas)
  346. return
  347. end
  348. _taskItemData = self:GetTaskItemData(_id, Enum.TaskTag.Daily)
  349. if _taskItemData then
  350. local datas = System.Collections.Generic.Dictionary_object_object()
  351. datas:Add('event', 'mj_daily_rewards')
  352. datas:Add('is_achieve', (success and 1 or 0))
  353. SDKMgr.Instance:ReportAction(datas)
  354. end
  355. end
  356. end
  357. --领取任务奖励之后的返回
  358. function TaskDataNew:SCGetTaskRewardAck(_data)
  359. self:JudgeAck(_data);
  360. end
  361. --请求服务器下发活跃度的奖励
  362. function TaskDataNew:CSGetTaskScoreRewardReq(_type, _index)
  363. LogError("-----CSGetTaskScoreRewardReq-----------"..Inspect({_type,_index}))
  364. local _req = {
  365. reward_type = _type,
  366. reward_idx = _index,
  367. };
  368. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_GET_TASK_SCORE_REWARD_REQ, _req);
  369. end
  370. function TaskDataNew:CSGetTaskScoreRewardAck(_data)
  371. self:JudgeAck(_data);
  372. end
  373. --任务奖励和活跃度奖励的ack内容是一样的,都调用这里吧
  374. function TaskDataNew:JudgeAck(_data)
  375. if _data.error ~= Enum.NetErrorCode.ERROR_OK then
  376. -- LogError("领取任务奖励失败,错误码:" .. tostring(_data.error));
  377. return
  378. end
  379. if _data.item_list and #_data.item_list > 0 then
  380. local _rewards = {};
  381. for _i = 1, #_data.item_list do
  382. local _itemData = _data.item_list[_i];
  383. table.insert(_rewards, {
  384. cfgId = _itemData.key;
  385. num = _itemData.value;
  386. })
  387. end
  388. ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIPOPGot,{rewards = _rewards})
  389. end
  390. end
  391. --服务器主动推送的任务状态改变之后的信息
  392. function TaskDataNew:SCTaskChangeNtf(_data)
  393. if self._data == nil then --如果服务器在登录得到所有的任务之前发了这条推送的话,不用记录这个消息,因为后续还会发送一个总的消息
  394. return;
  395. end
  396. if _data.latest5_hour_time ~= nil and _data.latest5_hour_time > 0 then
  397. self.dailyTaskEndTime = tonumber(tostring(_data.latest5_hour_time/1000))
  398. end
  399. if _data.latest_week5_hour_time ~= nil and _data.latest_week5_hour_time > 0 then
  400. self.weeklyTaskEndTime = tonumber(tostring(_data.latest_week5_hour_time/1000))
  401. end
  402. local _newTaskList = {};
  403. for _k, _v in pairs(_data.task_change_list) do
  404. local _taskItemData = self:GetTaskItemData(_v.task_id, _v.task_type);
  405. if _taskItemData then
  406. _taskItemData:RefreshTaskItem(_v);
  407. else
  408. table.insert(_newTaskList, _v);
  409. end
  410. end
  411. if #_newTaskList > 0 then
  412. self:CreateTaskByTable(_newTaskList, true);
  413. end
  414. self:SortTask(Enum.TaskTag.Daily);
  415. self:SortTask(Enum.TaskTag.Weekly);
  416. self:SortTask(Enum.TaskTag.Main);
  417. self:RecordScoreMessage(self._dayTaskMessage, _data.daily_task_score, Enum.TaskTag.Daily);
  418. self:RecordScoreMessage(self._weekTaskMessage, _data.week_task_score, Enum.TaskTag.Weekly);
  419. if self._refreshImmediately then
  420. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_TASK_CHANGE);
  421. else
  422. self._refreshImmediately = true;
  423. end
  424. self:RefreshRedPoint();
  425. end
  426. return TaskDataNew