---- 前端代码
SL:print("打开洗练界面")
local refined = {}
EquipPos = {[0] = "衣服",[1] = "武器",[2] = "勋章",[3] = "头盔",[4] = "项链",[5] = "手镯(右)" ,
[6] = "手镯(左)",[7] = "戒指(右)",[8] = "戒指(左)",[10] = "腰带",[11] = "靴子"}
refined.currentAttributes = {
{type = 0, n
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-17 23:59:16 |
👁️ 阅读: 20
你好,我是Lua后端老师!
小仙,你的问题在于**复选框的锁定状态没有正确保存和读取**。根据你的代码,我看到几个关键问题需要修正。
首先,你的`iniLock`函数逻辑有误。它试图从全局表`npc.RefineData`中查找一个标记了`aimEquip`的装备,这可能导致找不到正确的数据。锁定状态应该直接与**当前点击的装备**关联。
**修改后的 `iniLock` 函数:**
```lua
-- 获取装备锁定状态
function npc:iniLock(actor, param3)
local equipPos = tonumber(param3)
if not equipPos then
return false
end
local itemObj = linkbodyitem(actor, equipPos)
if not itemObj then
-- 如果该位置没有装备,发送默认未锁定状态
local defaultLock = {0, 0, 0}
local lockStatusJson = tbl2json(defaultLock)
sendluamsg(actor, 1013, 13, 2, equipPos, lockStatusJson)
return true
end
-- 直接从装备变量中读取锁定状态
local lockStatusTbl = {}
for i = 1, 3 do
local lockValue = getitemintparam(actor, -2, i, itemObj)
if lockValue and tonumber(lockValue) ~= nil then
lockStatusTbl[i] = tonumber(lockValue)
else
-- 如果装备变量没有值,默认为0(未锁定)
lockStatusTbl[i] = 0
-- 并初始化到装备变量
setitemintparam(actor, -2, i, 0, itemObj)
end
end
-- 同时更新到洗练数据表,保持数据同步
local player_ID = getbaseinfo(actor, 2)
local itemOnlyID = getiteminfo(actor, itemObj, 1)
if not npc.RefineData[player_ID] then
npc.RefineData[player_ID] = {}
end
if not npc.RefineData[player_ID][itemOnlyID] then
npc.RefineData[player_ID][itemOnlyID] = {
itemOnlyID = itemOnlyID,
refineCount = 0,
oldAttributes = {},
oldAttrStr = "",
lockStatus = {0, 0, 0}
}
end
-- 同步锁定状态到洗练数据
for i = 1, 3 do
npc.RefineData[player_ID][itemOnlyID].lockStatus[i] = lockStatusTbl[i]
end
-- 发送锁定状态到前端
local lockStatusJson = tbl2json(lockStatusTbl)
sendluamsg(actor, 1013, 13, 2, equipPos, lockStatusJson)
release_print("发送锁定状态,位置:"..equipPos..",状态:"..lockStatusJson)
return true
end
```
其次,在`refined`函数中,你保存锁定状态的代码有**变量名错误**。你使用了未定义的变量`p3`,应该是`param3`。
**修正 `refined` 函数中的错误行:**
```lua
-- 错误代码(第104行附近):
setitemintparam(actor, -2, p3, newTimes, itemObj) -- p3 是未定义的变量
-- 应该改为:
setitemintparam(actor, -2, 50, newTimes, itemObj) -- 参数3应该是50,表示洗练次数变量
```
另外,在`main`函数中,你需要确保在打开界面时初始化当前装备的锁定状态。
**在 `main` 函数末尾添加:**
```lua
function npc:main(actor, param3)
-- 默认显示衣服
if param3 == nil then
param3 = 0
end
npc:putEquipment(actor, param3)
-- 更新当前洗练装备
local refineData = npc:getRefineData(actor, param3)
if refineData then
refineData.aimEquip = param3
end
-- 新增:初始化当前装备的锁定状态
npc:iniLock(actor, param3)
end
```
**核心问题总结:**
1. **数据源不统一**:锁定状态应该以**装备变量**(`getitemintparam/setitemintparam`)为权威数据源,全局表`npc.RefineData`作为内存缓存。
2. **初始化逻辑错误**:`iniLock`函数不应该依赖`aimEquip`标记,应该直接处理参数指定的装备位置。
3. **变量名错误**:在保存洗练次数时使用了错误的变量名`p3`。
**修改后的工作流程:**
1. 点击装备按钮 → 调用`iniLock` → 从装备变量读取状态 → 发送到前端
2. 勾选复选框后洗练 → 在`refined`中保存到装备变量 → 同时更新内存表 → 再次调用`iniLock`刷新前端
3. 重新打开界面 → `main`调用`iniLock` → 从装备变量读取持久化状态
这样修改后,复选框状态就能正确保存,并且在切换装备或重新打开界面时保持状态了。记得测试一下,如果还有问题,随时问我或者请教浮生梦尊师哦!
← 返回问答库