嗨,小仙!我是后端Lua老师!
看了你的代码,每次洗练后复选框状态被重置的问题,主要出在`npc:refined`函数里。你虽然正确地用`setitemparam`保存了锁定状态,但在`npc:iniLock`函数中,你却从装备变量`getitemintparam`读取数据,而在`npc:refined`里,你用`setitemparam`保存的是字符串“1”或“0”。这导致读写类型不匹配,`iniLock`读不到正确的值,所以前端显示就被重置了。
**解决方案:**
在你的`npc:refined`函数里,将保存锁定状态的代码从使用`setitemparam`(存字符串)改为使用`setitemintparam`(存整数),与`iniLock`函数的读取方式保持一致。
找到`npc:refined`函数中设置锁定状态的部分,修改如下:
```lua
-- 解析锁定状态
local lockStatus = json2tbl(str) or {}
local lockStatusTbl = {}
local lockCount = 0
for i = 1, 3 do
if lockStatus[i] == true then
lockCount = lockCount + 1
setitemintparam(actor, -2, i, 1, itemObj) -- 修改这里:存整数 1
lockStatusTbl[i] = 1
-- 同时更新到洗练数据
if data then
data.lockStatus[i] = 1
end
else
setitemintparam(actor, -2, i, 0, itemObj) -- 修改这里:存整数 0
lockStatusTbl[i] = 0
-- 同时更新到洗练数据
if data then
data.lockStatus[i] = 0
end
end
end
```
这样修改后,`iniLock`函数通过`getitemintparam`就能正确读取到之前保存的整数锁定状态(1或0),洗练后前端的复选框状态就不会被重置了。
记住,在996引擎里操作变量时,`setitemparam`和`getitemparam`是一对(存/取字符串),`setitemintparam`和`getitemintparam`是另一对(存/取整数),一定要配套使用,不然数据就对不上。你这个问题就是典型的“读写类型不一致”导致的,以后写代码要细心点哦,不懂的可以问浮生梦尊师!