-- 玩家面板 外框
PlayerFrame = {}
PlayerFrame._ui = nil
-- 页签ID
-- 玩家面板页签ID列表
-- 定义了玩家面板中所有可用的基础页签类型
PlayerFrame._pageIDs = {
SLDefine.PlayerPage.MAIN_PLAYER_LAYER_EQUIP, -- 装备页签
SLDefine.PlayerPage.MAIN_PLAYER_LAYER_BASE_ATTRI, -- 基础属性页签
SLDefine.PlayerPage.MAIN_PLAYER_LAYER_EXTRA_ATTRO, -- 额外属性页签
SLDefine.PlayerPage.MAIN_PLAYER_LAYER_SKILL, -- 技能页签
SLDefine.PlayerPage.MAIN_PLAYER_LAYER_TITLE, -- 称号页签
SLDefine.PlayerPage.MAIN_PLAYER_LAYER_SUPER_EQUIP, -- 特殊装备页签
SLDefine.PlayerPage.MAIN_PLAYER_LAYER_BUFF, -- BUFF页签
}
-- 页签对应的打开函数映射表
-- 每个页签ID都对应一个特定的UI打开函数
-- 当点击页签时会调用对应的函数来打开相应界面
PlayerFrame.OpenFunc = {
[SLDefine.PlayerPage.MAIN_PLAYER_LAYER_EQUIP] = SL.OpenPlayerEquipUI, -- 打开装备界面
[SLDefine.PlayerPage.MAIN_PLAYER_LAYER_BASE_ATTRI] = SL.OpenPlayerBaseAttrUI, -- 打开基础属性界面
[SLDefine.PlayerPage.MAIN_PLAYER_LAYER_EXTRA_ATTRO] = SL.OpenPlayerExtraAttrUI, -- 打开额外属性界面
[SLDefine.PlayerPage.MAIN_PLAYER_LAYER_SKILL] = SL.OpenPlayerSkillUI, -- 打开技能界面
[SLDefine.PlayerPage.MAIN_PLAYER_LAYER_TITLE] = SL.OpenPlayerTitleUI, -- 打开称号界面
[SLDefine.PlayerPage.MAIN_PLAYER_LAYER_SUPER_EQUIP] = SL.OpenPlayerSuperEquipUI, -- 打开特殊装备界面
[SLDefine.PlayerPage.MAIN_PLAYER_LAYER_BUFF] = SL.OpenPlayerBuffUI, -- 打开BUFF界面
}
-- 内功
PlayerFrame._pageNGIDs = {1, 2, 3, 4}
-- 打开页签 内功
PlayerFrame.OpenNGFunc = {
[1] = SL.OpenInternalStateUI,
[2] = SL.OpenInternalSkillUI,
[3] = SL.OpenInternalMerdianUI,
[4] = SL.OpenInternalComboUI,
}
PlayerFrame.OpenType = {
Self = 1 --自己
}
PlayerFrame._showType = 1 -- 1 基础 2 内功
function PlayerFrame.main(data)
local parent = GUI:Attach_Parent()
PlayerFrame._NGShow = tonumber(SL:GetMetaValue("GAME_DATA", "OpenNGUI")) == 1
if PlayerFrame._NGShow then
GUI:LoadExport(parent, "player/player_layer_ng_win32")
else
GUI:LoadExport(parent, "player/player_layer_win32")
end
PlayerFrame._ui = GUI:ui_delegate(parent)
PlayerFrame._parent = parent
-- 设置当前页签ID
-- data.extent: 指定要打开的页签ID
-- 如果未指定则默认打开装备页签
PlayerFrame._pageid = data and data.extent or SLDefine.PlayerPage.MAIN_PLAYER_LAYER_EQUIP
-- 设置是否通过快捷键打开界面
-- data.isFast: 是否是快捷键打开
-- 影响玩家名字显示逻辑(神秘人状态下显示真实名字)
PlayerFrame._isFast = data and data.isFast or false
-- 记录上一次打开的页签ID
-- 用于页签切换时关闭上一个页面
-- 初始值设为装备页签
PlayerFrame._lastPageid = SLDefine.PlayerPage.MAIN_PLAYER_LAYER_EQUIP
-- 设置显示类型
-- data.type: 显示类型
-- 1: 基础页面(装备/属性等)
-- 2: 内功页面
PlayerFrame._showType = data and data.type or 1
if not PlayerFrame._ui then
return false
end
-- 适配
GUI:setPositionY(PlayerFrame._ui.Panel_1, SL:GetMetaValue("PC_POS_Y"))
-- 拖动的控件
GUI:Win_SetDrag(parent, PlayerFrame._ui.Panel_1)
-- 点击 界面浮起
GUI:Win_SetZPanel(parent, PlayerFrame._ui.Panel_1)
-- 名字添加触摸 点击私聊
GUI:setTouchEnabled(PlayerFrame._ui.Text_Name, true)
GUI:addOnClickEvent(
PlayerFrame._ui.Text_Name,
function()
local targetName = SL:GetMetaValue("USER_NAME")
local targetId = SL:GetMetaValue("USER_ID")
SL:PrivateChatWithTarget(targetId, targetName)
end
)
-- 关闭
local closeButton = PlayerFrame._ui.ButtonClose
if closeButton then
GUI:addOnClickEvent(closeButton,function()
SL:CloseMyPlayerUI()
end)
end
-- 注册事件
PlayerFrame.RegisterEvent()
GUI:setTouchEnabled(PlayerFrame._ui.Panel_btnList, false)
-- 刷新名字
PlayerFrame.RefreshPlayerName()
-- 切换内功显示
PlayerFrame._initBtn = {}
if PlayerFrame._NGShow then
PlayerFrame.InitTopTypePanel()
PlayerFrame.OnChangeTopShow()
end
-- 初始化页签
PlayerFrame.InitPageChangeBtn()
PlayerFrame.OpenPage(PlayerFrame._pageid, {init = true, pageId = PlayerFrame._pageid})
end
-- 初始化顶部类型切换面板
-- 用于切换基础属性和内功系统两个主要模块
function PlayerFrame.InitTopTypePanel()
-- 定义按钮键名列表
-- base_btn: 基础属性按钮
-- ng_btn: 内功系统按钮
local keyList = {"base_btn", "ng_btn"}
-- 遍历并初始化每个按钮
for i, name in ipairs(keyList) do
-- 设置按钮亮度状态
-- 当前选中类型的按钮暗显,未选中的按钮亮显
GUI:Button_setBright(PlayerFrame._ui[name], PlayerFrame._showType ~= i)
-- 设置按钮的显示层级
-- 当前选中的按钮层级更高(1),未选中的按钮层级为0
GUI:setLocalZOrder(PlayerFrame._ui[name], PlayerFrame._showType == i and 1 or 0)
-- 获取按钮上的文本节点
local nameText = GUI:getChildByName(PlayerFrame._ui[name], "Text_1")
-- 设置文本颜色
-- 选中状态: 浅色(#f8e6c6)
-- 未选中状态: 深色(#807256)
GUI:Text_setTextColor(nameText, PlayerFrame._showType == i and "#f8e6c6" or "#807256")
-- 为按钮添加点击事件
GUI:addOnClickEvent(PlayerFrame._ui[name], function()
-- 如果点击当前已选中的按钮,则不处理
if PlayerFrame._showType == i then
return
end
-- 切换显示类型(基础/内功)
PlayerFrame.ChangeShowType(i)
-- 打开对应类型的第一个页签
PlayerFrame.OpenPage(1, {pageId = 1})
end)
end
end
-- 刷新顶部类型切换面板的显示状态
-- 在切换显示类型(基础/内功)时调用
-- 更新按钮的亮度、层级和文本颜色
function PlayerFrame.RefreshTopTypePanel()
-- 定义需要刷新的按钮列表
-- base_btn: 基础属性按钮
-- ng_btn: 内功系统按钮
local keyList = {"base_btn", "ng_btn"}
-- 遍历每个按钮并更新其显示状态
for i, name in ipairs(keyList) do
-- 设置按钮亮度
-- 当前选中类型的按钮暗显(false),未选中的按钮亮显(true)
GUI:Button_setBright(PlayerFrame._ui[name], PlayerFrame._showType ~= i)
-- 设置按钮的显示层级
-- 当前选中的按钮层级为1,未选中的按钮层级为0
GUI:setLocalZOrder(PlayerFrame._ui[name], PlayerFrame._showType == i and 1 or 0)
-- 获取按钮上的文本节点并设置颜色
-- 选中状态: 浅色(#f8e6c6)
-- 未选中状态: 深色(#807256)
local nameText = GUI:getChildByName(PlayerFrame._ui[name], "Text_1")
GUI:Text_setTextColor(nameText, PlayerFrame._showType == i and "#f8e6c6" or "#807256")
end
end
-- 初始化页签切换按钮
-- 根据当前显示类型(基础/内功)初始化对应的页签按钮
function PlayerFrame.InitPageChangeBtn()
-- 获取页签按钮列表容器
local btnList = PlayerFrame._ui.Panel_btnList
-- 如果开启了内功系统
if PlayerFrame._NGShow then
-- 根据显示类型选择对应的按钮列表容器
-- 基础页面使用Panel_btnList,内功页面使用Panel_btnList_ng
btnList = PlayerFrame._showType == 1 and PlayerFrame._ui.Panel_btnList or PlayerFrame._ui.Panel_btnList_ng
-- 设置基础页面按钮列表的显示状态
GUI:setVisible(PlayerFrame._ui.Panel_btnList, PlayerFrame._showType == 1)
-- 设置内功页面按钮列表的显示状态
GUI:setVisible(PlayerFrame._ui.Panel_btnList_ng, PlayerFrame._showType == 2)
-- 如果存在左侧按钮列表,设置其显示状态
if PlayerFrame._ui.Panel_btnList_left then
GUI:setVisible(PlayerFrame._ui.Panel_btnList_left, PlayerFrame._showType == 1)
end
end
-- 设置菜单组ID
-- 基础页面为1,内功页面为7
local menu_groupID = PlayerFrame._showType == 1 and 1 or 7
-- 获取当前显示类型对应的页签ID列表
local pageIDList = PlayerFrame._showType == 1 and PlayerFrame._pageIDs or PlayerFrame._pageNGIDs
-- 如果当前显示类型的按钮未初始化
if not PlayerFrame._initBtn[PlayerFrame._showType] then
-- 遍历页签ID列表
for i, pageId in ipairs(pageIDList) do
-- 计算配置ID
-- 基础页面: pageId + 100
-- 内功页面: pageId + 700
local configId = pageId + (100 * menu_groupID)
-- 时装装备页签使用特殊的配置ID
if pageId == SLDefine.PlayerPage.MAIN_PLAYER_LAYER_SUPER_EQUIP then
configId = 1000 + SLDefine.PlayerPage.MAIN_PLAYER_LAYER_SUPER_EQUIP
end
-- 构造按钮名称并获取按钮引用
local btnName = "Button_" .. pageId
local panelBtn = GUI:getChildByName(btnList, btnName)
-- 如果在主列表中未找到按钮,尝试在左侧列表中查找
if not panelBtn and PlayerFrame._ui.Panel_btnList_left then
panelBtn = GUI:getChildByName(PlayerFrame._ui.Panel_btnList_left, btnName)
end
-- 如果找到了按钮
if panelBtn then
-- 获取按钮上的文本节点
local textName = GUI:getChildByName(panelBtn, "Text_name")
-- 设置按钮层级,当前选中的页签层级最高
GUI:setLocalZOrder(panelBtn, PlayerFrame._pageid == pageId and 1 or 0)
-- 为按钮添加点击事件
GUI:addOnClickEvent(
panelBtn,
function()
-- 检查是否满足打开条件
if not SL:CheckMenuLayerConditionByID(configId) then
SL:ShowSystemTips("条件不满足!")
return
end
-- 如果点击的是当前页签则不处理
if PlayerFrame._pageid == pageId then
return
end
-- 打开目标页签
PlayerFrame.OpenPage(pageId, {pageId = pageId})
end
)
end
end
-- 标记当前显示类型的按钮已初始化
PlayerFrame._initBtn[PlayerFrame._showType] = true
end
end
-- 切换显示类型(基础/内功)
-- @param i: 目标显示类型
-- 1: 基础页面(装备/属性等)
-- 2: 内功页面
function PlayerFrame.ChangeShowType(i)
-- 如果目标类型与当前类型相同则不处理
if PlayerFrame._showType == i then
return
end
-- 记录切换前的显示类型,用于页面关闭时的判断
PlayerFrame._lastType = PlayerFrame._showType
-- 更新当前显示类型
PlayerFrame._showType = i
-- 刷新顶部类型切换按钮的显示状态
PlayerFrame.RefreshTopTypePanel()
-- 重新初始化页签按钮
PlayerFrame.InitPageChangeBtn()
end
-- 刷新玩家名字显示
-- 根据不同状态(普通/快捷键打开)显示不同的名字
-- 并设置对应的名字颜色
function PlayerFrame.RefreshPlayerName()
-- 获取名字文本控件的引用
local Text_Name = PlayerFrame._ui.Text_Name
-- 获取玩家当前显示名字
-- 可能是普通名字或神秘人名字
local Name = SL:GetMetaValue("USER_NAME")
-- 如果是通过快捷键打开界面
-- 则显示玩家真实名字(用于神秘人系统)
if PlayerFrame._isFast then
Name = SL:GetMetaValue("REAL_USER_NAME") -- 真实名字 神秘人时显示真实名字
end
-- 设置名字文本
GUI:Text_setString(Text_Name, Name)
-- 获取名字颜色ID
-- 不同身份/状态的玩家可能有不同的名字颜色
local color = SL:GetMetaValue("USER_NAME_COLOR")
-- 如果有特殊颜色设置(color > 0)
-- 则将名字设置为对应的十六进制颜色值
if color and color > 0 then
GUI:Text_setTextColor(Text_Name, SL:GetHexColorByStyleId(color))
end
end
-- 刷新页签按钮状态
-- 更新所有页签按钮的显示状态,包括层级、可点击状态、亮度和文本颜色
function PlayerFrame.RefreshBtnState()
-- 获取默认的按钮列表容器
local btnList = PlayerFrame._ui.Panel_btnList
-- 如果开启了内功系统,根据当前显示类型选择对应的按钮列表
if PlayerFrame._NGShow then
btnList = PlayerFrame._showType == 1 and PlayerFrame._ui.Panel_btnList or PlayerFrame._ui.Panel_btnList_ng
end
-- 获取按钮列表中的所有子节点
local childs = GUI:getChildren(btnList)
-- 如果存在左侧按钮列表,将其中的按钮也添加到待处理列表中
if PlayerFrame._ui.Panel_btnList_left then
for _, child in ipairs(GUI:getChildren(PlayerFrame._ui.Panel_btnList_left)) do
table.insert(childs, child)
end
end
-- 遍历所有按钮,更新其显示状态
for _, child in ipairs(childs) do
-- 判断当前按钮是否为选中状态
local isSelected = GUI:getName(child) == ("Button_" .. PlayerFrame._pageid)
-- 设置按钮层级
-- 选中的按钮层级为1,未选中的为0
GUI:setLocalZOrder(child, isSelected and 1 or 0)
-- 设置按钮是否可点击
-- 选中的按钮禁用点击,未选中的启用点击
GUI:setTouchEnabled(child, not isSelected)
-- 设置按钮亮度
-- 选中的按钮暗显,未选中的亮显
GUI:Button_setBright(child, not isSelected)
-- 设置按钮文本颜色
-- 选中状态: 浅色(#f8e6c6)
-- 未选中状态: 深色(#807256)
local nameText = GUI:getChildByName(child, "Text_name")
GUI:Text_setTextColor(nameText, isSelected and "#f8e6c6" or "#807256")
end
end
-- 切页
-- 切换页签
-- @param data: 页签切换数据
-- data.index: 目标页签ID
-- data.init: 是否是初始化打开
-- data.isInternal: 是否是内功页面
-- data.child: 新页签的面板节点
function PlayerFrame.ChangePage(data)
-- 保存当前页签ID为上一个页签ID
PlayerFrame._lastPageid = PlayerFrame._pageid
-- 设置新的页签ID,如果未指定则默认为装备页签
PlayerFrame._pageid = data.index or SLDefine.PlayerPage.MAIN_PLAYER_LAYER_EQUIP
-- 刷新所有页签按钮的显示状态
PlayerFrame.RefreshBtnState()
-- 处理页面切换时的关闭逻辑
-- 场景1: 从基础页面切换
if PlayerFrame._lastType == 1 then
-- 关闭上一个基础页面
SL:CloseMyPlayerPageUI(PlayerFrame._lastPageid)
-- 重置上一个显示类型标记
PlayerFrame._lastType = false
-- 场景2: 从内功页面切换
elseif PlayerFrame._lastType == 2 then
-- 关闭上一个内功页面
SL:CloseMyPlayerInternalPageUI(PlayerFrame._lastPageid)
-- 重置上一个显示类型标记
PlayerFrame._lastType = false
-- 场景3: 普通页签切换(非初始化)
elseif not data.init then
-- 根据页面类型选择对应的关闭函数
-- 根据页面类型选择对应的关闭函数
if data.isInternal then
-- 如果是内功页面,调用内功页面的关闭函数
-- @param PlayerFrame._lastPageid: 上一个页签的ID
SL:CloseMyPlayerInternalPageUI(PlayerFrame._lastPageid)
else
-- 如果是基础页面,调用基础页面的关闭函数
-- @param PlayerFrame._lastPageid: 上一个页签的ID
SL:CloseMyPlayerPageUI(PlayerFrame._lastPageid)
end
end
-- 将新页签的面板添加到外框中
PlayerFrame.CreateLayerPanelChild(data.child)
end
-- 添加子页面到外框
function PlayerFrame.CreateLayerPanelChild(panel)
if panel then
GUI:addChild(PlayerFrame._ui.Node_panel, panel)
end
end
-- 切换子页面
function PlayerFrame.ChangeOpenedPage(id, data)
PlayerFrame.OpenPage(id)
end
-- 关闭外框
function PlayerFrame.OnCloseMainLayer()
PlayerFrame.UnRegisterEvent()
--关闭子页
if PlayerFrame._showType == 1 then
SL:CloseMyPlayerPageUI(PlayerFrame._pageid)
else
SL:CloseMyPlayerInternalPageUI(PlayerFrame._pageid)
end
end
-- 打开指定页签
-- @param id: 页签ID
-- 基础页面: MAIN_PLAYER_LAYER_XXX 常量
-- 内功页面: 1-4 的数字
-- @param data: 页签数据
-- init: 是否是初始化打开
-- pageId: 目标页签ID
-- PlayerFrame.OpenPage(PlayerFrame._pageid, {init = true, pageId = PlayerFrame._pageid})
function PlayerFrame.OpenPage(id, data)
-- 根据当前显示类型选择对应的打开函数
-- 基础页面(_showType == 1): 使用OpenFunc表中的函数
-- 内功页面(_showType == 2): 使用OpenNGFunc表中的函数
local openFunc = PlayerFrame._showType == 1 and PlayerFrame.OpenFunc[id] or PlayerFrame.OpenNGFunc[id]
-- 设置打开类型为"查看自己"
-- 预留了查看其他玩家属性的可能性
local openType = PlayerFrame.OpenType.Self
-- 如果找到对应的打开函数则执行
-- @param SL: 游戏系统全局对象
-- @param openType: 打开类型(Self)
-- @param data: 传入的页签数据
if openFunc then
openFunc(SL, openType, data)
end
end
-- 刷新内功顶部栏显示
function PlayerFrame.OnChangeTopShow()
if PlayerFrame._NGShow then
if SL:GetMetaValue("IS_LEARNED_INTERNAL") then
GUI:setVisible(PlayerFrame._ui["topLayout"], true)
else
GUI:setVisible(PlayerFrame._ui["topLayout"], false)
end
end
end
function PlayerFrame.RegisterEvent()
--添加子页
SL:RegisterLUAEvent(LUA_EVENT_PLAYER_FRAME_PAGE_ADD, "PlayerFrame", PlayerFrame.ChangePage)
--刷新名字
SL:RegisterLUAEvent(LUA_EVENT_PLAYER_FRAME_NAME_RRFRESH, "PlayerFrame", PlayerFrame.RefreshPlayerName)
--学习内功
SL:RegisterLUAEvent(LUA_EVENT_PLAYER_LEARNED_INTERNAL, "PlayerFrame", PlayerFrame.OnChangeTopShow)
end
function PlayerFrame.UnRegisterEvent()
SL:UnRegisterLUAEvent(LUA_EVENT_PLAYER_FRAME_PAGE_ADD, "PlayerFrame")
SL:UnRegisterLUAEvent(LUA_EVENT_PLAYER_FRAME_NAME_RRFRESH, "PlayerFrame")
SL:UnRegisterLUAEvent(LUA_EVENT_PLAYER_LEARNED_INTERNAL, "PlayerFrame")
end