源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

977 line
39 KiB

  1. DialogueViewNew = DialogueViewNew or BaseClass(BaseView)
  2. local DialogueViewNew = DialogueViewNew
  3. local DialogVoiceFlag = {
  4. CN = 1,
  5. JP = 2,
  6. EN = 3,
  7. }
  8. local ROLE_CON_POS = {
  9. x = -515,
  10. y = -359,
  11. }
  12. function DialogueViewNew:__init()
  13. self.base_file = "dialogue"
  14. self.layout_file = "DialogueViewNew"
  15. self.layer_name = "Main"
  16. self.destroy_imm = true
  17. self.use_background = true
  18. -- self.blur_activity_bg = true
  19. self.ignore_use_anim = true
  20. self.close_fog = true
  21. self.change_scene_close = true
  22. self.append_to_ctl_queue = false --是否要添加进界面堆栈
  23. -- self.is_set_order_sorting = false
  24. -- self.hide_maincancas = true --不要走通用逻辑,通用逻辑会隐藏场景对象,这里要显示出来,改为手动调用
  25. self.is_set_order_sorting = false
  26. self.model = DialogueModel:getInstance()
  27. self.dialogIndex = 1 --当前对话下标
  28. self.btnStatus = -1 --1离开,2继续对话,3完成任务
  29. self.item_list = {} --奖励列表
  30. self.task_item_list = {} --多任务按钮列表
  31. self.auto_mult_task_cache_data = nil--多任务自动任务数据缓存
  32. self.is_chooseing_option = false --是否正在选择任务选项
  33. self.option_cfg = nil --可选任务的内容配置
  34. self.auto_time = 8 --自动任务倒计时
  35. self.ask_task_str = "" --选择答案对话任务的内容
  36. self.background_alpha = 0.7
  37. TaskModel:getInstance().last_circle_tip_type = false--重置跑环标记
  38. self.load_callback = function ()
  39. self:LoadSuccess()
  40. self:AddEvent()
  41. end
  42. self.open_callback = function ( )
  43. self:OpenSuccess()
  44. self:SetMainUIHideFlag(true)
  45. -- LuaViewManager.ChangeMainCanvasVisible(lua_viewM, false)
  46. -- MainCamera:getInstance():SetPostEffectEnable(false)
  47. -- MainCamera:getInstance():SetMainCameraCullingMask(UIPartical.RenderingOther_List.Ground, true)
  48. end
  49. self.close_callback = function ( )
  50. self:SetMainUIHideFlag(false)
  51. end
  52. self.destroy_callback = function ( )
  53. -- LuaViewManager.ChangeMainCanvasVisible(lua_viewM, true)
  54. -- ChatModel:getInstance():Fire(ChatModel.HIDE_MIAN_UI_CHAT_VIEW,false)
  55. -- ChatModel:getInstance():Fire(ChatModel.HIDE_MIAN_UI_CHAT_VIEW,true)
  56. -- LuaViewManager.BocastChangeVisibleEvent(lua_viewM)
  57. -- MainCamera:getInstance():SetPostEffectEnable(true)
  58. self:DestroySuccess()
  59. end
  60. end
  61. function DialogueViewNew:SetMainUIHideFlag( need_hide )
  62. GlobalEventSystem:Fire(EventName.HIDE_MINI_MAP_VIEW, need_hide, MainUIModel.LOCK_SCREEN_MODE)
  63. GlobalEventSystem:Fire(EventName.HIDE_LEFT_BOTTOM_VIEW, need_hide, MainUIModel.LOCK_SCREEN_MODE)
  64. GlobalEventSystem:Fire(EventName.HIDE_RIGHT_BOTTOM_VIEW, need_hide, MainUIModel.LOCK_SCREEN_MODE, false)
  65. GlobalEventSystem:Fire(EventName.HIDE_MAIN_CHAT_VIEW, need_hide, MainUIModel.LOCK_SCREEN_MODE)
  66. GlobalEventSystem:Fire(EventName.HIDE_MAINROLE_HEAD_VIEW, need_hide, MainUIModel.LOCK_SCREEN_MODE)
  67. GlobalEventSystem:Fire(EventName.HIDE_TASK_TEAM_VIEW, need_hide, MainUIModel.LOCK_SCREEN_MODE)
  68. GlobalEventSystem:Fire(EventName.HIDE_RIGHT_TOP_ICON, need_hide, MainUIModel.LOCK_SCREEN_MODE)
  69. if need_hide then
  70. ItemUseModel:getInstance():HideItemUseView( )
  71. else
  72. ItemUseModel:getInstance():ShowItemUseView( )
  73. end
  74. end
  75. function DialogueViewNew:Open( npcDialogVo )
  76. self.npcDialogVo = npcDialogVo
  77. --本服团战活动,时间要延长到20秒
  78. if npcDialogVo and GuildModel.getInstance():IsGuildWarNpcId(npcDialogVo.npc_id)then
  79. local t = self.npcDialogVo
  80. if t and t.dialogList and t.dialogList.content and t.dialogList.content[1] and t.dialogList.content[1].list and t.dialogList.content[1].list[1] then
  81. t.dialogList.content[1].list[1].text = GuildModel.getInstance():GetGuildWarNpcTalkContent()
  82. end
  83. self.auto_time = 20
  84. end
  85. if IsTableEmpty(self.npcDialogVo) then
  86. print("error !!! npcDialogVo is null ")
  87. return
  88. end
  89. self:CheckGudie()
  90. BaseView.Open(self)
  91. end
  92. function DialogueViewNew:LoadSuccess()
  93. self.nodes = {
  94. "con/time:obj:tmp", "con/taskBtnCon:obj",
  95. "con/taskBtnCon/click_btn:obj",
  96. "con/taskBtnCon/click_btn/click_btn_lable:tmp",
  97. "con/taskBtnCon/sureBtn:obj",
  98. "con/role_con",
  99. "click_bg:obj",
  100. "con/content_bg:obj:img",
  101. "con/content_btn:obj",
  102. "con/name_con/npc_name:obj:tmp",
  103. "con/mult_task_con:obj",
  104. "con/award_conta",
  105. "con/content:tmp",
  106. "con/optional_conta:obj",
  107. "con/optional_conta/optional_group/option_1:obj",
  108. "con/optional_conta/optional_group/option_1/option1_txt:tmp",
  109. "con/optional_conta/optional_group/option_2:obj",
  110. "con/optional_conta/optional_group/option_2/option2_txt:tmp",
  111. "con/optional_conta/optional_group/option_3:obj",
  112. "con/optional_conta/optional_group/option_3/option3_txt:tmp",
  113. "con/optional_conta/option_time:obj:tmp",
  114. "con/my_role_con",
  115. "con/click_effect",
  116. ----------------------
  117. "con/voiceCon:obj",
  118. "con/voiceCon/cn_voice:obj", "con/voiceCon/cn_voice/cn_voice_icon:img",
  119. "con/voiceCon/jp_voice:obj", "con/voiceCon/jp_voice/jp_voice_icon:img",
  120. "con/voiceCon/en_voice:obj", "con/voiceCon/en_voice/en_voice_icon:img",
  121. }
  122. self:GetChildren(self.nodes)
  123. -- SetLocalPosition(self.transform, self.transform.localPosition.x, -ScreenHeight/2, 360)
  124. -- 往下对齐
  125. self.transform.anchoredPosition = Vector3(0,0,0)
  126. self.voiceCon_obj:SetActive(false)
  127. self.transform.sizeDelta = Vector2(ScreenWidth,ScreenHeight)
  128. UIDepth.SetUIDepth(self.gameObject,true,UIPartical.Start_SortingOrder_list.UI-50)
  129. -- local function bg_back_func( )
  130. -- if self.background_wnd and self.background_wnd_raw then
  131. -- self:MoveUIToBack(self.background_wnd_raw, nil, nil, {is_hide=true})
  132. -- self:MoveUIToBack(self.content_bg_img)
  133. -- end
  134. -- end
  135. -- if self.background_wnd then
  136. -- bg_back_func()
  137. -- else
  138. -- self.bg_back_func = bg_back_func
  139. -- end
  140. --设置确定按钮的位置
  141. GuideModel.getInstance():SetGuideCachePos(self.click_btn, GuideModel.CACHE_POS_TYPE.DIALOGUE_CLICK_BTN)
  142. self:AddToStageHandler()
  143. -- 初始化语音
  144. self:SelectVoice(DialogVoiceFlag.CN)
  145. -- 初始化模型展示位置
  146. SetLocalPosition(self.role_con, ROLE_CON_POS.x, ROLE_CON_POS.y, 0)
  147. --npc音效
  148. local npc_id = self.npcDialogVo and self.npcDialogVo.npc_id
  149. if npc_id then
  150. local sound_cfg = Config.ConfigSound.NpcSound[npc_id]
  151. if sound_cfg then
  152. if not lua_soundM:PlayingSoundEffect(sound_cfg.sound, 30) then
  153. self:CancelNpcSoundId()
  154. self.npc_sound_id = lua_soundM:PlayEffect(lua_soundM, sound_cfg.sound, false, LuaSoundManager.SOUND_TYPE.NPC, sound_cfg.volume, 1)
  155. end
  156. end
  157. end
  158. end
  159. function DialogueViewNew:CancelNpcSoundId( )
  160. if lua_soundM and self.npc_sound_id then
  161. lua_soundM:StopEffect(lua_soundM, LuaSoundManager.SOUND_TYPE.NPC, self.npc_sound_id)
  162. self.npc_sound_id = nil
  163. end
  164. end
  165. function DialogueViewNew:AddEvent()
  166. local click_btn_func = function ()
  167. -- 存在多任务的缓存任务,则继续自动进行多任务缓存的任务
  168. if self.auto_mult_task_cache_data then
  169. self:ClickMultTaskBtnFunc(self.auto_mult_task_cache_data)
  170. else
  171. self:OnTaskSelect()
  172. end
  173. end
  174. local function on_click( target )
  175. if target == self.click_btn_obj or target == self.content_btn_obj or target == self.sureBtn_obj then
  176. click_btn_func()
  177. elseif target == self.option_1_obj then
  178. self:SelectOptionalTask(1)
  179. elseif target == self.option_2_obj then
  180. self:SelectOptionalTask(2)
  181. elseif target == self.option_3_obj then
  182. self:SelectOptionalTask(3)
  183. elseif target == self.click_bg_obj then
  184. local task = TaskModel:getInstance():GetTaskById(self.npcDialogVo.task_id)
  185. if task and (task.type == TaskType.MAIN_LINE or task.type == TaskType.GUILD_LINE or task.type == TaskType.BOUNTY_LINE) then
  186. click_btn_func()
  187. else
  188. self:Close()
  189. end
  190. elseif target == self.cn_voice_obj then
  191. self:SelectVoice(DialogVoiceFlag.CN)
  192. elseif target == self.jp_voice_obj then
  193. self:SelectVoice(DialogVoiceFlag.JP)
  194. elseif target == self.en_voice_obj then
  195. self:SelectVoice(DialogVoiceFlag.EN)
  196. end
  197. end
  198. AddClickEvent(self.click_btn_obj, on_click)
  199. AddClickEvent(self.sureBtn_obj, on_click)
  200. AddClickEvent(self.click_bg_obj, on_click)
  201. AddClickEvent(self.content_btn_obj, on_click)
  202. AddClickEvent(self.option_1_obj, on_click)
  203. AddClickEvent(self.option_2_obj, on_click)
  204. AddClickEvent(self.option_3_obj, on_click)
  205. AddClickEvent(self.cn_voice_obj, on_click)
  206. AddClickEvent(self.jp_voice_obj, on_click)
  207. AddClickEvent(self.en_voice_obj, on_click)
  208. local function on_close()
  209. self:Close()
  210. end
  211. self.stop_task_id = GlobalEventSystem:Bind(EventName.STOP_AUTO_DO_TASK, on_close)
  212. local function on_change_reward(info)
  213. local total_list = {}
  214. local function insert_data( data )
  215. --这里不需要分开显示了,放一起
  216. local have = false
  217. for k,v in pairs(total_list) do
  218. if v[1] == data[1] and v[2] == data[2] then
  219. v[3] = v[3] + data[3]
  220. have = true
  221. end
  222. end
  223. if not have then
  224. table.insert(total_list, data)
  225. end
  226. end
  227. for index, vo in ipairs(info.reward) do
  228. insert_data(vo)
  229. end
  230. for index, vo in ipairs(info.extra_reward) do
  231. insert_data(vo)
  232. end
  233. if self.npcDialogVo then
  234. self.npcDialogVo.award = total_list
  235. end
  236. self:SetAwardList()
  237. end
  238. self.update_bounty_reward_id = GlobalEventSystem:Bind(EventName.UPDATE_TASK_BOUNTY_REWARD, on_change_reward)
  239. local function onGuideTrigger()
  240. self:AddToStageHandler()
  241. end
  242. self.guide_trigger_id = GlobalEventSystem:Bind(EventName.TRIGGER_GUIDE_TYPE,onGuideTrigger)
  243. end
  244. function DialogueViewNew:OpenSuccess()
  245. --停止自动战斗、自动任务
  246. GlobalEventSystem:Fire(EventName.STOPAUTOFIGHT,false,true)
  247. TaskController.Instance:ClearAutoDoTaskTimer()
  248. --每次设置数据时清空多任务自动进行的缓存
  249. self.auto_mult_task_cache_data = nil
  250. self.dialogIndex = 1
  251. self:UpdateView()
  252. end
  253. function DialogueViewNew:UpdateView()
  254. --先刷新按钮,再刷新对话,这里顺序不要调整,因为是根据self.dialogIndex去取按钮状态,UpdateDialogueInfo会累计self.dialogIndex
  255. self:UpdateBtnInfo()
  256. self:UpdateDialogueInfo()
  257. self:CreateTimer()
  258. end
  259. --更新对话框内容
  260. function DialogueViewNew:UpdateDialogueInfo( )
  261. self.cur_is_finsih_task = false -- 标识本次对话是否属于完成任务的对话
  262. if self.dialogIndex > self.npcDialogVo.dialogList.total_content then
  263. self:Close()
  264. return
  265. end
  266. local dialogContent = self.npcDialogVo.dialogList.content[self.dialogIndex]
  267. if not dialogContent then
  268. return
  269. end
  270. self.dialogIndex = self.dialogIndex + 1
  271. local askStr = ""
  272. self.dialogDic = {}
  273. local nameStr = ""
  274. for i = 1, dialogContent.total_list do
  275. local node = {
  276. type = 0, --类型
  277. text = "", --对话内容
  278. otherInfos = {}, --其他信息
  279. }
  280. node.type = dialogContent.list[i].type
  281. node.text = dialogContent.list[i].text
  282. node.otherInfos = Split(dialogContent.list[i].other, "|")
  283. local eventText = node.type .. "|" .. i
  284. self.dialogDic[eventText] = node
  285. --NPC对话内容
  286. if node.type == DialogueTypeConst.NPC then
  287. --NPC名称
  288. askStr = askStr .. WordManager:changeWords(node.text)
  289. if self.taskDialog == true then
  290. self:SetBtnState(1)
  291. end
  292. --角色对话内容
  293. elseif node.type == DialogueTypeConst.ROLE then
  294. nameStr = RoleManager.Instance.mainRoleInfo.name
  295. askStr = askStr .. WordManager:changeWords(node.text)
  296. self:SetBtnState(1)
  297. --完成任务
  298. elseif node.type == DialogueTypeConst.FINISH or node.type == DialogueTypeConst.TALK_EVENT
  299. or node.type == DialogueTypeConst.TRIGGER_AND_FINISH
  300. or node.type == DialogueTypeConst.FINISH_AND_TRIGGER then
  301. self:SetBtnState(2)
  302. self.btnData = eventText
  303. self.cur_is_finsih_task = true
  304. --触发任务
  305. elseif node.type == DialogueTypeConst.TRIGGER then
  306. self:SetBtnState(3)
  307. self.btnData = eventText
  308. end
  309. end
  310. -- 设置任务按钮样式
  311. self:ShowFinishBtn(self.cur_is_finsih_task == true)
  312. --选项任务指定的默认对话,服务端12101发过来的,只是单纯用来显示对话文本而已
  313. local show_talk = 0
  314. for k,v in pairs(self.npcDialogVo.task_list) do
  315. if v.show_talk ~= 0 then
  316. show_talk = v.show_talk
  317. break
  318. end
  319. end
  320. if self.ask_task_str ~= "" then
  321. self.content_tmp.text = self.ask_task_str
  322. elseif show_talk > 0 then
  323. local temp_talk_cfg = ConfigItemMgr.Instance:GetTalkItem(show_talk)
  324. local str = temp_talk_cfg and temp_talk_cfg.content[1] and temp_talk_cfg.content[1].list[1].text
  325. self.content_tmp.text = str and Trim(str) or Trim(askStr)
  326. else
  327. self.content_tmp.text = Trim(askStr)
  328. end
  329. --对话模型
  330. self:SetRoleModel(dialogContent, nameStr)
  331. --设置物品奖励
  332. local task = TaskModel:getInstance():GetTaskById(self.npcDialogVo.task_id)
  333. if task and task.type and (task.type == TaskType.BOUNTY_LINE or task.type == TaskType.GUILD_LINE) then
  334. --跑环奖励是需要额外请求协议获得的
  335. DialogueModel:getInstance():Fire(DialogueModel.REQUEST_CCMD_EVENT, 30011, self.npcDialogVo.task_id)
  336. else
  337. self:SetAwardList()
  338. end
  339. end
  340. function DialogueViewNew:SetBtnState(state)
  341. self.btnStatus = state + 1
  342. end
  343. function DialogueViewNew:SetRoleModel( dialogContent, nameStr )
  344. local function timer_func( )
  345. if nameStr == RoleManager.Instance.mainRoleInfo.name then --玩家自己的头像
  346. -- self.role_con.gameObject:SetActive(false)
  347. -- self.my_role_con.gameObject:SetActive(true)
  348. self.npc_name_tmp.text = RoleManager.Instance.mainRoleInfo.name
  349. local main_vo = RoleManager.Instance.mainRoleInfo
  350. local model_id, texture_id = main_vo:GetRoleClotheTextureId()
  351. local weapon_model_id, weapon_texture_id = main_vo:GetWeaponClotheId()
  352. local head_model_id,head_clothe_id = main_vo:GetRoleHeadId()
  353. local data = {
  354. career = main_vo.career,
  355. clothe_res_id = main_vo:GetRoleClotheId(),
  356. weapon_res_id = weapon_model_id,
  357. weapon_clothe_id = weapon_texture_id,
  358. role_type = SceneBaseType.Role,
  359. fashion_model_id = model_id,
  360. texture_id = texture_id,
  361. wing_id = main_vo.wing_id,
  362. image_id = main_vo.image_id,
  363. head_wear_id = head_model_id,
  364. head_clothe_id = head_clothe_id,
  365. size = Vector2(666,819),
  366. scale = 350,
  367. position = Vector3(40, 200, 0),
  368. action_name_list = {"show"},
  369. show_shadow = false,
  370. use_bloom = false,
  371. raycastParent = false,
  372. role_position_offset = true,
  373. can_rotate = false,
  374. rotate = -5,
  375. }
  376. lua_resM:SetRoleModel(self,self.role_con,data)
  377. else --NPC头像
  378. local icon_id = 0
  379. local weapon_id = 0
  380. local texture_id = 0
  381. local npc_config = ConfigItemMgr.Instance:GetNpcItem(self.npcDialogVo.npc_id)
  382. if npc_config then
  383. icon_id = npc_config.icon
  384. nameStr = Trim(npc_config.name)
  385. weapon_id = npc_config.arm_id
  386. texture_id = npc_config.texture_id
  387. end
  388. if icon_id ~= 0 then
  389. self.role_con.gameObject:SetActive(true)
  390. self.npc_name_tmp.text = nameStr
  391. local npc = Scene.Instance:GetNpc(self.npcDialogVo.npc_id)
  392. --RT
  393. -- local data = {
  394. -- clothe_res_id = icon_id,
  395. -- weapon_res_id = weapon_id,
  396. -- role_type = SceneBaseType.Npc,
  397. -- texture_id = texture_id,
  398. -- image_id = texture_id,
  399. -- size = Vector2(716,882),
  400. -- scale = 100,
  401. -- position = Vector3(10, 50, 0),
  402. -- action_name_list = {"casual", "idle"},
  403. -- show_shadow = false,
  404. -- raycastParent = false,
  405. -- can_rotate = false,
  406. -- renderSize = Vector2(716,882),
  407. -- use_bloom = true,
  408. -- }
  409. -- lua_resM:SetRoleModelByRT(self,self.role_con,data)
  410. --直接挂模型
  411. local data = {
  412. clothe_res_id = icon_id,
  413. weapon_res_id = weapon_id,
  414. role_type = SceneBaseType.Npc,
  415. texture_id = texture_id,
  416. image_id = texture_id,
  417. size = Vector2(716,882),
  418. scale = 380,
  419. position = Vector3(40, 200, 0),
  420. action_name_list = {"casual", "idle"},
  421. show_shadow = false,
  422. raycastParent = false,
  423. can_rotate = false,
  424. }
  425. lua_resM:SetRoleModel(self,self.role_con,data)
  426. else
  427. self.role_con.gameObject:SetActive(false)
  428. self.npc_name_obj:SetActive(false)
  429. end
  430. end
  431. end
  432. --延迟一帧
  433. if not self.show_figure_timer_id then
  434. self.show_figure_timer_id = GlobalTimerQuest:AddDelayQuest(timer_func, 0.04)
  435. end
  436. end
  437. function DialogueViewNew:SetAwardList( )
  438. for i, v in pairs(self.item_list) do
  439. v:SetVisible(false)
  440. end
  441. if self.npcDialogVo and self.npcDialogVo.award ~= nil then
  442. local award_list = self.npcDialogVo.award
  443. for i, v in ipairs(award_list) do
  444. local item = self.item_list[i]
  445. if item == nil then
  446. item = UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.award_conta)
  447. self.item_list[i] = item
  448. end
  449. item:SetVisible(true)
  450. item:SetItemSize(62, 62)
  451. local goods_id, lock = GoodsModel:getInstance():GetMappingTypeId(v[1], v[2])
  452. item:SetData(goods_id, v[3], nil, nil, lock)
  453. item:SetPosition((i - 1) * 72 + 15, 4)
  454. end
  455. end
  456. end
  457. --更新按钮状态
  458. function DialogueViewNew:UpdateBtnInfo( )
  459. --跑环的起点任务
  460. self.fake_circle_btn_id = false
  461. self.ask_task_str = ""
  462. local show_task = {}
  463. if self.npcDialogVo and self.npcDialogVo.task_list then
  464. show_task = DeepCopy(self.npcDialogVo.task_list)
  465. local scene_id = SceneManager.Instance:GetSceneId()
  466. local npc_cfg = TaskModel:getInstance():GetTaskAcceptNpcConfig()
  467. if scene_id == npc_cfg[6].scene_id and self.npcDialogVo.npc_id == npc_cfg[6].npc_id then
  468. if TaskModel:getInstance():CanAcceptCircleTask( TaskType.GUILD_LINE ) and GetModuleIsOpen(300,2) then
  469. if TaskModel:getInstance():GetGuildTipTask( TaskType.GUILD_LINE ) then
  470. table.insert( show_task, TaskModel:getInstance():GetGuildTipTask( TaskType.GUILD_LINE ) )
  471. self.fake_circle_btn_id = TaskModel:getInstance():GetGuildTipTask( TaskType.GUILD_LINE ).task_id
  472. end
  473. end
  474. end
  475. if scene_id == npc_cfg[7].scene_id and self.npcDialogVo.npc_id == npc_cfg[7].npc_id then
  476. local test = TaskModel:getInstance():CanAcceptCircleTask( TaskType.BOUNTY_LINE )
  477. if TaskModel:getInstance():CanAcceptCircleTask( TaskType.BOUNTY_LINE ) and GetModuleIsOpen(300,1) then
  478. if TaskModel:getInstance():GetBountyTipTask( TaskType.BOUNTY_LINE ) then
  479. table.insert( show_task, TaskModel:getInstance():GetBountyTipTask( TaskType.BOUNTY_LINE ) )
  480. self.fake_circle_btn_id = TaskModel:getInstance():GetBountyTipTask( TaskType.BOUNTY_LINE ).task_id
  481. end
  482. end
  483. end
  484. end
  485. self.time_obj:SetActive(true)
  486. if self.npcDialogVo and #self.npcDialogVo.task_list > 1 then
  487. --多任务
  488. -- self.click_btn_obj:SetActive(false)
  489. self.taskBtnCon_obj:SetActive(false)
  490. self:SetOptionalTaskData(false)
  491. self:CreateMultTaskBtn(show_task)
  492. else
  493. --按钮重置,默认单选项主线
  494. self.mult_task_con_obj:SetActive(false)
  495. self:SetOptionalTaskData(false)
  496. -- self.click_btn_obj:SetActive(true)
  497. self.taskBtnCon_obj:SetActive(true)
  498. -- SetAnchoredPositionY( self.time.transform, -277 )
  499. self.time.transform.anchoredPosition = Vector3(545, -32, 0)
  500. -- self:ShowFinishBtn(false)
  501. local btn_cfg_txt = ""
  502. if self.npcDialogVo.task_id and self.npcDialogVo.task_id == 0 then
  503. btn_cfg_txt = "我知道了" --当前npc没任务
  504. else
  505. local task_cfg = ConfigItemMgr.Instance:GetTaskData(self.npcDialogVo.task_id)
  506. btn_cfg_txt = task_cfg and task_cfg.bt_text and Trim(task_cfg.bt_text) or "继续任务"
  507. end
  508. if self.dialogIndex < self.npcDialogVo.dialogList.total_content then -- 多个对话内容时,提示为点击继续
  509. self.click_btn_lable_tmp.text = btn_cfg_txt ~= "" and btn_cfg_txt or "继续任务"
  510. elseif self.dialogIndex == self.npcDialogVo.dialogList.total_content and self.npcDialogVo.task_id ~= 0 then
  511. self:ShowContinueBtn()
  512. -- self:ShowFinishBtn(true)
  513. self.click_btn_lable_tmp.text = btn_cfg_txt ~= "" and btn_cfg_txt or "继续任务"
  514. elseif self:CanBeginCircleTask() then
  515. --如果是社团使者而且未接社团任务 / 赏金使者而且未接赏金任务
  516. self.click_btn_lable_tmp.text = btn_cfg_txt ~= "" and btn_cfg_txt or "继续任务"
  517. self.ask_task_str = Config.ConfigTaskEffect.DefaultGuildTaskDialogueContent
  518. else
  519. local npc_cfg = ConfigItemMgr.Instance:GetNpcItem(self.npcDialogVo.npc_id)
  520. local npc_default_btnstr = npc_cfg and Trim(npc_cfg.bt_text)
  521. self.click_btn_lable_tmp.text = npc_default_btnstr ~= "" and npc_default_btnstr or btn_cfg_txt
  522. end
  523. end
  524. end
  525. -- 显示完成任务按钮(不显示按钮时显示箭头按钮)
  526. function DialogueViewNew:ShowFinishBtn( bool )
  527. if not bool then return end
  528. self.click_btn_obj:SetActive(bool)
  529. self.sureBtn_obj:SetActive(not bool)
  530. end
  531. function DialogueViewNew:ShowContinueBtn()
  532. local task = TaskModel:getInstance():GetTaskById(self.npcDialogVo.task_id)
  533. if task then
  534. if task.type == TaskType.MAIN_LINE or task.type == TaskType.EXTENSION_LINE or task.type == TaskType.BOUNTY_LINE then
  535. --主线支线跑环
  536. for k, v in pairs(task.taskTips) do
  537. if v.type == TaskTipType.TYPE35 and v.isFinish == 0 then -- 如果是可选选项任务
  538. self:SetOptionalTaskData(true, v)
  539. self.ask_task_str = task.description
  540. break
  541. end
  542. end
  543. end
  544. end
  545. end
  546. -- 设置可选任务数据,没有正确答案了,两个选项都可以走
  547. function DialogueViewNew:SetOptionalTaskData(show, task_tip_vo)
  548. if show and task_tip_vo then
  549. -- SetAnchoredPositionY( self.time.transform, -52 )
  550. self.time_obj:SetActive(false)
  551. self.optional_conta_obj:SetActive(true)
  552. -- self.click_btn_obj:SetActive(false)
  553. self.taskBtnCon_obj:SetActive(false)
  554. self.is_chooseing_option = true
  555. self.option_cfg = TaskModel:getInstance():GetOptionalTaskCfg(self.npcDialogVo.task_id)
  556. if not self.option_cfg then
  557. print("error OptionalTaskCfg is null, task_id = "..tostring(self.npcDialogVo.task_id))
  558. return
  559. end
  560. local option_count = #self.option_cfg.talk_list
  561. if option_count == 3 then
  562. self.option_3_obj:SetActive(true)
  563. SetAnchoredPositionY(self.optional_conta, 8.5)
  564. else
  565. self.option_3_obj:SetActive(false)
  566. SetAnchoredPositionY(self.optional_conta, -50.5)
  567. end
  568. for i = 1, option_count do
  569. local txt = self.option_cfg.talk_list[i].content[1]
  570. and self.option_cfg.talk_list[i].content[1].list[1]
  571. and self.option_cfg.talk_list[i].content[1].list[1].text
  572. and Trim(self.option_cfg.talk_list[i].content[1].list[1].text) or ""
  573. self["option"..i.."_txt_tmp"].text = txt
  574. end
  575. else
  576. self.is_chooseing_option = false
  577. self.option_cfg = nil
  578. self.optional_conta_obj:SetActive(false)
  579. end
  580. end
  581. -- 当选中了可选任务的选项后执行的逻辑
  582. function DialogueViewNew:SelectOptionalTask(selected_index)
  583. self.is_chooseing_option = false
  584. if not self.option_cfg then
  585. print("error !! option_cfg is nil")
  586. return
  587. end
  588. local talk_id = self.option_cfg.talk_list[selected_index] and self.option_cfg.talk_list[selected_index].id
  589. self.model:Fire(DialogueModel.REQUEST_CCMD_EVENT, 30015, TaskTipType.TYPE35, self.npcDialogVo.npc_id, talk_id)
  590. --选项飘字:理性+5 or 感性+5
  591. -- local choose_type = 2 --1是理性,2是感性 3是中性
  592. -- if (self.option_cfg.intellect_first and selected_index == 1) or (not self.option_cfg.intellect_first and selected_index == 2) then
  593. -- choose_type = 1
  594. -- end
  595. -- 性格系统不要了 不用瓢字
  596. -- local choose_value_list = stringtotable(self.option_cfg.value)
  597. -- local task = TaskModel:getInstance():GetTaskById(self.npcDialogVo.task_id)
  598. -- if task.type == TaskType.BOUNTY_LINE then -- 日常任务需要读第四个key值
  599. -- local choose_value = 0
  600. -- for i,v in ipairs(choose_value_list) do
  601. -- if v[1] == 4 then
  602. -- choose_value = v[2]
  603. -- break
  604. -- end
  605. -- end
  606. -- GlobalEventSystem:Fire(DialogueModel.CHOOSE_MESSAGE_EVENT, 4, choose_value)
  607. -- else -- 主线任务按选择的index取key值
  608. -- local choose_value = choose_value_list[selected_index] and choose_value_list[selected_index][2] or 0
  609. -- GlobalEventSystem:Fire(DialogueModel.CHOOSE_MESSAGE_EVENT, self.option_cfg.talk_list[selected_index].choose_type, choose_value)
  610. -- end
  611. self:Close()
  612. end
  613. -- 选择语种
  614. function DialogueViewNew:SelectVoice( flag )
  615. if not flag then return end
  616. self.select_flag = flag
  617. local source1 = flag == DialogVoiceFlag.CN and "dialog_icon2" or "dialog_icon1"
  618. lua_resM:setImageSprite(self,self.cn_voice_icon_img, "dialogue_asset", source1, true)
  619. local source2 = flag == DialogVoiceFlag.JP and "dialog_icon2" or "dialog_icon1"
  620. lua_resM:setImageSprite(self,self.jp_voice_icon_img, "dialogue_asset", source2, true)
  621. local source3 = flag == DialogVoiceFlag.EN and "dialog_icon2" or "dialog_icon1"
  622. lua_resM:setImageSprite(self,self.en_voice_icon_img, "dialogue_asset", source3, true)
  623. end
  624. --创建多任务按钮
  625. function DialogueViewNew:CreateMultTaskBtn(task_list)
  626. -- 对任务进行需求排序(已完成的在前,已完成的按照完成时间排序,可接任务其次按等级升序排序)
  627. task_list = self.model:SortMultTaskList(task_list)
  628. -- 最多展示3个任务
  629. local callback = function(task_data)
  630. if self.is_chooseing_option then
  631. self:ClickMultTaskBtnFunc(task_data)
  632. return
  633. end
  634. if task_data and self.fake_circle_btn_id == task_data.task_id then
  635. --跑环假数据接任务
  636. self:OnTaskSelect()
  637. return
  638. end
  639. -------------------------
  640. local data = TaskModel:getInstance():GetTaskById( task_data.task_id )
  641. if task_data.task_state == 2 and data then
  642. --已接未完成的,让他去做任务
  643. local vip = RoleManager.Instance.mainRoleInfo.vip_flag
  644. if vip > 0 and TaskModel:getInstance():IsShowFlyShoe(data) then
  645. TaskModel:getInstance():TaskClickFun(data,true)
  646. else
  647. TaskModel:getInstance():TaskClickFun(data)
  648. end
  649. self:Close()
  650. return
  651. else
  652. self:ClickMultTaskBtnFunc(task_data)
  653. end
  654. end
  655. local show_num = #task_list > 3 and 3 or #task_list
  656. for k=1, show_num do
  657. local item = self.task_item_list[k]
  658. if not item then
  659. item = DialogueTaskBtnItem.New(self.mult_task_con, nil, self.layer_name)
  660. self.task_item_list[k] = item
  661. end
  662. item:SetVisible(true)
  663. local pos = Vector2(0, (show_num - k) * 66)
  664. item:SetData(task_list[k], pos, callback)
  665. end
  666. if #self.task_item_list > show_num then
  667. for k = show_num+1, #self.task_item_list do
  668. self.task_item_list[k]:SetVisible(false)
  669. end
  670. end
  671. self.mult_task_con_obj:SetActive(true)
  672. -- 这里保存一次多任务选择时的自动任务数据
  673. self.auto_mult_task_cache_data = task_list[1]
  674. -- SetAnchoredPositionY( self.time.transform, -191 + show_num*66 )
  675. -- SetAnchoredPositionY( self.time.transform, -191 )
  676. self.time.transform.anchoredPosition = Vector3(467, 119, 0)
  677. end
  678. function DialogueViewNew:ClickMultTaskBtnFunc(task_data)
  679. TaskModel:getInstance().now_task_id = task_data.task_id
  680. self.model:SetMultSelectTaskID(task_data.task_id)
  681. GlobalEventSystem:Fire(SceneEventType.SHOW_TASK, self.npcDialogVo.npc_id)
  682. end
  683. --是否可以触发赏金任务或社团任务
  684. function DialogueViewNew:CanBeginCircleTask()
  685. if self.npcDialogVo then
  686. return self.npcDialogVo.npc_id == TaskModel:getInstance():GetTaskAcceptNpcConfig(TaskType.GUILD_LINE).npc_id and TaskModel:getInstance():CanAcceptCircleTask(TaskType.GUILD_LINE)
  687. else
  688. return false
  689. end
  690. end
  691. -- 此函数如有修改请同步修改TaskCircleTipsNew:GoTaskCall( )
  692. function DialogueViewNew:OnTaskSelect()
  693. if not self.npcDialogVo then
  694. return
  695. end
  696. --self.npcDialogVo.task_id 大于0说明是12102的返回显示信息
  697. local cur_task_id = self.npcDialogVo.task_id and self.npcDialogVo.task_id or 0
  698. if self:CanBeginCircleTask() and (cur_task_id <= 0) then
  699. if self.npcDialogVo.npc_id == TaskModel:getInstance():GetTaskAcceptNpcConfig(TaskType.BOUNTY_LINE).npc_id then
  700. self.model:Fire(DialogueModel.REQUEST_CCMD_EVENT, 30009, TaskType.BOUNTY_LINE)
  701. TaskModel:getInstance().need_do_task_type = TaskType.BOUNTY_LINE --标记需要自动做任务
  702. self.model.dialogue_is_open = false
  703. TaskModel:getInstance().is_stop = false
  704. elseif self.npcDialogVo.npc_id == TaskModel:getInstance():GetTaskAcceptNpcConfig(TaskType.GUILD_LINE).npc_id then
  705. self.model:Fire(DialogueModel.REQUEST_CCMD_EVENT, 30009, TaskType.GUILD_LINE)
  706. TaskModel:getInstance().need_do_task_type = TaskType.GUILD_LINE --标记需要自动做任务
  707. self.model.dialogue_is_open = false
  708. TaskModel:getInstance().is_stop = false
  709. end
  710. self:Close()
  711. return
  712. end
  713. -- 选择任务选项时,不进行任何操作
  714. if self.is_chooseing_option then return end
  715. if self.btnStatus == 1 then--离开
  716. --如果是护送中转npc,传到拦截场景
  717. -- if self.npcDialogVo.npc_id == Config.Husongnpc[1].npc_id then
  718. -- if RoleManager.Instance.mainRoleInfo.level < Config.ConfigOpenLv.RightTop.escort then
  719. -- Message.show(string.format("%s级开启护送", Config.ConfigOpenLv.RightTop.escort))
  720. -- else
  721. -- GlobalEventSystem:Fire(SceneEventType.REQUEST_CHANGE_SCENE, Config.Husongnpc[2].scene_id)
  722. -- end
  723. -- end
  724. self:Close()
  725. elseif self.btnStatus == 2 then--继续对话
  726. if #self.npcDialogVo.task_list > 0 and TaskModel:getInstance().now_task_id and TaskModel:getInstance().now_task_id ~= 0 then
  727. self:SelectTask(self.npcDialogVo.task_list[1].task_id, self.npcDialogVo.task_list[1].task_state);
  728. return
  729. end
  730. self:UpdateView()
  731. elseif self.btnStatus == 3 or self.btnStatus == 4 then
  732. local is_complete = self:tryCompleteSendLetterTask()
  733. print('lzr:DialogueViewNew.lua[563] is_complete', is_complete)
  734. if is_complete then
  735. --送信任务
  736. self:Close()
  737. return
  738. end
  739. --打完副本, 切回主城继续任务
  740. local task = TaskModel:getInstance():GetTaskById(self.npcDialogVo.task_id)
  741. if self.npcDialogVo and self.npcDialogVo.task_id then
  742. if task and task.task_kind == TaskKind.DUN_KIND then
  743. for k, v in pairs(task.taskTips) do
  744. if v.type == TaskTipType.TYPE2 and v.isFinish == 0 then
  745. TaskModel:getInstance():SetNeedTaskFlag(false)
  746. end
  747. end
  748. end
  749. end
  750. --完成任务
  751. if #self.npcDialogVo.task_list > 0 then
  752. self:SelectTask(self.npcDialogVo.task_list[1].task_id, self.npcDialogVo.task_list[1].taskState);
  753. return
  754. end
  755. local eventText = self.btnData
  756. if self.dialogDic[eventText] == nil then
  757. return
  758. end
  759. --发协议去触发任务
  760. -- 圣物任务一律不通过对话界面去更新进度
  761. if task and task.type ~= TaskType.PSIONIC_LINE then
  762. GlobalEventSystem:Fire(DialogueModel.CLICK_ANSWER, self.npcDialogVo, self.dialogDic[eventText])
  763. end
  764. if task and task.type == TaskType.MAIN_LINE then
  765. GlobalEventSystem:Fire(DialogueModel.MAIN_LINE_CLICK_OK, task.id)
  766. end
  767. self:Close()
  768. else
  769. GlobalEventSystem:Fire(DialogueModel.CLICK_OK, self.npcDialogVo and self.npcDialogVo.npc_id or 0 )
  770. self:Close()
  771. end
  772. end
  773. function DialogueViewNew:tryCompleteSendLetterTask( )
  774. local task = TaskModel:getInstance():GetTaskById(self.npcDialogVo.task_id)
  775. if task and task.tipType and task.tipType == TaskTipType.TYPE38 then
  776. self.model:Fire(DialogueModel.REQUEST_CCMD_EVENT, 30015, TaskTipType.TYPE38, self.npcDialogVo.npc_id,0)
  777. return true
  778. end
  779. return false
  780. end
  781. --发12102,继续获取任务对话协议,重新走showDialogue
  782. function DialogueViewNew:SelectTask(id, state)
  783. GlobalEventSystem:Fire(DialogueModel.SELECT_TASK, id, self.npcDialogVo.npc_id, state)
  784. end
  785. function DialogueViewNew:CreateTimer()
  786. self:ClearTimer()
  787. local has_mult_task = self.npcDialogVo.task_list and #self.npcDialogVo.task_list > 1 or false
  788. local has_not_task = self.npcDialogVo.task_id and self.npcDialogVo.task_id == 0 or false
  789. if self.auto_time > 0 then
  790. local end_time = self.auto_time + TimeUtil:getServerTime()
  791. local function onTimer()
  792. local last_time = end_time - TimeUtil:getServerTime()
  793. if last_time > 0 and self.gameObject then
  794. -- 多选任务时
  795. if has_mult_task then
  796. self.time_tmp.text = string.format("(%d秒后自动选择)", last_time)
  797. elseif self.option_cfg then
  798. self.option_time_tmp.text = "".. last_time .. "秒后自动选择)"
  799. elseif has_not_task then
  800. self.time_tmp.text = string.format("(%d秒后继续)", last_time)
  801. else
  802. self.time_tmp.text = string.format("(%d秒后继续任务)", last_time)
  803. end
  804. else
  805. self:ClearTimer()
  806. -- 倒计时结束后,自动选择id靠前的答案
  807. if self.option_cfg then
  808. self:SelectOptionalTask(1)
  809. return
  810. end
  811. -- 多选任务时,自动选择创建多任务时缓存的第一个任务
  812. if has_mult_task then
  813. if self.auto_mult_task_cache_data then
  814. self:ClickMultTaskBtnFunc(self.auto_mult_task_cache_data)
  815. return
  816. end
  817. end
  818. --继续任务对话
  819. self:OnTaskSelect()
  820. end
  821. end
  822. self.timer_id = GlobalTimerQuest:AddPeriodQuest(onTimer, 1, -1)
  823. onTimer()
  824. end
  825. end
  826. function DialogueViewNew:ClearTimer()
  827. if self.timer_id then
  828. GlobalTimerQuest:CancelQuest(self.timer_id)
  829. self.timer_id = nil
  830. end
  831. end
  832. function DialogueViewNew:DestroySuccess( )
  833. self:ClearTimer()
  834. for i, item in pairs(self.item_list) do
  835. UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, item)
  836. end
  837. self.item_list = {}
  838. for k,v in pairs(self.task_item_list) do
  839. v:DeleteMe()
  840. end
  841. self.task_item_list = {}
  842. if self.stop_task_id then
  843. GlobalEventSystem:UnBind(self.stop_task_id)
  844. self.stop_task_id = nil
  845. end
  846. if self.update_bounty_reward_id then
  847. GlobalEventSystem:UnBind(self.update_bounty_reward_id)
  848. self.update_bounty_reward_id = nil
  849. end
  850. if self.show_figure_timer_id then
  851. GlobalTimerQuest:CancelQuest(self.show_figure_timer_id)
  852. self.show_figure_timer_id = nil
  853. end
  854. if self.guide_trigger_id then
  855. GlobalEventSystem:UnBind(self.guide_trigger_id)
  856. self.guide_trigger_id = nil
  857. end
  858. end
  859. function DialogueViewNew:CheckGudie()
  860. if RoleManager.Instance.mainRoleInfo.level == 1 and self.npcDialogVo and self.npcDialogVo.npc_id == 100101 then
  861. GlobalEventSystem:Fire(EventName.TEST_HELP_STEP, 999991001)
  862. elseif RoleManager.Instance.mainRoleInfo.level <= 10 and self.npcDialogVo and #self.npcDialogVo.task_list then
  863. for i,v in ipairs(self.npcDialogVo.task_list) do
  864. if v.task_id == 10030 then
  865. GlobalEventSystem:Fire(EventName.TEST_HELP_STEP, 999991002)
  866. end
  867. end
  868. end
  869. end
  870. function DialogueViewNew:AddToStageHandler()
  871. if self.gameObject == nil then return end
  872. local helpVo = GuideModel:getInstance():GetHelpVo(HelpType.DO_MAIN_TASK,1)
  873. --or GuideModel:getInstance():GetHelpVo(HelpType.TASK_SELECT,1)
  874. if not helpVo then return end
  875. local help_type = helpVo.help_type
  876. local step = helpVo.step
  877. local button = false
  878. if help_type == HelpType.DO_MAIN_TASK and step == 1 then
  879. button = self.click_btn_obj
  880. elseif help_type == HelpType.TASK_SELECT and step == 1 then
  881. button = self.option_1_obj
  882. end
  883. if button then
  884. local function call_back()
  885. self:Close()
  886. end
  887. GlobalEventSystem:Fire(EventName.OPEN_GUIDE_PROMPT_VIEW, button.transform, self.transform, call_back, helpVo, self.layout_file)
  888. end
  889. end
  890. function DialogueViewNew:Close()
  891. --完成引导
  892. local helpVo = GuideModel:getInstance():GetHelpVo(HelpType.DO_MAIN_TASK,1)
  893. --or GuideModel:getInstance():GetHelpVo(HelpType.TASK_SELECT,1)
  894. if helpVo then
  895. GlobalEventSystem:Fire(EventName.FINISH_CURRENT_HELP_STEP,helpVo)
  896. end
  897. BaseView.Close(self)
  898. end