local npc = {}
EquipPos = {[0] = "衣服",[1] = "武器",[2] = "勋章",[3] = "头盔",[4] = "项链",[5] = "手镯(右)" ,
[6] = "手镯(左)",[7] = "戒指(右)",[8] = "戒指(左)",[10] = "腰带",[11] = "靴子"}
npc.Attribute = {
attName = {
[1] = "血量",
[3] = "攻击下限", [4] = "
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-17 23:36:50 |
👁️ 阅读: 13
你好啊,小仙!我是Lua后端老师!
看了你的代码,问题出在前端脚本处理锁定状态的地方。你在`refined:refreshEquip`函数里,根据后端返回的锁定状态设置复选框是对的,但是你在`refined:refreshWin`函数里,每次切换装备时都重置了锁定状态为`{false, false, false}`,这样之前的锁定状态就被清空了。
而且,你在`refined:refreshEquip`函数里,给“洗练”按钮绑定点击事件时,判断`lockTbl[k] == true`来获取复选框状态,这个逻辑有问题。`lockTbl`是后端返回的锁定状态表(1或0),你应该直接读取前端复选框当前的选择状态。
我们来修复一下,主要修改前端脚本:
```lua
function refined:openWin()
-- 创造外部界面
local win_refined = GUI:Win_Create("win_refined", 0, 0, 0, 0)
GUI:LoadExport(win_refined, "refined")
refined.ui = GUI:ui_delegate(win_refined)
GUI:addOnClickEvent(refined.ui.esc, function()
GUI:Win_Close(win_refined)
end)
SL:SendLuaNetMsg(2013, 13, 0, 0, "装备洗练")
refined.currentEquipPos = 0 -- 默认选中衣服位置0
-- 在这里初始化锁定状态,但不要重置
refined.lockStatus = refined.lockStatus or {false, false, false}
for x, y in pairs(EquipPos) do
local buttonName = "but_"..x
GUI:addOnClickEvent(refined.ui[buttonName], function()
refined.currentEquipPos = x
-- 注意:这里不要重置锁定状态!
-- 锁定状态应该由后端返回,我们在refreshEquip函数里设置
SL:SendLuaNetMsg(2013, 13, 0, x, "获取锁定状态") -- 放入装备
end)
end
end
function refined:refreshEquip(msgData)
local lockTbl = SL:JsonDecode(msgData)
-- 根据后端返回的锁定状态设置复选框
for k = 1, 3 do
local checkBoxName = "CheckBox_"..k
if refined.ui[checkBoxName] then
if lockTbl and lockTbl[k] then
-- 1表示锁定,0表示未锁定
local isLocked = (lockTbl[k] == 1)
GUI:CheckBox_setSelected(refined.ui[checkBoxName], isLocked)
refined.lockStatus[k] = isLocked
else
GUI:CheckBox_setSelected(refined.ui[checkBoxName], false)
refined.lockStatus[k] = false
end
end
end
-- 重新绑定洗练按钮的点击事件,确保使用最新的锁定状态
GUI:removeOnClickEvent(refined.ui.refined_but) -- 先移除旧的事件
GUI:addOnClickEvent(refined.ui.refined_but, function()
GUI:delayTouchEnabled(refined.ui.refined_but, 0.7)
-- 获取当前复选框的选中状态
local currentLockStatus = {}
for k = 1, 3 do
local checkBoxName = "CheckBox_"..k
if refined.ui[checkBoxName] then
currentLockStatus[k] = GUI:CheckBox_isSelected(refined.ui[checkBoxName])
else
currentLockStatus[k] = false
end
end
-- 发送锁定状态到服务端保存
local lockJson = SL:JsonEncode(currentLockStatus)
SL:SendLuaNetMsg(2013, 13, 1, refined.currentEquipPos, lockJson)
end)
end
```
主要修改点:
1. 在`openWin`函数里初始化`lockStatus`,但切换装备时不再重置它
2. 在`refreshEquip`函数里,直接读取复选框的选中状态,而不是依赖`lockTbl[k] == true`这个错误判断
3. 每次刷新装备时重新绑定洗练按钮事件,确保使用最新的UI状态
另外,你的后端脚本`npc:iniLock`函数有两个定义,第二个会覆盖第一个,这可能导致一些问题。建议只保留一个。
小仙,记得前端的状态管理要清晰,切换装备时哪些该重置、哪些该保留要想清楚。如果还有问题,随时问我,或者请教浮生梦尊师!
← 返回问答库