TaskDataNew.lua 16 KB

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