-- 角色额外属性面板模块
PlayerExtraAtt = {}----角色面板 属性
-- UI实例引用
PlayerExtraAtt._ui = nil
-- 从GUIFunction获取属性类型定义
PlayerExtraAtt._Attribute = GUIFunction:PShowAttType()--属性
-- 需要显示的额外属性列表(负重相关)
PlayerExtraAtt._extraAttributeStr = {
PlayerExtraAtt._Attribute.Weight, -- 当前负重
PlayerExtraAtt._Attribute.Max_Weight, -- 最大负重
PlayerExtraAtt._Attribute.Wear_Weight, -- 穿戴负重
PlayerExtraAtt._Attribute.Max_Wear_Weight, -- 最大穿戴负重
PlayerExtraAtt._Attribute.Hand_Weight, -- 手持负重
PlayerExtraAtt._Attribute.Max_Hand_Weight, -- 最大手持负重
}
-- 初始化函数
function PlayerExtraAtt.main()
-- 获取父容器
local parent = GUI:Attach_Parent()
-- 加载UI布局文件
GUI:LoadExport(parent, "player/player_extra_attri_node_win32")
-- 获取UI代理对象
PlayerExtraAtt._ui = GUI:ui_delegate(parent)
PlayerExtraAtt._parent = parent
if not PlayerExtraAtt._ui then
return false
end
PlayerExtraAtt._index = 0 -- 属性条计数器
PlayerExtraAtt._updateCount = 0-- 更新请求计数器
PlayerExtraAtt.UpdateBaseAttri()
end
-- 更新基础属性显示
function PlayerExtraAtt.UpdateBaseAttri()
-- 限制更新频率为0.5秒一次
PlayerExtraAtt._updateCount = PlayerExtraAtt._updateCount + 1
if PlayerExtraAtt._updateCount > 1 then
return
end
-- 延迟执行更新检查
SL:scheduleOnce(PlayerExtraAtt._parent, function()
if PlayerExtraAtt._updateCount > 0 then
PlayerExtraAtt._updateCount = 0
PlayerExtraAtt:UpdateBaseAttri()
else
PlayerExtraAtt._updateCount = 0
end
end, 0.5)
-- 获取属性列表控件
local list = PlayerExtraAtt._ui.ListView_extraAtt
-- 获取属性配置数据
local configs = SL:GetMetaValue("ATTR_CONFIGS")--获取属性配置(cfg_att_score表)
-- 分类存储显示属性
local showList = {} -- 基础属性列表
local showListBehind = {} -- 额外属性列表
-- 遍历所有属性配置
for id, attConfig in pairs(configs) do
-- 属性ID超过1000时退出
if id > 1000 then
return
end
-- 获取属性值
local attValue = SL:GetMetaValue("ATT_BY_TYPE", attConfig.Idx) or 0
-- 判断职业相关属性是否显示
local jobShow = false
if attConfig.isshow == 3 then
local job = SL:GetMetaValue("JOB")
if id == PlayerExtraAtt._Attribute["Min_CustJobAttr_" .. job] or id == PlayerExtraAtt._Attribute["Max_CustJobAttr_" .. job] then
jobShow = true
end
end
-- 根据显示条件筛选属性
if (attConfig.isshow == 2 and attValue ~= 0) or attConfig.isshow == 1 or jobShow then
local attData = {
id = attConfig.Idx,
value = attValue
}
-- 根据速度属性分类
if attConfig.Idx <= SL:GetMetaValue("SPD") then
table.insert(showList, attData)
else
table.insert(showListBehind, attData)
end
end
end
-- 添加额外属性(负重相关)
for i, id in ipairs(PlayerExtraAtt._extraAttributeStr) do
local attData = {
id = id,
value = SL:GetMetaValue("ATT_BY_TYPE", id) or 0
}
table.insert(showList, attData)
end
-- 获取基础属性显示数据
local firstList = GUIFunction:GetAttDataShow(showList, nil)
-- 处理HP/MP显示格式
local maxHp = SL:GetMetaValue("MAXHP")
local maxMp = SL:GetMetaValue("MAXMP")
if firstList[PlayerExtraAtt._Attribute.HP] then
firstList[PlayerExtraAtt._Attribute.HP].value = string.format("%s/%s", firstList[PlayerExtraAtt._Attribute.HP].value, SL:HPUnit(maxHp))
end
if firstList[PlayerExtraAtt._Attribute.MP] then
firstList[PlayerExtraAtt._Attribute.MP].value = string.format("%s/%s", firstList[PlayerExtraAtt._Attribute.MP].value, SL:HPUnit(maxMp))
end
-- 合并所有显示属性
local showAttList = {}
for k, v in pairs(firstList) do
showAttList[k] = v
end
-- 获取额外属性显示数据
local behindList = GUIFunction:GetAttDataShow(showListBehind, nil)
-- 合并额外属性
for k, v in pairs(behindList) do
showAttList[k] = v
end
-- 转换为数组形式
local allList = {}
for k, v in pairs(showAttList) do
table.insert(allList, v)
end
-- 对属性列表进行排序
table.sort(allList, function(a, b)
-- 如果两个属性都是速度点数以下的基础属性,按ID升序排列
if a.id <= PlayerExtraAtt._Attribute.Speed_Point and b.id <= PlayerExtraAtt._Attribute.Speed_Point then
return a.id < b.id
-- 如果两个属性都是特殊属性(ID>10000),按ID升序排列
elseif a.id > 10000 and b.id > 10000 then
return a.id < b.id
-- 如果a是特殊属性,b是基础属性,a排在后面
elseif a.id > 10000 and b.id <= PlayerExtraAtt._Attribute.Speed_Point then
return false
-- 如果a是基础属性,b是特殊属性,a排在前面
elseif a.id <= PlayerExtraAtt._Attribute.Speed_Point and b.id > 10000 then
return true
-- 如果a是特殊属性,b不是,a排在前面
elseif a.id > 10000 then
return true
-- 如果b是特殊属性,a不是,b排在后面
elseif b.id > 10000 then
return false
-- 其他情况按ID升序排列
else
return a.id < b.id
end
end)
-- 获取已存在的属性条目
local chs = GUI:getChildren(list)
local existAttr = {}--已存在的属性
for i, ch in ipairs(chs) do
local tag = GUI:getTag(ch) or -1
existAttr[tag] = 1
end
-- 更新或创建属性条目
for k, v in ipairs(allList) do
local listData = {
id = v.id,
name = v.name,
value = v.value
}
if existAttr[v.id] then
-- 更新已存在的属性条目
local cell = GUI:getChildByTag(list, v.id)
PlayerExtraAtt.CreateAttri(nil, listData, cell)
existAttr[v.id] = nil
else
-- 创建新的属性条目
PlayerExtraAtt.CreateAttri(list, listData)
end
end
-- 删除不需要显示的属性条目
for id, _ in pairs(existAttr) do
if id ~= -1 then
local cell = GUI:getChildByTag(list, id)
if cell then
GUI:ListView_removeChild(list,cell)
end
end
end
end
-- 创建或更新单个属性条目
function PlayerExtraAtt.CreateAttri(parent, data, cell)
local isCreate = false
if not cell then
-- 创建新的属性条目
isCreate = true
PlayerExtraAtt._index = PlayerExtraAtt._index + 1
cell = GUI:Widget_Create(parent, "Attribute_" .. PlayerExtraAtt._index, 0, 0, 272, 22)
GUI:LoadExport(cell, "player/att_show_list_win32")
GUI:setTag(cell, data.id)
end
-- 设置属性名称和值
local ui = GUI:ui_delegate(cell)
GUI:Text_setString(ui.Text_attName, data.name)
GUI:Text_setString(ui.Text_attValue, data.value or "")
end
--[[
刷新固定属性
attrs={
{ id, name, value}
}
]]
function PlayerExtraAtt.RefreshFixedAttr(attrs)
local list = PlayerExtraAtt._ui.ListView_extraAtt
-- 获取属性显示数据
local attrList = GUIFunction:GetAttDataShow(attrs or {})
for k, v in ipairs(attrList) do
if v.id then
-- 获取属性配置
local config = SL:GetMetaValue("ATTR_CONFIG", v.id)
if (config.isshow == 2 and v.value ~= 0) or config.isshow == 1 then
-- 处理特殊格式显示
local fixAttr = attrs[v.id]
if fixAttr and fixAttr.sformat and fixAttr.max then
v.value = string.format(fixAttr.sformat, v.value, fixAttr.max)
end
-- 更新或创建属性条目
local cell = GUI:getChildByTag(list, v.id)
if not cell then
cell = PlayerExtraAtt.CreateAttri(list, v)
else
PlayerExtraAtt.CreateAttri(nil, v, cell)
end
end
end
end
end
-- 刷新HP MP属性显示
function PlayerExtraAtt.OnRefreshHPMP()
local HPMPAttr = {
{ id = PlayerExtraAtt._Attribute.HP, value = SL:GetMetaValue("HP") or 0, max = SL:HPUnit(SL:GetMetaValue("MAXHP")), sformat = "%s/%s" },
{ id = PlayerExtraAtt._Attribute.MP, value = SL:GetMetaValue("MP") or 0, max = SL:HPUnit(SL:GetMetaValue("MAXMP")), sformat = "%s/%s" },
}
PlayerExtraAtt.RefreshFixedAttr(HPMPAttr)
end
-- 关闭回调函数
function PlayerExtraAtt.CloseCallback()
PlayerExtraAtt._updateCount = 0
end