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

364 lines
14 KiB

  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 社团系统 社团合并请求发起界面
  4. -- *>
  5. GuildRequestMergeView = GuildRequestMergeView or BaseClass(BaseView)
  6. local GuildRequestMergeView = GuildRequestMergeView
  7. function GuildRequestMergeView:__init()
  8. self.base_file = "guild"
  9. self.layout_file = "GuildRequestMergeView"
  10. self.layer_name = "Activity"
  11. self.destroy_imm = true
  12. self.use_background = true --全屏界面默认使用这个参数,非全屏界面自行设置
  13. self.change_scene_close = true --是否切换场景时关闭(弹出界面使用)
  14. self.model = GuildModel:getInstance()
  15. self.guild_merge_list = {} -- 社团列表
  16. self.sroll_end_req_evt = false -- 滑动到底时请求协议
  17. self.cur_page = 1 -- 当前加载了多少页的社团数据(搜索用)
  18. self.rank_req_flag = 1 -- 当前加载的排行榜开始标识(默认从1开始请求)
  19. self.rank_max_num = 100 -- 当前榜单最大数据量
  20. self.total_page = 0 -- 总页数
  21. self.page_size = 20 --向服务器发送一页的个数
  22. self.search_name = "" -- 当前搜索的社团名称
  23. self.search_filter = 0 -- 搜索过滤已满社团 1:使用过滤
  24. self.select_index = 0 -- 选中的社团index
  25. self.selected_guild_id = nil -- 选中的社团id
  26. self.merge_condition = self.model:GetGuildMergeConditionCfg()
  27. -- 自动搜索社团功能参数
  28. self.last_change_input_time = Status.NowTime
  29. self.need_search = false
  30. self.load_callback = function ()
  31. self:LoadSuccess()
  32. self:AddEvent()
  33. end
  34. self.open_callback = function ( )
  35. self:UpdateView()
  36. end
  37. self.destroy_callback = function ( )
  38. self:DestroySuccess()
  39. end
  40. end
  41. function GuildRequestMergeView:Open( )
  42. --self.data = data
  43. BaseView.Open(self)
  44. end
  45. function GuildRequestMergeView:LoadSuccess()
  46. local nodes = {
  47. "content",
  48. "content/merge_btn_con/undo_btn:obj",
  49. "content/merge_btn_con/send_merge_btn:obj",
  50. "content/merge_btn_con/search_input:tmpInput",
  51. "content/merge_btn_con/merge_tip:tmp",
  52. "content/merge_scroll:obj",
  53. "content/merge_scroll/Viewport/merge_con",
  54. "content/empty_node:obj",
  55. "content/empty_node/empty_girl:raw",
  56. "content/empty_node/empty_tip:tmp",
  57. }
  58. self:GetChildren(nodes)
  59. lua_resM:setOutsideRawImage(self, self.empty_girl_raw, GameResPath.GetRoleBg("guild_empty_girl_697_560"), false)
  60. local function close_callback()
  61. self:Close()
  62. end
  63. self.tabWindowComponent = UITabWindow.New(self.transform, nil, nil, close_callback, self.background_wnd, self.content, UITabWindow.SizeSmallNoTab, nil, nil, false)
  64. self.tabWindowComponent:SetTitleText("社团合并")
  65. self.tabWindowComponent:SetBackgroundRes("WindowNew2_bg")
  66. end
  67. function GuildRequestMergeView:AddEvent()
  68. local function click_event(target)
  69. if target == self.undo_btn_obj then -- 撤销申请
  70. local merge_info = self.model:GetGuildMergeInfo()
  71. if not merge_info then
  72. return
  73. elseif merge_info.t_guild_id ~= 0 then -- 有合并信息
  74. self.model:Fire(GuildModel.REQUEST_CCMD_EVENT, 40034) -- 取消合并
  75. end
  76. elseif target == self.send_merge_btn_obj then -- 发起合并申请
  77. if self.selected_guild_id then
  78. self.model:Fire(GuildModel.REQUEST_CCMD_EVENT, 40031, self.selected_guild_id)
  79. else
  80. Message.show("请选择要合并的社团")
  81. end
  82. end
  83. end
  84. AddClickEvent(self.undo_btn_obj, click_event)
  85. AddClickEvent(self.send_merge_btn_obj, click_event)
  86. -- 搜索输入监听
  87. self.search_input_tmpInput.onValueChanged:AddListener(function()
  88. self.need_search = true
  89. self.last_change_input_time = Status.NowTime
  90. end)
  91. -- 更新社团列表数据
  92. local function update_guild_merge_list(vo, rank_type)
  93. if not rank_type or rank_type == GuildModel.GuildActiveRankType then
  94. self:SetMergeGuildListData(vo)
  95. end
  96. end
  97. self:BindEvent(self.model, GuildModel.RefreshGuildListEvt, update_guild_merge_list)
  98. self:BindEvent(self.model, GuildModel.UPDATE_GUILDACTIVE_RANK_DATA, update_guild_merge_list)
  99. local function update_guild_merge_info()
  100. self:UpdateMergeGuildList()
  101. end
  102. self:BindEvent(self.model, GuildModel.UPDATE_GUILD_MERGE_INFO, update_guild_merge_info)
  103. -- 初次加载完协议更新监听,就请求一次社团列表信息
  104. self:RequestMergeGuildData()
  105. end
  106. function GuildRequestMergeView:UpdateView()
  107. self:UpdateMergeTips()
  108. self:AutoSearchGuildTimer()
  109. end
  110. function GuildRequestMergeView:UpdateMergeTips( )
  111. -- 合并界面下方tips
  112. local guild_info = self.model:GetGuildBaseInfo()
  113. local tips = ""
  114. if guild_info then
  115. local guild_lv_cfg = Config.Guildlv[guild_info.guild_lv]
  116. local cap_num = guild_lv_cfg.member_capacity - guild_info.member_num + guild_info.add_mem_num
  117. tips = string.format("发起方可容纳数需大于对方社团总人数(当前社团可容纳<color=%s>%s</color>人)\n合并请求需要对方团长同意,同意后立即合并",
  118. guild_lv_cfg.member_capacity + guild_info.add_mem_num >= guild_info.member_num and ColorUtil.GREEN_DARK or ColorUtil.RED_DARK,
  119. cap_num < 0 and 0 or cap_num)
  120. end
  121. self.merge_tip_tmp.text = tips
  122. -- 空信息界面tips
  123. local empty_tip = ""
  124. if self.merge_condition then
  125. local guild_info = self.model:GetGuildBaseInfo()
  126. local guild_division = guild_info and guild_info.division or 0
  127. local division_lv_list = stringtotable(self.merge_condition.merge_lv)
  128. local can_merge = false
  129. for k,v in pairs(division_lv_list) do
  130. if v == guild_division then
  131. can_merge = true
  132. end
  133. end
  134. if not can_merge then -- 这个配置代表这个阶段天数内不开合并,后面需要+1天
  135. if self.merge_condition.id < #Config.Guildmerge then
  136. empty_tip = string.format("开服第<color=#3be85c>%s</color>天开放社团合并!", self.merge_condition.max_day + 1)
  137. else
  138. -- empty_tip = "社团评价为 <color=#66abff>一般</color> 时才可被合并!"
  139. empty_tip = "暂无可合并社团信息"
  140. end
  141. else
  142. empty_tip = "暂无可合并社团信息"
  143. end
  144. else
  145. empty_tip = "暂无可合并社团信息"
  146. end
  147. self.empty_tip_tmp.text = empty_tip
  148. end
  149. -- 更新社团列表(仅通过协议返回进行更新)
  150. function GuildRequestMergeView:SetMergeGuildListData(vo)
  151. if self.search_name == "" then
  152. self.rank_max_num = vo.sum
  153. self:UpdateMergeGuildList(vo.rank_list)
  154. else
  155. self.total_page = vo.page_total
  156. self.cur_page = vo.page_no
  157. self:UpdateMergeGuildList(vo.guild_list)
  158. end
  159. end
  160. function GuildRequestMergeView:UpdateMergeGuildList(new_list)
  161. local need_auto_select = TableSize(self.guild_merge_list) == 0
  162. -- 有协议返回的列表则更新,没有的话只做刷新处理
  163. -- 新增开服天数对社团排行的限制
  164. -- local require_active = self.merge_condition and self.merge_condition.active or 0
  165. if new_list and #new_list > 0 then
  166. for k, data in pairs(new_list) do
  167. -- local active = data.week_labor_last or data.first_value or 0
  168. -- if active <= require_active then
  169. -- self.guild_merge_list[#self.guild_merge_list+1] = data
  170. -- end
  171. local guild_division = data.division
  172. local division_lv_list = stringtotable(self.merge_condition.merge_lv)
  173. local can_merge = false
  174. for k,v in pairs(division_lv_list) do
  175. if v == guild_division then
  176. can_merge = true
  177. end
  178. end
  179. if can_merge then
  180. self.guild_merge_list[#self.guild_merge_list+1] = data
  181. end
  182. end
  183. self.sroll_end_req_evt = false
  184. end
  185. -- 做一份深拷贝,因为需要做排序但不影响数据原先的顺序
  186. local dc_data = DeepCopy(self.guild_merge_list)
  187. -- 在数据中去掉自己的社团信息
  188. local guild_id = RoleManager.Instance.mainRoleInfo.guild_id
  189. for k, v in pairs(dc_data) do
  190. if v.guild_id == guild_id then
  191. table.remove(dc_data, k)
  192. break
  193. end
  194. end
  195. -- 筛选出合并信息
  196. local merge_info = self.model:GetGuildMergeInfo()
  197. local has_merge_data = false
  198. if merge_info and merge_info.t_guild_id and merge_info.t_guild_id ~= 0 then
  199. has_merge_data = true
  200. local target_guild_vo = nil
  201. for k = #dc_data, 1, -1 do
  202. if dc_data[k].guild_id == merge_info.t_guild_id then
  203. target_guild_vo = table.remove(dc_data, k)
  204. break
  205. end
  206. end
  207. -- 将目标合并的社团排到最前面
  208. if target_guild_vo then
  209. table.insert(dc_data, 1, target_guild_vo)
  210. else
  211. local merge_guild_data = {
  212. guild_id = merge_info.t_guild_id,
  213. guild_name = merge_info.t_guild_name,
  214. guild_flag = merge_info.t_guild_flag,
  215. guild_lv = merge_info.t_guild_lv,
  216. week_labor_last = merge_info.t_week_labor_last,
  217. combat_power = merge_info.t_combat_power,
  218. role_id = merge_info.role_id,
  219. sex = merge_info.sex,
  220. name = merge_info.name,
  221. vip_flag = merge_info.vip_flag,
  222. sup_vip_type = merge_info.sup_vip_type,
  223. fighting = merge_info.fighting,
  224. member_num = merge_info.t_member_num,
  225. add_mem_num = merge_info.t_add_member_num,
  226. }
  227. table.insert(dc_data, 1, merge_guild_data)
  228. end
  229. end
  230. local empty_data = IsTableEmpty(dc_data)
  231. self.empty_node_obj:SetActive(empty_data)
  232. self.merge_scroll_obj:SetActive(not empty_data)
  233. if empty_data then return end
  234. -----------------------
  235. local function callback(index, guild_id)
  236. -- 若存在合并信息且点击的社团index不是1的话,需要飘字提醒
  237. if has_merge_data and index ~= 1 then
  238. Message.show("等待被申请社团回应中", "fault")
  239. end
  240. index = has_merge_data and 1 or index
  241. guild_id = has_merge_data and dc_data[1].guild_id or guild_id
  242. self.select_index = index
  243. self.merge_item_creator:IterateItems(function( item, i )
  244. -- 如果有合并信息,只让第一个item保持选中
  245. item:SetSelected(i == self.select_index)
  246. end)
  247. -- 记录选中的社团id
  248. self.selected_guild_id = guild_id
  249. end
  250. self.merge_item_creator = self.merge_item_creator or self:AddUIComponent(UI.ItemListCreator)
  251. local info = {
  252. data_list = dc_data,
  253. item_con = self.merge_con,
  254. scroll_view = self.merge_scroll,
  255. item_class = GuildRequestMergeItem,
  256. item_height = 99,
  257. start_y = -2,
  258. create_frequency = 0.01,
  259. alignment = UnityEngine.TextAnchor.UpperLeft,
  260. reuse_item_num = 7,
  261. on_update_item = function(item, i, v)
  262. if i == #self.guild_merge_list - 1 and not self.sroll_end_req_evt then
  263. if self.search_name ~= "" then -- 搜索
  264. if self.cur_page < self.total_page then
  265. -- 调整标志量,请求协议
  266. self.cur_page = self.cur_page + 1
  267. self.sroll_end_req_evt = true
  268. self:RequestMergeGuildData()
  269. end
  270. else -- 按排行查询
  271. if self.rank_req_flag + self.page_size <= self.rank_max_num then
  272. -- 调整标志量,请求协议
  273. self.rank_req_flag = self.rank_req_flag + self.page_size
  274. self.sroll_end_req_evt = true
  275. self:RequestMergeGuildData()
  276. end
  277. end
  278. end
  279. item:SetData(v, i, callback)
  280. item:SetSelected(i == self.select_index)
  281. end,
  282. }
  283. self.merge_item_creator:UpdateItems(info)
  284. -- 首次刷新或有合并社团情况下默认选中第一个item
  285. if (need_auto_select or has_merge_data) and #dc_data > 0 then
  286. callback(1, dc_data[1].guild_id)
  287. end
  288. end
  289. function GuildRequestMergeView:RequestMergeGuildData()
  290. if self.search_name == "" then
  291. RankModel:getInstance():Fire(RankModel.REQUEST_CCMD_EVENT, 22102, GuildModel.GuildActiveRankType, self.rank_req_flag, self.page_size)
  292. else
  293. self.model:Fire(GuildModel.RequestGuildListEvt, self.search_name, self.search_filter, self.page_size, self.cur_page)
  294. end
  295. end
  296. function GuildRequestMergeView:AutoSearchGuildTimer( )
  297. local function auto_search_func()
  298. -- 停止社团名称输入0.5秒后请求协议
  299. if self.need_search and Status.NowTime - self.last_change_input_time > 0.5 then
  300. self:OnSearchBtnClick()
  301. self.need_search = false
  302. end
  303. end
  304. self:ClearAutoSearchGuildTimer()
  305. self.auto_search_func_id = GlobalTimerQuest:AddPeriodQuest(auto_search_func, 0.3, -1)
  306. end
  307. function GuildRequestMergeView:ClearAutoSearchGuildTimer( )
  308. if self.auto_search_func_id then
  309. GlobalTimerQuest:CancelQuest(self.auto_search_func_id)
  310. self.auto_search_func_id = nil
  311. end
  312. end
  313. -- 更新点击搜索按钮事件
  314. function GuildRequestMergeView:OnSearchBtnClick( )
  315. local name = self.search_input_tmpInput.text
  316. local _, title_filter = LanguageFilter.FilterMsg(name)
  317. if title_filter == false then
  318. Message.show("内容有敏感词")
  319. return
  320. end
  321. --相同搜索--
  322. if name and name~="" and name == self.search_name then
  323. return
  324. end
  325. self.search_name = name
  326. self.cur_page = 1
  327. self:RequestMergeGuildData()
  328. -- 手动搜索时清空先前的缓存数据
  329. self.selected_guild_id = nil
  330. self.guild_merge_list = {}
  331. self.total_page = 0
  332. self.rank_req_flag = 1
  333. end
  334. function GuildRequestMergeView:DestroySuccess( )
  335. if self.tabWindowComponent then
  336. self.tabWindowComponent:DeleteMe()
  337. self.tabWindowComponent = nil
  338. end
  339. self:ClearAutoSearchGuildTimer()
  340. self.model:SetGuildSaveMergeCacheTimeFlag(true)
  341. end