-- <* -- @Author: Saber -- @Description: 转职任务界面 -- *> ReinTaskView = ReinTaskView or BaseClass(BaseItem) local ReinTaskView = ReinTaskView function ReinTaskView:__init(parent_wnd,prefab_asset,layer_name) self.base_file = "reincarnation" self.layout_file = "ReinTaskView" self.parent_wnd = parent_wnd self.layer_name = layer_name self.full_screen = true self.ani_right = 400 self.ani_left = -200 -- self.adjust_mid = {left = 160, right = 780} self.model_activity_bg = true self.model_activity_bg_pos = Vector2(-160, 32) self.open_rein_lv = nil -- 如果通过外部按钮跳转进来的,就会有这个值,自动定位到目标转职 -- self:AddPreLoadList("reincarnation", {"ReinTaskScrollItem"}) -- self:AddPreLoadList("reincarnation", {"ReinTaskDataItem"}) self.model = ReincarnationModel:getInstance() -- self.model:UpdateCurReinTask() -- 加载一次转职任务 self.task_model = TaskModel:getInstance() self.main_vo = RoleManager.Instance.mainRoleInfo self.rein_lv = 1 self.rein_stage_cfg = {} -- 当前转职等级的阶段任务属性配置 self.cur_task_stage = self.main_vo.turn_stage -- 当前转职任务阶段index self.first_loaded = true -- 第一次加载子节点 -- self.task_btn_list = {} -- 任务按钮item self.tab_item = {} self.eu_item = {} self.task_scroll_item = {} -- 任务描述item self.task_btn_flag = 0 -- 任务功能按钮状态 0对于已完成的任务 1接任务 2前往任务 3完成任务 4完成转职 5任务不可接 self.click_tips_level = 0 -- 当任务无法接取或进行时提示的任务等级 self.task_btn_flag_content = { [0] = "已完成", [1] = "接取任务", [2] = "前往", [3] = "完成任务", [4] = "完成转职", [5] = "前往", } self:Load() end function ReinTaskView:Load_callback() local nodes = { -- 左侧玩家模型,技能节点 "mid/role_con", -- 右侧信息部分 "right/right_bg:raw", "right/task_func_btn:obj:imgex", -- 任务交互按钮相关 "right/task_func_btn/task_func_btn_lb:tmp", "right/arrow:obj", -- 转职名称相关 "right/stage_cur:obj", "right/stage_cur/stage_cur_lb:tmp", "right/stage_next:obj", "right/stage_next/stage_next_lb:tmp", "right/data_scroll", "right/data_scroll/Viewport/data_con", -- "right/attr_scroll", -- 转职属性奖励容器 -- "right/attr_scroll/Viewport/attr_con", -- "right/taskdesc_scroll", -- 转职任务描述容器 -- "right/taskdesc_scroll/taskdesc_vp:img", "right/taskdesc_con", -- "right/unlock_con", -- "right/titleTxt2:tmp", -- "right/next_task_condition:tmp", -- 任务开放条件文本 -- 最左侧tab相关 "left/tab_scroll", "left/tab_scroll/tab_vp:img", "left/tab_scroll/tab_vp/tab_con", } self:GetChildren(nodes) lua_resM:setOutsideRawImage(self, self.right_bg_raw, GameResPath.GetViewBigBg("re_task_right_bg"), false) self:AddEvents() if self.need_refresh_data then self:UpdateView() end end function ReinTaskView:AddEvents() local function click_event(target) if target == self.task_func_btn_obj then -- 任务交互按钮 self:OnTaskFuncBtnClick() end end AddClickEvent(self.task_func_btn_obj, click_event) local function updateReinStage() self.cur_task_stage = self.main_vo.turn_stage end self.update_rein_stage_id = self.main_vo:BindOne("turn_stage", updateReinStage) local function updateReinTask() -- self.model:UpdateCurReinTask() self:UpdateCurStageTask() -- 更新任务按钮 self:UpdateTrunTabItem() end -- self:BindEvent(TaskModel:getInstance(), TaskEvent.TASK_LIST_INIT, updateReinTask) self:BindEvent(self.model, ReincarnationModel.REFRESH_REIN_TASK, updateReinTask) end function ReinTaskView:SetData(view_index, rein_lv) self.open_rein_lv = rein_lv if self.is_loaded then self.need_refresh_data = false self:UpdateView() else self.need_refresh_data = true end end function ReinTaskView:UpdateView() self.tab_data = self.model:GetTotalReinTransferCfg() self:InitReinData(self.open_rein_lv) self:UpdateRoleModel() -- 更新模型 self:UpdateTrunTabItem() -- 更新左侧职业按钮 self:UpdateAllTurnData() -- 更新界面转职数据 end -- 更新界面转职数据 function ReinTaskView:UpdateAllTurnData( ) self:UpdateCareerTitle() -- 更新职业变化节点 self:UpdateCurStageTask() -- 更新任务按钮 self:UpdateReinStageEnhanceAndUnlockData() -- 更新当前阶段的转职的属性提升和解锁内容 end function ReinTaskView:InitReinData(rein_lv) self.rein_lv = rein_lv or self.model:GetCurTurn() self.rein_stage_cfg = self.model:GetReinLvStageData(self.rein_lv) -- if self.rein_lv == 0 then -- 对0转特殊处理,给5个球 -- self.rein_stage_cfg = { -- {id = 0}, -- {id = 0}, -- {id = 0}, -- {id = 0}, -- {id = 0}, -- } -- end self.total_stage = #self.rein_stage_cfg end function ReinTaskView:UpdateRoleModel( ) local res_data = { father_node = self, transform = self.role_con, fashion_type = FuncOpenModel.TypeId.Clothes, size = Vector2(550, 440), scale = 255, ui_model_type = UIModelCommon.ModelType.BackModel, show_reflection = true, reflect_pos = Vector3(0, 76, 0), } FuncOpenModel:getInstance():SetModelRes(res_data) end -- 更新转职头衔 function ReinTaskView:UpdateCareerTitle( ) -- self.rein_lv是当前查看的转职,所以self.rein_lv获取到的数据实际上是next_cfg local lv_cfg, next_cfg for k, v in ipairs(self.tab_data) do if v.transfer_id == self.rein_lv-1 then lv_cfg = v end if v.transfer_id == self.rein_lv then next_cfg = v end end local turn, turn_stage = self.main_vo.turn, self.main_vo.turn_stage if self.rein_lv <= turn then -- 只显示当前职业 self.stage_next_obj:SetActive(false) self.arrow_obj:SetActive(false) SetAnchoredPositionX(self.stage_cur, 4.5) self.stage_cur_lb_tmp.text = Trim(next_cfg.name) else -- 显示当前职业和后续转职职业 self.stage_next_obj:SetActive(true) self.arrow_obj:SetActive(true) SetAnchoredPositionX(self.stage_cur, -102) if lv_cfg then self.stage_cur_lb_tmp.text = Trim(lv_cfg.name) end self.stage_next_lb_tmp.text = Trim(next_cfg.name) end end -- 加载转生阶段tabitem function ReinTaskView:UpdateTrunTabItem( ) local tab_click_func = function(rein_lv) self:InitReinData(rein_lv) self:UpdateAllTurnData() for k, v in pairs(self.tab_item) do v:SetSelected(v.data.transfer_id == rein_lv) end end local tab_index = 1 for k = 2, #self.tab_data do self.tab_item[tab_index] = self.tab_item[tab_index] or ReinTaskTabItem.New(self.tab_con) self.tab_item[tab_index]:SetAnchoredPosition(22, -(tab_index - 1) * (87 + 42) - 21) self.tab_item[tab_index]:SetData(self.tab_data[k], tab_index, tab_click_func) self.tab_item[tab_index]:SetSelected(self.tab_data[k].transfer_id == self.rein_lv) tab_index = tab_index + 1 end end -- 加载任务节点 function ReinTaskView:UpdateCurStageTask() -- 如果查看的是当前正在进行的转生阶段,则自动定位任务,否则定位到最后一个 if self.rein_lv == self.main_vo.turn + 1 then -- 自动定位到当前正在进行的任务 local cur_task_vo = self.model:GetCurTaskVo() local auto_index = self.cur_task_stage + 1 if cur_task_vo then -- 当前已接任务则当前阶段等于跳转阶段,否则为下一阶段 local task_received = cur_task_vo.acceptType == 0 auto_index = task_received and self.cur_task_stage or self.cur_task_stage + 1 end self:UpdateTaskData(auto_index > self.total_stage and self.total_stage or auto_index) else self:UpdateTaskData(self.rein_lv > self.main_vo.turn + 1 and 1 or self.total_stage) end end -- 构建任务详细数据结构体生成展示节点 function ReinTaskView:UpdateTaskData(stage) if not stage then return end -- 当前转职进度 local turn, turn_stage = self.main_vo.turn, self.main_vo.turn_stage -- 创建展示内容 local task_data_list = {} self.task_btn_flag = 0 -- 任务功能按钮状态 0已完成的任务 1接任务 2前往任务 3完成任务 4完成转职 5任务不可接 local condition_tmp = "" -- 条件文本,根据不同条件赋值 if self.rein_lv < turn then -- 查看往期转职任务 -- 提示任务内容已经完成 task_data_list[#task_data_list+1] = {finish_content = string.format("已完成全部转职任务", ColorUtil.GREEN_DARK)} -- self.titleTxt2_tmp.text = "转职任务" else local cur_task_vo, auto_index = nil, self.cur_task_stage + 1 if self.rein_lv == turn + 1 then -- 查看当前转职任务 -- 先尝试获取进行中的任务 cur_task_vo = self.model:GetCurTaskVo() if cur_task_vo then -- 当前已接任务则当前阶段等于跳转阶段,否则为下一阶段 local task_received = cur_task_vo.acceptType == 0 auto_index = task_received and self.cur_task_stage or self.cur_task_stage + 1 self.task_btn_flag = task_received and 2 or 1 if task_received then -- 如果任务已经完成了,则要进一步确认状态 local is_task_finished = cur_task_vo.taskTips[1] and cur_task_vo.taskTips[1].isFinish == 1 if is_task_finished then self.task_btn_flag = self.total_stage == stage and 4 or 3 end end end task_data_list[#task_data_list+1] = {title = string.format("(%s/%s)", ColorUtil.GREEN_DARK, stage, self.total_stage)} -- self.titleTxt2_tmp.text = string.format("转职任务(%s/%s)", ColorUtil.GREEN_DARK, stage, self.total_stage) else -- self.titleTxt2_tmp.text = "转职任务" end local stage_data = self.rein_stage_cfg[stage] local task_id = stage_data and stage_data.task_id -- 用于获取展示数据的task_vo local task_vo = nil if stage == auto_index then -- 当查看的阶段数相同时,才获取正在进行中的转生任务 task_vo = cur_task_vo end -- 如果当前有进行中或可接的转职任务,则直接使用任务结构体 if task_vo then task_data_list[#task_data_list+1] = {task_data = task_vo} else -- 当前进行中的任务不存在,则获取任务配置 if task_id and not self.task_model:IsTaskFinished(task_id) then task_vo = ConfigItemMgr.Instance:GetTaskData(task_id) task_data_list[#task_data_list+1] = { content = string.format("%s任务 (%s/%s) 级可接取", (self.rein_lv == turn + 1 and turn_stage ~= 0) and "下一阶段" or "转职", self.main_vo.level < task_vo.level and ColorUtil.RED_DARK or ColorUtil.GREEN_DARK, self.main_vo.level, task_vo.level) } self.task_btn_flag = 5 self.click_tips_level = task_vo.level -- 若查看的是当前正在进行的转职,而且没有可接或进行中的任务,就需要实时显示下一阶段所需要的角色等级 if not cur_task_vo and self.rein_lv == turn + 1 then local next_stage_cfg = self.rein_stage_cfg[auto_index] local next_stage_task = next_stage_cfg and ConfigItemMgr.Instance:GetTaskData(next_stage_cfg.task_id) condition_tmp = next_stage_task and string.format("Lv.%s 开启下一星任务", ColorUtil.RED_DARK, WordManager:GetRoleLevel(next_stage_task.level, turn)) or "" end else -- 对于已完成的任务或者不存在的任务,提示任务内容已经完成 task_data_list[#task_data_list+1] = {finish_content = string.format("已完成全部转职任务", ColorUtil.GREEN_DARK)} self.task_btn_flag = 0 end end end -- self.next_task_condition_tmp.text = condition_tmp for k, v in pairs(self.task_scroll_item) do v:SetVisible(false) end -- 生成节点 local item, height = nil, 0 for k, v in ipairs(task_data_list) do item = self.task_scroll_item[k] if not item then item = ReinTaskScrollItem.New(self.taskdesc_con) self.task_scroll_item[k] = item end item:SetVisible(true) item:SetAnchoredPosition(0, -height) height = height + item:SetData(v, stage) end SetSizeDeltaY(self.taskdesc_con, height) -- 更新任务按钮样式 local is_gray = self.task_btn_flag == 0 or self.task_btn_flag == 5 self.task_func_btn_imgex.gray = is_gray SetTMPSharedMaterial(self.task_func_btn_lb_tmp, is_gray and ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn or ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn) self.task_func_btn_lb_tmp.text = self.task_btn_flag_content[self.task_btn_flag] end function ReinTaskView:UpdateReinStageEnhanceAndUnlockData( ) -- 总内容 local eu_data_list = {} -- 属性提升相关 eu_data_list[#eu_data_list+1] = {title = "提升 战力属性"} -- 获取配置 local attr_list if self.rein_lv == 0 then -- 特殊处理 attr_list = { {1,20},{2,200} } else attr_list = stringtotable(self.rein_stage_cfg[#self.rein_stage_cfg].attr_list) end local attr_temp1, attr_temp2 for i = 1, #attr_list, 2 do attr_temp1 = attr_list[i] attr_temp2 = attr_list[i + 1] if attr_temp1 then eu_data_list[#eu_data_list+1] = {attr1 = attr_temp1} end if attr_temp2 then eu_data_list[#eu_data_list].attr2 = attr_temp2 end end -- 设置最后一条属性的条目位最终条目,该字段会增加条目高度拓宽间隔 eu_data_list[#eu_data_list].is_last = true -- 解锁的技能和装备代数表现 local unlock_data = self.model:GetReinSucceedUnlockData(self.rein_lv) if not IsTableEmpty(unlock_data.skill_list) then eu_data_list[#eu_data_list+1] = {title = "新增 强力技能"} eu_data_list[#eu_data_list+1] = {skill_data = unlock_data.skill_list} end eu_data_list[#eu_data_list].is_last = true if not IsTableEmpty(unlock_data.equip_list) then eu_data_list[#eu_data_list+1] = {title = string.format("解锁 %s代装备", ChineseNumber(unlock_data.equip_series))} eu_data_list[#eu_data_list+1] = {equip_data = unlock_data.equip_list} end eu_data_list[#eu_data_list].is_last = true local height = 0 for k, v in pairs(self.eu_item) do v:SetVisible(false) end for k, v in ipairs(eu_data_list) do self.eu_item[k] = self.eu_item[k] or ReinTaskDataItem.New(self.data_con) self.eu_item[k]:SetAnchoredPosition(0, - height) height = height + self.eu_item[k]:SetData(v) self.eu_item[k]:SetVisible(true) end SetSizeDeltaY(self.data_con, height) -- local start_y = -3 - (#attr_list > 6 and 0 or ((self.attr_scroll.sizeDelta.y - math.floor(#attr_list/2) * 31) / 2)) -- self.attr_item_creator = self.attr_item_creator or self:AddUIComponent(UI.ItemListCreator) -- local info = { -- data_list = attr_list, -- scroll_view = self.attr_scroll, -- item_con = self.attr_con, -- prefab_ab_name = "reincarnation", -- prefab_res_name = "ReinTaskAttrItem", -- item_width = 175, -- item_height = 34, -- start_y = start_y, -- space_x = 15, -- space_y = -3, -- create_frequency = 0.01, -- alignment = UnityEngine.TextAnchor.UpperLeft, -- child_names = {"attr_val:tmp", "attr_name:tmp"}, -- on_update_item = function(item, i, v) -- item.attr_name_tmp.text = WordManager:GetProperties(v[1]) -- item.attr_val_tmp.text = "+"..WordManager:GetPropertyValue(v[1], v[2]) -- end, -- } -- self.attr_item_creator:UpdateItems(info) end -- 创建转职技能节点 -- function ReinTaskView:UpdateUnlockItems( ) -- -- 先隐藏所有的技能 -- for k, v in pairs(self.unlock_item) do -- v:SetVisible(false) -- end -- local unlock_data = self.model:GetReinSucceedUnlockData(self.rein_lv) -- local item -- local list_num = #unlock_data -- for k, v in ipairs(unlock_data) do -- item = self.unlock_item[k] -- if not item then -- item = ReinUnlockItem.New(self.unlock_con) -- self.unlock_item[k] = item -- end -- local x_index = k % 2 == 0 and 1 or 0 -- local y_index = math.ceil(k / 2) - 1 -- item:SetAnchoredPosition(5.5 + x_index * 192, -121 * y_index - 5) -- item:SetData(v) -- item:SetVisible(true) -- end -- end -- 点击任务交互按钮 function ReinTaskView:OnTaskFuncBtnClick( ) if self.task_btn_flag ~= 0 and self.task_btn_flag ~= 5 then local cur_rein_task = self.model:GetCurTaskVo() TaskModel:getInstance():TaskClickFun(cur_rein_task) -- 关闭转生任务界面 GlobalEventSystem:Fire(EventName.CLOSE_NEW_MAIN_ROLE_VIEW) elseif self.task_btn_flag == 5 then Message.show(string.format("任务%s级开放", self.click_tips_level), "fault") end end function ReinTaskView:__delete( ) for k,v in pairs(self.tab_item) do v:DeleteMe() v = nil end self.tab_item = {} for k, v in pairs(self.task_scroll_item) do v:DeleteMe() v = nil end self.task_scroll_item = nil for k, v in pairs(self.eu_item) do v:DeleteMe() v = nil end self.eu_item = {} if self.update_rein_stage_id then self.main_vo:UnBind(self.update_rein_stage_id) self.update_rein_stage_id = nil end end