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

283 行
10 KiB

  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 圣物系统内通用装备item
  4. -- *>
  5. PsionicArmorItem = PsionicArmorItem or BaseClass(BaseItem)
  6. local PsionicArmorItem = PsionicArmorItem
  7. function PsionicArmorItem:__init(parent_wnd,prefab_asset,layer_name)
  8. self.base_file = "psionic"
  9. self.layout_file = "PsionicArmorItem"
  10. self.parent_wnd = parent_wnd
  11. self.layer_name = layer_name
  12. self.is_selected = false
  13. self.item_scale = 1
  14. self.item_gray = false
  15. self.item_total_gray = false
  16. self.break_show_locktype = 0 -- 圣物突破右侧展示节点无数据表现类型
  17. self.model = PsionicModel:getInstance()
  18. self.goods_model = GoodsModel:getInstance()
  19. self.pos = false
  20. self.slot_break_red_equip_list = {}
  21. self:Load()
  22. end
  23. function PsionicArmorItem:Load_callback()
  24. local nodes = {
  25. "empty_bg:obj",
  26. "item_con",
  27. "reddot:obj",
  28. "equiped:obj", -- 穿戴中标识
  29. "selected:obj", -- 选中标识
  30. "selected2:obj",
  31. "locked:obj",
  32. "break_add:obj",
  33. "quality_flag:obj:img", -- 最高品质标识
  34. -- 可穿戴/可替换标识
  35. "equip_flag:obj",
  36. "replace_flag:obj",
  37. }
  38. self:GetChildren(nodes)
  39. self.award_item = UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.item_con)
  40. self.award_item:SetItemSize(78, 78)
  41. self.award_item:SetVisible(false)
  42. local function short_click_callback(target, x, y)
  43. self:ClickHandler(target,x,y)
  44. end
  45. self.award_item.ClickCallFun = short_click_callback --覆盖AwardItem 的点击方法
  46. self:AddEvents()
  47. if self.need_refreshData then
  48. self:UpdateView()
  49. self:SetSelected(self.is_selected)
  50. end
  51. end
  52. function PsionicArmorItem:AddEvents( )
  53. local function update_equip_state(tab_type)
  54. if not tab_type then
  55. self:UpdateEquipState()
  56. elseif tab_type == PsionicConst.TabId.PArmor then
  57. self:UpdateEquipState()
  58. elseif tab_type == PsionicConst.TabId.PBreak then
  59. self:UpdateItemReddot()
  60. end
  61. end
  62. self:BindEvent(self.model, PsionicConst.UPDATE_RED_BY_TABID, update_equip_state)
  63. end
  64. -- data:道具数据 flag:道具的展示类型 default_typeId:没data的情况下用于展示的默认id
  65. function PsionicArmorItem:SetData(data, flag, callback, default_typeId, pos)
  66. self.data = data
  67. self.flag = flag or PsionicConst.ArmorItemFlag.Bag
  68. self.callback = callback
  69. self.default_typeId = default_typeId
  70. self.pos = pos
  71. if self.is_loaded then
  72. self.need_refreshData = false
  73. self:UpdateView()
  74. else
  75. self.need_refreshData = true
  76. end
  77. end
  78. -- 获取圣物突破红点显示的goodsid列表
  79. function PsionicArmorItem:SetBreakSlotRedEquipList(slot_break_red_equip_list)
  80. self.slot_break_red_equip_list = slot_break_red_equip_list
  81. if self.is_loaded then
  82. self:UpdateItemReddot()
  83. end
  84. end
  85. function PsionicArmorItem:UpdateView( )
  86. self:SetItemScale(self.item_scale)
  87. if not self.data or self.data.is_empty then
  88. self.empty_bg_obj:SetActive(true)
  89. self.equiped_obj:SetActive(false)
  90. if self.default_typeId then -- 显示默认id配置装备
  91. self.award_item:SetData(self.default_typeId, 1, nil)
  92. self.award_item:SetVisible(true)
  93. else
  94. self.award_item:SetVisible(false)
  95. end
  96. else
  97. self.empty_bg_obj:SetActive(false)
  98. self.award_item:SetData(self.data.type_id, 1, nil)
  99. self.award_item:SetVisible(true)
  100. end
  101. -- 穿戴flag相关
  102. self:UpdateEquipState()
  103. -- 灰化和整体灰化部分
  104. self:SetItemGray(self.item_gray)
  105. self:SetItemTotalGray(self.item_total_gray)
  106. -- 更新突破操作界面锁定展示
  107. self:UpdateBreakShowLockType(self.break_show_locktype)
  108. self:AddToStageHandler()
  109. -- 更新红点
  110. self:UpdateItemReddot()
  111. end
  112. -- 节点加上一层灰色蒙版
  113. function PsionicArmorItem:SetItemGray(bool)
  114. self.item_gray = bool
  115. if self.award_item then
  116. self.award_item:SetGray(bool)
  117. end
  118. end
  119. -- 节点完全置灰
  120. function PsionicArmorItem:SetItemTotalGray(bool)
  121. self.item_total_gray = bool
  122. if self.award_item then
  123. self.award_item:SetIconGray(bool)
  124. end
  125. end
  126. -- 调整【本节点】的缩放比例
  127. function PsionicArmorItem:SetItemScale(scale)
  128. self.item_scale = scale or 1
  129. if self.is_loaded then
  130. SetLocalScale(self.transform, self.item_scale, self.item_scale, self.item_scale)
  131. end
  132. end
  133. -- 判断这件装备是否是已穿戴/替换后能提升战斗力,根据情况显示标识
  134. function PsionicArmorItem:UpdateEquipState()
  135. local is_cur_equiped = false -- 是否是当前上阵的装备
  136. local show_equip_flag = false -- 是否显示可装备标志
  137. local show_replace_flag = false -- 是否显示可替换标志
  138. if (self.flag == PsionicConst.ArmorItemFlag.Bag or self.flag == PsionicConst.ArmorItemFlag.Resolve or self.flag == PsionicConst.ArmorItemFlag.Break) and self.award_item
  139. and self.data and not self.data.is_empty then
  140. local cur_equip_vo = self.goods_model:GetPsionicEquipBySlot(self.data.subtype)
  141. if cur_equip_vo then -- 根据情况区分展示可替换还是可装备
  142. if cur_equip_vo.goods_id == self.data.goods_id then
  143. is_cur_equiped = true
  144. else
  145. local equip_state = self.model:IsPsionicEquipPowerUpOrNot(self.data.goods_id) and 1 or nil
  146. show_replace_flag = equip_state == 1
  147. end
  148. else -- 当前栏位没有装备,则获取栏位红点
  149. show_equip_flag = self.model:GetPsionicEquipSlotRed(self.data.subtype)
  150. end
  151. end
  152. if self.equiped_obj.activeSelf ~= is_cur_equiped then
  153. self.equiped_obj:SetActive(is_cur_equiped)
  154. end
  155. if self.equip_flag_obj.activeSelf ~= show_equip_flag then
  156. self.equip_flag_obj:SetActive(show_equip_flag)
  157. end
  158. if self.replace_flag_obj.activeSelf ~= show_replace_flag then
  159. self.replace_flag_obj:SetActive(show_replace_flag)
  160. end
  161. end
  162. function PsionicArmorItem:ClickHandler(target, x, y)
  163. -- 默认展示id的强制固定展示类型
  164. if self.pos == 1 then
  165. local helpVo = GuideModel:getInstance():GetHelpVo(HelpType.TYPE_PSIONIC,3)
  166. if helpVo then
  167. GlobalEventSystem:Fire(EventName.FINISH_CURRENT_HELP_STEP,helpVo)
  168. end
  169. end
  170. if self.default_typeId then
  171. UIToolTipMgr:getInstance():AppendPsionicTips(nil, x, y, PsionicConst.ArmorItemFlag.Show, self.default_typeId)
  172. return
  173. end
  174. if not self.data then return end
  175. local function selected_callback(flag)
  176. self:SetSelected(flag)
  177. end
  178. if self.flag == PsionicConst.ArmorItemFlag.Resolve then -- 装备分解展示
  179. if self.callback then
  180. self.callback(self.data, selected_callback)
  181. end
  182. elseif self.flag == PsionicConst.ArmorItemFlag.Break then -- 装备突破展示
  183. if self.data and self.callback then
  184. -- 修改为切换查看的装备数据
  185. self.callback(self.data)
  186. end
  187. else
  188. UIToolTipMgr:getInstance():AppendPsionicTips(self.data, x, y, self.flag)
  189. end
  190. end
  191. -- 设置item的选中状态
  192. function PsionicArmorItem:SetSelected(flag)
  193. self.is_selected = flag and true or false
  194. if self.is_loaded then
  195. if self.flag == PsionicConst.ArmorItemFlag.Resolve -- 装备分解展示
  196. or self.flag == PsionicConst.ArmorItemFlag.Break then -- 装备突破展示
  197. if self.selected_obj.activeSelf ~= (self.is_selected and self.flag == PsionicConst.ArmorItemFlag.Break) then
  198. self.selected_obj:SetActive(self.is_selected and self.flag == PsionicConst.ArmorItemFlag.Break)
  199. end
  200. if self.selected2_obj.activeSelf ~= (self.is_selected and self.flag == PsionicConst.ArmorItemFlag.Resolve) then
  201. self.selected2_obj:SetActive(self.is_selected and self.flag == PsionicConst.ArmorItemFlag.Resolve)
  202. end
  203. self.award_item:SetGray(self.is_selected and self.flag == PsionicConst.ArmorItemFlag.Resolve)
  204. end
  205. end
  206. end
  207. -- 更新圣物突破时展示节点的数据缺失表现 lock_type:1 无数据但不锁定 2 无数据锁定
  208. function PsionicArmorItem:UpdateBreakShowLockType(lock_type)
  209. self.break_show_locktype = lock_type
  210. if self.is_loaded then
  211. if not self.data and self.flag == PsionicConst.ArmorItemFlag.BreakSelected then
  212. self.break_add_obj:SetActive(lock_type == 1)
  213. self.locked_obj:SetActive(lock_type == 2)
  214. elseif self.data and self.flag == PsionicConst.ArmorItemFlag.BreakSelected then
  215. self.break_add_obj:SetActive(false)
  216. self.locked_obj:SetActive(false)
  217. end
  218. end
  219. end
  220. function PsionicArmorItem:UpdateItemReddot( )
  221. if not self.data or self.data.is_empty then
  222. self.reddot_obj:SetActive(false)
  223. return
  224. end
  225. if self.flag == PsionicConst.ArmorItemFlag.Break then -- 突破红点
  226. -- 先获取突破红点,再判断是否是身上穿的装备
  227. -- local break_bool = self.model:GetPsionicBreakSlotRed(self.data.subtype)
  228. -- if break_bool then
  229. -- local cur_equip_vo = self.goods_model:GetPsionicEquipBySlot(self.data.subtype)
  230. -- self.reddot_obj:SetActive(cur_equip_vo.goods_id == self.data.goods_id)
  231. -- else
  232. -- self.reddot_obj:SetActive(false)
  233. -- end
  234. local break_red = self.slot_break_red_equip_list[self.data.subtype] and self.slot_break_red_equip_list[self.data.subtype] == self.data.goods_id or false
  235. self.reddot_obj:SetActive(break_red)
  236. else
  237. self.reddot_obj:SetActive(false)
  238. end
  239. end
  240. function PsionicArmorItem:__delete( )
  241. if self.award_item then
  242. UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, self.award_item)
  243. end
  244. self.award_item = nil
  245. end
  246. function PsionicArmorItem:AddToStageHandler()
  247. if self.pos ~= 1 then return end
  248. local helpVo = GuideModel:getInstance():GetHelpVo(HelpType.TYPE_PSIONIC,3)
  249. if not helpVo then return end
  250. local help_type = helpVo.help_type
  251. local step = helpVo.step
  252. local button = false
  253. if (help_type == HelpType.TYPE_PSIONIC) and step == 3 then
  254. button = self.item_con
  255. end
  256. if button then
  257. local function call_back()
  258. end
  259. GlobalEventSystem:Fire(EventName.OPEN_GUIDE_PROMPT_VIEW, button.transform, self.transform, call_back, helpVo, self.layout_file)
  260. end
  261. end