源战役客户端
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 

920 行
37 KiB

-- <*
-- @Author: Saber
-- @Description: 圣物系统主界面
-- *>
PsionicMainView = PsionicMainView or BaseClass(BaseView)
local PsionicMainView = PsionicMainView
local cos = math.cos
local sin = math.sin
local rad = math.rad
local clamp = Mathf.Clamp
function PsionicMainView:__init()
self.base_file = "psionic"
self.layout_file = "PsionicMainView"
self.layer_name = "UI"
self.destroy_imm = true
self.use_background = G_USING_BG --全屏界面默认使用这个参数
self.hide_maincancas = true --全屏界面需要隐藏主UI
self.append_to_ctl_queue = true --是否要添加进界面堆栈
self.ignore_use_anim = true
self.use_show_anim = false
self.use_hide_anim = false
self.close_fog = true
self.change_scene_close = true
self.tab_index = PsionicConst.TabId.PArmor -- 页签索引
self.open_switch_index = PsionicConst.TabId.PArmor -- 跳转index
self.main_vo = RoleManager.Instance.mainRoleInfo
-- 界面列表
self.view_list = {}
-- 装备栏位置列表
self.equip_con_list = {}
self.main_equip_item_list = {} -- 圣物主页的圆盘上的装备节点
self.tab_equip_item_list = {} -- 圣物升级,洗练,觉醒等页签的左侧当tab节点用的装备节点
self.skill_con_list = {}
self.skill_item_list = {}
self.break_tab_list = {}
self.break_tab_index = 1
-- 装备临时数据相关
self.equip_last_select_slot = nil -- 上次选中的装备slot
self.skill_last_select_slot = nil -- 上次选中的技能slot
self.ps_target_wash_uid = nil -- 目标选中的洗练装备uid
self.cur_show_equip_goods_id = nil -- 当前查看的模型的装备id
self.armor_item_list = {}
self.equip_circle_radius = 0
self.advance_drag_y = 0
-- 模型信息数据相关
self.psionic_effect_res = nil -- 当前的圣环特效名
self.star_list = {}
self.model = PsionicModel:getInstance()
self.goods_model = GoodsModel:getInstance()
self.is_in_guide = false
self.load_callback = function ()
-- 保险起见,每次打开界面都要请求一次最新数据
self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13900)
self.model:Fire(PsionicConst.REQUEST_CCMD_EVENT, 13910)
self:LoadSuccess()
self:AddEvent()
self:UpdateTabRed()
end
self.open_callback = function ( )
self:OpenSuccess()
end
self.switch_callback = function(index)
self:SwitchTab(index)
end
self.destroy_callback = function ( )
self:DestroySuccess()
end
end
function PsionicMainView:Open(index, other_args)
self.open_switch_index = index
-- self.tab_index = index
if index == PsionicConst.TabId.PSkill then
self.skill_last_select_slot = other_args and other_args.slot or self.skill_last_select_slot
elseif index == PsionicConst.TabId.PWash then
self.ps_target_wash_uid = other_args and other_args.target_uid or self.ps_target_wash_uid
-- 如果存在需要选中的装备id,那要把洗练左侧页签定到第一个页签上
self.break_tab_index = self.ps_target_wash_uid and 1 or self.break_tab_index
else
self.equip_last_select_slot = other_args and other_args.slot or self.equip_last_select_slot
end
BaseView.Open(self)
end
function PsionicMainView:LoadSuccess()
local nodes = {
-- 右侧界面容器
"container",
"right",
-- 装备突破tab节点
"left/break_tab_con:obj",
"left/equip_tab_con:obj",
-- 左侧装备节点
"main/equip_con:obj", "main/equip_con/activate_effect_btn:obj", "main/equip_con/activate_effect_btn/activate_effect_btn_red:obj",
-- 装备模型信息节点
"main/equip_info_con:obj",
"main/equip_info_con/break_select_scroll:obj", "main/equip_info_con/break_select_scroll/Viewport/break_select_con",
"main/equip_info_con/break_select_bg:obj", -- 装备突破背包容器
"main/equip_info_con/equip_name:tmp", "main/equip_info_con/equip_name_bg", -- 装备名称及背景板
"main/equip_info_con/equip_star_con", "main/equip_info_con/equip_model_con", -- 装备星数容器和模型容器
"main/equip_info_con/equip_effect_con",
}
self:GetChildren(nodes)
-- 装备界面相关
-- 主页的圆盘上的装备和技能节点位置
for k = 1, 4 do
self.equip_con_list[k] = self:GetChild("main/equip_con/left_equip_con" .. k)
end
for k = 1, 4 do
self.skill_con_list[k] = self:GetChild("main/equip_con/right_equip_con" .. k)
end
local function select_callback(index)
self:SwitchTab(index)
end
local function close_callback()
self:Close()
end
self.tabWindowComponent = UITabWindow.New(self.transform, PsionicConst.TabData, select_callback, close_callback, self.background_wnd, nil, UITabWindow.SizeSmallHall, nil, nil, true)
self.tabWindowComponent:SetTitleText("圣物")
self.tabWindowComponent:ChangeShowFlag("Psionic")
self:AddToStageHandler()
end
function PsionicMainView:AddEvent()
local function click_event(target)
if target == self.activate_effect_btn_obj then
self.model:Fire(PsionicConst.OPEN_PSIONIC_EFFECT_EQUIP_VIEW, true)
end
end
AddClickEvent(self.activate_effect_btn_obj, click_event)
-- 圣物装备突破成功后,要重新更新圣物装备进阶界面信息
local function update_advance_view(slot)
self:SelectMainRoleArmorItem(slot, true)
end
self:BindEvent(self.model, PsionicConst.UPDATE_ACVANCE_VIEW, update_advance_view)
local function update_psionic_tab_red(tab_id)
self:UpdateTabRed(tab_id)
if tab_id and tab_id == PsionicConst.TabId.PArmor then
self:UpdateEffectBtnRed()
end
end
self:BindEvent(self.model, PsionicConst.UPDATE_RED_BY_TABID, update_psionic_tab_red)
-- 特殊事件:在洗练界面中显示出所有的item节点,并取消对左侧装备的选中
local function on_show_all_item_in_refact_view()
self:OnClickEquipItemCallback(nil)
end
self:BindEvent(self.model, PsionicConst.SHOW_ALL_ITEMS_IN_REFACTVIEW, on_show_all_item_in_refact_view)
local function update_break_succeed(uid, slot) -- 圣物装备升星成功后,刷新当前选中的装备数据 uid:装备唯一id
self.ps_target_wash_uid = uid
self:UpdateBreakEquipItem(self.break_tab_index, true, true)
end
self:BindEvent(self.model, PsionicConst.UPDATE_EQUIP_BREAK_SUCCEED, update_break_succeed)
local function play_effect(type)
if type then
local function call_back( )
self.showing_break_level_effect = false
self.showing_break_equip_effect = false
self.showing_skill_effect = false
end
if type == PsionicConst.EffectType.BreakLevel then -- 槽位等级突破成功
if not self.showing_break_level_effect then
self:ClearUIEffect(self.equip_effect_con)
self:AddUIEffect("ui_jinjie", self.equip_effect_con, self.layer_name, Vector3(25, -200, 0), 1, false, 1.5, nil, call_back)
self.showing_break_level_effect = true
end
elseif type == PsionicConst.EffectType.BreakEquip then -- 装备升星成功
if not self.showing_break_equip_effect then
self:ClearUIEffect(self.equip_effect_con)
self:AddUIEffect("ui_jinjie", self.equip_effect_con, self.layer_name, Vector3(25, -78, 0), 1, false, 1.5, nil, call_back)
self.showing_break_equip_effect = true
end
elseif type == PsionicConst.EffectType.Skill then -- 技能升级成功
if not self.showing_skill_effect then
self:ClearUIEffect(self.equip_effect_con)
self:AddUIEffect("ui_jinjie", self.equip_effect_con, self.layer_name, Vector3(25, -200, 0), 1, false, 1.5, nil, call_back)
self.showing_skill_effect = true
end
end
end
end
self:BindEvent(self.model, PsionicConst.PLAY_EFFECT, play_effect)
local function update_equip_data() -- 当玩家当前的圣魂装备发生变动,则需要检测圣魂特效是否要变动
self.model:CheckPsionicEffectStage() -- goodsmodel的检测搬过来这边
end
self:BindEvent(self.model, PsionicConst.UPDATE_PISIONIC_EQUIP_ARMOR, update_equip_data)
local function onGuideTrigger()
self:AddToStageHandler()
end
self:BindEvent(GlobalEventSystem, EventName.TRIGGER_GUIDE_TYPE, onGuideTrigger)
end
function PsionicMainView:OpenSuccess()
-- 更新主角模型信息
-- self:UpdateRoleData()
self:UpdateBreakTabItem()
self:UpdateEffectBtnRed()
self:SwitchTab(self.open_switch_index)
end
-- 针对界面隐藏时的回调处理
function PsionicMainView:HideChangeCall(show)
if show then
-- 修复从其他界面切换回圣物抽奖界面时模型动画的错误
if self.tab_index == PsionicConst.TabId.PDataDig and self.view_list[self.tab_index].is_loaded then -- 圣物寻宝
self.view_list[self.tab_index]:StartTransCGAlphaAnim(true)
end
end
end
function PsionicMainView:UpdateView()
local bg_res = "default_bg_6"
if self.tab_index == PsionicConst.TabId.PArmor then -- 数码装甲
if not self.view_list[self.tab_index] then
self.view_list[self.tab_index] = PsionicArmorView.New(self.right)
self.view_list[self.tab_index]:SetAnchoredPosition(-371, 0)
-- 更新左侧装备和技能节点数据
self:UpdatePsionicEquipAndSkillData()
end
bg_res = "ps_lv_bg"
-- self:CheckPsionicEquipArmorItem(PsionicConst.TabId.PArmor)
elseif self.tab_index == PsionicConst.TabId.PAdvance then -- 圣物进阶
if not self.view_list[self.tab_index] then
self.view_list[self.tab_index] = PsionicAdvanceView.New(self.right)
self.view_list[self.tab_index]:SetAnchoredPosition(-348.5, 0)
end
bg_res = "ps_advance_bg"
-- 每次切换都要选中一件装备
self:SelectMainRoleArmorItem()
-- 创建道具节点
self:CheckPsionicEquipArmorItem(PsionicConst.TabId.PAdvance)
elseif self.tab_index == PsionicConst.TabId.PBreak then -- 圣物突破
if not self.view_list[self.tab_index] then
self.view_list[self.tab_index] = PsionicAdvanceBreakView.New(self.right)
self.view_list[self.tab_index]:SetAnchoredPosition(-348, 0)
end
bg_res = "ps_adv_break_bg"
self.cur_selected_break_goodsVo = nil
self:UpdateBreakEquipItem(self.break_tab_index, true)
elseif self.tab_index == PsionicConst.TabId.PWash then -- 圣物洗练
if not self.view_list[self.tab_index] then
self.view_list[self.tab_index] = PsionicWashView.New(self.right)
self.view_list[self.tab_index]:SetAnchoredPosition(-348, 0)
end
bg_res = "ps_advance_bg"
-- 每次切换都要选中一件装备
self:SelectMainRoleArmorItem()
-- 创建道具节点
self:CheckPsionicEquipArmorItem(PsionicConst.TabId.PWash)
elseif self.tab_index == PsionicConst.TabId.PSkill then -- 圣物觉醒
if not self.view_list[self.tab_index] then
self.view_list[self.tab_index] = PsionicSkillView.New(self.right)
self.view_list[self.tab_index]:SetAnchoredPosition(-348, 0)
end
bg_res = "ps_advance_bg"
-- 每次切换都要选中一个技能
self:SelectCircleItemSkill()
-- 创建道具节点
self:CheckPsionicEquipArmorItem(PsionicConst.TabId.PSkill)
elseif self.tab_index == PsionicConst.TabId.PDataDig then -- 圣物寻宝
if not self.view_list[self.tab_index] then
self.view_list[self.tab_index] = PsionicDrawView.New(self.container)
end
bg_res = "ps_draw_bg"
elseif self.tab_index == PsionicConst.TabId.PExchange then -- 圣物兑换
if not self.view_list[self.tab_index] then
self.view_list[self.tab_index] = PsionicExchangeView.New(self.container)
end
end
self:PopUpChild(self.view_list[self.tab_index])
-- 寻宝界面不要打开物品飞入的表现
self.model:SetPsionicShowFlyGoods(self.tab_index ~= PsionicConst.TabId.PDataDig)
self.tabWindowComponent:SetUIBack(
{
target = self,
bg1 = GameResPath.GetViewBigBg(bg_res)
})
-- 控制界面节点的开关
self:ShowPsionicInfoNodeCon()
end
function PsionicMainView:SwitchTab( index, other_args )
if index == PsionicConst.TabId.PAdvance
or index == PsionicConst.TabId.PWash
or index == PsionicConst.TabId.PSkill then -- 装甲进阶和重构
-- 如果当前一件圣物装备都没有穿戴则屏蔽该界面
local equip_list = self.goods_model:GetPsionicEquipList()
if IsTableEmpty(equip_list) then
Message.show("未穿戴圣物", "fault")
self:SwitchTab(self.tab_index)
return
end
-- 获取目标装备品质
local require_cfg = PsionicConst.RequireEquipColor[index] -- 切换需求前端配置
local has_advancable_equipment
for k, v in pairs(equip_list) do
-- 如果存在目标品质以上的圣物装备,则可以进入相关界面
if v.color >= require_cfg.color then
has_advancable_equipment = true
break
end
end
if not has_advancable_equipment then
local str = string.format("穿戴%s品质以上圣物才可进阶!", require_cfg.str)
Message.show(str, "fault")
self:SwitchTab(self.tab_index)
return
end
elseif index == PsionicConst.TabId.PBreak then -- 圣物突破
local equip_list = self.goods_model:GetPsionicEquipList()
local bag_list = self.model:GetPsionicBagData()
local has_can_break_equip = false
for k, v in ipairs(equip_list) do
if v.next ~= 0 then -- 检查穿戴装备突破后的装备id不是0,下为背包装备的判断
has_can_break_equip = true
break
end
end
if not has_can_break_equip then
for k, v in pairs(bag_list) do
if v.next ~= 0 then
has_can_break_equip = true
break
end
end
end
if IsTableEmpty(equip_list) and IsTableEmpty(bag_list) or not has_can_break_equip then
Message.show("未持有可进化的圣物", "fault")
self:SwitchTab(self.tab_index)
return
end
end
if index == PsionicConst.TabId.PSkill then
self.skill_last_select_slot = other_args and other_args.slot or self.skill_last_select_slot
elseif index == PsionicConst.TabId.PWash then
self.ps_target_wash_uid = other_args and other_args.target_uid or self.ps_target_wash_uid
-- 如果存在需要选中的装备id,那要把洗练左侧页签定到第一个页签上
self.break_tab_index = self.ps_target_wash_uid and 1 or self.break_tab_index
else
self.equip_last_select_slot = other_args and other_args.slot or self.equip_last_select_slot
end
self.tab_index = index
self:DoOpenAni(self.tab_index)
--设置页签索引值切换主页面
if self.tabWindowComponent then
self.tabWindowComponent:SetTabBarIndex(self.tab_index)
end
self:UpdateView()
end
-- 创建装备升星页签节点
function PsionicMainView:UpdateBreakTabItem( )
local function break_tab_clickCallback(index)
for k, v in ipairs(self.break_tab_list) do
v:SetSelected(k == index)
end
self.break_tab_index = index
self:UpdateBreakEquipItem(self.break_tab_index)
end
for i = 1, 5 do
self.break_tab_list[i] = self.break_tab_list[i] or PsionicAdvanceBreakTabItem.New(self.break_tab_con)
self.break_tab_list[i]:SetAnchoredPosition(0, - (i-1) * 55)
self.break_tab_list[i]:SetData(i, break_tab_clickCallback)
end
break_tab_clickCallback(self.break_tab_index or 1)
end
-- 更新选中的圣物装备信息
function PsionicMainView:UpdateSelectedArmorInfo(goods_vo, star_effect)
if goods_vo and not goods_vo.is_empty and (not self.cur_show_equip_goods_id or self.cur_show_equip_goods_id ~= goods_vo.goods_id)then
-- 加载名称
self.equip_name_tmp.text = GoodsModel:getInstance():getGoodsName(goods_vo.type_id)
local star_num = goods_vo.star
-- 加载星数
for k, v in pairs(self.star_list) do
v.gameObject:SetActive(false)
end
local offset_x = (self.equip_star_con.sizeDelta.x - star_num * 27) / 2 + 2
for i = 1, star_num do
self.star_list[i] = self.star_list[i] or UiFactory.createChild(self.equip_star_con, UIType.Image2, "star" .. i)
self.star_list[i].gameObject:SetActive(true)
SetAnchoredPosition(self.star_list[i].transform, (i-1) * 27 + offset_x, 0)
lua_resM:setImageSprite(self, self.star_list[i]:GetComponent("Image"), "psionic_asset", "ps_star_1" , true)
self:ClearUIEffect(self.star_list[i].transform)
if star_effect and i == star_num then -- 需要星星动画时
self:AddUIEffect("ui_jinjiestar", self.star_list[i].transform, self.layer_name, Vector3(13, -12, 0), 1, false)
end
end
-- 加载圣物模型
local model_data = PsionicConst.SlotModel[goods_vo.subtype]
local res_data = {
father_node = self,
transform = self.equip_model_con,
fashion_type = FuncOpenModel.TypeId.OtherGoods,
raycast_size = Vector2(0,0),
rotate = model_data.rotate,
scale = model_data.scale,
figure_id = model_data.model,
position = model_data.pos,
layer_name = self.layer_name,
ui_model_type = UIModelCommon.ModelType.Model,
}
FuncOpenModel:getInstance():SetModelRes(res_data)
self.cur_show_equip_goods_id = goods_vo.goods_id
end
end
-- 更新圣物进化的背包节点 index:对应breaktab的index 1表示全部 2~5代表槽位(slot)4~7的映射 not_scroll_back:是否刷新时容器滚回初始位置
function PsionicMainView:UpdateBreakEquipItem(index, reload_equip_item, not_scroll_back)
-- 加载背包道具数据
-- 是否需要定位到目标装备
local target_item_index = nil
not_scroll_back = not_scroll_back or false
if not self.break_equip_item or reload_equip_item then
self.break_equip_item = self.model:GetPsionicBagData(true) -- 该方法会抽出背包圣物装备数据创建新表返回,true为按品质降序排序
for k = #self.break_equip_item, 1, -1 do -- 移除无法突破的装备
if self.break_equip_item[k].next == 0
and self.break_equip_item[k].goods_id ~= self.ps_target_wash_uid then
table.remove(self.break_equip_item, k)
end
end
end
-- 预先加载穿戴装备(需置顶)
local data = {}
local equip_data = nil
if index == 1 then
for k, v in ipairs(self.break_equip_item) do
data[#data+1] = v
end
-- 倒序插入已穿戴的装备
for i = 7, 3, -1 do
equip_data = self.goods_model:GetPsionicEquipBySlot(i)
if equip_data and equip_data.next ~= 0 then
table.insert(data, 1, equip_data)
end
end
else
equip_data = self.goods_model:GetPsionicEquipBySlot(index + 2)
if equip_data and equip_data.next ~= 0 then
table.insert(data, equip_data)
end
-- 插入这个槽位的装备数据
for k, v in ipairs(self.break_equip_item) do
if v.subtype == index + 2 then
data[#data+1] = v
end
end
end
-- 获取目标装备index
-- 新增修改:新增红点规则 每个槽位按照【当前穿戴】-【装备品质】-【装备星级】的排序规则的可突破的第一件装备给突破红点
-- 当前的装备列表顺序就是以【当前穿戴】-【装备品质】-【装备星级】的规则了,所以遇到条件满足的装备数据就将id加入其中
local slot_break_red_equip_list = {}
-- 如果没有目标选中的index,则定位到数据列表最靠前的可以进化的装备上,下面这个列表缓存存在进化红点的装备index,视情况拿出第一个数据来定位
local temp_index_list = {}
for k, v in ipairs(data) do
if self.ps_target_wash_uid and v.goods_id == self.ps_target_wash_uid then
target_item_index = k
-- break
end
-- 获取缓存下来的突破红点
if not slot_break_red_equip_list[v.subtype] then
local break_bool = self.model:GetPsionicBreakEquipRed(v.goods_id)
if break_bool then
slot_break_red_equip_list[v.subtype] = v.goods_id
temp_index_list[#temp_index_list + 1] = k
end
end
end
-- 当前定位的节点是否是可突破的节点
local is_cur_target_index_in_index_list = false
for k, v in ipairs(temp_index_list) do
is_cur_target_index_in_index_list = is_cur_target_index_in_index_list or (target_item_index and target_item_index == v)
end
if not target_item_index or not is_cur_target_index_in_index_list then
target_item_index = temp_index_list[1] or nil
end
-- 补全格子
local empty_data = {is_empty = true}
local data_length = #data
local need_full_num
if data_length < 12 then
need_full_num = 12
elseif data_length % 6 ~= 0 then
-- 有空白格子,补全成无数据格子
need_full_num = math.ceil(data_length / 6) * 6
end
if need_full_num then
for i = data_length + 1, need_full_num do
data[i] = empty_data
end
end
local callback = function(data)
-- 更新展示的装备信息和模型
self:UpdateSelectedArmorInfo(data, self.ps_target_wash_uid and true or false)
-- 更新突破界面的材料需求
self:UpdateBreakViewData(data, self.ps_target_wash_uid and true or false, slot_break_red_equip_list)
-- 更新选中
self.break_item_creator:IterateItems(function( item, i )
item:SetSelected(item.data.goods_id == data.goods_id)
end)
self.cur_selected_break_goodsVo = data
end
self.break_item_creator = self.break_item_creator or self:AddUIComponent(UI.ItemListCreator)
local info = {
data_list = data,
item_con = self.break_select_con,
scroll_view = self.break_select_scroll,
item_class = PsionicArmorItem,
item_width = 62,
item_height = 62,
start_x = 15.5,
start_y = -13.5,
space_x = 19,
space_y = 15,
create_frequency = 0.01,
alignment = UnityEngine.TextAnchor.UpperLeft,
is_scroll_back_on_update = not not_scroll_back,
on_update_item = function(item, i, v)
item:SetItemScale(0.795)
item:SetBreakSlotRedEquipList(slot_break_red_equip_list)
item:SetData(v, PsionicConst.ArmorItemFlag.Break, callback)
if self.cur_selected_break_goodsVo then
item:SetSelected(v.goods_id == self.cur_selected_break_goodsVo.goods_id)
end
end,
final_callback = function()
if not_scroll_back and target_item_index then
self.break_item_creator:ScrollToItem(target_item_index, -50)
end
end,
}
self.break_item_creator:UpdateItems(info)
callback(target_item_index and data[target_item_index] or (self.cur_selected_break_goodsVo or data[1]))
-- 清空目标选中的uid
self.ps_target_wash_uid = nil
end
-- 更新突破界面的信息
function PsionicMainView:UpdateBreakViewData(goods_vo, need_show_effect, slot_break_red_equip_list)
if self.tab_index == PsionicConst.TabId.PBreak
and self.view_list[self.tab_index] then
self.view_list[self.tab_index]:SetData(goods_vo, need_show_effect, slot_break_red_equip_list)
end
end
-- 加载玩家佩戴的圣物装备
function PsionicMainView:CheckPsionicEquipArmorItem(show_flag)
if IsTableEmpty(self.tab_equip_item_list) then
self:UpdatePsionicEquipArmorData(show_flag)
else
self:ChangePsionicEquipArmorShowFlag(show_flag)
end
end
-- show_flag : 根据打开的页签不同,调整节点的点击回调逻辑
function PsionicMainView:UpdatePsionicEquipArmorData(show_flag)
-- 加载4个位置的装备,
-- 以位置做key,后面更新装备内容的时候直接通过装备位置来获取节点
local item
local function equip_callback(slot)
-- 更新进阶界面中的装备信息
self:SelectMainRoleArmorItem(slot)
end
local function skill_callback(slot)
-- 更新进阶界面中的技能信息
self:SelectCircleItemSkill(slot)
end
for i = 1, 4 do
item = self.tab_equip_item_list[i]
if not item then
-- item = PsionicArmorEquipItem.New(self.equip_con_list[i], nil, self.layer_name)
item = PsionicArmorEquipItem.New(self.equip_tab_con, nil, self.layer_name)
self.tab_equip_item_list[i] = item
end
item:SetAnchoredPosition(0, 179 - (i - 1) * 122)
item:SetData(i, PsionicConst.ArmorItemFlag.Equiped, show_flag, equip_callback, skill_callback)
if show_flag == PsionicConst.TabId.PSkill then
if self.skill_last_select_slot then
item:SetSelected(i == (self.skill_last_select_slot - 3))
end
else
if self.equip_last_select_slot then
item:SetSelected(i == (self.equip_last_select_slot - 3))
end
end
end
end
function PsionicMainView:ChangePsionicEquipArmorShowFlag(show_flag)
for k, v in ipairs(self.tab_equip_item_list) do
v:ChangeShowFlag(show_flag)
end
end
-- 对左侧装备节点的点击的回调
function PsionicMainView:OnClickEquipItemCallback(slot)
if IsTableEmpty(self.tab_equip_item_list) then
return
end
slot = slot and slot - 3 or nil -- 槽位即道具子id,从4开始,需要-3映射
for k, v in pairs(self.tab_equip_item_list) do
v:SetSelected(k == slot)
end
end
-- 切换到进阶或重构界面时,需要自动选中一件装备
function PsionicMainView:SelectMainRoleArmorItem(slot, dont_refresh)
local data
local require_cfg = PsionicConst.RequireEquipColor[self.tab_index]
local get_data = false
-- print("Saber:PsionicMainView [396] self.tab_index: ",self.tab_index)
local function check_color(data)
if data and require_cfg.color ~= 0 then
return data.color >= require_cfg.color
end
return data and true or false
end
if slot then -- 指定了槽位,就需要优先寻找槽位的装备
data = self.goods_model:GetPsionicEquipBySlot(slot)
get_data = check_color(data)
if get_data then
self.equip_last_select_slot = slot
end
end
if not get_data then
if self.equip_last_select_slot then -- 存在上次选中的装备
data = self.goods_model:GetPsionicEquipBySlot(self.equip_last_select_slot)
get_data = check_color(data)
end
if not get_data then -- 上次选中的装备不见了,则需要重新自动定位
for i = 1, 4 do
data = self.goods_model:GetPsionicEquipBySlot(i + 3) -- 槽位即道具子id,从4开始,需要+3映射
get_data = check_color(data)
if get_data then
self.equip_last_select_slot = i + 3
break
end
end
end
end
if get_data and data then
if (self.tab_index == PsionicConst.TabId.PAdvance
or self.tab_index == PsionicConst.TabId.PWash)
and self.view_list[self.tab_index] then -- 装甲进阶
-- 重新设置装备进阶界面数据
self.view_list[self.tab_index]:SetData(data)
end
-- 触发一次对符合条件的节点的点击
if not dont_refresh or self.tab_index == PsionicConst.TabId.PWash then
self:OnClickEquipItemCallback(self.equip_last_select_slot)
end
self:UpdateSelectedArmorInfo(data)
end
return data, self.equip_last_select_slot
end
-- 修改左侧装备的展示类型
-- function PsionicMainView:ChangeEquipShowFlag(flag)
-- for k, v in pairs(self.armor_item_list) do
-- v:SetEquipShowFlag(flag)
-- end
-- end
-- 切换到技能界面时,需要自动选中一个已激活技能
function PsionicMainView:SelectCircleItemSkill(slot, dont_refresh)
local skill_data, get_data
if slot then -- 指定了槽位,就需要优先寻找槽位的装备的技能
skill_data = self.model:GetPsionicSlotData(slot) -- 存在技能数据,代表已经激活
if skill_data and skill_data.skill_lv > 0 then
self.skill_last_select_slot = slot
get_data = true
end
end
if not get_data then
if self.skill_last_select_slot then -- 存在上次选中的装备,查找这件装备上的技能
skill_data = self.model:GetPsionicSlotData(self.skill_last_select_slot)
get_data = skill_data and skill_data.skill_lv > 0
end
if not get_data then -- 上次选中的装备不见了,则需要重新自动定位,找到有技能的槽位
for i = 1, 4 do
skill_data = self.model:GetPsionicSlotData(i + 3)-- 槽位即道具子id,从4开始,需要+3映射
if skill_data and skill_data.skill_lv > 0 then
self.skill_last_select_slot = i + 3
get_data = true
break
end
end
end
end
if get_data then
if self.tab_index == PsionicConst.TabId.PSkill and self.view_list[self.tab_index] then -- 技能觉醒界面
-- 重新设置技能觉醒界面需要展示的数据
self.view_list[self.tab_index]:SetData(skill_data)
end
if not dont_refresh then
self:OnClickEquipItemCallback(self.skill_last_select_slot)
end
self:UpdateSelectedArmorInfo(self.goods_model:GetPsionicEquipBySlot(self.skill_last_select_slot))
end
return skill_data, self.skill_last_select_slot
end
-- 调整主界面节点的显示情况
function PsionicMainView:ShowPsionicInfoNodeCon( )
local is_armor = self.tab_index == PsionicConst.TabId.PArmor
local is_advance = self.tab_index == PsionicConst.TabId.PAdvance
local is_wash = self.tab_index == PsionicConst.TabId.PWash
local is_break = self.tab_index == PsionicConst.TabId.PBreak
local is_skill = self.tab_index == PsionicConst.TabId.PSkill
-- 是否展示主角模型界面
-- self:ShowRoleModelCon(is_armor)
-- 是否展示穿戴装备节点
self:ShowEquipCon(is_armor, is_advance or is_wash or is_skill)
-- 是否展示装备模型节点
self:ShowEquipInfoCon(is_break, is_advance or is_break or is_wash or is_skill)
end
-- 是否展示模型界面
-- function PsionicMainView:ShowRoleModelCon(show)
-- if self.role_con_obj.activeSelf ~= show then
-- self.role_con_obj:SetActive(show)
-- end
-- end
-- 是否展示穿戴装备节点
function PsionicMainView:ShowEquipCon(is_armor, show_tab)
-- 背包页签只展示圆盘上的装备节点,其他页签展示左侧tab节点
if self.equip_con_obj.activeSelf ~= is_armor then
self.equip_con_obj:SetActive(is_armor)
end
if self.equip_tab_con_obj.activeSelf ~= show_tab then
self.equip_tab_con_obj:SetActive(show_tab)
end
-- if self.equip_right_obj.activeSelf ~= is_armor then
-- self.equip_right_obj:SetActive(is_armor)
-- self.equip_title2_tmp.text = is_armor and "圣物技能" or ""
-- end
end
-- 是否展示装备模型节点
function PsionicMainView:ShowEquipInfoCon(is_break, show)
if self.equip_info_con_obj.activeSelf ~= show then
self.equip_info_con_obj:SetActive(show)
if not show then -- 隐藏特效
self.showing_break_level_effect = false
self.showing_break_equip_effect = false
self.showing_skill_effect = false
self:ClearUIEffect(self.equip_effect_con)
end
end
-- 突破界面需要展示背包滚动容器和容器背景,并调整模型位置
if self.break_select_bg_obj.activeSelf ~= is_break then
self.break_select_bg_obj:SetActive(is_break)
self.break_select_scroll_obj:SetActive(is_break)
self.break_tab_con_obj:SetActive(is_break)
end
SetAnchoredPositionY(self.equip_model_con, is_break and -120 or -200)
SetAnchoredPositionY(self.equip_effect_con, is_break and 65 or 25)
end
-- 显示左侧进阶装备列表节点
function PsionicMainView:ShowPsionicArmorListCon( )
-- local bool = self.tab_index == PsionicConst.TabId.PAdvance or self.tab_index == PsionicConst.TabId.PWash or self.tab_index == PsionicConst.TabId.PSkill
-- if self.advance_con_obj.activeSelf ~= bool then -- 显示状态不同,则切换显示状态
-- if not self.adv_node_tween_id then
-- self.advance_con_obj:SetActive(bool)
-- end
-- end
end
-- 加载玩家佩戴的圣物技能
function PsionicMainView:UpdatePsionicEquipAndSkillData( )
-- 加载4个位置的技能,
local e_item, s_item
for i = 1, 4 do
-- 装备节点
e_item = self.main_equip_item_list[i]
if not e_item then
e_item = PsionicArmorEquipItem.New(self.equip_con_list[i])
self.main_equip_item_list[i] = e_item
end
e_item:SetData(i, PsionicConst.ArmorItemFlag.Equiped, PsionicConst.TabId.PArmor)
-- 技能节点
s_item = self.skill_item_list[i]
if not s_item then
s_item = PsionicSkillEquipItem.New(self.skill_con_list[i])
self.skill_item_list[i] = s_item
end
s_item:SetData(i)
end
end
-- 更新页签红点
function PsionicMainView:UpdateTabRed(tab_id)
if tab_id then
self.tabWindowComponent:ShowRedPoint(tab_id, self.model:GetPsionicRedDotCache(tab_id))
else
for k, v in pairs(PsionicConst.TabData) do
local bool = self.model:GetPsionicRedDotCache(v.id)
-- print("Saber:PsionicMainView [658] bool, v.id: ",bool, v.id)
self.tabWindowComponent:ShowRedPoint(v.id, bool)
end
end
end
-- 更新圣环按钮红点
function PsionicMainView:UpdateEffectBtnRed( )
self.activate_effect_btn_red_obj:SetActive(self.model:GetPsionicEffectBtnRed())
end
function PsionicMainView:DestroySuccess( )
if self.tabWindowComponent then
self.tabWindowComponent:DeleteMe()
self.tabWindowComponent = nil
end
for k, v in pairs(self.view_list) do
v:DeleteMe()
v = nil
end
self.view_list = nil
for k, v in pairs(self.tab_equip_item_list) do
v:DeleteMe()
v = nil
end
self.tab_equip_item_list = nil
for k, v in pairs(self.armor_item_list) do
v:DeleteMe()
v = nil
end
self.armor_item_list = nil
for k, v in pairs(self.main_equip_item_list) do
v:DeleteMe()
v = nil
end
self.main_equip_item_list = {}
for k, v in pairs(self.skill_item_list) do
v:DeleteMe()
v = nil
end
self.skill_item_list = nil
for k, v in pairs(self.break_tab_list) do
v:DeleteMe()
v = nil
end
self.break_tab_list = nil
self:ClearUIEffect(self.equip_effect_con)
self.model:SetPsionicShowFlyGoods(true)
Runner.Instance:RemoveRunObj(self)
end
function PsionicMainView:Close()
--完成引导
self:CloseGuide()
BaseView.Close(self)
end
--检测点击屏幕
function PsionicMainView:Update()
if self.is_in_guide then
local is_click = false
if Input.touchCount > 0 then
is_click = true
else
if Input.GetMouseButtonDown(0) then
is_click = true
end
end
if is_click then
self.is_in_guide = false
Runner.Instance:RemoveRunObj(self)
self:CloseGuide()
end
end
end
function PsionicMainView:AddToStageHandler()
local helpVo = GuideModel:getInstance():GetHelpVo(HelpType.TYPE_PSIONIC,5)
if not helpVo then return end
local help_type = helpVo.help_type
if (help_type == HelpType.TYPE_PSIONIC) then
local step = helpVo.step
local button = false
if (help_type == HelpType.TYPE_PSIONIC) and step == 5 then
button = self.skill_con_list[1]
end
if button then
local function call_back()
end
GlobalEventSystem:Fire(EventName.OPEN_GUIDE_PROMPT_VIEW, button.transform, button.transform.parent.transform, call_back, helpVo, self.layout_file)
self.is_in_guide = true
Runner.Instance:AddRunObj(self, 1)
end
else
GlobalEventSystem:Fire(EventName.CLOSE_GUIDE_PROMPT_VIEW)
end
end
function PsionicMainView:CloseGuide()
local helpVo = GuideModel:getInstance():GetHelpVo(HelpType.TYPE_PSIONIC,5)
if helpVo then
GlobalEventSystem:Fire(EventName.FINISH_CURRENT_HELP_STEP,helpVo)
end
end