local npc = {}
EquipPos = {[0] = "衣服",[1] = "武器",[2] = "勋章",[3] = "头盔",[4] = "项链",[5] = "手镯(右)" ,
[6] = "手镯(左)",[7] = "戒指(右)",[8] = "戒指(左)",[10] = "腰带",[11] = "靴子"}
npc.Attribute = {
attName = {
[1] = "血量",
[3] = "攻击下限", [4] = "
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-16 20:59:33 |
👁️ 阅读: 10
我是后端Lua老师!
小仙,看了你的代码和日志,问题出在**锁定逻辑的判断条件**上。在`refined`函数中,你虽然解析了锁定状态,但在生成新属性时,判断条件写错了。
**问题分析:**
从日志可以看到,你传入了 `{1=false, 2=false, 3=true}`,表示只锁定第3个属性(防御)。但代码执行后,防御属性还是被刷新了。
**错误位置:**
在你的`refined`函数中,第3个复选框(防御)的判断条件是:
```lua
if lockStatus[3] == true and data.oldAttributes and data.oldAttributes[3] then
```
这个逻辑本身没问题,但问题在于**这是第一次洗练**,`data.oldAttributes`是空的,所以条件不成立,还是会执行`else`分支生成新属性。
**解决方案:**
你需要修改判断逻辑,不仅要检查锁定状态,还要考虑是否是第一次洗练(没有旧属性):
```lua
-- 第3个复选框:防御
if lockStatus[3] == true and data.oldAttributes and data.oldAttributes[3] then
-- 如果防御被锁定且有旧属性,使用旧的防御
ac_attr = data.oldAttributes[3]
attrStr_ac = "3#9#"..ac_attr.ac_min.."|3#10#"..ac_attr.ac_max
release_print("防御被锁定,使用旧值: "..attrStr_ac)
elseif lockStatus[3] == true then
-- 如果防御被锁定但没有旧属性(第一次洗练),生成默认值
local min_defense = 1 -- 默认值
local max_defense = 5 -- 默认值
ac_attr = {
type = 3,
name = "防御力",
ac_min = min_defense,
ac_max = max_defense,
min_color = "#FFFFFF",
max_color = "#FFFFFF",
color = "#FFFFFF",
index = 3
}
attrStr_ac = "3#9#"..min_defense.."|3#10#"..max_defense
release_print("防御被锁定(首次),使用默认值: "..attrStr_ac)
else
-- 防御未锁定,生成新值
-- ... 你原来的生成新防御的代码
end
```
**同样需要修改血量和攻击的判断逻辑:**
```lua
-- 第1个复选框:血量
if lockStatus[1] == true and data.oldAttributes and data.oldAttributes[1] then
-- 如果血量被锁定且有旧属性,使用旧的血量
hp_attr = data.oldAttributes[1]
attrStr_hp = "3#1#"..hp_attr.hp_value
release_print("血量被锁定,使用旧值: "..attrStr_hp)
elseif lockStatus[1] == true then
-- 如果血量被锁定但没有旧属性,使用默认值
local hp_value = 100 -- 默认值
hp_attr = {
type = 1,
name = "血量",
hp_value = hp_value,
color = "#FFFFFF",
index = 1
}
attrStr_hp = "3#1#"..hp_value
release_print("血量被锁定(首次),使用默认值: "..attrStr_hp)
else
-- 血量未锁定,生成新值
-- ... 你原来的生成新血量的代码
end
```
**建议的优化:**
1. 在`getRefineData`函数中初始化默认的`oldAttributes`,这样第一次洗练时就有默认属性
2. 或者使用一个单独的初始化函数来设置默认属性
**修改后的`getRefineData`函数:**
```lua
function npc:getRefineData(actor, param3)
local player_ID = getbaseinfo(actor, 2)
if not npc.RefineData then
npc.RefineData = {}
end
if not npc.RefineData[player_ID] then
npc.RefineData[player_ID] = {}
end
local itemObj = linkbodyitem(actor, param3)
if not itemObj then
return nil
end
local itemOnlyID = getiteminfo(actor, itemObj, 1)
if npc.RefineData[player_ID][itemOnlyID] then
release_print("从全局表获取已存在的洗练数据,refineCount: "..(npc.RefineData[player_ID][itemOnlyID].refineCount or 0))
return npc.RefineData[player_ID][itemOnlyID]
end
-- 创建新的洗练数据对象,并初始化默认属性
release_print("创建新的洗练数据对象,itemOnlyID: "..itemOnlyID)
local newData = {
itemOnlyID = itemOnlyID,
refineCount = 0,
oldAttributes = {
[1] = { -- 血量默认值
type = 1,
name = "血量",
hp_value = 100,
color = "#FFFFFF",
index = 1
},
[2] = { -- 攻击默认值
type = 2,
name = "攻击力",
att_min = 0,
att_max = 5,
min_color = "#FFFFFF",
max_color = "#FFFFFF",
color = "#FFFFFF",
index = 2
},
[3] = { -- 防御默认值
type = 3,
name = "防御力",
ac_min = 1,
ac_max = 5,
min_color = "#FFFFFF",
max_color = "#FFFFFF",
color = "#FFFFFF",
index = 3
}
},
oldAttrStr = ""
}
npc.RefineData[player_ID][itemOnlyID] = newData
return newData
end
```
这样修改后,第一次洗练时如果锁定某个属性,就会使用默认值而不是重新随机生成。下次洗练时,如果继续锁定,就会使用上次洗练的结果。
小仙,这个错误是因为没有考虑到第一次洗练时`oldAttributes`为空的情况。下次注意检查边界条件哦!如果还有不懂的,可以问浮生梦尊师!
← 返回问答库