源战役客户端
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.

370 lines
16 KiB

  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 通用邀请右侧tips弹窗
  4. -- *>
  5. CommonInviteTipView = CommonInviteTipView or BaseClass(BaseView)
  6. local CommonInviteTipView = CommonInviteTipView
  7. local clamp = Mathf.Clamp
  8. local math_floor = Mathf.Floor
  9. function CommonInviteTipView:__init()
  10. self.base_file = "common"
  11. self.layout_file = "CommonInviteTipView"
  12. self.layer_name = "Main"
  13. self.destroy_imm = true
  14. self.use_background = false --全屏界面默认使用这个参数,非全屏界面自行设置
  15. self.anim_time = 0.5
  16. self.is_animating = false -- 是否在动画中
  17. self.waiting = true -- 是否在等待新的邀请数据更新界面
  18. self.show_time_str = false--是否显示剩余时间
  19. self.show_time_elapse = false --剩余时间显示
  20. self.model = CommonModel:getInstance()
  21. self.dun_many_model = false
  22. self.req_duny_many_mirror = false
  23. self.load_callback = function ()
  24. self:LoadSuccess()
  25. self:AddEvent()
  26. end
  27. self.open_callback = function ( )
  28. self:UpdateView()
  29. end
  30. self.destroy_callback = function ( )
  31. self:DestroySuccess()
  32. end
  33. end
  34. --[[ invite_data = { -- 邀请数据
  35. layer_name -- 定制层级,可不传,默认Main层
  36. invite_type -- 邀请类型 必传,用来在界面内决定要怎么展示内容
  37. accept_callback -- 接受邀请回调
  38. reject_callback -- 拒绝邀请回调
  39. auto_close_time -- 自动拒绝时间,可不传,默认30秒
  40. vip -- vip 等级
  41. svip -- 贵族
  42. -- 其他数据自己自行添加,然后根据invite_type编写自己的逻辑
  43. }
  44. ]]
  45. function CommonInviteTipView:Open(invite_data)
  46. self.invite_data = invite_data
  47. -- 定制层级
  48. self.layer_name = invite_data.layer_name or self.layer_name
  49. self:InitNodesAndData()
  50. BaseView.Open(self)
  51. end
  52. function CommonInviteTipView:ReOpen(invite_data)
  53. self.invite_data = invite_data
  54. if self.is_loaded then
  55. self:InitNodesAndData()
  56. self:UpdateView()
  57. end
  58. end
  59. function CommonInviteTipView:LoadSuccess()
  60. local nodes = {
  61. "reject_btn:obj:img",
  62. "accept_btn:obj",
  63. "role_name:tmp",
  64. "vip_con",
  65. "invite_content:tmp",
  66. "fillBg:img",
  67. "bg",
  68. "mirror_btn:obj",
  69. "time_text:tmp:obj",
  70. "time_bg:obj",
  71. "event_icon:obj",
  72. }
  73. self:GetChildren(nodes)
  74. self.vip_item = RoleVipItem.New(self.vip_con)
  75. self.vip_item:SetAnchoredPosition(0, 0)
  76. self.vip_item:SetScale(0.84, 0.84)
  77. -- 动画重点坐标初始化
  78. self.start_anim_pos_x = 350 - ClientConfig.iphone_x_offset_right
  79. self.end_anim_pos_x = 0 - ClientConfig.iphone_x_offset_right
  80. SetAnchoredPositionX(self.transform, self.start_anim_pos_x)
  81. end
  82. function CommonInviteTipView:AddEvent()
  83. local function click_event(target)
  84. if target == self.accept_btn_obj then
  85. if not self.is_animating then -- 动画状态不允许操作
  86. if self.invite_data and self.invite_data.accept_callback then
  87. self.invite_data.accept_callback(self.invite_data)
  88. end
  89. self:HideAnim() -- 播放关闭效果,并检查邀请缓存
  90. end
  91. elseif target == self.reject_btn_obj then
  92. if not self.is_animating then -- 动画状态不允许操作
  93. if self.invite_data and self.invite_data.reject_callback then
  94. self.invite_data.reject_callback(self.invite_data)
  95. end
  96. self:HideAnim() -- 播放关闭效果,并检查邀请缓存
  97. end
  98. elseif target == self.mirror_btn_obj then
  99. if not self.is_animating then -- 动画状态不允许操作
  100. if self.invite_data and self.invite_data.other_callback then
  101. self.invite_data.other_callback(self.invite_data)
  102. end
  103. self:HideAnim() -- 播放关闭效果,并检查邀请缓存
  104. end
  105. end
  106. end
  107. AddClickEvent(self.accept_btn_obj, click_event)
  108. AddClickEvent(self.reject_btn_obj, click_event)
  109. AddClickEvent(self.mirror_btn_obj, click_event)
  110. local onMirrorInfoUpdate = function (dun_type)
  111. self.req_duny_many_mirror = false
  112. end
  113. self:BindEvent(DunManyModel:getInstance(), DunManyModel.UPDATE_DUNMANY_MIRROR, onMirrorInfoUpdate)
  114. end
  115. function CommonInviteTipView:InitNodesAndData( )
  116. if self.is_loaded then
  117. if self.vip_item then
  118. self.vip_item:SetData(0)
  119. end
  120. self.role_name_tmp.text = ""
  121. self.invite_content_tmp.text = ""
  122. lua_resM:setImageSprite(self, self.reject_btn_img, "common_asset", "com_invite_reject")
  123. SetAnchoredPositionX(self.transform, self.start_anim_pos_x)
  124. end
  125. self.auto_close_time = self.invite_data.auto_close_time or 30
  126. self.waiting = false
  127. self:ClearAutoCloseTimer()
  128. self:ClearViewAnimId()
  129. self:ClearDestroyTimer()
  130. end
  131. -- 更新邀请内容
  132. function CommonInviteTipView:UpdateView()
  133. self.fillBg_img.fillAmount = 1 -- 进度条拉满
  134. if self.invite_data then
  135. self.show_time_str = false
  136. self.show_time_elapse = false
  137. self.mirror_btn_obj:SetActive(false)
  138. self.event_icon_obj:SetActive(false)
  139. if self.invite_data.invite_type == CommonModel.InviteTipsType.GuildSpellList
  140. or self.invite_data.invite_type == CommonModel.InviteTipsType.Team
  141. or self.invite_data.invite_type == CommonModel.InviteTipsType.Crusade
  142. or self.invite_data.invite_type == CommonModel.InviteTipsType.GuardinThree
  143. then
  144. SetSizeDeltaX(self.bg, 329)
  145. SetSizeDeltaX(self.fillBg, 329)
  146. SetAnchoredPositionX(self.vip_con, -19)
  147. SetAnchoredPositionX(self.accept_btn, 100.5)
  148. SetAnchoredPositionX(self.reject_btn, 49)
  149. SetAnchoredPositionX(self.invite_content, -37)
  150. SetAnchoredPositionX(self.role_name, (self.invite_data.vip == 0 and self.invite_data.svip == 0) and -15 or 7)
  151. -- elseif self.invite_data.invite_type == CommonModel.InviteTipsType.Crusade
  152. -- or self.invite_data.invite_type == CommonModel.InviteTipsType.GuardinThree then --装备副本
  153. -- self.mirror_btn_obj:SetActive(true)
  154. -- SetSizeDeltaX(self.bg, 325)
  155. -- SetSizeDeltaX(self.fillBg, 325)
  156. -- SetAnchoredPositionX(self.vip_con, -52.5)
  157. -- SetAnchoredPositionX(self.accept_btn, 38)
  158. -- SetAnchoredPositionX(self.reject_btn, -18.5)
  159. -- SetAnchoredPositionX(self.invite_content, -53)
  160. -- SetAnchoredPositionX(self.role_name, (self.invite_data.vip == 0 and self.invite_data.svip == 0) and -53 or -20)
  161. elseif self.invite_data.invite_type == CommonModel.InviteTipsType.EventTips then -- 活动tips
  162. self.event_icon_obj:SetActive(true)
  163. SetSizeDeltaX(self.bg, 329)
  164. SetSizeDeltaX(self.fillBg, 329)
  165. SetAnchoredPositionX(self.accept_btn, 100.5)
  166. SetAnchoredPositionX(self.reject_btn, 49)
  167. SetAnchoredPositionX(self.invite_content, -37)
  168. SetAnchoredPositionX(self.role_name, 7)
  169. lua_resM:setImageSprite(self, self.reject_btn_img, "common_asset", "com_invite_reject2")
  170. end
  171. if self.invite_data.invite_type == CommonModel.InviteTipsType.GuildSpellList then -- 社团拼单邀请
  172. local str = string.format('Lv.%s %s', self.invite_data.inviter_lv, self.invite_data.inviter_name)
  173. self.role_name_tmp.text = str
  174. local sl_cfg = Config.Guildorder[self.invite_data.cfg_id]
  175. self.invite_content_tmp.text = string.format("拼单:<color=%s>%s</color>", GuildModel.SpellListColor[sl_cfg.color], Trim(sl_cfg.name))
  176. elseif self.invite_data.invite_type == CommonModel.InviteTipsType.Team then -- 组队邀请
  177. local data = self.invite_data.param_data
  178. local str = string.format('Lv.%s %s', data.level, data.name)
  179. self.role_name_tmp.text = HtmlColorTxt( str, "#ffffff")
  180. -- 副本目标
  181. local main_type = data.activity_id or ""
  182. local sub_type = data.subtype or ""
  183. local cfg = Config.Teamui[main_type.."@"..sub_type]
  184. if cfg then
  185. local txt = cfg.subtype_name
  186. self.invite_content_tmp.text = "副本:" .. HtmlColorTxt( Trim(txt), "#fdffc2")
  187. else
  188. self.invite_content_tmp.text = "暂无目标"
  189. end
  190. elseif self.invite_data.invite_type == CommonModel.InviteTipsType.Crusade then --装备副本
  191. local data = self.invite_data
  192. self.role_name_tmp.text = HtmlColorTxt( data.inviter_name, "#ffffff")
  193. self.dun_cfg = DunManyModel.getInstance():GetManyDunCfg(data.dun_id)
  194. if self.dun_cfg then
  195. self.invite_content_tmp.text = HtmlColorTxt(Trim(self.dun_cfg.sub_type_name), "#FDFFC2")
  196. end
  197. self.show_time_str = data.show_time_str
  198. self.show_time_elapse = data.show_time
  199. elseif self.invite_data.invite_type == CommonModel.InviteTipsType.GuardinThree then --守卫信标
  200. local data = self.invite_data
  201. self.role_name_tmp.text = HtmlColorTxt( data.inviter_name, "#ffffff")
  202. self.dun_cfg = BaseDungeonModel.Instance:GetDunCfg(data.dun_id)
  203. if self.dun_cfg then
  204. self.invite_content_tmp.text = HtmlColorTxt(Trim(self.dun_cfg.name), "#FDFFC2")
  205. end
  206. self.show_time_str = data.show_time_str
  207. self.show_time_elapse = data.show_time
  208. DunManyModel.getInstance():Fire(DunManyModel.REQUEST_CCMD_EVENT, 21528,DunManyModel.InviteTeamType.GuardinThree)
  209. elseif self.invite_data.invite_type == CommonModel.InviteTipsType.EventTips then -- 活动tips
  210. self.role_name_tmp.text = HtmlColorTxt(self.invite_data.inviter_name, "#ffffff")
  211. self.invite_content_tmp.text = self.invite_data.inviter_content
  212. end
  213. -- 设置vip 并调整名字的位置
  214. self.vip_item:SetData(self.invite_data.vip, self.invite_data.svip)
  215. -- 自动关闭倒计时
  216. self:StartAutoCloseTimer()
  217. -- 播放弹出动画
  218. self:ShowAnim()
  219. end
  220. end
  221. -- 自动关闭倒计时
  222. function CommonInviteTipView:StartAutoCloseTimer( )
  223. self.time_bg_obj:SetActive(self.show_time_str ~= false and self.show_time_str ~= "")
  224. self.time_text_obj:SetActive(self.show_time_str ~= false and self.show_time_str ~= "")
  225. local end_time = self.auto_close_time + TimeUtil:getServerTimeMs()/1000
  226. local show_time = self.show_time_elapse ~= false and ( self.show_time_elapse + TimeUtil:getServerTimeMs()/1000) or (false)
  227. self:ClearAutoCloseTimer()
  228. local function auto_close_func()
  229. local left_time = end_time - TimeUtil:getServerTimeMs()/1000
  230. self.fillBg_img.fillAmount = clamp(left_time / self.auto_close_time, 0, 1)
  231. if show_time then
  232. local sce_time = math_floor(show_time - TimeUtil:getServerTimeMs()/1000)
  233. if sce_time >= 0 then
  234. self.time_text_tmp.text = string.format(self.show_time_str, HtmlColorTxt(sce_time, "#0ce148"))
  235. else
  236. self.time_text_tmp.text = ""
  237. self.time_text_obj:SetActive(false)
  238. self.show_time_str = false
  239. self.show_time_elapse = false
  240. end
  241. end
  242. --绝地守卫特殊显示
  243. if self.invite_data and self.invite_data.invite_type == CommonModel.InviteTipsType.GuardinThree then
  244. self.time_text_tmp.text = self:GetGuardinThreeText()
  245. end
  246. if left_time <= 0 then
  247. if self.invite_data.invite_type == CommonModel.InviteTipsType.Crusade or self.invite_data.invite_type == CommonModel.InviteTipsType.GuardinThree then
  248. if self.invite_data and self.invite_data.other_callback then
  249. self.invite_data.other_callback(self.invite_data)
  250. end
  251. else
  252. if self.invite_data and self.invite_data.reject_callback then
  253. self.invite_data.reject_callback(self.invite_data)
  254. end
  255. end
  256. self:ClearAutoCloseTimer()
  257. self:HideAnim() -- 播放关闭效果,并检查邀请缓存
  258. end
  259. end
  260. self.auto_close_func_id = GlobalTimerQuest:AddPeriodQuest(auto_close_func, 0.02, -1)
  261. end
  262. function CommonInviteTipView:ClearAutoCloseTimer( )
  263. if self.auto_close_func_id then
  264. GlobalTimerQuest:CancelQuest(self.auto_close_func_id)
  265. self.auto_close_func_id = nil
  266. end
  267. end
  268. -- 弹出动画
  269. function CommonInviteTipView:ShowAnim()
  270. local function anim_callback()
  271. self.is_animating = false
  272. end
  273. self:ClearViewAnimId()
  274. self.is_animating = true
  275. self.view_anim_id = TweenLite.to(self, self.transform, TweenLite.UiAnimationType.ANCHORED_POSX,
  276. self.end_anim_pos_x, self.anim_time, anim_callback, TweenFunc.EASE_OUT_QUINT)
  277. end
  278. -- 播放关闭动画,并检测缓存是否还有其他邀请没有处理
  279. function CommonInviteTipView:HideAnim()
  280. local function anim_callback()
  281. self.is_animating = false
  282. self.waiting = true
  283. self:DestroyTimer()
  284. -- 检查缓存
  285. CommonController.Instance:Fire(EventName.SHOW_COMMON_INVITE_TIPS)
  286. end
  287. self:ClearViewAnimId()
  288. self.is_animating = true
  289. self.view_anim_id = TweenLite.to(self, self.transform, TweenLite.UiAnimationType.ANCHORED_POSX,
  290. self.start_anim_pos_x, self.anim_time, anim_callback, TweenFunc.EASE_OUT_QUINT)
  291. end
  292. function CommonInviteTipView:ClearViewAnimId( )
  293. if self.view_anim_id then
  294. TweenLite.Stop(self.view_anim_id)
  295. self.view_anim_id = nil
  296. end
  297. end
  298. -- 销毁界面倒计时 固定5秒后如果没有新的邀请则销毁界面
  299. function CommonInviteTipView:DestroyTimer( )
  300. local end_time = 5 + TimeUtil:getServerTime()
  301. self:ClearDestroyTimer()
  302. local function destroy_func()
  303. local left_time = end_time - TimeUtil:getServerTime()
  304. if left_time <= 0 then
  305. self:Close()
  306. end
  307. end
  308. self.destroy_func_id = GlobalTimerQuest:AddPeriodQuest(destroy_func, 0.1, -1)
  309. end
  310. function CommonInviteTipView:ClearDestroyTimer( )
  311. if self.destroy_func_id then
  312. GlobalTimerQuest:CancelQuest(self.destroy_func_id)
  313. self.destroy_func_id = nil
  314. end
  315. end
  316. function CommonInviteTipView:DestroySuccess( )
  317. if self.vip_item then
  318. self.vip_item:DeleteMe()
  319. self.vip_item = nil
  320. end
  321. self:ClearViewAnimId()
  322. self:ClearAutoCloseTimer()
  323. self:ClearDestroyTimer()
  324. end
  325. function CommonInviteTipView:GetGuardinThreeText( )
  326. self.dun_many_model = self.dun_many_model or DunManyModel.getInstance()
  327. local info = self.dun_many_model:GetDunManyMirrorInfo(DunManyModel.InviteTeamType.GuardinThree)
  328. local str = ""
  329. if info then
  330. local time_str = ""
  331. if info.recover_time ~= 0 then
  332. local cur_time = TimeUtil:getServerTime()
  333. if cur_time >= info.recover_time then
  334. if not self.req_duny_many_mirror then
  335. self.dun_many_model:Fire(DunManyModel.REQUEST_CCMD_EVENT, 21528,DunManyModel.InviteTeamType.GuardinThree)
  336. self.req_duny_many_mirror = true
  337. end
  338. else
  339. local left_time = info.recover_time - cur_time
  340. time_str = string.format("%s后恢复%s次", HtmlColorTxt(TimeUtil:timeConvert8(left_time), "#0ce148"), HtmlColorTxt(1, "#0ce148"))
  341. end
  342. end
  343. str = string.format("剩余分身数:%s %s", HtmlColorTxt(info.count, "#0ce148") , time_str)
  344. end
  345. return str
  346. end