PlayerBaseAtt = {} --角色属性面板模块

-- 基础属性显示字符串数组
PlayerBaseAtt._baseAttributeStr = {
    "职   业",
    "等   级",
    "当前经验",
    "升级经验",
}

-- 获取属性值的本地函数
local function getAttValue(key)
    local str = ""
    if key == 1 then
        str = SL:GetMetaValue("JOB_NAME")  --获取职业名称
    elseif key == 2 then
        local level = SL:GetMetaValue("LEVEL")  --获取等级
        local reinLv = SL:GetMetaValue("RELEVEL")  --获取转生等级
        if reinLv and reinLv > 0 then
            str = string.format("%s转%s级", reinLv, level)  --显示转生等级+当前等级
        else 
            str = string.format("%s级", level)  --仅显示当前等级
        end
    elseif key == 3 then
        str = SL:GetMetaValue("EXP")  --获取当前经验值
    elseif key == 4 then
        str = SL:GetMetaValue("MAXEXP")  --获取升级所需经验值
    elseif key == 5 then
        str = SL:GetMetaValue("SEX")  --获取升级所需经验值
    end
    return str
end

-- 初始化函数
function PlayerBaseAtt.main()
    local parent = GUI:Attach_Parent()
    GUI:LoadExport(parent, "player/player_base_attri_node_win32")

    PlayerBaseAtt._ui = GUI:ui_delegate(parent)
    PlayerBaseAtt._parent = parent
    if not PlayerBaseAtt._ui then
        return false
    end
    PlayerBaseAtt._index = 0--添加的属性条编号
    PlayerBaseAtt.UpdateBaseAttri()
end

-- 更新属性显示函数
function PlayerBaseAtt.UpdateBaseAttri()
    local list = PlayerBaseAtt._ui.ListView_base
    GUI:removeAllChildren(list)
    for k, v in ipairs(PlayerBaseAtt._baseAttributeStr) do
        local listData = {
            str = v,
            strValue = getAttValue(k)
        }
        PlayerBaseAtt.CreateAttri(list,listData)
    end

    -- 2. 更新额外属性
    local variableInfo = SL:GetMetaValue("EX_ATTR")  --获取额外属性信息
    local variableList = string.split(variableInfo, "|")  --按|分割属性列表
    for i, v in ipairs(variableList) do
        local attList = string.split(v, "#")  --按#分割单个属性的名称和值
        if attList[1] and attList[2] then
            local listData = {
                str = attList[1],
                strValue = attList[2]
            }
            local cell = PlayerBaseAtt.CreateAttri(list,listData)
            if string.find(attList[2], "&<(.-)>&") then
                SL:CustomAttrWidgetAdd(attList[2],cell.Text_attValue)--脚本变量额外属性 添加监听更新
            end
        end
    end

    -- 3. 更新红点提示相关属性
    -- 从游戏数据中获取红点配置信息
    local redValue = SL:GetMetaValue("GAME_DATA", "RedPointValue")
    -- 将配置按"|"分割成数组
    local data = string.split(redValue, "|")
    -- 遍历每个红点配置项
    for i, v in ipairs(data) do 
        -- 将每项按"#"分割成名称和值
        local temp = string.split(v, "#")
        local name = temp[1]  -- 红点显示名称
        local value = temp[2] -- 红点关联值
        if value and name then   
            local newValue = nil
            -- 如果值是数字,使用TITEMCOUNT格式(用于物品数量监听)
            if tonumber(value) then 
                newValue = string.format("&<TITEMCOUNT/%s>&", value)
            -- 如果值不是数字,使用REDKEY格式(用于红点状态监听)
            else 
                newValue = string.format("&<REDKEY/%s>&", value)
            end 

            -- 构造列表项数据
            local listData = {
                str = name,      -- 显示名称
                strValue = newValue  -- 监听值
            }
            -- 创建属性条目并获取UI引用
            local cell = PlayerBaseAtt.CreateAttri(list, listData)
            -- 为该属性值添加自定义属性更新监听
            SL:CustomAttrWidgetAdd(newValue, cell.Text_attValue)        
        end  
    end    
end

-- 创建单个属性条目的函数
function PlayerBaseAtt.CreateAttri(parent,data)
    PlayerBaseAtt._index = PlayerBaseAtt._index + 1
    local widget = GUI:Widget_Create(parent, "Attribute_"..PlayerBaseAtt._index, 0, 0, 272, 22)
    GUI:LoadExport(widget, "player/att_show_list_win32")
    local ui =  GUI:ui_delegate(widget)
    if data.str then
        GUI:Text_setString(ui.Text_attName,data.str .. ":")
    end
    GUI:Text_setString(ui.Text_attValue,data.strValue )
    return ui
end
    撰写回复...