源战役客户端
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

936 rindas
34 KiB

pirms 1 mēnesi
  1. --[[
  2. @description:
  3. ]]
  4. require("game.dialogue.DialogueModel")
  5. require("game.dialogue.DialogueViewNew")
  6. require("game.dialogue.DialogueEvent")
  7. require("game.dialogue.vo.NpcDialogVo")
  8. require("game.dialogue.vo.DialogueNodeVo")
  9. -- require("game.dialogue.vo.DialogueTaskVo")
  10. require("game.dialogue.DialogueTypeConst")
  11. require("game.dialogue.DialogLang")
  12. require("game.dialogue.DialogueTaskBtnItem") -- 对话界面的任务item
  13. require("game.dialogue.DialogueChooseMessage") -- 对话选项提示
  14. DialogueController=DialogueController or BaseClass(BaseController)
  15. function DialogueController:__init()
  16. DialogueController.Instance=self
  17. self.dialogueView = nil
  18. self.dialogueModel = DialogueModel:getInstance()
  19. self.taskModel = TaskModel:getInstance()
  20. self.dialogueModel.autoIntoCopy = 0
  21. self:registerAllProtocals()
  22. self:addAllEvents()
  23. end
  24. function DialogueController:__delete()
  25. end
  26. function DialogueController:registerAllProtocals()
  27. self:RegisterProtocal(12101, "response12101") --获取指定npc关联的任务列表
  28. self:RegisterProtocal(12102, "response12102") --获取指定任务的对话列表
  29. self:RegisterProtocal(30003, "response30003") --接受任务
  30. self:RegisterProtocal(30004, "response30004") --完成任务
  31. self:RegisterProtocal(30007, "response30007") --任务对话事件
  32. self:RegisterProtocal(30008, "response30008")--任务探索事件件
  33. self:RegisterProtocal(30009, "response30009")--触发悬赏任务和社团周任务
  34. self:RegisterProtocal(30010, "response30010")--悬赏任务和社团周任务进度
  35. self:RegisterProtocal(30011, "response30011")--请求赏金和社团任务奖励,奖励是规则算出来的,所以不读配置
  36. self:RegisterProtocal(30012, "response30012")--上一个完成的任务id
  37. self:RegisterProtocal(30015, "response30015")--任务请求完成进度
  38. --切换活动镜像场景
  39. local function onSceneLoadViewComplete( )
  40. --如果是在副本里面,则等待
  41. if not self.dialogueModel.is_show_main_task_tips_flag and not SceneManager:getInstance():IsMirrorScene() and self.dialogueModel.is_delay_show_main_task_tips then
  42. local task_id = self.dialogueModel.is_delay_show_main_task_tips
  43. self.taskModel.now_task_id = nil
  44. GlobalEventSystem:Fire(EventName.STOP_AUTO_DO_TASK) --停止自动任务
  45. local function ok_callback()
  46. GlobalEventSystem:Fire(EventName.CLOSE_ALL_VIEW)
  47. self.taskModel.tip_new_main_line = task_id
  48. GuideController.Instance:TriggerHelper(GuideModel.TASK_TRIGGER_TYPE, 9993150002)
  49. self.taskModel:Fire(TaskEvent.SHOW_NEW_MAIN_LINE_TIP)
  50. end
  51. local function cancle_callback()
  52. local next_task = self.taskModel:GetTaskByType(TaskType.BOUNTY_LINE)
  53. if next_task then
  54. self.taskModel.now_task_id = next_task.id
  55. else
  56. self.taskModel.now_task_id = task_id
  57. end
  58. self.taskModel:SetTaskAutoFlag(true)
  59. GlobalEventSystem:Fire(EventName.FORCE_TO_DO_TASK)
  60. end
  61. local str = "任务指引\n\n有新的主线任务,赶紧去看看吧!"
  62. Alert.show(str, Alert.Type.Two, ok_callback, cancle_callback, "确定", "继续任务")
  63. self.dialogueModel.is_show_main_task_tips_flag = true
  64. self.dialogueModel.is_delay_show_main_task_tips = false
  65. end
  66. end
  67. GlobalEventSystem:Bind(EventName.SCENE_LOAD_VIEW_COMPLETE, onSceneLoadViewComplete)
  68. --新手期,跑环任务时升级,触发主线推荐
  69. local function onChangeLevel(level)
  70. if not self.dialogueModel.is_show_main_task_tips_flag and Config.ConfigTaskEffect.NewMainLineTipLvMin <= level and RoleManager.Instance.mainRoleInfo.level <= level then
  71. local cur_task = self.taskModel:GetCurTask()
  72. if cur_task and cur_task.type == TaskType.BOUNTY_LINE then
  73. local cur_main_task = self.taskModel:GetMainTask()
  74. if cur_main_task and level >= cur_main_task.level then
  75. self.taskModel.now_task_id = false
  76. GlobalEventSystem:Fire(EventName.STOP_AUTO_DO_TASK) --停止自动任务
  77. --如果是在副本里面,则等待
  78. if not SceneManager:getInstance():IsMirrorScene() then
  79. local function ok_callback()
  80. if cur_main_task then
  81. GlobalEventSystem:Fire(EventName.CLOSE_ALL_VIEW)
  82. self.taskModel.tip_new_main_line = cur_main_task.id
  83. GuideController.Instance:TriggerHelper(GuideModel.TASK_TRIGGER_TYPE, 9993150002)
  84. self.taskModel:Fire(TaskEvent.SHOW_NEW_MAIN_LINE_TIP)
  85. end
  86. end
  87. local function cancle_callback()
  88. self.taskModel:SetTaskAutoFlag(true)
  89. GlobalEventSystem:Fire(EventName.FORCE_TO_DO_TASK)
  90. end
  91. local str = "任务指引\n\n有新的主线任务,赶紧去看看吧!"
  92. Alert.show(str, Alert.Type.Two, ok_callback, cancle_callback, "确定", "继续任务")
  93. self.dialogueModel.is_show_main_task_tips_flag = true
  94. else
  95. self.dialogueModel.is_delay_show_main_task_tips = cur_main_task.id
  96. end
  97. end
  98. end
  99. end
  100. end
  101. RoleManager.Instance.mainRoleInfo:Bind(EventName.CHANGE_LEVEL, onChangeLevel)
  102. end
  103. function DialogueController:showDialogue(npcDialogVo)
  104. if self.dialogueView == nil then
  105. self.dialogueView = DialogueViewNew.New()
  106. end
  107. if self:IsShowCircleView(npcDialogVo) then
  108. local cfg1 = self.taskModel:GetTaskAcceptNpcConfig(TaskType.BOUNTY_LINE)
  109. local cfg2 = self.taskModel:GetTaskAcceptNpcConfig(TaskType.GUILD_LINE)
  110. --判断是否可领取奖励
  111. local task_type = false
  112. if npcDialogVo.npc_id == cfg1.npc_id then
  113. task_type = TaskType.BOUNTY_LINE
  114. elseif npcDialogVo.npc_id == cfg2.npc_id then
  115. task_type = TaskType.GUILD_LINE
  116. end
  117. GlobalEventSystem:Fire(EventName.OPEN_TASK_CIRCLE_TIPS, task_type, nil, npcDialogVo)
  118. return
  119. end
  120. if npcDialogVo and npcDialogVo.dialogList then
  121. self.dialogueView:Open(npcDialogVo)
  122. else
  123. if self.dialogueView:HasOpen() == true then
  124. self.dialogueView:Close()
  125. end
  126. end
  127. end
  128. function DialogueController:CloseDialoueView()
  129. if self.dialogueView and self.dialogueView:HasOpen() == true then
  130. self.dialogueView:Close()
  131. end
  132. end
  133. function DialogueController:addAllEvents()
  134. local function onRequestHandler(...)
  135. local args_list = {...}
  136. if args_list[1] == 30009 then
  137. self:SendFmtToGame(args_list[1], "c", args_list[2])
  138. elseif args_list[1] == 30010 or args_list[1] == 30019 then
  139. self:SendFmtToGame(args_list[1], "c", args_list[2])
  140. elseif args_list[1] == 30015 then
  141. self:SendFmtToGame(args_list[1], "cli", args_list[2], args_list[3], args_list[4])
  142. elseif args_list[1] == 30011 then
  143. self:SendFmtToGame(args_list[1], "i", args_list[2])
  144. else
  145. self:SendFmtToGame(args_list[1])
  146. end
  147. end
  148. self.dialogueModel:Bind(DialogueModel.REQUEST_CCMD_EVENT,onRequestHandler)
  149. local function taskFun(npcId, taskId, state)
  150. self:request12102(npcId, taskId, state)
  151. end
  152. self:Bind(DialogueModel.SELECT_TASK, taskFun )
  153. local function answer_fun(dialogueVo, dialogueNodeVo, selected,double)
  154. self:clickAnswerHandler(dialogueVo, dialogueNodeVo, selected,double)
  155. end
  156. self:Bind(DialogueModel.CLICK_ANSWER, answer_fun)
  157. local function showTask1(id)
  158. local level = RoleManager.Instance.mainRoleInfo.level
  159. -- if id == GuildModel.FEAST_NPC then
  160. -- --社团宴席npc, 请求是否可以采集
  161. -- GuildModel:getInstance():Fire(GuildModel.REQUEST_CCMD_EVENT, 40219)
  162. -- else
  163. if GetModuleIsOpen(500) and (id == EscortConst.START_NPC or id == EscortConst.KF_START_NPC) then --护送领取npc
  164. GlobalEventSystem:Fire(EscortConst.OPEN_ESCORT_VIEW, true)
  165. elseif GetModuleIsOpen(500) and (id == EscortConst.END_NPC or id == EscortConst.KF_END_NPC) and EscortModel:getInstance():IsEscortState( ) then --护送结算npc
  166. EscortModel:getInstance():Fire(EscortConst.REQUEST_SCMD_EVENT, 50003, 2)
  167. else
  168. self.dialogueModel.changeSceneClose=false
  169. self.dialogueModel.isAuto = false --发事件过来的要重置一下auto状态
  170. self:request12101(id)
  171. end
  172. end
  173. self:Bind(SceneEventType.SHOW_TASK, showTask1 )
  174. local function acceptTask1(id)
  175. self.dialogueModel.changeSceneClose=false
  176. self:acceptTask(id)
  177. end
  178. self:Bind(TaskEventType.SEND_TASK_ACCEPT, acceptTask1 )
  179. local function finishTask1(id, arr)
  180. self.dialogueModel.changeSceneClose=false
  181. self:finishTask(id, arr)
  182. end
  183. self:Bind(TaskEventType.SEND_TASK_FINISH, finishTask1 )
  184. local function taskQuest()
  185. self:request30008()
  186. end
  187. self:Bind(TaskEventType.TASK_QUEST, taskQuest)
  188. -- 超级强硬的关闭对话框
  189. local function OutCloseDialog()
  190. self:CloseDialoueView()
  191. self.dialogueModel.changeSceneClose=true
  192. self.taskModel.last_circle_tip_type = false
  193. --清理剧情软对话
  194. self.dialogueModel:CancelTaskTalkTimer()
  195. end
  196. GlobalEventSystem:Bind(SceneEventType.SCENE_CHANGED, OutCloseDialog)
  197. local close_fun = function ()
  198. self:CloseDialoueView()
  199. end
  200. GlobalEventSystem:Bind(SceneEventType.CLOSE_DIALOGUE_VIEW, close_fun)
  201. local game_start = function()
  202. setTimeout(function()
  203. if not self.preload_dialogue_view then
  204. local playerLv = RoleManager:getInstance():GetMainRoleVo().level
  205. if playerLv <= 120 then
  206. self.preload_dialogue_view = true
  207. if self.dialogueView == nil then
  208. self.dialogueView = DialogueViewNew.New()
  209. end
  210. self.dialogueView:Open()
  211. self.dialogueView:Hide()
  212. end
  213. end
  214. end,1.6)
  215. end
  216. GlobalEventSystem:Bind(EventName.GAME_START,game_start)
  217. local function on_choose_message( choose_type, choose_value )
  218. if not self.choose_message then
  219. self.choose_message = DialogueChooseMessage.New()
  220. end
  221. if self.choose_message:HasOpen() then
  222. self.choose_message:SetData(choose_type, choose_value)
  223. else
  224. self.choose_message:Open(choose_type, choose_value)
  225. end
  226. end
  227. GlobalEventSystem:Bind(DialogueModel.CHOOSE_MESSAGE_EVENT, on_choose_message)
  228. local function playerLevelUp()
  229. local task_id = TaskModel:getInstance().need_accept
  230. if task_id and task_id~=0 then
  231. --先判断等级
  232. local cfg = ConfigItemMgr.Instance:GetTaskData(task_id)
  233. if cfg then
  234. if RoleManager.Instance.mainRoleInfo.level >= cfg.level then
  235. self:acceptTask(task_id)
  236. TaskModel:getInstance().need_accept = nil
  237. end
  238. end
  239. end
  240. end
  241. RoleManager.Instance.mainRoleInfo:Bind(EventName.CHANGE_LEVEL,playerLevelUp)
  242. end
  243. function DialogueController:request12101(id)
  244. self.taskModel.scmd12101Send = true
  245. self:SendFmtToGame(12101, "i", id)
  246. end
  247. function DialogueController:response12101()
  248. if not self.taskModel.scmd12101Send then
  249. return
  250. end
  251. self.taskModel.scmd12101Send = false
  252. local scmd12101 = SCMD12101.New(true)
  253. -- print("Saber:DialogueController [start:178] scmd12101 ------------------------------------------")
  254. -- PrintTable(scmd12101)
  255. scmd12101.task_id = 0
  256. self.dialogueModel.npcDialogVo = scmd12101
  257. local dialogid = self.dialogueModel:GetDialogueId(scmd12101.npc_id)
  258. local task = TaskModel:getInstance():GetTaskById(self.taskModel.now_task_id)
  259. if task and task.task_kind==TaskKind.DUN_KIND and task.content_id~=0 and task.acceptType==0 then
  260. --副本类型的任务,如果已经接过就做一个假任务对话
  261. if task.type==TaskType.GUILD_LINE or task.type==TaskType.BOUNTY_LINE then
  262. --赏金和社团任务要判断是否已经进行了任务对话 副本失败后,taskTips列表就只有副本步骤了
  263. self:showNpcTalk(dialogid,#scmd12101.task_list)
  264. return
  265. else
  266. --主线或者支线,就做一个假任务对话
  267. for k,v in pairs(task.taskTips) do
  268. if v.type==TaskTipType.TYPE2 and v.isFinish==0
  269. and scmd12101.npc_id==task.start_npc then
  270. local scmd12102 = SCMD12102.New()
  271. scmd12102.npc_id = task.start_npc
  272. scmd12102.task_id = task.id
  273. scmd12102.talk_id = task.start_talk
  274. self.dialogueModel.npcDialogVo = scmd12102
  275. self.dialogueModel.npcDialogVo.dialogList = ConfigItemMgr.Instance:GetTalkItem(self.dialogueModel.npcDialogVo.talk_id)
  276. self.dialogueModel.npcDialogVo.task_list = {}
  277. self:showDialogue(self.dialogueModel.npcDialogVo)
  278. return
  279. end
  280. end
  281. end
  282. end
  283. self:showNpcTalk(dialogid,#scmd12101.task_list)
  284. --如果没有任务,则播放声音
  285. if #scmd12101.task_list == 0 then
  286. SoundModel:getInstance():PlayNpcSound(scmd12101.npc_id)
  287. end
  288. end
  289. --[[
  290. *
  291. * @param npcId NPCID
  292. * @param taskId ID
  293. * @param state
  294. *
  295. ]]
  296. function DialogueController:request12102(npcId, taskId, state)
  297. self:SendFmtToGame(12102, "ii", npcId, taskId)
  298. self.dialogueModel.isAuto = false
  299. end
  300. function DialogueController:response12102()
  301. if self.dialogueModel.changeSceneClose==true then
  302. -- 过滤掉延时的返回
  303. return
  304. end
  305. local scmd12102 = SCMD12102.New(true)
  306. -- print("Saber:DialogueController [start:261] scmd12102 ------------------------------------------")
  307. -- PrintTable(scmd12102)
  308. self.dialogueModel.npcDialogVo = scmd12102
  309. -- print("response12102:",self.dialogueModel.npcDialogVo.npc_id,self.dialogueModel.npcDialogVo.task_id,self.dialogueModel.npcDialogVo.talk_id)
  310. self.dialogueModel.npcDialogVo.dialogList = ConfigItemMgr.Instance:GetTalkItem(self.dialogueModel.npcDialogVo.talk_id)
  311. self.dialogueModel.npcDialogVo.task_list = {}
  312. --奖励这里获取
  313. self.dialogueModel.npcDialogVo.award = nil
  314. local temp = TaskModel.Instance:GetCanTaskById(self.dialogueModel.npcDialogVo.task_id);
  315. if temp == nil then
  316. temp = TaskModel.Instance:GetReceivedTaskById(self.dialogueModel.npcDialogVo.task_id);
  317. if temp then
  318. self.dialogueModel.npcDialogVo.award = temp.award_list
  319. end
  320. else
  321. self.dialogueModel.npcDialogVo.award = temp.award_list
  322. end
  323. if self.dialogueModel.npcDialogVo.dialogList and self.dialogueModel.npcDialogVo.dialogList.content then
  324. for k,v in ipairs(self.dialogueModel.npcDialogVo.dialogList.content) do
  325. for _,vo in ipairs(v.list) do
  326. if vo.type==0 and Trim(vo.text)=="" then
  327. --对话内容为空字符串,直接接受任务或者完成任务
  328. local data = TaskModel:getInstance():GetTaskById(scmd12102.task_id)
  329. if data then
  330. if data.acceptType==0 then
  331. self:finishTask(scmd12102.task_id)
  332. elseif data.acceptType==1 then
  333. -- 如果是转职任务,则记录接受任务时的玩家等级
  334. if self.taskModel:IsTurnTask(flag) then
  335. self.taskModel:RecordProcessingTurnTaskLevel()
  336. end
  337. self:acceptTask(scmd12102.task_id)
  338. end
  339. end
  340. return
  341. end
  342. end
  343. end
  344. end
  345. self:showDialogue(self.dialogueModel.npcDialogVo)
  346. SoundModel:getInstance():PlayTaskAcceptSound(scmd12102.task_id)
  347. end
  348. -- 接受任务
  349. function DialogueController:acceptTask(id)
  350. TaskController.Instance:Clear30000Timer()
  351. id = tonumber(id)
  352. local task = TaskModel:getInstance():GetTaskById(id)
  353. if task and task.task_kind==TaskKind.DUN_KIND and task.content_id~=0 then
  354. --副本类型的任务,如果已经接过就直接进入副本(特殊处理,副本失败是要重新接任务的)
  355. -- GlobalEventSystem:Fire(EventName.STOP_AUTO_DO_TASK)
  356. local need_go_dun = true
  357. if task.type==TaskType.GUILD_LINE or task.type==TaskType.BOUNTY_LINE then
  358. self.taskModel.last_circle_tip_type = false--接任务的时候重置一下任务类型
  359. if self.dialogueModel.npcDialogVo and self.dialogueModel.npcDialogVo.npc_id then
  360. self:talkToNPC(self.dialogueModel.npcDialogVo.npc_id, task.id)
  361. --30007发送后会推送30001, 但是进度未完成,不会自动任务,这里手动请求30000
  362. TaskController.Instance:request30000()
  363. need_go_dun = false
  364. end
  365. else
  366. if task.acceptType==1 then
  367. TaskModel:getInstance().wait_30003 = true
  368. self:SendFmtToGame(30003, "i", id)
  369. -- 转职任务需要记录接受任务时的等级,判断断级
  370. end
  371. end
  372. if need_go_dun then
  373. BaseDungeonModel:getInstance():Fire(BaseDungeonModel.REQUEST_CCMD_EVENT, 61001, task.content_id)
  374. end
  375. TaskModel:getInstance():SetNeedTaskFlag(true)
  376. else
  377. if task and (task.type==TaskType.GUILD_LINE or task.type==TaskType.BOUNTY_LINE) then
  378. self:talkToNPC(self.dialogueModel.npcDialogVo.npc_id, task.id)
  379. self.dialogueModel.isAuto = true
  380. --30007发送后会推送30001, 但是进度未完成,不会自动任务,这里手动请求30000
  381. TaskController.Instance:request30000()
  382. else
  383. TaskModel:getInstance().wait_30003 = true
  384. self:SendFmtToGame(30003, "i", id)
  385. self.dialogueModel.isAuto = true
  386. end
  387. end
  388. end
  389. function DialogueController:response30003()
  390. TaskModel:getInstance().wait_30003 = false
  391. local flag, msg = self:ReadFmt("ii")
  392. if flag==0 then
  393. -- if msg ~= TaskLang.TASK_STR81 then
  394. -- Message.show(Language.substitute(TaskLang.TASK_STR82, msg));
  395. -- end
  396. ErrorCodeShow(msg)
  397. else
  398. print('Ych:DialogueController.lua[436] data', TaskController.Instance.auto_accept_main_id , flag)
  399. if TaskController.Instance.auto_accept_main_id == flag then
  400. --当前这次不要主动做主线,所以自动接完任务也不要主动切换当前任务
  401. TaskController.Instance.auto_accept_main_id = nil
  402. else
  403. if self.taskModel:IsTurnTask(flag) then -- 转职任务需要特殊处理,接取到任务时需要判断是否时断级接取
  404. self.taskModel.now_task_id = not self.taskModel:IsNewTurnTaskInLimitLv() and flag or self.taskModel.now_task_id
  405. else
  406. self.taskModel.now_task_id = flag
  407. end
  408. end
  409. self.dialogueModel:CheckTaskTalkEvent(flag)
  410. -- Message.show("成功接受任务")
  411. -------接受任务mainui表现
  412. local data = {
  413. type = SceneSpecialTipType.task,
  414. isAccept = true,
  415. }
  416. CommonController.Instance:Fire(EventName.OPEN_SCENESPECIALTIPVIEW,data)
  417. SoundModel:getInstance():PlayTaskSound(flag)
  418. end
  419. -- print("30003============:", self.dialogueModel.isAuto, self.dialogueModel.npcDialogVo, flag, msg)
  420. -- if self.dialogueModel.isAuto == true and self.dialogueModel.npcDialogVo ~= nil then
  421. -- -- print("接受了任务后,这里又打开了对话==", self.dialogueModel.npcDialogVo.npc_id)
  422. -- self:request12101(self.dialogueModel.npcDialogVo.npc_id)
  423. -- end
  424. TaskController.Instance:HandleTask()
  425. end
  426. --double: 0是默认 1是双倍
  427. function DialogueController:finishTask(id, arr,double)
  428. TaskController.Instance:Clear30000Timer()
  429. self.dialogueModel.isAuto = true
  430. TaskModel:getInstance().wait_30004 = true
  431. arr = arr or {}
  432. double = double or 0
  433. local len = #arr
  434. self:WriteBegin(30004)
  435. self:WriteFMT("i", id)
  436. self:WriteFMT("c", double)
  437. self:WriteFMT("h", len)
  438. for i = 1, len do
  439. self:WriteFMT("i", arr[i])
  440. end
  441. self:SendToGame()
  442. -- self:Fire(EventName.TASK_CHANGE, id, 2)
  443. end
  444. function DialogueController:response30004()
  445. TaskModel:getInstance().wait_30004 = false
  446. local flag, code = self:ReadFmt("ii")
  447. local len = self:ReadFmt("h")
  448. local goods_list = {}
  449. local goods_list_2 = {}
  450. for i = 1, len do
  451. local obj = {
  452. style = self:ReadFmt("c"),
  453. typeId = self:ReadFmt("i"),
  454. count = self:ReadFmt("i"),
  455. }
  456. table.insert(goods_list, obj)
  457. -------------------------
  458. if obj.style == 5 then
  459. local have = false
  460. local goods_id = Config.ConfigNotNormalGoods[obj.style].goods_id
  461. for k,v in pairs(goods_list_2) do
  462. have = have or (v == goods_id)
  463. end
  464. if not have then
  465. goods_list_2[#goods_list_2+1] = goods_id
  466. end
  467. end
  468. end
  469. if flag == 0 then
  470. ErrorCodeShow(code)
  471. else
  472. -------完成任务mainui表现
  473. local data = {
  474. type = SceneSpecialTipType.task,
  475. isAccept = false,
  476. }
  477. CommonController.Instance:Fire(EventName.OPEN_SCENESPECIALTIPVIEW,data)
  478. --添加任务完成标识
  479. self.taskModel:AddFinishTask( flag )
  480. --如果是触发引导的任务, 就停止自动任务
  481. -- if Config.ConfigHelper.Task[flag] and not Config.ConfigHelper.NotStopList[flag] then
  482. -- GlobalEventSystem:Fire(EventName.STOP_AUTO_DO_TASK)
  483. -- end
  484. --如果是主线
  485. if TaskModel:getInstance():IsMainTask(flag) then
  486. TaskModel:getInstance().last_finish_task_id = flag
  487. end
  488. -- 如果是转职任务,则记录完成任务时的玩家等级
  489. if self.taskModel:IsTurnTask(flag) then
  490. self.taskModel:RecordProcessingTurnTaskLevel()
  491. end
  492. --在副本里面出来
  493. -- if Config.ConfigHelper.NeedDelayExecute[flag] then
  494. -- GuideModel:getInstance():SetNeedDelayExecuteGuide(true)
  495. -- end
  496. print("完成任务, id====:", flag)
  497. if flag == self.taskModel.tip_new_main_line then
  498. --清掉继续主线提示
  499. self.taskModel.tip_new_main_line = false
  500. end
  501. -------------------------
  502. if Config.ConfigTaskEffect.GuideLevel < RoleManager.Instance.mainRoleInfo.level then
  503. if TaskModel:getInstance():IsCircleTask(flag) then--(非主线)只有跑环类会做完一个任务,自动衔接下一个同类任务的
  504. --起一个计时器,1s内收到30000协议并主动接主线任务的时候,不会停止自动任务
  505. TaskModel:getInstance().sign_mask_not_guide_wait_accept_main_task = true
  506. local function delay( )
  507. TaskModel:getInstance().sign_mask_not_guide_wait_accept_main_task = nil
  508. end
  509. setTimeout(delay,1)
  510. end
  511. end
  512. -------------------------
  513. local taskVo = TaskModel:getInstance():GetTaskById(flag)
  514. GlobalEventSystem:Fire(TaskEventType.TASK_SUCCESS, flag)
  515. self.taskModel.last_task_id_cache = flag
  516. self.taskModel.now_task_id = nil
  517. --如果是支线或者限时, 就不处理,避免中断其他任务
  518. -- if taskVo and taskVo.type~=TaskType.EXTENSION_LINE and taskVo.type~=TaskType.LIMIT_LINE then
  519. if taskVo then
  520. self.taskModel.last_task_type_cache = taskVo.type
  521. end
  522. -- end
  523. if taskVo and taskVo.type == TaskType.EXTENSION_LINE then
  524. --支线任务完成增加表现效果
  525. lua_soundM:PlayEffect(self, "extension_line_success", false, LuaSoundManager.SOUND_TYPE.ROLE)
  526. else
  527. SoundModel:getInstance():PlayTaskSound(flag)
  528. SoundModel:getInstance():PlayTaskCompleteSound(flag)
  529. end
  530. if taskVo and taskVo.type == TaskType.BOUNTY_LINE then
  531. --日常任务飘经验获得
  532. MainUIModel:getInstance():PlayGoodsFlyList(goods_list_2)
  533. self.dialogueModel.is_delay_show_main_task_tips = false
  534. self.dialogueModel.is_show_main_task_tips_flag = false
  535. --完成经验跑环时,会提示要不要做主线
  536. if Config.ConfigTaskEffect.NewMainLineTipLvMin <= RoleManager.Instance.mainRoleInfo.level and RoleManager.Instance.mainRoleInfo.level <= Config.ConfigTaskEffect.NewMainLineTipLvMax then
  537. local cur_main_task = self.taskModel:GetMainTask()
  538. if cur_main_task and RoleManager.Instance.mainRoleInfo.level >= cur_main_task.level then
  539. self.taskModel.now_task_id = nil
  540. GlobalEventSystem:Fire(EventName.STOP_AUTO_DO_TASK) --停止自动任务
  541. --如果是在副本里面,则等待
  542. if not SceneManager:getInstance():IsMirrorScene() then
  543. local function ok_callback()
  544. if cur_main_task then
  545. GlobalEventSystem:Fire(EventName.CLOSE_ALL_VIEW)
  546. self.taskModel.tip_new_main_line = cur_main_task.id
  547. GuideController.Instance:TriggerHelper(GuideModel.TASK_TRIGGER_TYPE, 9993150002)
  548. self.taskModel:Fire(TaskEvent.SHOW_NEW_MAIN_LINE_TIP)
  549. end
  550. end
  551. local function cancle_callback()
  552. self.taskModel:SetTaskAutoFlag(true)
  553. GlobalEventSystem:Fire(EventName.FORCE_TO_DO_TASK)
  554. end
  555. local str = "任务指引\n\n有新的主线任务,赶紧去看看吧!"
  556. Alert.show(str, Alert.Type.Two, ok_callback, cancle_callback, "确定", "继续任务")
  557. self.dialogueModel.is_show_main_task_tips_flag = true
  558. else
  559. self.dialogueModel.is_delay_show_main_task_tips = cur_main_task.id
  560. end
  561. end
  562. end
  563. end
  564. --判断是否配置了自动接下个任务
  565. if taskVo and taskVo.next~=0 then
  566. if taskVo.type ~= TaskType.EXTENSION_LINE then --支线不需要自动触发下一个
  567. --先判断等级
  568. local cfg = ConfigItemMgr.Instance:GetTaskData(taskVo.next)
  569. if cfg then
  570. if RoleManager.Instance.mainRoleInfo.level >= cfg.level then
  571. self:acceptTask(taskVo.next)
  572. else
  573. -- if Config.ConfigTaskEffect.GuideLevel < RoleManager.Instance.mainRoleInfo.level then
  574. -- if TaskModel:getInstance():IsMainTask(flag) then
  575. -- --如果是非新手期,而且是完成主线,那就不用记录了,30000返回的时候主线就会被自动接掉
  576. -- return
  577. -- end
  578. -- end
  579. --升级了就触发
  580. TaskModel:getInstance().need_accept = taskVo.next
  581. end
  582. end
  583. end
  584. end
  585. end
  586. end
  587. --[[
  588. *
  589. * @param npcId NPCID
  590. * @param taskId ID
  591. *
  592. ]]
  593. function DialogueController:talkToNPC(npcId, taskId)
  594. self:SendFmtToGame(30007, "ii", taskId, npcId)
  595. self.dialogueModel.isAuto=true;
  596. end
  597. function DialogueController:response30007()
  598. end
  599. --任务探索事件
  600. function DialogueController:request30008()
  601. self:SendFmtToGame(30008)
  602. end
  603. function DialogueController:response30008()
  604. end
  605. function DialogueController:response30009()
  606. local code = self:ReadFmt("i")
  607. if code==1 then
  608. --Message.show("成功接受任务")
  609. -------接受任务mainui表现
  610. local data = {
  611. type = SceneSpecialTipType.task,
  612. isAccept = true,
  613. }
  614. TaskModel.getInstance():Fire(TaskEvent.SHOW_SCROLL_TO_ITEM, 1) --领取任务后,置顶任务栏
  615. CommonController.Instance:Fire(EventName.OPEN_SCENESPECIALTIPVIEW,data)
  616. else
  617. ErrorCodeShow(code)
  618. end
  619. end
  620. function DialogueController:response30010()
  621. local info = {}
  622. info.task_type = self:ReadFmt("c")
  623. info.cur_progress = self:ReadFmt("c")
  624. info.total_progress = self:ReadFmt("c")
  625. info.reward_progress = self:ReadFmt("c")
  626. TaskModel:getInstance():SetCircleTaskInfo(info)
  627. end
  628. function DialogueController:response30011( )
  629. local info = {}
  630. info.task_id = self:ReadFmt("i")
  631. local basedata=ConfigItemMgr.Instance:GetTaskData(info.task_id)
  632. --奖励
  633. local len0 = UserMsgAdapter.ReadFmt("h") or 0
  634. info.reward = info.reward or {}
  635. local vo0 = nil
  636. for i = 1,len0 do
  637. vo0 = {
  638. UserMsgAdapter.ReadFmt("c") or 0,
  639. UserMsgAdapter.ReadFmt("i") or 0,
  640. UserMsgAdapter.ReadFmt("l") or 0
  641. }
  642. table.insert(info.reward,vo0)
  643. end
  644. --额外奖励
  645. info.extra_reward = info.extra_reward or {}
  646. local len1 = UserMsgAdapter.ReadFmt("h") or 0
  647. local vo1 = nil
  648. for i = 1,len1 do
  649. vo1 = {
  650. UserMsgAdapter.ReadFmt("c") or 0,
  651. UserMsgAdapter.ReadFmt("i") or 0,
  652. UserMsgAdapter.ReadFmt("l") or 0
  653. }
  654. table.insert(info.extra_reward,vo1)
  655. end
  656. self.taskModel.circle_cache_reward = info
  657. GlobalEventSystem:Fire(EventName.UPDATE_TASK_BOUNTY_REWARD, info)
  658. -------------------------
  659. TaskModel:getInstance():Fire(TaskEvent.TASK_LIST_INIT)
  660. end
  661. function DialogueController:response30012()
  662. local task_id = self:ReadFmt("i")
  663. TaskModel:getInstance().last_finish_task_id = task_id
  664. GlobalEventSystem:Fire(EventName.REFRESH_CALL_STAR_MODEL)
  665. GlobalEventSystem:Fire(EventName.TASK_DATA_INIT)
  666. end
  667. function DialogueController:response30015()
  668. local code = self:ReadFmt("i")
  669. ErrorCodeShow(code)
  670. end
  671. --选择npc功能对话框
  672. function DialogueController:showNpcFunctionSelectTalk(talkid,taskCount)
  673. local dialogid = talkid
  674. local npcDialogVo = self.dialogueModel.npcDialogVo
  675. npcDialogVo.dialogId = dialogid
  676. npcDialogVo.dialogList = ConfigItemMgr.Instance:GetTalkItem(dialogid)
  677. if npcDialogVo.dialogList==nil then
  678. -- print("~~选择npc功能对话框~~~对话id is nil, 显示默认对话:",dialogid)
  679. npcDialogVo.dialogList=DialogueModel.DEFAULT_TALK
  680. if npcDialogVo.dialogList.content[1] then
  681. npcDialogVo.dialogList.content[1].id = npcDialogVo.npc_id
  682. end
  683. end
  684. -- 跳过空对话
  685. -- print("---------showNpcFunctionSelectTalk--------:", self.dialogueModel.isAuto, taskCount)
  686. if self.dialogueModel.isAuto == true and taskCount==0 then
  687. self.dialogueModel.isAuto = false
  688. return
  689. end
  690. self:showDialogue(npcDialogVo)
  691. end
  692. function DialogueController:showNpcTalk(talkid,taskCount)
  693. local dialogid = talkid
  694. local npcDialogVo = self.dialogueModel.npcDialogVo --12101
  695. local is_default_talk = false
  696. --[[
  697. npc下面可能同时会有主线和支线任务121012
  698. id
  699. 12101id
  700. ]]
  701. -- 2019年11月6日修改:增加多任务过滤筛选出第一个要处理的任务
  702. -- 17:45分,天气晴,飒爽的秋风带来了冬季的寒意,窗外的阳光似乎没有了温度,而我心中只记得策划大佬突然又要改需求了(╯‵□′)╯︵┻━┻
  703. -- if self.taskModel.now_task_id and self.dialogueModel.npcDialogVo and #self.dialogueModel.npcDialogVo.task_list > 1 then
  704. if self.dialogueModel.mult_select_task_id and self.dialogueModel.npcDialogVo and #self.dialogueModel.npcDialogVo.task_list > 1 then
  705. local find = false
  706. for i,v in ipairs(self.dialogueModel.npcDialogVo.task_list) do
  707. if v.task_id == self.dialogueModel.mult_select_task_id then
  708. find = true
  709. break
  710. end
  711. end
  712. if find then
  713. local delete_index={}
  714. for i,v in ipairs(self.dialogueModel.npcDialogVo.task_list) do
  715. if v.task_id ~= self.taskModel.now_task_id then
  716. table.insert(delete_index,i)
  717. end
  718. end
  719. local del_num=0
  720. for i,v in ipairs(delete_index) do
  721. local index = v - del_num
  722. table.remove(self.dialogueModel.npcDialogVo.task_list, index)
  723. del_num = del_num + 1
  724. end
  725. -- else
  726. -- -- 对多任务进行排序,然后根据排好的顺序只选择第一个任务
  727. -- self.dialogueModel:SortMultTaskList(self.dialogueModel.npcDialogVo.task_list)
  728. -- for k = #self.dialogueModel.npcDialogVo.task_list , 1 do
  729. -- if k > 1 then
  730. -- table.remove(self.dialogueModel.npcDialogVo.task_list, k)
  731. -- end
  732. -- end
  733. end
  734. taskCount = 1
  735. end
  736. -- 每次走完多任务的判断都要保证多任务选择的任务id置空
  737. self.dialogueModel:SetMultSelectTaskID(nil)
  738. -- dialogid是目标npc默认的对话内容,如果为空则显示通用默认npc的对话,一般是npcid为0或者空的时候会出现
  739. npcDialogVo.dialogId = dialogid
  740. npcDialogVo.dialogList = ConfigItemMgr.Instance:GetTalkItem(dialogid)
  741. if npcDialogVo.dialogList==nil then
  742. print("~~~~~db里面找不到该对话id, 显示默认对话:",dialogid)
  743. npcDialogVo.dialogList=DialogueModel.DEFAULT_TALK
  744. is_default_talk = true
  745. if npcDialogVo.dialogList.content[1] then
  746. npcDialogVo.dialogList.content[1].id = npcDialogVo.npc_id
  747. end
  748. end
  749. -- 跳过空对话
  750. if self.dialogueModel.isAuto == true and taskCount==0 then
  751. self.dialogueModel.isAuto = false
  752. return
  753. end
  754. -- 判断是否是可选任务,是则不请求12102协议获取对话内容(仅需在只有一条任务数据的时候判断)
  755. local is_optional_task = false
  756. if taskCount == 1 and npcDialogVo.task_list and npcDialogVo.task_list[1] and npcDialogVo.task_list[1].task_id then
  757. local task_vo = TaskModel:getInstance():GetTaskById(npcDialogVo.task_list[1].task_id) or {}
  758. if task_vo.tipType then
  759. is_optional_task = is_optional_task or task_vo.tipType == TaskTipType.TYPE35
  760. local is_target_npc = task_vo.tipParam and task_vo.tipParam[3] == npcDialogVo.npc_id
  761. if is_optional_task and is_target_npc then
  762. npcDialogVo.task_id = npcDialogVo.task_list[1].task_id
  763. end
  764. end
  765. end
  766. --(task_state 0:无 1:有可接任务 2:有未完成的任务 3:有可提交的任务 4:有任务对话)
  767. local is_cur_select = npcDialogVo and npcDialogVo.task_list and npcDialogVo.task_list[1] and
  768. ((TaskModel:getInstance().now_task_id or 0) == 0 or TaskModel:getInstance().now_task_id == npcDialogVo.task_list[1].task_id)
  769. if is_cur_select and npcDialogVo.dialogList.total_content == 1 and npcDialogVo.dialogList.content[1].total_list == 1
  770. and taskCount == 1 and npcDialogVo.task_list[1].task_state~=2 and not is_optional_task then
  771. self:request12102(npcDialogVo.npc_id, npcDialogVo.task_list[1].task_id, npcDialogVo.task_list[1].task_state)
  772. else
  773. if npcDialogVo.npc_id == 0 and is_default_talk then --当npc_id 是0 ,而且是默认对话的时候,对话框就不显示出来了
  774. return
  775. end
  776. if self.dialogueModel.isAuto == false then
  777. self:showDialogue(npcDialogVo)
  778. elseif #npcDialogVo.task_list > 0 then
  779. -- self.model:SortMultTaskList(npcDialogVo.task_list)
  780. local isShow=false
  781. for _, taskNodeVo in pairs(npcDialogVo.task_list) do
  782. if taskNodeVo.task_state ~= 2 then
  783. isShow=true
  784. break
  785. end
  786. end
  787. if isShow==true and npcDialogVo.dialogId and npcDialogVo.dialogId ~= 0 then
  788. self:showDialogue(npcDialogVo)
  789. end
  790. end
  791. end
  792. self.dialogueModel.isAuto=false
  793. end
  794. --[[
  795. * NPC对话框确定按钮
  796. * @param e
  797. *
  798. ]]
  799. function DialogueController:clickAnswerHandler(dialogueVo, dialogueNodeVo, selected,double)
  800. selected = selected or false
  801. local typeId = 0
  802. --任务的操作
  803. self.dialogueModel.andTriggerTask = nil
  804. if dialogueNodeVo.type == DialogueTypeConst.FINISH_AND_TRIGGER then
  805. self.dialogueModel.andTriggerTask = dialogueNodeVo
  806. self:finishTask(dialogueVo.task_id,false,double);
  807. elseif dialogueNodeVo.type == DialogueTypeConst.TRIGGER then
  808. self:acceptTask(dialogueVo.task_id);
  809. elseif dialogueNodeVo.type == DialogueTypeConst.FINISH then
  810. self:finishTask(dialogueVo.task_id,false,double);
  811. elseif dialogueNodeVo.type == DialogueTypeConst.TRIGGER_AND_FINISH then
  812. elseif dialogueNodeVo.type == DialogueTypeConst.TALK_EVENT then
  813. self:talkToNPC(dialogueVo.npcId, dialogueVo.task_id)
  814. end
  815. end
  816. -- 是否是显示跑环界面
  817. function DialogueController:IsShowCircleView( npcDialogVo )
  818. -------------------------
  819. local cfg1 = self.taskModel:GetTaskAcceptNpcConfig(TaskType.BOUNTY_LINE)
  820. local cfg2 = self.taskModel:GetTaskAcceptNpcConfig(TaskType.GUILD_LINE)
  821. if not (npcDialogVo.npc_id == cfg1.npc_id or npcDialogVo.npc_id == cfg2.npc_id) then
  822. --当前不是跑环npc
  823. return false
  824. end
  825. -------------------------
  826. --判断是否可领取奖励
  827. local task_type = false
  828. if npcDialogVo.npc_id == cfg1.npc_id then
  829. task_type = TaskType.BOUNTY_LINE
  830. elseif npcDialogVo.npc_id == cfg2.npc_id then
  831. task_type = TaskType.GUILD_LINE
  832. end
  833. local reward_data = self.taskModel:CanCircleReward(task_type)
  834. if reward_data then
  835. return true
  836. end
  837. -------------------------
  838. if npcDialogVo.task_id == 0 then
  839. --身上没任务,首次接任务用对话框
  840. return false
  841. end
  842. local task = TaskModel:getInstance():GetTaskById(npcDialogVo.task_id)
  843. if not task then return false end
  844. local is_circle_line = task.type==TaskType.GUILD_LINE or task.type==TaskType.BOUNTY_LINE
  845. if is_circle_line then
  846. if task.tipType == TaskTipType.TYPE35 and self.taskModel.last_circle_tip_type == task.tipType then
  847. --多选任务,而且上一次跑环tip显示的是多选类,那就显示普通对话
  848. return false
  849. end
  850. if task.acceptType==0 and self.taskModel:IsTaskProgressFinish(task) then
  851. --任务已完成等结束
  852. return false
  853. end
  854. if task.taskTips and task.taskTips[1] and task.taskTips[1].isFinish == 0 then
  855. --第一步改成弹界面
  856. return true
  857. end
  858. end
  859. return false
  860. end