源战役客户端
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

919 行
37 KiB

  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 圣物系统主界面
  4. -- *>
  5. PsionicMainView = PsionicMainView or BaseClass(BaseView)
  6. local PsionicMainView = PsionicMainView
  7. local cos = math.cos
  8. local sin = math.sin
  9. local rad = math.rad
  10. local clamp = Mathf.Clamp
  11. function PsionicMainView:__init()
  12. self.base_file = "psionic"
  13. self.layout_file = "PsionicMainView"
  14. self.layer_name = "UI"
  15. self.destroy_imm = true
  16. self.use_background = G_USING_BG --全屏界面默认使用这个参数
  17. self.hide_maincancas = true --全屏界面需要隐藏主UI
  18. self.append_to_ctl_queue = true --是否要添加进界面堆栈
  19. self.ignore_use_anim = true
  20. self.use_show_anim = false
  21. self.use_hide_anim = false
  22. self.close_fog = true
  23. self.change_scene_close = true
  24. self.tab_index = PsionicConst.TabId.PArmor -- 页签索引
  25. self.open_switch_index = PsionicConst.TabId.PArmor -- 跳转index
  26. self.main_vo = RoleManager.Instance.mainRoleInfo
  27. -- 界面列表
  28. self.view_list = {}
  29. -- 装备栏位置列表
  30. self.equip_con_list = {}
  31. self.main_equip_item_list = {} -- 圣物主页的圆盘上的装备节点
  32. self.tab_equip_item_list = {} -- 圣物升级,洗练,觉醒等页签的左侧当tab节点用的装备节点
  33. self.skill_con_list = {}
  34. self.skill_item_list = {}
  35. self.break_tab_list = {}
  36. self.break_tab_index = 1
  37. -- 装备临时数据相关
  38. self.equip_last_select_slot = nil -- 上次选中的装备slot
  39. self.skill_last_select_slot = nil -- 上次选中的技能slot
  40. self.ps_target_wash_uid = nil -- 目标选中的洗练装备uid
  41. self.cur_show_equip_goods_id = nil -- 当前查看的模型的装备id
  42. self.armor_item_list = {}
  43. self.equip_circle_radius = 0
  44. self.advance_drag_y = 0
  45. -- 模型信息数据相关
  46. self.psionic_effect_res = nil -- 当前的圣环特效名
  47. self.star_list = {}
  48. self.model = PsionicModel:getInstance()
  49. self.goods_model = GoodsModel:getInstance()
  50. self.is_in_guide = false
  51. self.load_callback = function ()
  52. -- 保险起见,每次打开界面都要请求一次最新数据
  53. self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13900)
  54. self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13910)
  55. self:LoadSuccess()
  56. self:AddEvent()
  57. self:UpdateTabRed()
  58. end
  59. self.open_callback = function ( )
  60. self:OpenSuccess()
  61. end
  62. self.switch_callback = function(index)
  63. self:SwitchTab(index)
  64. end
  65. self.destroy_callback = function ( )
  66. self:DestroySuccess()
  67. end
  68. end
  69. function PsionicMainView:Open(index, other_args)
  70. self.open_switch_index = index
  71. -- self.tab_index = index
  72. if index == PsionicConst.TabId.PSkill then
  73. self.skill_last_select_slot = other_args and other_args.slot or self.skill_last_select_slot
  74. elseif index == PsionicConst.TabId.PWash then
  75. self.ps_target_wash_uid = other_args and other_args.target_uid or self.ps_target_wash_uid
  76. -- 如果存在需要选中的装备id,那要把洗练左侧页签定到第一个页签上
  77. self.break_tab_index = self.ps_target_wash_uid and 1 or self.break_tab_index
  78. else
  79. self.equip_last_select_slot = other_args and other_args.slot or self.equip_last_select_slot
  80. end
  81. BaseView.Open(self)
  82. end
  83. function PsionicMainView:LoadSuccess()
  84. local nodes = {
  85. -- 右侧界面容器
  86. "container",
  87. "right",
  88. -- 装备突破tab节点
  89. "left/break_tab_con:obj",
  90. "left/equip_tab_con:obj",
  91. -- 左侧装备节点
  92. "main/equip_con:obj", "main/equip_con/activate_effect_btn:obj", "main/equip_con/activate_effect_btn/activate_effect_btn_red:obj",
  93. -- 装备模型信息节点
  94. "main/equip_info_con:obj",
  95. "main/equip_info_con/break_select_scroll:obj", "main/equip_info_con/break_select_scroll/Viewport/break_select_con",
  96. "main/equip_info_con/break_select_bg:obj", -- 装备突破背包容器
  97. "main/equip_info_con/equip_name:tmp", "main/equip_info_con/equip_name_bg", -- 装备名称及背景板
  98. "main/equip_info_con/equip_star_con", "main/equip_info_con/equip_model_con", -- 装备星数容器和模型容器
  99. "main/equip_info_con/equip_effect_con",
  100. }
  101. self:GetChildren(nodes)
  102. -- 装备界面相关
  103. -- 主页的圆盘上的装备和技能节点位置
  104. for k = 1, 4 do
  105. self.equip_con_list[k] = self:GetChild("main/equip_con/left_equip_con" .. k)
  106. end
  107. for k = 1, 4 do
  108. self.skill_con_list[k] = self:GetChild("main/equip_con/right_equip_con" .. k)
  109. end
  110. local function select_callback(index)
  111. self:SwitchTab(index)
  112. end
  113. local function close_callback()
  114. self:Close()
  115. end
  116. self.tabWindowComponent = UITabWindow.New(self.transform, PsionicConst.TabData, select_callback, close_callback, self.background_wnd, nil, UITabWindow.SizeSmallHall, nil, nil, true)
  117. self.tabWindowComponent:SetTitleText("圣物")
  118. self.tabWindowComponent:ChangeShowFlag("Psionic")
  119. self:AddToStageHandler()
  120. end
  121. function PsionicMainView:AddEvent()
  122. local function click_event(target)
  123. if target == self.activate_effect_btn_obj then
  124. self.model:Fire(PsionicConst.OPEN_PSIONIC_EFFECT_EQUIP_VIEW, true)
  125. end
  126. end
  127. AddClickEvent(self.activate_effect_btn_obj, click_event)
  128. -- 圣物装备突破成功后,要重新更新圣物装备进阶界面信息
  129. local function update_advance_view(slot)
  130. self:SelectMainRoleArmorItem(slot, true)
  131. end
  132. self:BindEvent(self.model, PsionicConst.UPDATE_ACVANCE_VIEW, update_advance_view)
  133. local function update_psionic_tab_red(tab_id)
  134. self:UpdateTabRed(tab_id)
  135. if tab_id and tab_id == PsionicConst.TabId.PArmor then
  136. self:UpdateEffectBtnRed()
  137. end
  138. end
  139. self:BindEvent(self.model, PsionicConst.UPDATE_RED_BY_TABID, update_psionic_tab_red)
  140. -- 特殊事件:在洗练界面中显示出所有的item节点,并取消对左侧装备的选中
  141. local function on_show_all_item_in_refact_view()
  142. self:OnClickEquipItemCallback(nil)
  143. end
  144. self:BindEvent(self.model, PsionicConst.SHOW_ALL_ITEMS_IN_REFACTVIEW, on_show_all_item_in_refact_view)
  145. local function update_break_succeed(uid, slot) -- 圣物装备升星成功后,刷新当前选中的装备数据 uid:装备唯一id
  146. self.ps_target_wash_uid = uid
  147. self:UpdateBreakEquipItem(self.break_tab_index, true, true)
  148. end
  149. self:BindEvent(self.model, PsionicConst.UPDATE_EQUIP_BREAK_SUCCEED, update_break_succeed)
  150. local function play_effect(type)
  151. if type then
  152. local function call_back( )
  153. self.showing_break_level_effect = false
  154. self.showing_break_equip_effect = false
  155. self.showing_skill_effect = false
  156. end
  157. if type == PsionicConst.EffectType.BreakLevel then -- 槽位等级突破成功
  158. if not self.showing_break_level_effect then
  159. self:ClearUIEffect(self.equip_effect_con)
  160. self:AddUIEffect("ui_jinjie", self.equip_effect_con, self.layer_name, Vector3(25, -200, 0), 1, false, 1.5, nil, call_back)
  161. self.showing_break_level_effect = true
  162. end
  163. elseif type == PsionicConst.EffectType.BreakEquip then -- 装备升星成功
  164. if not self.showing_break_equip_effect then
  165. self:ClearUIEffect(self.equip_effect_con)
  166. self:AddUIEffect("ui_jinjie", self.equip_effect_con, self.layer_name, Vector3(25, -78, 0), 1, false, 1.5, nil, call_back)
  167. self.showing_break_equip_effect = true
  168. end
  169. elseif type == PsionicConst.EffectType.Skill then -- 技能升级成功
  170. if not self.showing_skill_effect then
  171. self:ClearUIEffect(self.equip_effect_con)
  172. self:AddUIEffect("ui_jinjie", self.equip_effect_con, self.layer_name, Vector3(25, -200, 0), 1, false, 1.5, nil, call_back)
  173. self.showing_skill_effect = true
  174. end
  175. end
  176. end
  177. end
  178. self:BindEvent(self.model, PsionicConst.PLAY_EFFECT, play_effect)
  179. local function update_equip_data() -- 当玩家当前的圣魂装备发生变动,则需要检测圣魂特效是否要变动
  180. self.model:CheckPsionicEffectStage() -- goodsmodel的检测搬过来这边
  181. end
  182. self:BindEvent(self.model, PsionicConst.UPDATE_PISIONIC_EQUIP_ARMOR, update_equip_data)
  183. local function onGuideTrigger()
  184. self:AddToStageHandler()
  185. end
  186. self:BindEvent(GlobalEventSystem, EventName.TRIGGER_GUIDE_TYPE, onGuideTrigger)
  187. end
  188. function PsionicMainView:OpenSuccess()
  189. -- 更新主角模型信息
  190. -- self:UpdateRoleData()
  191. self:UpdateBreakTabItem()
  192. self:UpdateEffectBtnRed()
  193. self:SwitchTab(self.open_switch_index)
  194. end
  195. -- 针对界面隐藏时的回调处理
  196. function PsionicMainView:HideChangeCall(show)
  197. if show then
  198. -- 修复从其他界面切换回圣物抽奖界面时模型动画的错误
  199. if self.tab_index == PsionicConst.TabId.PDataDig and self.view_list[self.tab_index].is_loaded then -- 圣物寻宝
  200. self.view_list[self.tab_index]:StartTransCGAlphaAnim(true)
  201. end
  202. end
  203. end
  204. function PsionicMainView:UpdateView()
  205. local bg_res = "default_bg_6"
  206. if self.tab_index == PsionicConst.TabId.PArmor then -- 数码装甲
  207. if not self.view_list[self.tab_index] then
  208. self.view_list[self.tab_index] = PsionicArmorView.New(self.right)
  209. self.view_list[self.tab_index]:SetAnchoredPosition(-371, 0)
  210. -- 更新左侧装备和技能节点数据
  211. self:UpdatePsionicEquipAndSkillData()
  212. end
  213. bg_res = "ps_lv_bg"
  214. -- self:CheckPsionicEquipArmorItem(PsionicConst.TabId.PArmor)
  215. elseif self.tab_index == PsionicConst.TabId.PAdvance then -- 圣物进阶
  216. if not self.view_list[self.tab_index] then
  217. self.view_list[self.tab_index] = PsionicAdvanceView.New(self.right)
  218. self.view_list[self.tab_index]:SetAnchoredPosition(-348.5, 0)
  219. end
  220. bg_res = "ps_advance_bg"
  221. -- 每次切换都要选中一件装备
  222. self:SelectMainRoleArmorItem()
  223. -- 创建道具节点
  224. self:CheckPsionicEquipArmorItem(PsionicConst.TabId.PAdvance)
  225. elseif self.tab_index == PsionicConst.TabId.PBreak then -- 圣物突破
  226. if not self.view_list[self.tab_index] then
  227. self.view_list[self.tab_index] = PsionicAdvanceBreakView.New(self.right)
  228. self.view_list[self.tab_index]:SetAnchoredPosition(-348, 0)
  229. end
  230. bg_res = "ps_adv_break_bg"
  231. self.cur_selected_break_goodsVo = nil
  232. self:UpdateBreakEquipItem(self.break_tab_index, true)
  233. elseif self.tab_index == PsionicConst.TabId.PWash then -- 圣物洗练
  234. if not self.view_list[self.tab_index] then
  235. self.view_list[self.tab_index] = PsionicWashView.New(self.right)
  236. self.view_list[self.tab_index]:SetAnchoredPosition(-348, 0)
  237. end
  238. bg_res = "ps_advance_bg"
  239. -- 每次切换都要选中一件装备
  240. self:SelectMainRoleArmorItem()
  241. -- 创建道具节点
  242. self:CheckPsionicEquipArmorItem(PsionicConst.TabId.PWash)
  243. elseif self.tab_index == PsionicConst.TabId.PSkill then -- 圣物觉醒
  244. if not self.view_list[self.tab_index] then
  245. self.view_list[self.tab_index] = PsionicSkillView.New(self.right)
  246. self.view_list[self.tab_index]:SetAnchoredPosition(-348, 0)
  247. end
  248. bg_res = "ps_advance_bg"
  249. -- 每次切换都要选中一个技能
  250. self:SelectCircleItemSkill()
  251. -- 创建道具节点
  252. self:CheckPsionicEquipArmorItem(PsionicConst.TabId.PSkill)
  253. elseif self.tab_index == PsionicConst.TabId.PDataDig then -- 圣物寻宝
  254. if not self.view_list[self.tab_index] then
  255. self.view_list[self.tab_index] = PsionicDrawView.New(self.container)
  256. end
  257. bg_res = "ps_draw_bg"
  258. elseif self.tab_index == PsionicConst.TabId.PExchange then -- 圣物兑换
  259. if not self.view_list[self.tab_index] then
  260. self.view_list[self.tab_index] = PsionicExchangeView.New(self.container)
  261. end
  262. end
  263. self:PopUpChild(self.view_list[self.tab_index])
  264. -- 寻宝界面不要打开物品飞入的表现
  265. self.model:SetPsionicShowFlyGoods(self.tab_index ~= PsionicConst.TabId.PDataDig)
  266. self.tabWindowComponent:SetUIBack(
  267. {
  268. target = self,
  269. bg1 = GameResPath.GetViewBigBg(bg_res)
  270. })
  271. -- 控制界面节点的开关
  272. self:ShowPsionicInfoNodeCon()
  273. end
  274. function PsionicMainView:SwitchTab( index, other_args )
  275. if index == PsionicConst.TabId.PAdvance
  276. or index == PsionicConst.TabId.PWash
  277. or index == PsionicConst.TabId.PSkill then -- 装甲进阶和重构
  278. -- 如果当前一件圣物装备都没有穿戴则屏蔽该界面
  279. local equip_list = self.goods_model:GetPsionicEquipList()
  280. if IsTableEmpty(equip_list) then
  281. Message.show("未穿戴圣物", "fault")
  282. self:SwitchTab(self.tab_index)
  283. return
  284. end
  285. -- 获取目标装备品质
  286. local require_cfg = PsionicConst.RequireEquipColor[index] -- 切换需求前端配置
  287. local has_advancable_equipment
  288. for k, v in pairs(equip_list) do
  289. -- 如果存在目标品质以上的圣物装备,则可以进入相关界面
  290. if v.color >= require_cfg.color then
  291. has_advancable_equipment = true
  292. break
  293. end
  294. end
  295. if not has_advancable_equipment then
  296. local str = string.format("穿戴%s品质以上圣物才可进阶!", require_cfg.str)
  297. Message.show(str, "fault")
  298. self:SwitchTab(self.tab_index)
  299. return
  300. end
  301. elseif index == PsionicConst.TabId.PBreak then -- 圣物突破
  302. local equip_list = self.goods_model:GetPsionicEquipList()
  303. local bag_list = self.model:GetPsionicBagData()
  304. local has_can_break_equip = false
  305. for k, v in ipairs(equip_list) do
  306. if v.next ~= 0 then -- 检查穿戴装备突破后的装备id不是0,下为背包装备的判断
  307. has_can_break_equip = true
  308. break
  309. end
  310. end
  311. if not has_can_break_equip then
  312. for k, v in pairs(bag_list) do
  313. if v.next ~= 0 then
  314. has_can_break_equip = true
  315. break
  316. end
  317. end
  318. end
  319. if IsTableEmpty(equip_list) and IsTableEmpty(bag_list) or not has_can_break_equip then
  320. Message.show("未持有可进化的圣物", "fault")
  321. self:SwitchTab(self.tab_index)
  322. return
  323. end
  324. end
  325. if index == PsionicConst.TabId.PSkill then
  326. self.skill_last_select_slot = other_args and other_args.slot or self.skill_last_select_slot
  327. elseif index == PsionicConst.TabId.PWash then
  328. self.ps_target_wash_uid = other_args and other_args.target_uid or self.ps_target_wash_uid
  329. -- 如果存在需要选中的装备id,那要把洗练左侧页签定到第一个页签上
  330. self.break_tab_index = self.ps_target_wash_uid and 1 or self.break_tab_index
  331. else
  332. self.equip_last_select_slot = other_args and other_args.slot or self.equip_last_select_slot
  333. end
  334. self.tab_index = index
  335. self:DoOpenAni(self.tab_index)
  336. --设置页签索引值切换主页面
  337. if self.tabWindowComponent then
  338. self.tabWindowComponent:SetTabBarIndex(self.tab_index)
  339. end
  340. self:UpdateView()
  341. end
  342. -- 创建装备升星页签节点
  343. function PsionicMainView:UpdateBreakTabItem( )
  344. local function break_tab_clickCallback(index)
  345. for k, v in ipairs(self.break_tab_list) do
  346. v:SetSelected(k == index)
  347. end
  348. self.break_tab_index = index
  349. self:UpdateBreakEquipItem(self.break_tab_index)
  350. end
  351. for i = 1, 5 do
  352. self.break_tab_list[i] = self.break_tab_list[i] or PsionicAdvanceBreakTabItem.New(self.break_tab_con)
  353. self.break_tab_list[i]:SetAnchoredPosition(0, - (i-1) * 55)
  354. self.break_tab_list[i]:SetData(i, break_tab_clickCallback)
  355. end
  356. break_tab_clickCallback(self.break_tab_index or 1)
  357. end
  358. -- 更新选中的圣物装备信息
  359. function PsionicMainView:UpdateSelectedArmorInfo(goods_vo, star_effect)
  360. if goods_vo and not goods_vo.is_empty and (not self.cur_show_equip_goods_id or self.cur_show_equip_goods_id ~= goods_vo.goods_id)then
  361. -- 加载名称
  362. self.equip_name_tmp.text = GoodsModel:getInstance():getGoodsName(goods_vo.type_id)
  363. local star_num = goods_vo.star
  364. -- 加载星数
  365. for k, v in pairs(self.star_list) do
  366. v.gameObject:SetActive(false)
  367. end
  368. local offset_x = (self.equip_star_con.sizeDelta.x - star_num * 27) / 2 + 2
  369. for i = 1, star_num do
  370. self.star_list[i] = self.star_list[i] or UiFactory.createChild(self.equip_star_con, UIType.Image2, "star" .. i)
  371. self.star_list[i].gameObject:SetActive(true)
  372. SetAnchoredPosition(self.star_list[i].transform, (i-1) * 27 + offset_x, 0)
  373. lua_resM:setImageSprite(self, self.star_list[i]:GetComponent("Image"), "psionic_asset", "ps_star_1" , true)
  374. self:ClearUIEffect(self.star_list[i].transform)
  375. if star_effect and i == star_num then -- 需要星星动画时
  376. self:AddUIEffect("ui_jinjiestar", self.star_list[i].transform, self.layer_name, Vector3(13, -12, 0), 1, false)
  377. end
  378. end
  379. -- 加载圣物模型
  380. local model_data = PsionicConst.SlotModel[goods_vo.subtype]
  381. local res_data = {
  382. father_node = self,
  383. transform = self.equip_model_con,
  384. fashion_type = FuncOpenModel.TypeId.OtherGoods,
  385. raycast_size = Vector2(0,0),
  386. rotate = model_data.rotate,
  387. scale = model_data.scale,
  388. figure_id = model_data.model,
  389. position = model_data.pos,
  390. layer_name = self.layer_name,
  391. ui_model_type = UIModelCommon.ModelType.Model,
  392. }
  393. FuncOpenModel:getInstance():SetModelRes(res_data)
  394. self.cur_show_equip_goods_id = goods_vo.goods_id
  395. end
  396. end
  397. -- 更新圣物进化的背包节点 index:对应breaktab的index 1表示全部 2~5代表槽位(slot)4~7的映射 not_scroll_back:是否刷新时容器滚回初始位置
  398. function PsionicMainView:UpdateBreakEquipItem(index, reload_equip_item, not_scroll_back)
  399. -- 加载背包道具数据
  400. -- 是否需要定位到目标装备
  401. local target_item_index = nil
  402. not_scroll_back = not_scroll_back or false
  403. if not self.break_equip_item or reload_equip_item then
  404. self.break_equip_item = self.model:GetPsionicBagData(true) -- 该方法会抽出背包圣物装备数据创建新表返回,true为按品质降序排序
  405. for k = #self.break_equip_item, 1, -1 do -- 移除无法突破的装备
  406. if self.break_equip_item[k].next == 0
  407. and self.break_equip_item[k].goods_id ~= self.ps_target_wash_uid then
  408. table.remove(self.break_equip_item, k)
  409. end
  410. end
  411. end
  412. -- 预先加载穿戴装备(需置顶)
  413. local data = {}
  414. local equip_data = nil
  415. if index == 1 then
  416. for k, v in ipairs(self.break_equip_item) do
  417. data[#data+1] = v
  418. end
  419. -- 倒序插入已穿戴的装备
  420. for i = 7, 3, -1 do
  421. equip_data = self.goods_model:GetPsionicEquipBySlot(i)
  422. if equip_data and equip_data.next ~= 0 then
  423. table.insert(data, 1, equip_data)
  424. end
  425. end
  426. else
  427. equip_data = self.goods_model:GetPsionicEquipBySlot(index + 2)
  428. if equip_data and equip_data.next ~= 0 then
  429. table.insert(data, equip_data)
  430. end
  431. -- 插入这个槽位的装备数据
  432. for k, v in ipairs(self.break_equip_item) do
  433. if v.subtype == index + 2 then
  434. data[#data+1] = v
  435. end
  436. end
  437. end
  438. -- 获取目标装备index
  439. -- 新增修改:新增红点规则 每个槽位按照【当前穿戴】-【装备品质】-【装备星级】的排序规则的可突破的第一件装备给突破红点
  440. -- 当前的装备列表顺序就是以【当前穿戴】-【装备品质】-【装备星级】的规则了,所以遇到条件满足的装备数据就将id加入其中
  441. local slot_break_red_equip_list = {}
  442. -- 如果没有目标选中的index,则定位到数据列表最靠前的可以进化的装备上,下面这个列表缓存存在进化红点的装备index,视情况拿出第一个数据来定位
  443. local temp_index_list = {}
  444. for k, v in ipairs(data) do
  445. if self.ps_target_wash_uid and v.goods_id == self.ps_target_wash_uid then
  446. target_item_index = k
  447. -- break
  448. end
  449. -- 获取缓存下来的突破红点
  450. if not slot_break_red_equip_list[v.subtype] then
  451. local break_bool = self.model:GetPsionicBreakEquipRed(v.goods_id)
  452. if break_bool then
  453. slot_break_red_equip_list[v.subtype] = v.goods_id
  454. temp_index_list[#temp_index_list + 1] = k
  455. end
  456. end
  457. end
  458. -- 当前定位的节点是否是可突破的节点
  459. local is_cur_target_index_in_index_list = false
  460. for k, v in ipairs(temp_index_list) do
  461. is_cur_target_index_in_index_list = is_cur_target_index_in_index_list or (target_item_index and target_item_index == v)
  462. end
  463. if not target_item_index or not is_cur_target_index_in_index_list then
  464. target_item_index = temp_index_list[1] or nil
  465. end
  466. -- 补全格子
  467. local empty_data = {is_empty = true}
  468. local data_length = #data
  469. local need_full_num
  470. if data_length < 12 then
  471. need_full_num = 12
  472. elseif data_length % 6 ~= 0 then
  473. -- 有空白格子,补全成无数据格子
  474. need_full_num = math.ceil(data_length / 6) * 6
  475. end
  476. if need_full_num then
  477. for i = data_length + 1, need_full_num do
  478. data[i] = empty_data
  479. end
  480. end
  481. local callback = function(data)
  482. -- 更新展示的装备信息和模型
  483. self:UpdateSelectedArmorInfo(data, self.ps_target_wash_uid and true or false)
  484. -- 更新突破界面的材料需求
  485. self:UpdateBreakViewData(data, self.ps_target_wash_uid and true or false, slot_break_red_equip_list)
  486. -- 更新选中
  487. self.break_item_creator:IterateItems(function( item, i )
  488. item:SetSelected(item.data.goods_id == data.goods_id)
  489. end)
  490. self.cur_selected_break_goodsVo = data
  491. end
  492. self.break_item_creator = self.break_item_creator or self:AddUIComponent(UI.ItemListCreator)
  493. local info = {
  494. data_list = data,
  495. item_con = self.break_select_con,
  496. scroll_view = self.break_select_scroll,
  497. item_class = PsionicArmorItem,
  498. item_width = 62,
  499. item_height = 62,
  500. start_x = 15.5,
  501. start_y = -13.5,
  502. space_x = 19,
  503. space_y = 15,
  504. create_frequency = 0.01,
  505. alignment = UnityEngine.TextAnchor.UpperLeft,
  506. is_scroll_back_on_update = not not_scroll_back,
  507. on_update_item = function(item, i, v)
  508. item:SetItemScale(0.795)
  509. item:SetBreakSlotRedEquipList(slot_break_red_equip_list)
  510. item:SetData(v, PsionicConst.ArmorItemFlag.Break, callback)
  511. if self.cur_selected_break_goodsVo then
  512. item:SetSelected(v.goods_id == self.cur_selected_break_goodsVo.goods_id)
  513. end
  514. end,
  515. final_callback = function()
  516. if not_scroll_back and target_item_index then
  517. self.break_item_creator:ScrollToItem(target_item_index, -50)
  518. end
  519. end,
  520. }
  521. self.break_item_creator:UpdateItems(info)
  522. callback(target_item_index and data[target_item_index] or (self.cur_selected_break_goodsVo or data[1]))
  523. -- 清空目标选中的uid
  524. self.ps_target_wash_uid = nil
  525. end
  526. -- 更新突破界面的信息
  527. function PsionicMainView:UpdateBreakViewData(goods_vo, need_show_effect, slot_break_red_equip_list)
  528. if self.tab_index == PsionicConst.TabId.PBreak
  529. and self.view_list[self.tab_index] then
  530. self.view_list[self.tab_index]:SetData(goods_vo, need_show_effect, slot_break_red_equip_list)
  531. end
  532. end
  533. -- 加载玩家佩戴的圣物装备
  534. function PsionicMainView:CheckPsionicEquipArmorItem(show_flag)
  535. if IsTableEmpty(self.tab_equip_item_list) then
  536. self:UpdatePsionicEquipArmorData(show_flag)
  537. else
  538. self:ChangePsionicEquipArmorShowFlag(show_flag)
  539. end
  540. end
  541. -- show_flag : 根据打开的页签不同,调整节点的点击回调逻辑
  542. function PsionicMainView:UpdatePsionicEquipArmorData(show_flag)
  543. -- 加载4个位置的装备,
  544. -- 以位置做key,后面更新装备内容的时候直接通过装备位置来获取节点
  545. local item
  546. local function equip_callback(slot)
  547. -- 更新进阶界面中的装备信息
  548. self:SelectMainRoleArmorItem(slot)
  549. end
  550. local function skill_callback(slot)
  551. -- 更新进阶界面中的技能信息
  552. self:SelectCircleItemSkill(slot)
  553. end
  554. for i = 1, 4 do
  555. item = self.tab_equip_item_list[i]
  556. if not item then
  557. -- item = PsionicArmorEquipItem.New(self.equip_con_list[i], nil, self.layer_name)
  558. item = PsionicArmorEquipItem.New(self.equip_tab_con, nil, self.layer_name)
  559. self.tab_equip_item_list[i] = item
  560. end
  561. item:SetAnchoredPosition(0, 179 - (i - 1) * 122)
  562. item:SetData(i, PsionicConst.ArmorItemFlag.Equiped, show_flag, equip_callback, skill_callback)
  563. if show_flag == PsionicConst.TabId.PSkill then
  564. if self.skill_last_select_slot then
  565. item:SetSelected(i == (self.skill_last_select_slot - 3))
  566. end
  567. else
  568. if self.equip_last_select_slot then
  569. item:SetSelected(i == (self.equip_last_select_slot - 3))
  570. end
  571. end
  572. end
  573. end
  574. function PsionicMainView:ChangePsionicEquipArmorShowFlag(show_flag)
  575. for k, v in ipairs(self.tab_equip_item_list) do
  576. v:ChangeShowFlag(show_flag)
  577. end
  578. end
  579. -- 对左侧装备节点的点击的回调
  580. function PsionicMainView:OnClickEquipItemCallback(slot)
  581. if IsTableEmpty(self.tab_equip_item_list) then
  582. return
  583. end
  584. slot = slot and slot - 3 or nil -- 槽位即道具子id,从4开始,需要-3映射
  585. for k, v in pairs(self.tab_equip_item_list) do
  586. v:SetSelected(k == slot)
  587. end
  588. end
  589. -- 切换到进阶或重构界面时,需要自动选中一件装备
  590. function PsionicMainView:SelectMainRoleArmorItem(slot, dont_refresh)
  591. local data
  592. local require_cfg = PsionicConst.RequireEquipColor[self.tab_index]
  593. local get_data = false
  594. -- print("Saber:PsionicMainView [396] self.tab_index: ",self.tab_index)
  595. local function check_color(data)
  596. if data and require_cfg.color ~= 0 then
  597. return data.color >= require_cfg.color
  598. end
  599. return data and true or false
  600. end
  601. if slot then -- 指定了槽位,就需要优先寻找槽位的装备
  602. data = self.goods_model:GetPsionicEquipBySlot(slot)
  603. get_data = check_color(data)
  604. if get_data then
  605. self.equip_last_select_slot = slot
  606. end
  607. end
  608. if not get_data then
  609. if self.equip_last_select_slot then -- 存在上次选中的装备
  610. data = self.goods_model:GetPsionicEquipBySlot(self.equip_last_select_slot)
  611. get_data = check_color(data)
  612. end
  613. if not get_data then -- 上次选中的装备不见了,则需要重新自动定位
  614. for i = 1, 4 do
  615. data = self.goods_model:GetPsionicEquipBySlot(i + 3) -- 槽位即道具子id,从4开始,需要+3映射
  616. get_data = check_color(data)
  617. if get_data then
  618. self.equip_last_select_slot = i + 3
  619. break
  620. end
  621. end
  622. end
  623. end
  624. if get_data and data then
  625. if (self.tab_index == PsionicConst.TabId.PAdvance
  626. or self.tab_index == PsionicConst.TabId.PWash)
  627. and self.view_list[self.tab_index] then -- 装甲进阶
  628. -- 重新设置装备进阶界面数据
  629. self.view_list[self.tab_index]:SetData(data)
  630. end
  631. -- 触发一次对符合条件的节点的点击
  632. if not dont_refresh or self.tab_index == PsionicConst.TabId.PWash then
  633. self:OnClickEquipItemCallback(self.equip_last_select_slot)
  634. end
  635. self:UpdateSelectedArmorInfo(data)
  636. end
  637. return data, self.equip_last_select_slot
  638. end
  639. -- 修改左侧装备的展示类型
  640. -- function PsionicMainView:ChangeEquipShowFlag(flag)
  641. -- for k, v in pairs(self.armor_item_list) do
  642. -- v:SetEquipShowFlag(flag)
  643. -- end
  644. -- end
  645. -- 切换到技能界面时,需要自动选中一个已激活技能
  646. function PsionicMainView:SelectCircleItemSkill(slot, dont_refresh)
  647. local skill_data, get_data
  648. if slot then -- 指定了槽位,就需要优先寻找槽位的装备的技能
  649. skill_data = self.model:GetPsionicSlotData(slot) -- 存在技能数据,代表已经激活
  650. if skill_data and skill_data.skill_lv > 0 then
  651. self.skill_last_select_slot = slot
  652. get_data = true
  653. end
  654. end
  655. if not get_data then
  656. if self.skill_last_select_slot then -- 存在上次选中的装备,查找这件装备上的技能
  657. skill_data = self.model:GetPsionicSlotData(self.skill_last_select_slot)
  658. get_data = skill_data and skill_data.skill_lv > 0
  659. end
  660. if not get_data then -- 上次选中的装备不见了,则需要重新自动定位,找到有技能的槽位
  661. for i = 1, 4 do
  662. skill_data = self.model:GetPsionicSlotData(i + 3)-- 槽位即道具子id,从4开始,需要+3映射
  663. if skill_data and skill_data.skill_lv > 0 then
  664. self.skill_last_select_slot = i + 3
  665. get_data = true
  666. break
  667. end
  668. end
  669. end
  670. end
  671. if get_data then
  672. if self.tab_index == PsionicConst.TabId.PSkill and self.view_list[self.tab_index] then -- 技能觉醒界面
  673. -- 重新设置技能觉醒界面需要展示的数据
  674. self.view_list[self.tab_index]:SetData(skill_data)
  675. end
  676. if not dont_refresh then
  677. self:OnClickEquipItemCallback(self.skill_last_select_slot)
  678. end
  679. self:UpdateSelectedArmorInfo(self.goods_model:GetPsionicEquipBySlot(self.skill_last_select_slot))
  680. end
  681. return skill_data, self.skill_last_select_slot
  682. end
  683. -- 调整主界面节点的显示情况
  684. function PsionicMainView:ShowPsionicInfoNodeCon( )
  685. local is_armor = self.tab_index == PsionicConst.TabId.PArmor
  686. local is_advance = self.tab_index == PsionicConst.TabId.PAdvance
  687. local is_wash = self.tab_index == PsionicConst.TabId.PWash
  688. local is_break = self.tab_index == PsionicConst.TabId.PBreak
  689. local is_skill = self.tab_index == PsionicConst.TabId.PSkill
  690. -- 是否展示主角模型界面
  691. -- self:ShowRoleModelCon(is_armor)
  692. -- 是否展示穿戴装备节点
  693. self:ShowEquipCon(is_armor, is_advance or is_wash or is_skill)
  694. -- 是否展示装备模型节点
  695. self:ShowEquipInfoCon(is_break, is_advance or is_break or is_wash or is_skill)
  696. end
  697. -- 是否展示模型界面
  698. -- function PsionicMainView:ShowRoleModelCon(show)
  699. -- if self.role_con_obj.activeSelf ~= show then
  700. -- self.role_con_obj:SetActive(show)
  701. -- end
  702. -- end
  703. -- 是否展示穿戴装备节点
  704. function PsionicMainView:ShowEquipCon(is_armor, show_tab)
  705. -- 背包页签只展示圆盘上的装备节点,其他页签展示左侧tab节点
  706. if self.equip_con_obj.activeSelf ~= is_armor then
  707. self.equip_con_obj:SetActive(is_armor)
  708. end
  709. if self.equip_tab_con_obj.activeSelf ~= show_tab then
  710. self.equip_tab_con_obj:SetActive(show_tab)
  711. end
  712. -- if self.equip_right_obj.activeSelf ~= is_armor then
  713. -- self.equip_right_obj:SetActive(is_armor)
  714. -- self.equip_title2_tmp.text = is_armor and "圣物技能" or ""
  715. -- end
  716. end
  717. -- 是否展示装备模型节点
  718. function PsionicMainView:ShowEquipInfoCon(is_break, show)
  719. if self.equip_info_con_obj.activeSelf ~= show then
  720. self.equip_info_con_obj:SetActive(show)
  721. if not show then -- 隐藏特效
  722. self.showing_break_level_effect = false
  723. self.showing_break_equip_effect = false
  724. self.showing_skill_effect = false
  725. self:ClearUIEffect(self.equip_effect_con)
  726. end
  727. end
  728. -- 突破界面需要展示背包滚动容器和容器背景,并调整模型位置
  729. if self.break_select_bg_obj.activeSelf ~= is_break then
  730. self.break_select_bg_obj:SetActive(is_break)
  731. self.break_select_scroll_obj:SetActive(is_break)
  732. self.break_tab_con_obj:SetActive(is_break)
  733. end
  734. SetAnchoredPositionY(self.equip_model_con, is_break and -120 or -200)
  735. SetAnchoredPositionY(self.equip_effect_con, is_break and 65 or 25)
  736. end
  737. -- 显示左侧进阶装备列表节点
  738. function PsionicMainView:ShowPsionicArmorListCon( )
  739. -- local bool = self.tab_index == PsionicConst.TabId.PAdvance or self.tab_index == PsionicConst.TabId.PWash or self.tab_index == PsionicConst.TabId.PSkill
  740. -- if self.advance_con_obj.activeSelf ~= bool then -- 显示状态不同,则切换显示状态
  741. -- if not self.adv_node_tween_id then
  742. -- self.advance_con_obj:SetActive(bool)
  743. -- end
  744. -- end
  745. end
  746. -- 加载玩家佩戴的圣物技能
  747. function PsionicMainView:UpdatePsionicEquipAndSkillData( )
  748. -- 加载4个位置的技能,
  749. local e_item, s_item
  750. for i = 1, 4 do
  751. -- 装备节点
  752. e_item = self.main_equip_item_list[i]
  753. if not e_item then
  754. e_item = PsionicArmorEquipItem.New(self.equip_con_list[i])
  755. self.main_equip_item_list[i] = e_item
  756. end
  757. e_item:SetData(i, PsionicConst.ArmorItemFlag.Equiped, PsionicConst.TabId.PArmor)
  758. -- 技能节点
  759. s_item = self.skill_item_list[i]
  760. if not s_item then
  761. s_item = PsionicSkillEquipItem.New(self.skill_con_list[i])
  762. self.skill_item_list[i] = s_item
  763. end
  764. s_item:SetData(i)
  765. end
  766. end
  767. -- 更新页签红点
  768. function PsionicMainView:UpdateTabRed(tab_id)
  769. if tab_id then
  770. self.tabWindowComponent:ShowRedPoint(tab_id, self.model:GetPsionicRedDotCache(tab_id))
  771. else
  772. for k, v in pairs(PsionicConst.TabData) do
  773. local bool = self.model:GetPsionicRedDotCache(v.id)
  774. -- print("Saber:PsionicMainView [658] bool, v.id: ",bool, v.id)
  775. self.tabWindowComponent:ShowRedPoint(v.id, bool)
  776. end
  777. end
  778. end
  779. -- 更新圣环按钮红点
  780. function PsionicMainView:UpdateEffectBtnRed( )
  781. self.activate_effect_btn_red_obj:SetActive(self.model:GetPsionicEffectBtnRed())
  782. end
  783. function PsionicMainView:DestroySuccess( )
  784. if self.tabWindowComponent then
  785. self.tabWindowComponent:DeleteMe()
  786. self.tabWindowComponent = nil
  787. end
  788. for k, v in pairs(self.view_list) do
  789. v:DeleteMe()
  790. v = nil
  791. end
  792. self.view_list = nil
  793. for k, v in pairs(self.tab_equip_item_list) do
  794. v:DeleteMe()
  795. v = nil
  796. end
  797. self.tab_equip_item_list = nil
  798. for k, v in pairs(self.armor_item_list) do
  799. v:DeleteMe()
  800. v = nil
  801. end
  802. self.armor_item_list = nil
  803. for k, v in pairs(self.main_equip_item_list) do
  804. v:DeleteMe()
  805. v = nil
  806. end
  807. self.main_equip_item_list = {}
  808. for k, v in pairs(self.skill_item_list) do
  809. v:DeleteMe()
  810. v = nil
  811. end
  812. self.skill_item_list = nil
  813. for k, v in pairs(self.break_tab_list) do
  814. v:DeleteMe()
  815. v = nil
  816. end
  817. self.break_tab_list = nil
  818. self:ClearUIEffect(self.equip_effect_con)
  819. self.model:SetPsionicShowFlyGoods(true)
  820. Runner.Instance:RemoveRunObj(self)
  821. end
  822. function PsionicMainView:Close()
  823. --完成引导
  824. self:CloseGuide()
  825. BaseView.Close(self)
  826. end
  827. --检测点击屏幕
  828. function PsionicMainView:Update()
  829. if self.is_in_guide then
  830. local is_click = false
  831. if Input.touchCount > 0 then
  832. is_click = true
  833. else
  834. if Input.GetMouseButtonDown(0) then
  835. is_click = true
  836. end
  837. end
  838. if is_click then
  839. self.is_in_guide = false
  840. Runner.Instance:RemoveRunObj(self)
  841. self:CloseGuide()
  842. end
  843. end
  844. end
  845. function PsionicMainView:AddToStageHandler()
  846. local helpVo = GuideModel:getInstance():GetHelpVo(HelpType.TYPE_PSIONIC,5)
  847. if not helpVo then return end
  848. local help_type = helpVo.help_type
  849. if (help_type == HelpType.TYPE_PSIONIC) then
  850. local step = helpVo.step
  851. local button = false
  852. if (help_type == HelpType.TYPE_PSIONIC) and step == 5 then
  853. button = self.skill_con_list[1]
  854. end
  855. if button then
  856. local function call_back()
  857. end
  858. GlobalEventSystem:Fire(EventName.OPEN_GUIDE_PROMPT_VIEW, button.transform, button.transform.parent.transform, call_back, helpVo, self.layout_file)
  859. self.is_in_guide = true
  860. Runner.Instance:AddRunObj(self, 1)
  861. end
  862. else
  863. GlobalEventSystem:Fire(EventName.CLOSE_GUIDE_PROMPT_VIEW)
  864. end
  865. end
  866. function PsionicMainView:CloseGuide()
  867. local helpVo = GuideModel:getInstance():GetHelpVo(HelpType.TYPE_PSIONIC,5)
  868. if helpVo then
  869. GlobalEventSystem:Fire(EventName.FINISH_CURRENT_HELP_STEP,helpVo)
  870. end
  871. end