TaskDataNew.lua 16 KB

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