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

261 lines
10 KiB

преди 4 седмици
  1. GuildEventView = GuildEventView or BaseClass(BaseItem)
  2. local GuildEventView = GuildEventView
  3. local ServerTimeModel = ServerTimeModel
  4. function GuildEventView:__init(parent_wnd,prefab_asset,layer_name)
  5. self.base_file = "guild"
  6. self.layout_file = "GuildEventView"
  7. self.parent_wnd = parent_wnd
  8. self.layer_name = layer_name
  9. -- self.full_screen = true
  10. -- self.ani_right = 600
  11. -- self.ani_left = -600
  12. -- self.adjust_mid = {left = 160, right = 780}
  13. self.model = GuildModel:getInstance()
  14. self.open_day_offset = 0
  15. self.server_open_this_week = false -- 是不是本周内开服
  16. self.event_item_list = {} -- 活动入口按钮item列表
  17. self.event_view_list = {} -- 活动海报界面item列表
  18. self.cur_wday = os.date("*t", TimeUtil:getServerTime()).wday - 1 -- 今天是星期几,值域 1~7 周日为1,所以做个减1做正常周数的映射
  19. if self.model.need_jump_wday and self.model.need_jump_wday>=1 and self.model.need_jump_wday<=7 then
  20. self.cur_wday = self.model.need_jump_wday
  21. self.model.need_jump_wday = false
  22. end
  23. self:Load()
  24. end
  25. function GuildEventView:Load_callback()
  26. self.nodes = {
  27. -- 左侧
  28. "left/event_scroll", "left/event_scroll/Viewport/event_con",
  29. "left/week_day1:tmp",
  30. -- 右侧
  31. "right/view_con",
  32. -- 按钮
  33. "left/arrow_left:obj:img", "left/arrow_right:obj:img",
  34. }
  35. self:GetChildren(self.nodes)
  36. self:AddEvents()
  37. self:UpdateView()
  38. end
  39. function GuildEventView:AddEvents( )
  40. local function click_event(target)
  41. if target == self.arrow_right_obj then -- 向右切换星期数
  42. self:ChangeWday(1)
  43. elseif target == self.arrow_left_obj then -- 向左切换星期数
  44. self:ChangeWday(-1)
  45. end
  46. end
  47. AddClickEvent(self.arrow_right_obj, click_event, LuaSoundManager.SOUND_UI.SWITCH)
  48. AddClickEvent(self.arrow_left_obj, click_event, LuaSoundManager.SOUND_UI.SWITCH)
  49. local function chnage_day_func(type)
  50. if type == SettingModel.CHANGE_DAY.HOUR_0 then -- 跨0点
  51. self:CheckOpenDayInWeek()
  52. end
  53. end
  54. self:BindEvent(GlobalEventSystem, EventName.CHANE_DAY, chnage_day_func)
  55. end
  56. -- 检查开服天数在本周的特殊情况
  57. -- 如果是本周开服,则开服天数之前的日期不允许切换,周日->未开服天数的同理
  58. function GuildEventView:CheckOpenDayInWeek( )
  59. local open_day = ServerTimeModel:getInstance():GetOpenServerDay()
  60. -- open_day = 2 -- debug
  61. local cur_wday = os.date("*t", TimeUtil:getServerTime()).wday - 1 -- 今天是星期几,值域 1~7 周日为1,所以做个减1做正常周数的映射
  62. self.server_open_this_week = cur_wday > open_day -- 不用等于,因为周一开服没有影响
  63. -- print("Saber:GuildEventView [62] self.server_open_this_week, open_day, cur_wday: ",self.server_open_this_week, open_day, cur_wday)
  64. end
  65. -- 修改今天是星期几,并同步修改星期几展示的活动
  66. function GuildEventView:ChangeWday(offset)
  67. if not offset then return end
  68. if self.server_open_this_week then -- 需要特殊处理箭头的点击
  69. local open_day = ServerTimeModel:getInstance():GetOpenServerDay()
  70. -- open_day = 2 -- debug
  71. local temp_cur_wd = self.cur_wday + offset
  72. local temp_open_day_offset = self.open_day_offset + offset
  73. local temp_open_day = open_day + temp_open_day_offset
  74. temp_open_day = temp_cur_wd > 7 and temp_open_day - 7 or temp_open_day
  75. -- print("Saber:GuildEventView [73] temp_open_day,temp_cur_wd: ",temp_open_day,temp_cur_wd)
  76. if temp_open_day <= 0 then
  77. return
  78. else
  79. self.open_day_offset = temp_open_day_offset
  80. self.cur_wday = temp_cur_wd > 7 and temp_cur_wd - 7 or temp_cur_wd
  81. SetImageGray(self.arrow_right_img, self.cur_wday == 7 and temp_open_day < 7) -- 周日
  82. SetImageGray(self.arrow_left_img, temp_open_day <= 1)
  83. end
  84. else
  85. self.open_day_offset = self.open_day_offset + offset
  86. self.cur_wday = self.cur_wday + offset
  87. -- 修改今天是星期几,要做一个范围映射
  88. if self.cur_wday > 7 then
  89. self.cur_wday = self.cur_wday - 7
  90. elseif self.cur_wday < 1 then
  91. self.cur_wday = self.cur_wday + 7
  92. end
  93. end
  94. self.week_day1_tmp.text = WordManager:GetWeekStr3(self.cur_wday)
  95. self:UpdateEventItem()
  96. end
  97. function GuildEventView:UpdateView( )
  98. self:CheckOpenDayInWeek()
  99. self:ChangeWday(0)
  100. end
  101. function GuildEventView:UpdateEventItem( )
  102. local event_list = self.model:GetGuildEventByWday(self.cur_wday)
  103. local function call_back(data, index)
  104. self.model.select_tab_index = index
  105. self.item_creator:IterateItems(function( item, i )
  106. item:SetSelected(i == index)
  107. end)
  108. self:OpenViewByData(data)
  109. end
  110. self.item_creator = self.item_creator or self:AddUIComponent(UI.ItemListCreator)
  111. local activity_index ,final_event_flag,jump_event_target_index = self:GetActivityIndex(event_list)
  112. local info = {
  113. data_list = event_list,
  114. item_con = self.event_con,
  115. scroll_view = self.event_scroll,
  116. item_class = GuildEventTabItem,
  117. start_x = 8,
  118. start_y = -7,
  119. item_height = 94+5,
  120. space_y = 8-5,
  121. create_frequency = 0.01,
  122. alignment = UnityEngine.TextAnchor.UpperLeft,
  123. is_scroll_back_on_update = true,
  124. final_callback = function()
  125. -- 定位
  126. if jump_event_target_index ~= 0 then --不等于0说明是用openfun跳过来的
  127. call_back(event_list[jump_event_target_index], jump_event_target_index)
  128. self.item_creator:ScrollToItem(jump_event_target_index,-6)
  129. else
  130. call_back(event_list[activity_index], activity_index)
  131. self.item_creator:ScrollToItem(activity_index,-6)
  132. end
  133. end,
  134. on_update_item = function(item, i, v)
  135. if final_event_flag then
  136. item:SetData(v, i, call_back,activity_index+1)
  137. else
  138. item:SetData(v, i, call_back,activity_index)
  139. end
  140. end,
  141. }
  142. self.item_creator:UpdateItems(info)
  143. self.view_con.gameObject:SetActive(not IsTableEmpty(event_list))
  144. end
  145. --获取当前正在进行的活动index,用于打开界面时跳转
  146. function GuildEventView:GetActivityIndex(event_list)
  147. local is_final_event = false --最后一个活动也结束了,进行全部置灰操作
  148. local event_data = self.model:GetGuildEventData() --活动开启信息
  149. local jump_event_target_index = 0 --需要通过openfun跳转到指定的活动时,返回这个index
  150. if self.model.need_jump_event_type then --活动跳转标记
  151. local continue_flag = true
  152. for i,v in ipairs(event_list) do
  153. local compare_type = tonumber(v.module_id..v.module_sub)
  154. --蛋疼,社团boss的活动子类型从module_sub改到ac_sub了
  155. if v.module_id == 406 then
  156. compare_type = tonumber(v.module_id..v.ac_sub)
  157. elseif v.module_id == 410 then--如果要从外部指定活动类型跳转到本国团战的话,活动类型直接传410,日期传活动当天
  158. compare_type = v.module_id
  159. end
  160. if continue_flag and tonumber(self.model.need_jump_event_type) == compare_type then
  161. jump_event_target_index = i
  162. continue_flag = false
  163. end
  164. end
  165. end
  166. self.model.need_jump_event_type = nil --重置活动跳转标记
  167. local activity_k = 0 --活动类型,用于记录event_data里正在开活动的的k
  168. local activity_v = {}
  169. for k,v in pairs(event_data) do
  170. if v.is_evt_open then
  171. activity_k = k
  172. activity_v = v
  173. break
  174. end
  175. end
  176. if activity_k == GuildEventType.NoonCollect then
  177. for i,v in ipairs(event_list) do
  178. if v.module_id == 408 then
  179. return i + activity_v.type - 1,is_final_event,jump_event_target_index
  180. end
  181. end
  182. else
  183. for i,v in ipairs(event_list) do
  184. local key = tonumber(v.module_id..v.module_sub)
  185. --蛋疼,社团boss的活动子类型从module_sub改到ac_sub了
  186. if v.module_id == 406 then
  187. key = tonumber(v.module_id..v.ac_sub)
  188. end
  189. if tonumber(activity_k) == key then
  190. return i,is_final_event,jump_event_target_index
  191. end
  192. end
  193. end
  194. -- 如果当前没有活动在进行中,则需要通过当前的系统时间来决定定位到哪个即将开启的活动上(2020年3月14日策划需求,如果出现时区定位不准的问题找策划)
  195. local date = os.date("*t", TimeUtil:getServerTime())
  196. local zero_min = date.hour * 60 + date.min -- 当前时区距0点的分钟数
  197. local evt_time_start, evt_start_hour, evt_start_min
  198. for k, v in ipairs(event_list) do
  199. evt_time_start = Split((Split(v.time_str, "~")[1]),":")
  200. evt_start_hour = evt_time_start[1]
  201. evt_start_min = evt_time_start[2]
  202. if evt_start_hour * 60 + evt_start_min >= zero_min then
  203. return k,is_final_event,jump_event_target_index
  204. end
  205. end
  206. is_final_event = true -- 没有找到活动开启时跳到最后去
  207. return #event_list,is_final_event,jump_event_target_index
  208. end
  209. -- 根据活动信息弹出界面
  210. -- 活动类型需要在GuildModel.EventModuleId配置键值
  211. function GuildEventView:OpenViewByData(evt_data)
  212. for k, v in pairs(self.event_view_list) do
  213. v:SetVisible(false)
  214. end
  215. local key = evt_data.module_id .. "@" .. evt_data.module_sub
  216. --蛋疼,社团boss的活动子类型从module_sub改到ac_sub了
  217. if evt_data.module_id == 406 then
  218. key = evt_data.module_id .. "@" .. evt_data.ac_sub
  219. end
  220. local view = self.event_view_list[key]
  221. if not view then
  222. view = _G[GuildModel.EventModuleId[key]].New(self.view_con)
  223. self.event_view_list[key] = view
  224. -- 活动界面需要获得活动的开始时间和活动类型的话就写一个这个函数,可参考GuildEventBossView
  225. if view["SetEventAcData"] then
  226. view:SetEventAcData(evt_data)
  227. end
  228. end
  229. --午间采集活动分了多个项,但界面是共用一个,因此要重复SetEventAcData
  230. if evt_data.module_id == 408 then
  231. view:SetEventAcData(evt_data)
  232. end
  233. view:SetVisible(true)
  234. end
  235. function GuildEventView:__delete( )
  236. for k, v in pairs(self.event_view_list) do
  237. v:DeleteMe()
  238. v = nil
  239. end
  240. self.event_view_list = nil
  241. end