BossHomeSubView = BossHomeSubView or BaseClass(BaseItem) local BossHomeSubView = BossHomeSubView local ConfigItemMgr = ConfigItemMgr local Config = Config local stringtotable = stringtotable function BossHomeSubView:__init() self.base_file = "boss" self.layout_file = "BossHomeSubView" self.layer_name = "UI" self.model = BossHomeModel:getInstance() self.full_screen = true -- self.ani_right = 400 self.ani_left = -200 -- self.adjust_mid = {left = 370, right = 520} self.adjust_mid = {left = 370} self.cur_hor_tab_index = 1 self.cur_select_index = 1 self.select_boss_id = false self.need_auto_selected = false self.main_tab_data = {} self.first_update_maintab = true self.main_tab_selected_index = 1 -- 区域tab索引 self.guild_exclusive_index = 1--社团归属索引 self.bosshome_area_type = 1 -- 区域类型 1:普通 2:社团专属 self.sort_data_list = nil self.cache_event_req_list = {} -- 缓存对应区域/层数的协议请求,满足条件则不会在本次打开界面时反复请求协议 self.reward_list = {} self.main_role = RoleManager.Instance.mainRoleInfo self:Load() -- 清除红点 self.model:CheckBossHomeRedByType(BossConst.RedType.ModuleOpen, false) self.model.boss_home_login_red = false self.model:CheckBossHomeRedByType(BossConst.RedType.Login) end function BossHomeSubView:Load_callback() self.nodes = { "bg:raw", "right", "right/right_bg:raw", "right/con_model:raw", -- "right/boss_bg_mask:obj", "right/boss_bg_mask_new:raw", "right/scroll_special","right/scroll_special/Viewport/Content_special", "right/btn_challenge/red_challenge:obj", "right/btn_challenge:obj:img","right/btn_help:obj", "right/btn_history:obj", "left/scroll_tab","left/scroll_tab/Viewport/Content_tab", "left/tab_con", "left/bg_tab", "left/bg_main_tab", "right/btn_challenge/lb_btn_challenge:tmp", "right/costCon:obj", "right/costCon/costNum:tmp", "right/costCon/costImg:img", "right/costCon/costDes:tmp", "right/block_tips:tmp", } self:GetChildren(self.nodes) self.btn_help_obj:SetActive(false) self.costDes_tmp.text = "<#f558ff>VIP等级<#ffffff>不足可消耗" -- SetLocalPositionZ(self.boss_bg_mask, -4000) -- self.boss_bg_mask_canvas = self.boss_bg_mask.gameObject:GetComponent(typeof(UnityEngine.Canvas)) -- self.boss_bg_mask_obj.layer = LayerMask.NameToLayer(self.layer_name) -- 重新设置RT节点 self.block_tips_tmp.fontSize = 16 SetSizeDelta(self.con_model, 400, 500) SetAnchoredPosition(self.con_model, -3.5, -30) lua_resM:setOutsideRawImage(self, self.bg_raw, GameResPath.GetViewBigBg("bosshome_main_bg")) lua_resM:setOutsideRawImage(self, self.right_bg_raw, GameResPath.GetViewBigBg("bosshome_main_bg2")) lua_resM:setOutsideRawImage(self, self.boss_bg_mask_new_raw, GameResPath.GetViewBigBg("bosshome_boss_bgmasknew")) self:AddEvents() if self.need_refreshData then self:UpdateView() end end function BossHomeSubView:AddEvents( ) local on_click = function ( click_obj ) if self.btn_challenge_obj == click_obj then self:DoChallenge() elseif self.btn_history_obj == click_obj then if self.select_boss_id and self.select_boss_id > 0 then BossModel.Instance:Fire(BossConst.OPEN_MONEY_KILL_HISTORY_VIEW,self.select_boss_id) end end end AddClickEvent(self.btn_challenge_obj, on_click) AddClickEvent(self.btn_history_obj, on_click) local function ANS_BOSS_HOME_INFO(bosstype, level, guild_id) local target_guild_id = 0 if self.main_tab_selected_index ~= 1 then target_guild_id = self.main_tab_data[self.main_tab_selected_index] and self.main_tab_data[self.main_tab_selected_index].guild_data and self.main_tab_data[self.main_tab_selected_index].guild_data.guild_id or 0 end if bosstype == self.bosshome_area_type and level == self.cur_hor_tab_index and guild_id == target_guild_id then self:UpdateLeftItemInfo() end end self:BindEvent(self.model, BossHomeConst.ANS_BOSS_HOME_INFO, ANS_BOSS_HOME_INFO) local function ChangeVisible( flag ) if not flag then return end self:UpdateModelInfo(true) end self:BindEvent(GlobalEventSystem, BaseView.ChangeVisible, ChangeVisible) local function updateGuildExclusiveData() self:UpdateMainTab() end self:BindEvent(self.model, BossHomeConst.UPDATE_GUILD_EXCLUSIVE_DATA, updateGuildExclusiveData) -- 当玩家所在的社团id变动时,刷新主页签 self.on_guild_id_chagne_id = self.main_role:BindOne("guild_id", updateGuildExclusiveData) end function BossHomeSubView:SetData( select_boss_id ) --需要判断下这个bossid是否正确,否则就重置为nil -- local is_boss_id_true = false -- for k,v in pairs(Config.Homeboss) do -- if v.boss_id == select_boss_id and v.sub_module == 1 then -- is_boss_id_true = true -- break -- end -- end -- if not is_boss_id_true then -- select_boss_id = nil -- end if select_boss_id then select_boss_id = nil--先不允许外部传 end self.select_boss_id = select_boss_id or self.select_boss_id ------------------------- if self.select_boss_id then self.need_auto_selected = true -- local boss_conf = self.model:GetBossHomeCFGById( self.select_boss_id ) -- self:SwitchTab( boss_conf.level ) end ------------------------- if self.is_loaded then self.need_refreshData = false self:UpdateView() else self.need_refreshData = true end end function BossHomeSubView:UpdateView( ) self:UpdateMainTab() end -- 更新幻魔之家最右侧主tab:区域tab function BossHomeSubView:UpdateMainTab( ) self.main_tab_data = {} local guild_exclusive_data = self.model:GetBossHomeGuildExclusiveData() -- 插入公共区域的配置 self.main_tab_data[#self.main_tab_data+1] = { type = BossHomeConst.BossHomeType.Normal, } -- 插入社团专属区域的信息 self.guild_exclusive_index = 1 local temp_ex_data for i = 1, 3 do temp_ex_data = guild_exclusive_data[i] self.main_tab_data[#self.main_tab_data+1] = { type = BossHomeConst.BossHomeType.Guild, -- 没有社团信息到时候要做空表现处理 guild_data = temp_ex_data or nil } if temp_ex_data and temp_ex_data.guild_id == self.main_role.guild_id then self.guild_exclusive_index = i + 1 end end -- 选中回调,选中后需要同步更新左侧层数,boss页签和最右侧的boss模型等内容和奖励 local function select_callback(index, type) self.main_tab_selected_index = index self.bosshome_area_type = type self.maintab_item_creator:IterateItems(function ( item, i ) item:SetSelected(index) end) -- 更新这个区域的页签数据信息 self:SetTabData() -- 更新boss模型 self:UpdateModelInfo() -- 更新奖励 self:UpdateAwardInfo() end self.maintab_item_creator = self.maintab_item_creator or self:AddUIComponent(UI.ItemListCreator) local data = { data_list = self.main_tab_data, scroll_view = self.bg_main_tab, item_con = self.bg_main_tab, item_class = BossHomeMainTabItem, item_height = 151, start_x = 11.5, start_y = -6, space_y = 6, on_update_item = function(item, i, v) item:SetData(v, i, select_callback) item:SetSelected(self.main_tab_selected_index) end, } self.maintab_item_creator:UpdateItems(data) -- 首次打开需要自动定位 -- 若存在外部传入的bossid,则需要定位到对应的区域/层数和位置 -- 而不存在外部传入的bossid,且存在自己所在的社团专属区域,则自动定位到该index,否则默认第一位 if self.first_update_maintab then -- if self.need_auto_selected then -- local boss_conf = self.model:GetBossHomeCFGById(self.select_boss_id) -- if boss_conf then -- 在公共区域,则需要强制切换到公共区域 -- self.guild_exclusive_index = 1 -- else -- -- 是专属区域的boss,则不要变动self.guild_exclusive_index,但固定层数索引 -- boss_conf = self.model:GetGuildBossHomeCFGById(self.select_boss_id) -- end -- -- 确定外部传入的bossid对应的层数,后面的逻辑跳过对这个值的更新 -- self.cur_hor_tab_index = boss_conf.level -- end -- select_callback(self.guild_exclusive_index, self.main_tab_data[self.guild_exclusive_index].type) select_callback(1, self.main_tab_data[1].type) else select_callback(self.main_tab_selected_index, self.main_tab_data[self.main_tab_selected_index].type) end self.first_update_maintab = false end function BossHomeSubView:SetTabData() -- 需根据区域是否属于公共区域划分不同的配置,后同 local cfg = self.bosshome_area_type == BossHomeConst.BossHomeType.Normal and self.model:GetBossHomeLevelCFG() or self.model:GetGuildBossHomeLevelCFG() local open_count = 0 self.menu_list = {} local tab = 1 for i,v in ipairs(cfg) do if v.enter_lv <= self.main_role.level then table.insert(self.menu_list, string.format("第%s层", v.level)) open_count = i -- 标记开放的个数 tab = i -- 计算顶部页签 else if i == open_count + 1 then local str = string.format("%s级开放", v.enter_lv) table.insert(self.menu_list, {text = str, enter_lv = v.enter_lv, show_lock = true}) end end end local call_back = function (index) if index <= open_count then self:SwitchTab(index or 1) else local temp_cfg = self.menu_list[index] Message.show(string.format("%s级开放该层幻魔之家!", temp_cfg.enter_lv), "fault") if self.tabBar then self.tabBar:SetSelectTab(self.cur_hor_tab_index) end self:SwitchTab(self.cur_hor_tab_index) end end -- 在没有指定bossid跳转的前提下,才可以确定当前等级最高可以挑战的boss索引index if not self.need_auto_selected then self.cur_hor_tab_index = tab end SetSizeDeltaX(self.bg_tab.transform, 125.7 * (#self.menu_list)) if not self.tabBar then self.tabBar = self:CreateItem(UIHorTabBar, self.tab_con, self.layer_name) end self.tabBar:SetData(self.menu_list, call_back) -- self.tabBar:SetBtnLabelColor(ColorUtil:ConvertHexToRGBColor("#9eb3cf"), ColorUtil:ConvertHexToRGBColor("#ffffff")) self.tabBar:SetSize(130,45) self.tabBar:SetPosition(-1,-2) self.tabBar:SetBtnRes("alphaCommon_asset", "tyui_btn1_3", "tyui_btn1_1") self.tabBar:SetSpacing(-6, 0) local offset = -math.min(124*(self.cur_hor_tab_index - 1),814) self.tabBar:SetScrollConPos(offset,0) -- -- 若需要选中外部传入的bossid对应的层数 -- if self.need_auto_selected then -- local boss_conf = self.model:GetBossHomeCFGById( self.select_boss_id ) -- -- 确定外部传入的bossid对应的层数 -- self.cur_hor_tab_index = boss_conf.level -- end -- if self.select_boss_id then -- self.need_auto_selected = true -- end self.sort_data_list = self.bosshome_area_type == BossHomeConst.BossHomeType.Normal and self.model:GetBossHomeCFG(self.cur_hor_tab_index) or self.model:GetGuildBossHomeCFG(self.cur_hor_tab_index) local monster_cfg for i,v in ipairs(self.sort_data_list) do monster_cfg = ConfigItemMgr.Instance:GetMonsterDataItem(v.boss_id) if monster_cfg then if monster_cfg.lv <= self.main_role.level then self.cur_select_index = i end end end -- 选中顶部层数页签,更新boss列表和其他内容 self.tabBar:SetSelectTab(self.cur_hor_tab_index) call_back(self.cur_hor_tab_index) end function BossHomeSubView:SwitchTab( index ) self.cur_hor_tab_index = index -- 请求boss信息列表 self:RequestBossData() end function BossHomeSubView:RequestBossData( ) local target_guild_id = 0 if self.main_tab_selected_index ~= 1 then target_guild_id = self.main_tab_data[self.main_tab_selected_index] and self.main_tab_data[self.main_tab_selected_index].guild_data and self.main_tab_data[self.main_tab_selected_index].guild_data.guild_id or 0 end -- 请求boss信息列表 -- local key = self.bosshome_area_type .. "@" .. self.cur_hor_tab_index .. "@" .. target_guild_id -- if self.cache_event_req_list[key] then -- 已经请求过数据的不再请求,直接加载 -- self:UpdateLeftItemInfo() -- else self.model:Fire(BossHomeConst.REQUEST_CCMD_EVENT, 46201, self.bosshome_area_type, self.cur_hor_tab_index, target_guild_id) -- end -- 追加缓存,后续避开协议请求 -- self.cache_event_req_list[key] = true end function BossHomeSubView:CheckSelectId( ) --检查默认选中的Id if (not self.select_boss_id) or (self.select_boss_id == 0) then --默认选择 self.select_boss_id = self.sort_data_list[1].boss_id end end function BossHomeSubView:UpdateLeftItemInfo() ------------------------- local function select_call( index,boss_id,data ) if boss_id and boss_id > 0 then self:SetSelectItem(index, boss_id, data) end end ------------------------- self.sort_data_list = self.bosshome_area_type == BossHomeConst.BossHomeType.Normal and self.model:GetBossHomeCFG(self.cur_hor_tab_index) or self.model:GetGuildBossHomeCFG(self.cur_hor_tab_index) self:CheckSelectId() local show_data = self.sort_data_list local server_data = self.model:GetBossHomeInfo() self.tab_item_list = self.tab_item_list or self:AddUIComponent(UI.ItemListCreator) local data = { data_list = show_data or {}, item_con = self.Content_tab, item_class = BossHomeTabItem, item_width = BossHomeTabItem.Width, item_height = BossHomeTabItem.Height-3.2, space_y = 2.5, start_x = 8.5-6, start_y = -5.5+6, scroll_view = self.scroll_tab, on_update_item = function(item, i, v) item:SetData(i,v,select_call, server_data[v.boss_id], "boss_home") item:SetSelect(self.select_boss_id) end, } self.tab_item_list:UpdateItems(data) if self.need_auto_selected then for k,v in pairs(show_data) do if v.boss_id == self.select_boss_id then self.cur_select_index = k end end self.need_auto_selected = false end ------------------------- self.cur_select_index = show_data[self.cur_select_index] and self.cur_select_index or 1 local data = show_data[self.cur_select_index] self:SetSelectItem(self.cur_select_index, data.boss_id, data) self.tab_item_list:ScrollToItem(self.cur_select_index) end function BossHomeSubView:SetSelectItem( index, boss_id,data ) self.cur_select_index = index self.select_boss_id = boss_id self.select_data = data self.tab_item_list:IterateItems(function ( item ) item:SetSelect(self.select_boss_id) end) self:UpdateModelInfo(true) self:UpdateAwardInfo() self:UpdateChallengeBtnState() end function BossHomeSubView:UpdateModelInfo( force ) --Boss形象 local monster = ConfigItemMgr.Instance:GetMonsterDataItem(self.select_boss_id) if not monster then print("HWR:BossDesertedSubView [234]no boss cfg: ",self.select_boss_id) return end ------------------------- --BOSS展示的时候的第一次播放的动作 -- print("Saber:BossHomeSubView [371] monster.icon: ",monster.icon) local aciton_list = {"show", idle_name="show",loopList=false} local pos = Config.ConfigBoss.ModelPos[monster.icon] or {0,0} if not self.last_boss_id or self.last_boss_id~=self.select_boss_id or force then local function delay( ) if self._use_delete_method then return end local res_data = { clothe_res_id = monster.icon, --weapon_res_id = monster.weapon_id, type = SceneBaseType.Monster, action_name_list = aciton_list, layer_name = self.layer_name, father_node = self, transform = self.con_model, rotate = Vector3(15,180,0), fashion_type = FuncOpenModel.TypeId.Monster, size = {x = 600, y = 500}, -- position = Vector3(pos[1], 20 + pos[2], -1000), position = Vector3(pos[1], 100 + pos[2], 0), -- scale = 70, scale = 30, can_rotate = false; -- ui_model_type = UIModelCommon.ModelType.Model, ui_model_type = UIModelCommon.ModelType.RT, show_shadow = false, } FuncOpenModel:getInstance():SetModelRes(res_data) end setTimeout(delay,0.05) end self.last_boss_id = self.select_boss_id -- self.boss_bg_mask_canvas.sortingOrder = self:GetCurrLayerDepth(self.layer_name) + 1 end function BossHomeSubView:UpdateAwardInfo( ) local conf = self.select_data if not conf or not conf.drop_show then return end ------------------------- local base_conf = stringtotable(conf.drop_show) local function GetShowList( data ) local result = {} if data then for k,v in pairs(data) do if self.main_role.career == tonumber(v[1]) or tonumber(v[1]) == 0 then table.insert(result,v) end end end return result end base_conf = GetShowList(base_conf) ------------------------- for k, v in ipairs(base_conf) do if k > 12 then return end -- 至多显示12个道具 self.reward_list[k] = self.reward_list[k] or UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.Content_special) -- 使用了组件自动对准位置 -- self.reward_list[k]:SetAnchoredPosition((k - 1) * 96 + offset_x, 0) self.reward_list[k]:SetItemSize(78, 78) self.reward_list[k]:SetVisible(true, nil, true) self.reward_list[k]:SetDataWithMapId(v[3], v[4], v[2]) local goods_vo = GoodsModel:getInstance():GetGoodsBasicByTypeId(v[3]) if goods_vo.type == 4 and goods_vo.subtype >= 6 and goods_vo.subtype <= 9 then--珍宝要显示概率UP self.reward_list[k]:SetNumLimitVisible(true,33) else self.reward_list[k]:SetNumLimitVisible(false) end end if #base_conf < #self.reward_list then for i = #base_conf + 1, #self.reward_list do self.reward_list[i]:SetVisible(false, nil, true) end end end -- 点击挑战按钮回调 function BossHomeSubView:DoChallenge( ) if self.select_boss_id and self.select_boss_id > 0 then --场景内寻路 local scene_id = self.model:GetBossHomeSceneById(self.select_boss_id) local cur_scene_id = SceneManager.Instance:GetSceneId() if cur_scene_id == scene_id then local cfg = Config.Homeboss[self.bosshome_area_type .. "@" .. self.select_boss_id] local pos = stringtotable(cfg.born_pos) local function call_back( ... ) GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT) end local findVo = FindVo.New() findVo.sceneId = SceneManager.Instance:GetSceneId() findVo.type = FindVo.POINT findVo.x = pos[1]/ SceneObj.LogicRealRatio.x findVo.y = pos[2]/ SceneObj.LogicRealRatio.y findVo.call_back = call_back GlobalEventSystem:Fire(EventName.FIND,findVo) BossModel.Instance:Fire(BossConst.CLOSE_BOSS_BASE_VIEW) else --如果是在boss之家场景中,但是点了其他场景中的boss,飘字提示不允许这样做 if SceneManager.Instance:IsBossHomeScene() then Message.show("当前场景不能直接进入!","fault") return end local is_in_common = self.main_tab_selected_index == 1 local is_in_guild = self.guild_exclusive_index == self.main_tab_selected_index and self.guild_exclusive_index ~= 1 if not is_in_common and not is_in_guild then Message.show("无法进入其他社团的幻魔之家", "fault") return end --场景外先判断vip够不够,不够要提醒花钱买门票 local ok_enter = function() self.model:Fire(BossHomeConst.REQUEST_CCMD_EVENT, 46204, self.bosshome_area_type, self.select_boss_id) self.model:SetNeedFindBoss(self.select_boss_id) end local vip_condition = stringtotable(Config.Homebosslevel[self.bosshome_area_type .. "@" .. self.cur_hor_tab_index].condition)[1][2] if self.main_role.vip_flag >= vip_condition then ok_enter() else local cost = stringtotable(Config.Homebosslevel[self.bosshome_area_type .. "@" .. self.cur_hor_tab_index].cost) if cost[1] then local function ok1( ... ) if RoleManager.Instance.mainRoleInfo.jinLock>=cost[1][3] then--够钱直接买 ok_enter() else local function use_function( toggle_tip_data,call_fun_sum ) GlobalEventSystem:Fire(EventName.OPEN_COM_TOGGLE_TIP_VIEW, toggle_tip_data) end local function recharge_open_call_back( ) self:Close() end local buy_tip_data = { gold_type = cost[1][1],--货币类型 cost_price = cost[1][3],--消耗金额 ok_callback = ok_enter,--成功 no_need_toggle = true, -- toggle_function = toggle_function,--多选 -- recharge_open_call_back = recharge_open_call_back, togglePriceStr = string.format("%s 抵扣VIP条件进入?",cost[1][3]),--提示语 use_function = use_function,--最终调用 } CustomActivityModel:getInstance():BuyTips(buy_tip_data) end end local function ok2( ... ) OpenFun.Open(158,0) end local ask_str = string.format("您的<#f558ff>VIP等级不满足,是否消耗 %s<#fdffc2>%s 进入?", WordManager:GetMoneyFaceStr(cost[1][1]),cost[1][3]) Alert.show(ask_str,Alert.Type.Two,ok1,ok2,"确定","提升VIP") else -- Message.show(string.format("需达到VIP%s方可进入", vip_condition), "fault") local function ok3( ... ) OpenFun.Open(158,0) end local ask_str = "您的<#f558ff>VIP等级不足,\n提升<#f558ff>VIP可进入幻魔之家无限刷BOSS哦!" Alert.show(ask_str,Alert.Type.One,ok3,nil,"提升VIP") end end end self.model.boss_home_scene_boss = self.select_boss_id end end --刷新挑战按钮vip进入显示条件 function BossHomeSubView:UpdateChallengeBtnState( ) local level_cfg = self.bosshome_area_type == BossHomeConst.BossHomeType.Normal and self.model:GetBossHomeLevelCFG(self.cur_hor_tab_index) or self.model:GetGuildBossHomeLevelCFG(self.cur_hor_tab_index) if level_cfg then local vip_condition = stringtotable(level_cfg.condition)[1][2] self.lb_btn_challenge_tmp.text = string.format("VIP%s直接进入", vip_condition) local cost = stringtotable(level_cfg.cost) local can_use_money = false local cost_money = 0 if cost[1] then can_use_money = true cost_money = cost[1][3] end local is_in_common = self.main_tab_selected_index == 1 local is_in_guild = self.guild_exclusive_index == self.main_tab_selected_index and self.guild_exclusive_index ~= 1 local vip_enough = self.main_role.vip_flag >= vip_condition local is_need_set_gray = false if is_in_common then--公共情况下,不能花钱进且vip不够的时候置灰 if vip_enough or (not vip_enough and can_use_money) then--亮 is_need_set_gray = false else--置灰 is_need_set_gray = true end else if is_in_guild then if vip_enough or (not vip_enough and can_use_money) then--亮 is_need_set_gray = false else--置灰 is_need_set_gray = true end else--置灰 is_need_set_gray = true end end if is_need_set_gray then SetImageGray(self.btn_challenge_img,true) SetTMPSharedMaterial(self.lb_btn_challenge_tmp, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn) else SetImageGray(self.btn_challenge_img,false) SetTMPSharedMaterial(self.lb_btn_challenge_tmp, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn) end self.block_tips_tmp.text = (is_in_guild or is_in_common) and "" or "无法进入其他社团的幻魔之家" if (is_in_common and not vip_enough and can_use_money) or (is_in_guild and not vip_enough and can_use_money) then self.costCon_obj:SetActive(true) self.costNum_tmp.text = string.format("<#fdffc2>%s<#ffffff> 进入",cost_money) else self.costCon_obj:SetActive(false) end end end function BossHomeSubView:__delete( ) for k,v in pairs(self.reward_list) do UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, v) v = nil end self.reward_list = {} if self.on_guild_id_chagne_id then self.main_role:UnBind(self.on_guild_id_chagne_id) self.on_guild_id_chagne_id = nil end end