GuildEventView = GuildEventView or BaseClass(BaseItem) local GuildEventView = GuildEventView local ServerTimeModel = ServerTimeModel function GuildEventView:__init(parent_wnd,prefab_asset,layer_name) self.base_file = "guild" self.layout_file = "GuildEventView" self.parent_wnd = parent_wnd self.layer_name = layer_name -- self.full_screen = true -- self.ani_right = 600 -- self.ani_left = -600 -- self.adjust_mid = {left = 160, right = 780} self.model = GuildModel:getInstance() self.open_day_offset = 0 self.server_open_this_week = false -- 是不是本周内开服 self.event_item_list = {} -- 活动入口按钮item列表 self.event_view_list = {} -- 活动海报界面item列表 self.cur_wday = os.date("*t", TimeUtil:getServerTime()).wday - 1 -- 今天是星期几,值域 1~7 周日为1,所以做个减1做正常周数的映射 if self.model.need_jump_wday and self.model.need_jump_wday>=1 and self.model.need_jump_wday<=7 then self.cur_wday = self.model.need_jump_wday self.model.need_jump_wday = false end self:Load() end function GuildEventView:Load_callback() self.nodes = { -- 左侧 "left/event_scroll", "left/event_scroll/Viewport/event_con", "left/week_day1:tmp", -- 右侧 "right/view_con", -- 按钮 "left/arrow_left:obj:img", "left/arrow_right:obj:img", } self:GetChildren(self.nodes) self:AddEvents() self:UpdateView() end function GuildEventView:AddEvents( ) local function click_event(target) if target == self.arrow_right_obj then -- 向右切换星期数 self:ChangeWday(1) elseif target == self.arrow_left_obj then -- 向左切换星期数 self:ChangeWday(-1) end end AddClickEvent(self.arrow_right_obj, click_event, LuaSoundManager.SOUND_UI.SWITCH) AddClickEvent(self.arrow_left_obj, click_event, LuaSoundManager.SOUND_UI.SWITCH) local function chnage_day_func(type) if type == SettingModel.CHANGE_DAY.HOUR_0 then -- 跨0点 self:CheckOpenDayInWeek() end end self:BindEvent(GlobalEventSystem, EventName.CHANE_DAY, chnage_day_func) end -- 检查开服天数在本周的特殊情况 -- 如果是本周开服,则开服天数之前的日期不允许切换,周日->未开服天数的同理 function GuildEventView:CheckOpenDayInWeek( ) local open_day = ServerTimeModel:getInstance():GetOpenServerDay() -- open_day = 2 -- debug local cur_wday = os.date("*t", TimeUtil:getServerTime()).wday - 1 -- 今天是星期几,值域 1~7 周日为1,所以做个减1做正常周数的映射 self.server_open_this_week = cur_wday > open_day -- 不用等于,因为周一开服没有影响 -- print("Saber:GuildEventView [62] self.server_open_this_week, open_day, cur_wday: ",self.server_open_this_week, open_day, cur_wday) end -- 修改今天是星期几,并同步修改星期几展示的活动 function GuildEventView:ChangeWday(offset) if not offset then return end if self.server_open_this_week then -- 需要特殊处理箭头的点击 local open_day = ServerTimeModel:getInstance():GetOpenServerDay() -- open_day = 2 -- debug local temp_cur_wd = self.cur_wday + offset local temp_open_day_offset = self.open_day_offset + offset local temp_open_day = open_day + temp_open_day_offset temp_open_day = temp_cur_wd > 7 and temp_open_day - 7 or temp_open_day -- print("Saber:GuildEventView [73] temp_open_day,temp_cur_wd: ",temp_open_day,temp_cur_wd) if temp_open_day <= 0 then return else self.open_day_offset = temp_open_day_offset self.cur_wday = temp_cur_wd > 7 and temp_cur_wd - 7 or temp_cur_wd SetImageGray(self.arrow_right_img, self.cur_wday == 7 and temp_open_day < 7) -- 周日 SetImageGray(self.arrow_left_img, temp_open_day <= 1) end else self.open_day_offset = self.open_day_offset + offset self.cur_wday = self.cur_wday + offset -- 修改今天是星期几,要做一个范围映射 if self.cur_wday > 7 then self.cur_wday = self.cur_wday - 7 elseif self.cur_wday < 1 then self.cur_wday = self.cur_wday + 7 end end self.week_day1_tmp.text = WordManager:GetWeekStr3(self.cur_wday) self:UpdateEventItem() end function GuildEventView:UpdateView( ) self:CheckOpenDayInWeek() self:ChangeWday(0) end function GuildEventView:UpdateEventItem( ) local event_list = self.model:GetGuildEventByWday(self.cur_wday) local function call_back(data, index) self.model.select_tab_index = index self.item_creator:IterateItems(function( item, i ) item:SetSelected(i == index) end) self:OpenViewByData(data) end self.item_creator = self.item_creator or self:AddUIComponent(UI.ItemListCreator) local activity_index ,final_event_flag,jump_event_target_index = self:GetActivityIndex(event_list) local info = { data_list = event_list, item_con = self.event_con, scroll_view = self.event_scroll, item_class = GuildEventTabItem, start_x = 8, start_y = -7, item_height = 94+5, space_y = 8-5, create_frequency = 0.01, alignment = UnityEngine.TextAnchor.UpperLeft, is_scroll_back_on_update = true, final_callback = function() -- 定位 if jump_event_target_index ~= 0 then --不等于0说明是用openfun跳过来的 call_back(event_list[jump_event_target_index], jump_event_target_index) self.item_creator:ScrollToItem(jump_event_target_index,-6) else call_back(event_list[activity_index], activity_index) self.item_creator:ScrollToItem(activity_index,-6) end end, on_update_item = function(item, i, v) if final_event_flag then item:SetData(v, i, call_back,activity_index+1) else item:SetData(v, i, call_back,activity_index) end end, } self.item_creator:UpdateItems(info) self.view_con.gameObject:SetActive(not IsTableEmpty(event_list)) end --获取当前正在进行的活动index,用于打开界面时跳转 function GuildEventView:GetActivityIndex(event_list) local is_final_event = false --最后一个活动也结束了,进行全部置灰操作 local event_data = self.model:GetGuildEventData() --活动开启信息 local jump_event_target_index = 0 --需要通过openfun跳转到指定的活动时,返回这个index if self.model.need_jump_event_type then --活动跳转标记 local continue_flag = true for i,v in ipairs(event_list) do local compare_type = tonumber(v.module_id..v.module_sub) --蛋疼,社团boss的活动子类型从module_sub改到ac_sub了 if v.module_id == 406 then compare_type = tonumber(v.module_id..v.ac_sub) elseif v.module_id == 410 then--如果要从外部指定活动类型跳转到本国团战的话,活动类型直接传410,日期传活动当天 compare_type = v.module_id end if continue_flag and tonumber(self.model.need_jump_event_type) == compare_type then jump_event_target_index = i continue_flag = false end end end self.model.need_jump_event_type = nil --重置活动跳转标记 local activity_k = 0 --活动类型,用于记录event_data里正在开活动的的k local activity_v = {} for k,v in pairs(event_data) do if v.is_evt_open then activity_k = k activity_v = v break end end if activity_k == GuildEventType.NoonCollect then for i,v in ipairs(event_list) do if v.module_id == 408 then return i + activity_v.type - 1,is_final_event,jump_event_target_index end end else for i,v in ipairs(event_list) do local key = tonumber(v.module_id..v.module_sub) --蛋疼,社团boss的活动子类型从module_sub改到ac_sub了 if v.module_id == 406 then key = tonumber(v.module_id..v.ac_sub) end if tonumber(activity_k) == key then return i,is_final_event,jump_event_target_index end end end -- 如果当前没有活动在进行中,则需要通过当前的系统时间来决定定位到哪个即将开启的活动上(2020年3月14日策划需求,如果出现时区定位不准的问题找策划) local date = os.date("*t", TimeUtil:getServerTime()) local zero_min = date.hour * 60 + date.min -- 当前时区距0点的分钟数 local evt_time_start, evt_start_hour, evt_start_min for k, v in ipairs(event_list) do evt_time_start = Split((Split(v.time_str, "~")[1]),":") evt_start_hour = evt_time_start[1] evt_start_min = evt_time_start[2] if evt_start_hour * 60 + evt_start_min >= zero_min then return k,is_final_event,jump_event_target_index end end is_final_event = true -- 没有找到活动开启时跳到最后去 return #event_list,is_final_event,jump_event_target_index end -- 根据活动信息弹出界面 -- 活动类型需要在GuildModel.EventModuleId配置键值 function GuildEventView:OpenViewByData(evt_data) for k, v in pairs(self.event_view_list) do v:SetVisible(false) end local key = evt_data.module_id .. "@" .. evt_data.module_sub --蛋疼,社团boss的活动子类型从module_sub改到ac_sub了 if evt_data.module_id == 406 then key = evt_data.module_id .. "@" .. evt_data.ac_sub end local view = self.event_view_list[key] if not view then view = _G[GuildModel.EventModuleId[key]].New(self.view_con) self.event_view_list[key] = view -- 活动界面需要获得活动的开始时间和活动类型的话就写一个这个函数,可参考GuildEventBossView if view["SetEventAcData"] then view:SetEventAcData(evt_data) end end --午间采集活动分了多个项,但界面是共用一个,因此要重复SetEventAcData if evt_data.module_id == 408 then view:SetEventAcData(evt_data) end view:SetVisible(true) end function GuildEventView:__delete( ) for k, v in pairs(self.event_view_list) do v:DeleteMe() v = nil end self.event_view_list = nil end