我是lua后端老师!小仙,看了你的洗练脚本,发现了一个关键问题:**所有装备共享同一个锁定状态表**,导致锁定状态在装备间混淆了。
问题出在`refined.lockStatus`这个全局变量上。每次切换装备时,你虽然重置了前端显示,但后端没有正确区分不同装备的锁定状态。
## 解决方案:
### 1. 后端需要按装备存储锁定状态
修改`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("从全局表获取已存在的洗练数据,itemOnlyID: "..itemOnlyID)
return npc.RefineData[player_ID][itemOnlyID]
else
-- 创建新的洗练数据对象
release_print("创建新的洗练数据对象,itemOnlyID: "..itemOnlyID)
local newData = {
itemOnlyID = itemOnlyID,
refineCount = 0,
oldAttributes = {},
oldAttrStr = "",
lockStatus = {0, 0, 0}, -- 每个装备独立的锁定状态
aimEquip = nil
}
npc.RefineData[player_ID][itemOnlyID] = newData
return newData
end
end
```
### 2. 修改锁定状态读取逻辑
```lua
function npc:iniLock(actor, param3)
local player_ID = getbaseinfo(actor, 2)
local equipPos = tonumber(param3)
if not equipPos then
return false
end
local itemObj = linkbodyitem(actor, equipPos)
if not itemObj then
return false
end
-- 获取该装备的洗练数据
local refineData = npc:getRefineData(actor, equipPos)
if not refineData then
return false
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)
-- 同时更新到洗练数据中
refineData.lockStatus[i] = tonumber(lockValue)
else
-- 如果装备变量没有,使用洗练数据中的
lockStatusTbl[i] = refineData.lockStatus[i] or 0
end
end
-- 发送锁定状态到前端
local lockStatusJson = tbl2json(lockStatusTbl)
sendluamsg(actor, 1013, 13, 2, equipPos, lockStatusJson)
return true
end
```
### 3. 修改洗练时的锁定状态保存
```lua
-- 在refined函数中,保存锁定状态到装备变量和洗练数据
local lockStatus = json2tbl(str) or {}
local lockStatusTbl = {}
local lockCount = 0
for i = 1, 3 do
if lockStatus[i] == true then
lockCount = lockCount + 1
setitemparam(actor, -2, i, "1", itemObj) -- 保存到装备变量
lockStatusTbl[i] = 1
-- 同时更新到洗练数据
if data then
data.lockStatus[i] = 1
end
else
setitemparam(actor, -2, i, "0", itemObj) -- 保存到装备变量
lockStatusTbl[i] = 0
-- 同时更新到洗练数据
if data then
data.lockStatus[i] = 0
end
end
end
-- 发送锁定状态到前端
local lockStatusJson = tbl2json(lockStatusTbl)
sendluamsg(actor, 1013, 13, 2, param3, lockStatusJson)
```
### 4. 前端也需要调整
```lua
-- 在refreshWin函数中,每次切换装备时重新请求该装备的锁定状态
function refined:refreshWin(p3, msgData)
refined.eqInfo = SL:JsonDecode(msgData)
for k, v in pairs(refined.eqInfo) do
if k <= 11 then
local buttonName = "but_"..v.pos
if refined.ui[buttonName] then
GUI:Button_setTitleText(refined.ui[buttonName], v.name or "未装备")
local hasEquip = not string.find(v.name, "未装备")
-- 设置按钮状态
GUI:setTouchEnabled(refined.ui[buttonName], hasEquip)
GUI:Button_setGrey(refined.ui[buttonName], not hasEquip)
end
end
end
if refined.eqInfo[12] then
refined.currentEquipPos = p3 -- 更新当前装备位置
if refined.ui.ItemShow_1 then
GUI:ItemShow_updateItem(refined.ui.ItemShow_1, refined.eqInfo[12].idx or 0)
end
-- 重置前端锁定状态显示为默认未选中
for k = 1, 3 do
local checkBoxName = "CheckBox_"..k
if refined.ui[checkBoxName] then
GUI:CheckBox_setSelected(refined.ui[checkBoxName], false)
end
end
-- 请求该装备的锁定状态
SL:SendLuaNetMsg(2013, 13, 2, p3, "请求锁定状态")
end
end
```
## 关键改进点:
1. **每个装备独立存储**:使用`itemOnlyID`作为键,确保每个装备有自己的锁定状态
2. **双重存储**:既保存在装备变量中(持久化),也保存在洗练数据中(运行时)
3. **切换时重置**:前端切换装备时,先重置显示,再请求该装备的实际状态
4. **状态同步**:洗练时同时更新装备变量和洗练数据中的锁定状态
这样修改后,每个装备的锁定状态就会独立保存,不会再出现所有装备共享同一个状态的问题了。小仙,如果还有不明白的地方,随时问我或者请教浮生梦尊师!