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

414 rivejä
19 KiB

4 viikkoa sitten
  1. --<*
  2. -- @Author: Saber
  3. -- @Description: 社团主信息界面
  4. --*>
  5. GuildInfoView = GuildInfoView or BaseClass(BaseItem)
  6. local GuildInfoView = GuildInfoView
  7. function GuildInfoView:__init(parent_wnd,prefab_asset,layer_name)
  8. self.base_file = "guild"
  9. self.layout_file = "GuildInfoView"
  10. self.parent_wnd = parent_wnd
  11. self.layer_name = layer_name
  12. self.leader_head_item = nil
  13. self.vice_leader_head_item = {}
  14. self.treasure_head_item = {}
  15. self.baged_item = {} -- 社团勋章列表
  16. self.model = GuildModel:getInstance()
  17. self.main_vo = RoleManager.Instance.mainRoleInfo
  18. -- 刷新最新的社团基本信息
  19. self.model:Fire(GuildModel.RequestGuildBaseInfoEvt)
  20. self.model:Fire(GuildModel.RequestMemberViewMemberInfoEvt)
  21. self:Load()
  22. end
  23. function GuildInfoView:Load_callback()
  24. self.nodes = {
  25. -- 左侧信息部分
  26. "left/guild_icon:img", "left/change_anounce_btn:obj", "left/exp_fill:img",
  27. "left/anounce_scroll/Viewport/anounce_con", "left/anounce_scroll/Viewport/anounce_con/guild_anounce:tmp",
  28. "left/guild_name:tmp", "left/guild_lv:tmp", "left/guild_exp:tmp", "left/guild_rating:img", "left/guild_menber:tmp",
  29. "left/honorwall_con", "left/honor_mask:obj", "left/change_gName_btn:obj",
  30. -- 中间信息部分
  31. "right/operate_btn:obj", "right/log_btn:obj", "right/redpocket_btn:obj", "right/enter_btn:obj",
  32. "right/operate_btn/operate_btn_red:obj",
  33. "right/role_head_1", "right/role_head_2",
  34. "right/redpacket_red:obj",
  35. "right/member_scroll", "right/member_scroll/Viewport/member_con",
  36. "right/operate_con:obj:img",
  37. "right/operate_con/apply_btn:obj",
  38. "right/operate_con/impeach_btn:obj",
  39. "right/operate_con/posmgr_btn:obj",
  40. "right/operate_con/quit_btn:obj",
  41. "right/operate_con/merge_btn:obj", "right/operate_con/merge_btn/merge_btn_red:obj",
  42. "right/operate_con/impeach_tip:tmp",
  43. "right/operate_con/operate_mask:obj",
  44. "right/ques_btn:obj",
  45. "right/allot_pos:obj",
  46. -- "right/allot_pos/allot_pos_red:obj",
  47. -- "right/allot_pos/allot_pos_num:tmp", -- 职位分配红点暂时屏蔽
  48. }
  49. self:GetChildren(self.nodes)
  50. self.operate_con_img.enabled = true
  51. self:AddEvents()
  52. self:UpdateView()
  53. -- self:UpdateMemberBtnRed()
  54. self:UpdateRedPacketRed()
  55. self:UpdateOperateBtnAndRelatedBtnRed()
  56. self:UpdateRightHeadData(GuildModel.GuildPosition.Leader)
  57. self:UpdateRightHeadData(GuildModel.GuildPosition.ViceLeader)
  58. self:UpdateGuildMember()
  59. self:UpdateOperateBtnCon()
  60. end
  61. function GuildInfoView:AddEvents( )
  62. local function click_event(target)
  63. if target == self.enter_btn_obj then -- 进入社团驻地
  64. self.model:Fire(GuildModel.ENTER_GUILD_BASE)
  65. elseif target == self.change_anounce_btn_obj then -- 修改社团公告
  66. if self.model:HasOperatePermission(GuildModel.MgrPermission.ChangeAnnounce) then
  67. self.model:Fire(GuildModel.OPEN_GUILD_EDITOR_ANNOUNCE_VIEW, true)
  68. else
  69. Message.show("团长/副团长可修改")
  70. end
  71. -- elseif target == self.fund_ques_btn_obj then -- 弹出资金功能介绍
  72. -- GlobalEventSystem:Fire(EventName.OPEN_INSTRUCTION_VIEW, 40001)
  73. -- elseif target == self.lv_ques_btn_obj then -- 弹出等级功能介绍
  74. -- GlobalEventSystem:Fire(EventName.OPEN_INSTRUCTION_VIEW, 40002)
  75. elseif target == self.operate_btn_obj then -- 操作按钮
  76. self:ShowOperateBtnCon(true)
  77. -- self.model:Fire(GuildModel.OPEN_MEMBER_MANAGE_VIEW, true)
  78. -- 点击后更新一下按钮的红点
  79. -- self:UpdateMemberBtnRed()
  80. elseif target == self.log_btn_obj then -- 社团日志按钮
  81. self.model:Fire(GuildModel.OPEN_GUILD_LOG_VIEW, true)
  82. elseif target == self.redpocket_btn_obj then -- 社团红包按钮
  83. RedPacketModel:GetInstance():Fire(RedPacketModel.OPEN_GUILD_REDPACKET_VIEW, true)
  84. elseif target == self.honor_mask_obj then -- 社团徽章蒙版
  85. if self.honor_click_callback then
  86. self.honor_click_callback()
  87. end
  88. self.honor_mask_obj:SetActive(false)
  89. elseif target == self.operate_mask_obj then -- 社团操作蒙版
  90. self:ShowOperateBtnCon(false)
  91. elseif target == self.apply_btn_obj then -- 社团操作--职位申请
  92. self.model:Fire(GuildModel.OPEN_POSITION_APPLY_VIEW, true)
  93. self:ShowOperateBtnCon(false)
  94. elseif target == self.impeach_btn_obj then -- 社团操作--弹劾团长
  95. self:OnImpeachBtnClick()
  96. self:ShowOperateBtnCon(false)
  97. elseif target == self.quit_btn_obj then -- 社团操作--退出社团
  98. self.model:Fire(GuildModel.RequestQuitGuildEvt)
  99. self:ShowOperateBtnCon(false)
  100. elseif target == self.posmgr_btn_obj then -- 社团操作--职位分配
  101. self.model:Fire(GuildModel.OPEN_GUILD_POS_ALLOT_VIEW, true)
  102. elseif target == self.merge_btn_obj then -- 社团操作--发起社团合并
  103. local merge_cfg = self.model:GetGuildMergeConditionCfg()
  104. if merge_cfg then
  105. local guild_info = self.model:GetGuildBaseInfo()
  106. local guild_division = guild_info and guild_info.division or 0
  107. local division_lv_list = stringtotable(merge_cfg.merge_lv)
  108. local can_merge = false
  109. for k,v in pairs(division_lv_list) do
  110. if v == guild_division then
  111. can_merge = true
  112. end
  113. end
  114. if can_merge then
  115. self.model:Fire(GuildModel.OPEN_REQUEST_MERGE_VIEW, true)
  116. else
  117. if merge_cfg.id < #Config.Guildmerge then
  118. local str = string.format("开服第%s天开放社团合并功能", merge_cfg.max_day + 1)
  119. Message.show(str, "fault")
  120. else
  121. -- Message.show("社团评价为 <color=#66abff>一般</color> 时才可被合并!")
  122. self.model:Fire(GuildModel.OPEN_REQUEST_MERGE_VIEW, true)
  123. end
  124. end
  125. end
  126. elseif target == self.change_gName_btn_obj then -- 社团改名
  127. if self.model:HasOperatePermission(GuildModel.MgrPermission.ChangeName) then
  128. self.model:Fire(GuildModel.OPEN_GUILD_RENAME_VIEW, true)
  129. else
  130. Message.show("您没有权限修改社团名称", "fault")
  131. end
  132. elseif target == self.ques_btn_obj then -- 社团介绍
  133. GlobalEventSystem:Fire(EventName.OPEN_INSTRUCTION_VIEW, 40004)
  134. elseif target == self.allot_pos_obj then -- 可分配职位按钮
  135. -- 有权限的玩家打开职位分配界面,否则打开职位申请界面
  136. if self.model:HasOperatePermission(GuildModel.MgrPermission.PassPosApply) then
  137. self.model:Fire(GuildModel.OPEN_GUILD_POS_ALLOT_VIEW, true)
  138. else
  139. self.model:Fire(GuildModel.OPEN_POSITION_APPLY_VIEW, true)
  140. end
  141. end
  142. end
  143. AddClickEvent(self.enter_btn_obj, click_event)
  144. AddClickEvent(self.change_anounce_btn_obj, click_event)
  145. -- AddClickEvent(self.fund_ques_btn_obj, click_event, 2)
  146. -- AddClickEvent(self.lv_ques_btn_obj, click_event, 2)
  147. AddClickEvent(self.operate_btn_obj, click_event)
  148. AddClickEvent(self.log_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  149. AddClickEvent(self.redpocket_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  150. AddClickEvent(self.honor_mask_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  151. AddClickEvent(self.operate_mask_obj, click_event)
  152. AddClickEvent(self.apply_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  153. AddClickEvent(self.impeach_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  154. AddClickEvent(self.quit_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  155. AddClickEvent(self.posmgr_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  156. AddClickEvent(self.merge_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  157. AddClickEvent(self.change_gName_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  158. AddClickEvent(self.ques_btn_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  159. AddClickEvent(self.allot_pos_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  160. --刷新社团基础信息
  161. local function on_refresh_guild_baseinfo()
  162. self:UpdateView()
  163. end
  164. self:BindEvent(self.model, GuildModel.RefreshGuildInfoEvt, on_refresh_guild_baseinfo)
  165. -- 刷新社团职位信息
  166. local function on_refresh_guild_member()
  167. self:UpdateRightHeadData(GuildModel.GuildPosition.Leader)
  168. self:UpdateRightHeadData(GuildModel.GuildPosition.ViceLeader)
  169. -- 社团成员变动时刷新主界面社团成员列表数据
  170. self:UpdateGuildMember()
  171. end
  172. self:BindEvent(self.model, GuildModel.RefreshMainViewMemberInfoEvt, on_refresh_guild_member)
  173. --刷新社团公告信息
  174. local function on_update_anounce(str, num)
  175. self:SetAnnounceText(str)
  176. -- Message.show("修改成功")
  177. -- local total = Config.Gangkv[27].value
  178. -- local str = string.format("公告发布成功,今日剩余发布次数:%s次",num)
  179. -- Message.show(str)
  180. end
  181. self:BindEvent(self.model, GuildModel.RefreshGuildAnnounceEvt, on_update_anounce)
  182. local function update_red(view_type)
  183. if not view_type or view_type == Config.ConfigGuild.TabId.MainInfo then
  184. -- self:UpdateMemberBtnRed()
  185. self:UpdateRedPacketRed()
  186. self:UpdateOperateBtnAndRelatedBtnRed()
  187. end
  188. end
  189. self:BindEvent(self.model, GuildModel.UPDATE_RED_DOT_BY_TYPE, update_red)
  190. -- 玩家职位变动的时候刷新一下操作按钮的弹窗
  191. local function update_operate_con()
  192. self:UpdateOperateBtnCon()
  193. end
  194. self.update_operate_con_id = self.main_vo:BindOne("position", update_operate_con)
  195. end
  196. function GuildInfoView:UpdateView( )
  197. local vo = self.model:GetGuildBaseInfo()
  198. if IsTableEmpty(vo) then return end
  199. self.guild_name_tmp.text = vo.guild_name
  200. self.guild_lv_tmp.text = string.format("%s级", vo.guild_lv)
  201. local guild_lv_cfg = Config.Guildlv[vo.guild_lv]
  202. local total_exp = guild_lv_cfg.exp
  203. local percent = vo.guild_exp / total_exp
  204. self.exp_fill_img.fillAmount = percent
  205. self.guild_exp_tmp.text = string.format("%s/%s", vo.guild_exp, total_exp)
  206. self.guild_menber_tmp.text = string.format("<color=#2cf86f>%s</color>/%s", vo.member_num, guild_lv_cfg.member_capacity + GuildModel:getInstance():GetAddMemNum())
  207. lua_resM:setImageSprite(self, self.guild_rating_img, "guild_asset", "guild_rank" .. vo.division, true)
  208. self:SetAnnounceText(vo.announce) --设置社团主页公告信息
  209. lua_resM:setImageSprite(self, self.guild_icon_img, "guildIcon_asset", "guild_icon" .. vo.guild_flag, true)
  210. self:UpdateGuildBadgeItem()
  211. end
  212. --设置社团公告内容
  213. function GuildInfoView:SetAnnounceText(str)
  214. if not str or str == "" then
  215. self.guild_anounce_tmp.text = Config.ConfigGuild.GuildDesc
  216. else
  217. self.guild_anounce_tmp.text = str
  218. end
  219. self.anounce_con.sizeDelta = Vector2(self.anounce_con.sizeDelta.x, self.guild_anounce_tmp.preferredHeight + 20)
  220. end
  221. function GuildInfoView:UpdateRightHeadData(position)
  222. local position_member_list = self.model:GetMemberDataByPosition(position)
  223. local member_num = #position_member_list
  224. local pos_num = self.model:GetPositionNum(position)
  225. for k = 1, pos_num do
  226. self["pos"..position.."_head_list"] = self["pos"..position.."_head_list"] or {}
  227. local head_item = self["pos"..position.."_head_list"][k]
  228. if not head_item then
  229. head_item = GuildCommonHeadItem.New(self["role_head_"..position])
  230. self["pos"..position.."_head_list"][k] = head_item
  231. end
  232. -- 是否拥有该位置的社员数据
  233. local have_data = k <= member_num
  234. local head_data_vo = {
  235. head_data = {
  236. vo = {
  237. role_id = have_data and position_member_list[k].role_id or 0,
  238. server_id = have_data and position_member_list[k].server_id or 0,
  239. -- career = have_data and position_member_list[k].career or 0,
  240. -- sex = have_data and position_member_list[k].sex or 0,
  241. turn = have_data and position_member_list[k].turn or 0,
  242. picture_ver = have_data and position_member_list[k].picture_ver or 0,
  243. picture = have_data and position_member_list[k].picture or "",
  244. profile_photo_id = have_data and position_member_list[k].profile_photo_id or 0,
  245. level = have_data and position_member_list[k].level or nil,
  246. dress_board_id = have_data and (position_member_list[k].dress_id or position_member_list[k].dress_board) or nil,
  247. empty_head = not have_data,
  248. },
  249. show_tip = have_data,
  250. },
  251. show_position = position,
  252. show_name = have_data and position_member_list[k].name or "",
  253. no_data = not have_data,
  254. -- pos = Vector2(self["role_head_"..position].sizeDelta.x/2 + (k-1-pos_num/2) * 210 + 20, 0),
  255. pos = Vector2((k-1) * 390, 0),
  256. size = 94,
  257. }
  258. head_item:SetData(head_data_vo)
  259. end
  260. end
  261. -- 更新社团成员管理按钮红点
  262. -- function GuildInfoView:UpdateMemberBtnRed()
  263. -- self.member_red_obj:SetActive(self.model:GetGuildMemberApplyRed())
  264. -- end
  265. -- 更新社团红包红点
  266. function GuildInfoView:UpdateRedPacketRed( )
  267. self.redpacket_red_obj:SetActive(RedPacketModel:GetInstance():GetGuildRedPacketRed())
  268. end
  269. -- 操作按钮相关红点
  270. function GuildInfoView:UpdateOperateBtnAndRelatedBtnRed( )
  271. local bool = self.model:GetGuildMergeTipRed()
  272. self.merge_btn_red_obj:SetActive(bool)
  273. self.operate_btn_red_obj:SetActive(bool)
  274. end
  275. function GuildInfoView:UpdateGuildBadgeItem( )
  276. local vo = self.model:GetGuildBaseInfo()
  277. local badge_list = vo.badges or {}
  278. local function mask_callback(click_callback)
  279. self.honor_mask_obj:SetActive(true)
  280. self.honor_click_callback = click_callback
  281. end
  282. -- 没数据的处理
  283. -- if not badge_list[2] then
  284. -- badge_list[2] = {id = 2001, start_time = 0, end_time = 0} -- 战力榜外数据
  285. -- end
  286. -- if not badge_list[3] then
  287. -- badge_list[3] = {is_empty = true} -- 跨服勋章数据
  288. -- end
  289. local item
  290. for k, v in pairs(badge_list) do
  291. item = self.baged_item[k]
  292. if not item then
  293. item = GuildBadgeItem.New(self.honorwall_con)
  294. self.baged_item[k] = item
  295. end
  296. item:SetAnchoredPosition((k-1) * 105 + 32, -5)
  297. item:SetData(v, true, mask_callback)
  298. end
  299. end
  300. -- 2020年5月20日修改 信息界面增加社团成员滚动容器
  301. function GuildInfoView:UpdateGuildMember( )
  302. -- 社团成员数据来源 40006
  303. local data = self.model:GetGuildMemberListForInfoView()
  304. self.member_item_creator = self.member_item_creator or self:AddUIComponent(UI.ItemListCreator)
  305. local info = {
  306. data_list = data,
  307. item_con = self.member_con,
  308. scroll_view = self.member_scroll,
  309. item_class = GuildInfoMemberItem,
  310. item_height = 37,
  311. create_frequency = 0.01,
  312. alignment = UnityEngine.TextAnchor.UpperLeft,
  313. on_update_item = function(item, i, v)
  314. item:SetData(v, i)
  315. end,
  316. }
  317. self.member_item_creator:UpdateItems(info)
  318. end
  319. -- 更新操作界面按钮
  320. function GuildInfoView:UpdateOperateBtnCon( )
  321. local is_leader = RoleManager.Instance.mainRoleInfo.position == GuildModel.GuildPosition.Leader
  322. self.apply_btn_obj:SetActive(not is_leader)
  323. self.impeach_btn_obj:SetActive(not is_leader)
  324. self.posmgr_btn_obj:SetActive(is_leader)
  325. self.merge_btn_obj:SetActive(is_leader)
  326. self.impeach_tip_tmp.text = is_leader and "" or "(需团长离线3天后)"
  327. SetSizeDeltaY(self.operate_con, is_leader and 192 or 211)
  328. end
  329. function GuildInfoView:ShowOperateBtnCon(show)
  330. if self.operate_con_obj.activeSelf ~= show then
  331. self.operate_con_obj:SetActive(show)
  332. end
  333. end
  334. function GuildInfoView:OnImpeachBtnClick( )
  335. -- 虽然身为团长不应该出现这个按钮,但还是判断一下保险
  336. local position = RoleManager.Instance.mainRoleInfo.position
  337. if position == GuildModel.GuildPosition.Leader then
  338. Message.show("无法弹劾自己")
  339. else
  340. local leader_data = self.model:GetMemberDataByPosition(GuildModel.GuildPosition.Leader)[1]
  341. if leader_data then
  342. local offline_time = leader_data.offline_time
  343. -- 社长超过3天未上限时,可弹劾现任会长
  344. local can_apply_agency = TimeUtil:getServerTime() - offline_time >= 3 * 86400
  345. if can_apply_agency then
  346. local function ok( ... )
  347. self.model:Fire(GuildModel.REQUEST_CCMD_EVENT, 40018, GuildModel.GuildPosition.Leader)
  348. end
  349. local ask_str = "团长超过3天未上线,被弹劾后您将成为新的团长\n是否继续?"
  350. Alert.show(ask_str,Alert.Type.Two,ok,nil,"确定","取消")
  351. else
  352. Message.show("团长离线时间不足3天,无法弹劾")
  353. end
  354. end
  355. end
  356. end
  357. function GuildInfoView:__delete( )
  358. if self["pos"..GuildModel.GuildPosition.Leader.."_head_list"] then
  359. for k, v in pairs(self["pos"..GuildModel.GuildPosition.Leader.."_head_list"]) do
  360. v:DeleteMe()
  361. v = nil
  362. end
  363. end
  364. self["pos"..GuildModel.GuildPosition.Leader.."_head_list"] = {}
  365. if self["pos"..GuildModel.GuildPosition.ViceLeader.."_head_list"] then
  366. for k, v in pairs(self["pos"..GuildModel.GuildPosition.ViceLeader.."_head_list"]) do
  367. v:DeleteMe()
  368. v = nil
  369. end
  370. self["pos"..GuildModel.GuildPosition.ViceLeader.."_head_list"] = {}
  371. end
  372. -- if self["pos"..GuildModel.GuildPosition.Teasure.."_head_list"] then
  373. -- for k, v in pairs(self["pos"..GuildModel.GuildPosition.Teasure.."_head_list"]) do
  374. -- v:DeleteMe()
  375. -- v = nil
  376. -- end
  377. -- self["pos"..GuildModel.GuildPosition.Teasure.."_head_list"] = {}
  378. -- end
  379. for k, v in pairs(self.baged_item) do
  380. v:DeleteMe()
  381. v = nil
  382. end
  383. self.baged_item = nil
  384. if self.update_operate_con_id then
  385. self.main_vo:UnBind(self.update_operate_con_id)
  386. self.update_operate_con_id = nil
  387. end
  388. end