源战役客户端
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

564 wiersze
17 KiB

4 tygodni temu
  1. BossHomeSceneView = BossHomeSceneView or BaseClass(BaseView)
  2. local BossHomeSceneView = BossHomeSceneView
  3. local ShowType = {
  4. Rank = 1,
  5. Team = 2,
  6. }
  7. local ShowSubType = {
  8. Role = 1,
  9. Boss = 2,
  10. }
  11. function BossHomeSceneView:__init()
  12. self.base_file = "boss"
  13. self.layout_file = "BossHomeSceneView"
  14. self.layer_name = "Main"
  15. self.destroy_imm = true
  16. self.use_background = false
  17. self.change_scene_close = false
  18. self.hide_maincancas = false --是否隐藏主界面
  19. self.append_to_ctl_queue = false --是否要添加进界面堆栈
  20. self.model = BossHomeModel:getInstance()
  21. self.show_type = 0
  22. self.show_sub_type = ShowSubType.Boss
  23. self.cur_visible = true
  24. self.force_change_sub_damage = false--幻魔伤害表从无到有,需要切换一次到伤害表,脱战清空
  25. self.rightIcon_tween = {}--右上角缓动动画列表
  26. self.rank_item_list = {}
  27. self.show_rank_num = 10
  28. self.is_empty_rank = true
  29. --根据当前场景id判断是boss之家还是社团之家
  30. self.cur_boss_home_type = self.model:GetBossHomeSceneType()
  31. local target_guild_id = 0
  32. if self.cur_boss_home_type ~= BossHomeConst.BossHomeType.Normal then
  33. target_guild_id = RoleManager.Instance.mainRoleInfo.guild_id
  34. end
  35. self.model:Fire(BossHomeConst.REQUEST_CCMD_EVENT, 46201, self.cur_boss_home_type, self.model:GetBossHomeSceneFloor(), target_guild_id)
  36. self.load_callback = function ()
  37. self:LoadSuccess()
  38. self:AddEvent()
  39. end
  40. self.open_callback = function ( )
  41. self:OpenSuccess()
  42. end
  43. self.destroy_callback = function ( )
  44. self:DestroySuccess()
  45. end
  46. end
  47. function BossHomeSceneView:Open()
  48. BaseView.Open(self)
  49. end
  50. function BossHomeSceneView:LoadSuccess()
  51. local nodes = {
  52. "con:obj","con/con_rank:obj","con/rank_btn:obj","con/team_btn:obj","con/con_team:obj","con/team_btn_red:obj","con/task_select_bg:obj", "con/team_select_bg:obj", "con/con_rank/rank_bg:img",
  53. "con/con_rank/con_role:obj","con/con_rank/con_role/lb_att:tmp","con/con_rank/con_role/lb_empty:tmp",
  54. "con/con_rank/con_role/scroll","con/con_rank/con_role/lb_name:tmp","con/con_rank/con_role/scroll/Viewport/Content",
  55. "con/con_rank/con_role/lb_rank:tmp","con/con_rank/con_role/img_rank:img:obj",
  56. "rightIconCon/exitBtn:obj","rightIconCon:obj",
  57. "con/con_rank/btn_damage:obj",
  58. "con/task_show_bg:obj","con/team_show_bg:obj","arrow/arrow_click:obj", "arrow",
  59. "con/con_rank/con_boss:obj", "con/con_rank/con_boss/scroll_boss",
  60. "con/con_rank/btn_boss_list:obj",
  61. "con/con_rank/con_boss/scroll_boss/Viewport/Content_boss",
  62. "con/con_rank/lb_rank_name:tmp",
  63. "con/con_rank/lb_no_damage:tmp",
  64. "con/con_rank/con_role/lb_tip:tmp",
  65. }
  66. self:GetChildren(nodes)
  67. for i=1,self.show_rank_num do
  68. --先要做节点补足
  69. self.rank_item_list[i] = self.rank_item_list[i] or self:CreateItem(BossHomeSceneRankItem, self.Content, self.layer_name, "boss_home")
  70. self.rank_item_list[i]:SetVisible(false)
  71. end
  72. self.exitBtn_obj:SetActive(false)
  73. self.transform.anchoredPosition = Vector2(ClientConfig.iphone_x_offset_left - 3,- 60)
  74. SetAnchoredPositionX( self.rightIconCon.transform, ScreenWidth - 349 - ClientConfig.iphone_x_offset_right )
  75. local posX, posY = GetAnchoredPosition(self.con)
  76. self.origin_pos_x = posX + 1
  77. self.origin_pos_y = posY
  78. self.con_width = GetSizeDeltaX(self.con)
  79. self.transform:SetSiblingIndex(1)
  80. lua_resM:setOutsideImageSprite(self, self.rank_bg_img, GameResPath.GetViewBigBg("common_right_top_img2"))
  81. self.lb_tip_tmp.text = "伤害排名<color=#fdffc2>第一名</color>玩家才可获得归属奖励"
  82. if not self.init_exit_btn then
  83. self.init_exit_btn = true
  84. local function call_back( ... )
  85. local function ok( )
  86. SceneManager:getInstance():SetCurrentReqChangeSceneId(0)
  87. BossModel:GetInstance():Fire(BossConst.REQ_QUIT_SCENE)--复用boss模块的退出场景
  88. end
  89. local str = "您正在参与幻魔战斗,确认离开吗?"
  90. Alert.show(str,Alert.Type.Two,ok)
  91. end
  92. local data = {call_back = call_back,pos = {x = 241,y = 278}}
  93. GlobalEventSystem:Fire(EventName.SHOW_EXIT_BTN_STATE,data)
  94. end
  95. end
  96. function BossHomeSceneView:AddEvent()
  97. local on_click = function ( click_obj )
  98. if self.rank_btn_obj == click_obj then
  99. self:SetShowType(ShowType.Rank)
  100. elseif self.team_btn_obj == click_obj then
  101. self:SetShowType(ShowType.Team)
  102. elseif self.arrow_click_obj == click_obj then
  103. self:SwitchVisible(not self.cur_visible)
  104. elseif self.btn_boss_list_obj == click_obj then
  105. self:RefreshSubShow( ShowSubType.Boss )
  106. elseif self.btn_damage_obj == click_obj then
  107. self:RefreshSubShow( ShowSubType.Role )
  108. end
  109. end
  110. AddClickEvent(self.rank_btn_obj, on_click)
  111. AddClickEvent(self.team_btn_obj, on_click)
  112. AddClickEvent(self.arrow_click_obj, on_click)
  113. AddClickEvent(self.btn_boss_list_obj, on_click)
  114. AddClickEvent(self.btn_damage_obj, on_click)
  115. local function activity_icon_changeFunc(is_hide)
  116. self.rightIconCon_obj:SetActive(is_hide)
  117. end
  118. self:BindEvent(GlobalEventSystem, EventName.NOTIFY_ACTIVITY_ICON_HIDE_STATE, activity_icon_changeFunc)
  119. local function onOrientationChange()
  120. self.transform.anchoredPosition = Vector2(ClientConfig.iphone_x_offset_left-3,-60)
  121. SetAnchoredPositionX( self.rightIconCon.transform, ScreenWidth - 349 - ClientConfig.iphone_x_offset_right )
  122. end
  123. self:BindEvent(GlobalEventSystem, EventName.ORIENTATION_DID_CHANGE, onOrientationChange)
  124. local function UpdateRankInfo( )
  125. self:ShowRank()
  126. self:RefreshSubShow( )
  127. end
  128. self:BindEvent(self.model, BossHomeConst.ANS_BOSS_HOME_RANK_INFO, UpdateRankInfo)
  129. local function UPDATE_TEAM_RED_POINT()
  130. self:TeamRedPointShow()
  131. end
  132. self:BindEvent(TeamModel:getInstance(), TeamModel.BE_INVITED, UPDATE_TEAM_RED_POINT)
  133. self:BindEvent(TeamModel:getInstance(), TeamModel.GET_APPLY_JOIN, UPDATE_TEAM_RED_POINT)
  134. local function ANS_BOSS_HOME_INFO( )
  135. self:ShowBossList()
  136. end
  137. self:BindEvent(self.model, BossHomeConst.ANS_BOSS_HOME_INFO, ANS_BOSS_HOME_INFO)
  138. --脱战通知
  139. local function OUT_OF_BOSS_HOME_LIST( boss_id, is_kill_delay)
  140. --脱战后
  141. self.rank_empty = true
  142. self.force_change_sub_damage = false
  143. self:ShowRank()
  144. if is_kill_delay then
  145. self:RefreshSubShow( ShowSubType.Boss )
  146. else
  147. self:RefreshSubShow( )
  148. end
  149. end
  150. self:BindEvent(self.model, BossHomeConst.OUT_OF_BOSS_HOME_LIST, OUT_OF_BOSS_HOME_LIST)
  151. --敌人列表
  152. local function BOARD_ENEMY_ROLE_ID( role_id )
  153. if not role_id then return end
  154. local curTime = TimeUtil:getServerTime()
  155. self.enemy_list = self.enemy_list or {}
  156. -------------------------
  157. for i=1,2 do
  158. --筛选过期信息
  159. if self.enemy_list[i] and (self.enemy_list[i].time + 5 < curTime) then
  160. self.enemy_list[i] = nil
  161. end
  162. end
  163. -------------------------
  164. if TableSize(self.enemy_list) >= 2 then
  165. --最大两个有效信息
  166. return
  167. end
  168. -------------------------
  169. for i=1,2 do
  170. --如果已经有了自己,那就不需要刷新
  171. if self.enemy_list[i] and (self.enemy_list[i].role_id == role_id) then
  172. return
  173. end
  174. end
  175. -------------------------
  176. local new_data = {role_id = role_id,time = curTime}
  177. for i=1,2 do
  178. --加一条数据触发刷新
  179. if not self.enemy_list[i] then
  180. self.enemy_list[i] = new_data
  181. break
  182. end
  183. end
  184. self.model:Fire(BossHomeConst.REFRESH_ENEMY_LIST,self.enemy_list)
  185. end
  186. self:BindEvent(GlobalEventSystem, EventName.BOARD_ENEMY_ROLE_ID, BOARD_ENEMY_ROLE_ID)
  187. end
  188. function BossHomeSceneView:OpenSuccess()
  189. self:SetShowType(ShowType.Rank)
  190. self:UpdateView()
  191. end
  192. function BossHomeSceneView:UpdateView()
  193. self:UpdateBtn()
  194. self:UpdateSubView()
  195. end
  196. function BossHomeSceneView:SwitchVisible( visible, force )
  197. if self.cur_visible == visible and not force then
  198. return
  199. end
  200. self.cur_visible = visible
  201. SetLocalScale(self.arrow, visible and 1 or -1, 1, 1)
  202. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.con)
  203. local targetX = visible and self.origin_pos_x or self.origin_pos_x-(self.con_width+65)
  204. local moveAction = cc.MoveTo.createAnchoredType(0.5, targetX, self.origin_pos_y)
  205. moveAction = cc.EaseExponentialOut.New(moveAction)
  206. local action
  207. if visible then
  208. self.con_obj:SetActive(true)
  209. action = moveAction
  210. else
  211. action = cc.Sequence.New(moveAction, cc.CallFunc.New(function()
  212. self.con_obj:SetActive(false)
  213. end))
  214. end
  215. self:AddAction(action, self.con)
  216. end
  217. function BossHomeSceneView:SetShowType( showType, force )
  218. if self.show_type == showType and not force then
  219. return
  220. end
  221. self.show_type = showType
  222. self:UpdateView()
  223. end
  224. function BossHomeSceneView:RefreshSubShow( show_sub_type )
  225. self.show_sub_type = show_sub_type or self.show_sub_type
  226. if self.force_change_sub_damage then
  227. self.show_sub_type = ShowSubType.Role
  228. self.force_change_sub_damage = false
  229. end
  230. -------------------------
  231. if self.show_sub_type == ShowSubType.Role then
  232. self.lb_rank_name_tmp.text = "伤害列表"
  233. -- self.lb_rank_name_tmp.text = ""
  234. self.con_boss_obj:SetActive(false)
  235. if self.rank_empty then
  236. self.con_role_obj:SetActive(false)
  237. self.lb_no_damage_tmp.text = "暂未对幻魔造成伤害"
  238. else
  239. self.con_role_obj:SetActive(true)
  240. self.lb_no_damage_tmp.text = ""
  241. end
  242. else
  243. --"幻魔列表"
  244. self.lb_no_damage_tmp.text = ""
  245. self.lb_rank_name_tmp.text = "幻魔列表"
  246. -- self.lb_rank_name_tmp.text = ""
  247. self.con_role_obj:SetActive(false)
  248. self.con_boss_obj:SetActive(true)
  249. end
  250. -- self.btn_boss_list_obj:SetActive(self.show_sub_type == ShowSubType.Role)
  251. end
  252. function BossHomeSceneView:UpdateBtn( )
  253. if self.show_type == ShowType.Rank then
  254. self.task_show_bg_obj:SetActive(false)
  255. self.task_select_bg_obj:SetActive(true)
  256. self.team_show_bg_obj:SetActive(true)
  257. self.team_select_bg_obj:SetActive(false)
  258. elseif self.show_type == ShowType.Team then
  259. self.task_show_bg_obj:SetActive(true)
  260. self.task_select_bg_obj:SetActive(false)
  261. self.team_show_bg_obj:SetActive(false)
  262. self.team_select_bg_obj:SetActive(true)
  263. end
  264. end
  265. function BossHomeSceneView:UpdateSubView( )
  266. if self.show_type == ShowType.Rank then
  267. self.con_rank_obj:SetActive(true)
  268. self.con_team_obj:SetActive(false)
  269. self:ShowRank()
  270. self:ShowBossList()
  271. self:RefreshSubShow()
  272. elseif self.show_type == ShowType.Team then
  273. self.con_team_obj:SetActive(true)
  274. self.con_rank_obj:SetActive(false)
  275. if not self.Team then
  276. self.Team = self:CreateItem(TeamView, self.con_team, self.layer_name)
  277. end
  278. self.Team:SetData()
  279. end
  280. end
  281. function BossHomeSceneView:TeamRedPointShow()
  282. -- 2020-08-11,被邀请时组队-加入队伍要有红点
  283. local isShow = TeamModel:getInstance():CheckBeInvitedRedDot()
  284. self.team_btn_red_obj:SetActive(isShow)
  285. end
  286. function BossHomeSceneView:DelayRankCall( )
  287. local sort_list = self.sort_list_info
  288. for k,v in pairs(self.rank_item_list) do
  289. v:SetVisible(false,true)
  290. end
  291. -------------------------
  292. --有个操作要注意,节点列表里面的已有数据如果已经不再有效,那么,需要清除动画
  293. for k,v in pairs(self.rank_item_list) do
  294. local have = false
  295. if v.data then
  296. for kk,vv in pairs(sort_list) do
  297. if vv.role_id == v.data.role_id then
  298. have = true
  299. break
  300. end
  301. end
  302. if not have then
  303. v:CleanAction()
  304. end
  305. end
  306. end
  307. -------------------------
  308. local show_item_list = {}--防错,层级变更之后,item对应的self.rank_item_list没有变k,self.rank_item_list的k值已不可使用
  309. for i,v in ipairs(sort_list) do
  310. local cur_item = false
  311. for k,item in pairs(self.rank_item_list) do
  312. if item.data and item.data.role_id == v.role_id then
  313. cur_item = item
  314. break
  315. end
  316. end
  317. if not cur_item then
  318. --如果存在,就拿那个对应的调整插入
  319. --否则,获取一个队列里面没有的或者空白数据的插入
  320. for k,item in pairs(self.rank_item_list) do
  321. if not item.data then
  322. --空白数据的
  323. cur_item = item
  324. break
  325. else
  326. local using = false
  327. for a,b in pairs(sort_list) do
  328. if b.role_id == item.data.role_id then
  329. using = true
  330. end
  331. end
  332. if not using then
  333. cur_item = item
  334. break
  335. end
  336. end
  337. end
  338. end
  339. cur_item.transform:SetSiblingIndex(i)
  340. cur_item:SetData(i,sort_list[i],"boss_home")
  341. cur_item:SetVisible(true,true)
  342. end
  343. -------------------------
  344. if self.delay_rank_id then
  345. GlobalTimerQuest:CancelQuest(self.delay_rank_id)
  346. self.delay_rank_id = nil
  347. end
  348. end
  349. function BossHomeSceneView:ShowRank( )
  350. if not self.is_loaded then return end
  351. local all_sort_list = {}
  352. local rank_data = self.model:GetBossHomeRankInfo(self.model:GetCurFightBossId()) or {}
  353. local hurt_data = rank_data and rank_data.rank_list or {}
  354. for k,v in pairs(hurt_data) do
  355. all_sort_list[#all_sort_list+1] = DeepCopy(v)
  356. end
  357. -------------------------
  358. local function sort_call( a,b )
  359. --从大到小
  360. return a.hurt > b.hurt
  361. end
  362. table.sort( all_sort_list, sort_call )
  363. -------------------------
  364. local sort_list = {}
  365. for i=1,self.show_rank_num do
  366. sort_list[i] = all_sort_list[i]
  367. end
  368. -------------------------
  369. --要做排序,已有的要复用
  370. -------------------------
  371. self.sort_list_info = sort_list--存起来下一帧用
  372. local function delay_rank_call( )
  373. self:DelayRankCall()
  374. end
  375. self.delay_rank_id = self.delay_rank_id or setTimeout(delay_rank_call,0)
  376. -------------------------
  377. if TableSize(sort_list) > 0 then
  378. if self.rank_empty then
  379. --如果上次是空表来着
  380. self.force_change_sub_damage = true
  381. end
  382. self.lb_empty_tmp.text = ""
  383. self.rank_empty = false
  384. if self.is_empty_rank then
  385. -- self:SwitchVisible(true, true)
  386. self.is_empty_rank = false
  387. end
  388. else
  389. self.lb_empty_tmp.text = "暂无选中幻魔"
  390. self.rank_empty = true
  391. end
  392. -------------------------
  393. local my_info = {
  394. rank = 0,
  395. hurt = 0,
  396. role_id = RoleManager.Instance.mainRoleInfo.role_id,
  397. name = self.model:GetShortNameStr( RoleManager.Instance.mainRoleInfo.name )
  398. }
  399. local team_id = TeamModel:getInstance().in_team_id and TeamModel:getInstance().in_team_id or 0
  400. for k,v in pairs(sort_list) do
  401. if (v.role_id == RoleManager.Instance.mainRoleInfo.role_id) or (v.role_id == team_id) then
  402. my_info = DeepCopy(v)
  403. my_info.rank = k
  404. break
  405. end
  406. end
  407. -------------------------
  408. local only_my_data = self.model:GetMyHurtOnly()
  409. if only_my_data then
  410. if (team_id and team_id > 0) then
  411. --组队中啊,不能直接用队伍数据显示
  412. my_info.role_id = RoleManager.Instance.mainRoleInfo.role_id
  413. my_info.hurt = only_my_data.hurt
  414. my_info.name = self.model:GetShortNameStr( RoleManager.Instance.mainRoleInfo.name )
  415. end
  416. end
  417. -------------------------
  418. if my_info.rank == 0 then
  419. self.lb_att_tmp.text = self.model:GetHurtNumStr( my_info.hurt or 0 )
  420. self.lb_rank_tmp.text = "--"
  421. self.img_rank_obj:SetActive(false)
  422. self.lb_name_tmp.text = self.model:GetShortNameStr( RoleManager.Instance.mainRoleInfo.name )
  423. else
  424. self.lb_att_tmp.text = self.model:GetHurtNumStr( my_info.hurt )
  425. self.img_rank_obj:SetActive(my_info.rank <= 3)
  426. if my_info.rank <= 3 then
  427. self.lb_rank_tmp.text = ""
  428. lua_resM:setImageSprite(self, self.img_rank_img, "common_asset", "com_rank_3_" .. my_info.rank,true)
  429. else
  430. self.lb_rank_tmp.text = my_info.rank
  431. end
  432. if my_info.role_id == RoleManager.Instance.mainRoleInfo.role_id then
  433. self.lb_name_tmp.text = self.model:GetShortNameStr( RoleManager.Instance.mainRoleInfo.name )
  434. else
  435. self.lb_name_tmp.text = self.model:GetShortNameStr( string.format( "%s队", my_info.name ) )
  436. end
  437. end
  438. end
  439. function BossHomeSceneView:ShowBossList( )
  440. all_boss_list = {}
  441. if self.cur_boss_home_type == 1 then
  442. all_boss_list = self.model:GetBossHomeCFG(self.model:GetBossHomeSceneFloor( )) or {}
  443. else
  444. all_boss_list = self.model:GetGuildBossHomeCFG(self.model:GetBossHomeSceneFloor( )) or {}
  445. end
  446. -------------------------
  447. local function select_call( boss_data )
  448. local scene_id = 0
  449. if self.cur_boss_home_type == 1 then
  450. scene_id = self.model:GetBossHomeSceneById(boss_data.boss_id)
  451. else
  452. scene_id = self.model:GetGuildBossHomeSceneById(boss_data.boss_id)
  453. end
  454. local cur_scene_id = SceneManager.Instance:GetSceneId()
  455. if cur_scene_id == scene_id then
  456. local pos = stringtotable(boss_data.born_pos)
  457. local function call_back( ... )
  458. GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT)
  459. end
  460. local findVo = FindVo.New()
  461. findVo.sceneId = SceneManager.Instance:GetSceneId()
  462. findVo.type = FindVo.POINT
  463. findVo.x = pos[1]/ SceneObj.LogicRealRatio.x
  464. findVo.y = pos[2]/ SceneObj.LogicRealRatio.y
  465. findVo.call_back = call_back
  466. findVo.range = 3
  467. GlobalEventSystem:Fire(EventName.FIND,findVo)
  468. end
  469. -------------------------
  470. self.model.boss_home_scene_boss = boss_data.boss_id
  471. if self.item_list then
  472. self.item_list:IterateItems(
  473. function ( item )
  474. item:SetSelect()
  475. end
  476. )
  477. end
  478. end
  479. self.item_list = self.item_list or self:AddUIComponent(UI.ItemListCreator)
  480. local data = {
  481. data_list = all_boss_list or {},
  482. item_con = self.Content_boss,
  483. item_class = BossHomeSceneBossItem,
  484. item_width = BossHomeSceneBossItem.Width,
  485. item_height = BossHomeSceneBossItem.Height,
  486. space_x = 1,
  487. -- space_y = 0,
  488. start_x = 6,
  489. start_y = -3,
  490. scroll_view = self.scroll_boss,
  491. create_frequency = 0.10,
  492. on_update_item = function(item, i, v)
  493. item:SetData(v,select_call)
  494. end,
  495. }
  496. self.item_list:UpdateItems(data)
  497. end
  498. function BossHomeSceneView:DestroySuccess( )
  499. GlobalEventSystem:Fire(EventName.HIDE_EXIT_BTN_STATE)
  500. if self.delay_rank_id then
  501. GlobalTimerQuest:CancelQuest(self.delay_rank_id)
  502. self.delay_rank_id = nil
  503. end
  504. for k,v in pairs(self.rightIcon_tween) do
  505. TweenLite.Stop(v)
  506. end
  507. CommonController.Instance:Fire(EventName.CLOSE_SPECIALTIPVIEW)
  508. end