GUIFunction = {}
local AttTypeTable = GUIDefine.AttTypeTable
local ExAttType = GUIDefine.ExAttType
-- 获取基础属性
function GUIFunction:PShowAttType()
return AttTypeTable
end
function GUIFunction:GetExAttType()
return ExAttType
end
-- 触发 与身上装备比
根据浮生梦老师前端课程内容,你提供的代码中关于装备自动对比和换装的核心逻辑主要集中在以下几个函数中:
## 1. **装备对比触发函数** - `GUIFunction:CompareEquipOnBody(equipData, from)`
这是背包提升箭头使用的核心对比函数,主要逻辑:
```lua
-- 检查是否比身上装备更好
function GUIFunction:CompareEquipOnBody(equipData, from)
-- 基础检查:装备数据、自动穿戴开关、职业判断等
local autoDress = SL:GetMetaValue("SERVER_OPTION", "autoDress")
if not autoDress or autoDress == 0 then
return false
end
-- 获取当前装备战力
local myParam = {jobPower = true}
local myPower, powerSortIndex = GUIFunction:GetEquipPower(equipData, myParam, isHero)
-- 比较身上同部位装备
local targetMinPower = 0
for i, pos in ipairs(pos) do
local targetInfo = isHero and SL:GetMetaValue("H.EQUIP_DATA", pos)
or SL:GetMetaValue("EQUIP_DATA", pos)
if not targetInfo then
return true -- 该部位没有装备,可以直接穿戴
end
local targetPower = GUIFunction:GetEquipPower(targetInfo, targetParam, isHero)
if targetMinPower == 0 or targetPower < targetMinPower then
targetMinPower = targetPower
end
end
-- 战力对比:新装备战力 > 身上最小战力
if targetMinPower < myPower then
return true
end
return false
end
```
## 2. **战力计算函数** - `GUIFunction:GetEquipPower(item, param, isHero)`
计算装备的对比战力值:
```lua
function GUIFunction:GetEquipPower(item, param, isHero)
-- 获取装备基础属性
local itemCfg = SL:GetMetaValue("ITEM_DATA", item.Index)
local attList = {} -- 属性列表
-- 解析属性字符串格式:needJob#attId#attValue|...
local tAttribute = string.split(itemCfg.attribute or "", "|")
for i, v in ipairs(tAttribute) do
if v and v ~= "" then
local tAttribute2 = string.split(v or "", "#")
table.insert(attList, {
id = tonumber(tAttribute2[2]) or 3,
value = tonumber(tAttribute2[3]) or 0
})
end
end
-- 计算战力(考虑职业权重)
local powerValue, powerSortIndex = GUIFunction:CalculateAttPower(
attList, param.jobPower, param.powerSortIndex, isHero
)
return powerValue, powerSortIndex
end
```
## 3. **属性战力计算** - `GUIFunction:CalculateAttPower(attList, isJobPower, sortIndex, isHero)`
根据职业权重计算实际战力:
```lua
function GUIFunction:CalculateAttPower(attList, isJobPower, sortIndex, isHero)
local power = -1
local myJob = isHero and SL:GetMetaValue("H.JOB") or SL:GetMetaValue("JOB")
local jobPowerAttIds = {
[AttTypeTable.Max_DEF] = 2, -- 物防权重2
[AttTypeTable.Max_MDF] = 1 -- 魔防权重1
}
-- 根据职业设置主属性权重
if isJobPower then
if myJob == 0 then --战士
jobPowerAttIds[AttTypeTable.Max_ATK] = 3
elseif myJob == 1 then --法师
jobPowerAttIds[AttTypeTable.Max_MAT] = 3
elseif myJob == 2 then --道士
jobPowerAttIds[AttTypeTable.Max_Daoshu] = 3
end
end
-- 计算各权重属性值
local powers = {}
local powerSortIndex = 0
for k, v in pairs(attList) do
if jobPowerAttIds[v.id] then
local score = v.value
powers[jobPowerAttIds[v.id]] = score
if jobPowerAttIds[v.id] > powerSortIndex and score > 0 then
powerSortIndex = jobPowerAttIds[v.id]
end
end
end
power = powers[powerSortIndex] or -1
return power, powerSortIndex
end
```
## 4. **自动使用检测** - `GUIFunction:OnAutoUseCheckItem(item)` 和 `GUIFunction:OnAutoUseCheckItem_Hero(item)`
这两个函数分别在`资料5`的第131行和`资料4`的第132行,负责:
1. 检查自动使用开关
2. 验证穿戴条件(性别、职业、等级等)
3. 通过`GetMinPowerPosByStdMode`找到最小战力部位
4. 显示自动穿戴Tips提示
## 关键对比逻辑总结:
1. **战力优先级**:主属性(3) > 物防(2) > 魔防(1)
2. **对比规则**:新装备战力 > 身上同部位最小战力装备
3. **职业优化**:战士看攻击,法师看魔法,道士看道术
4. **自动穿戴**:通过`CheckAutoUseTips`函数处理显示逻辑
如果你想让某个装备优先对比特定属性,可以在调用`GetEquipPower`时设置`param.jobPower = true`来启用职业权重计算。