- "<var>" = {
[LUA-print] - 1 = {
[LUA-print] - "equipObj" = "2153637989688"
[LUA-print] - "gemInfo" = "{"socket0":10226,"socket1":-1,"socket2":-1,"socket3":-1,"socket4":-1,"socket5":-1,"socket6":-1,"socket7":-1,"socket8":-1,"soc
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-05-31 04:19:44 |
👁️ 阅读: 3
从你提供的代码和数据结构来看,问题出在 `npc:refreshwin(pos,status)` 函数中对 `status` 数据的解析逻辑上。
**关键问题分析:**
1. **数据结构不匹配**:你的 `status` 数据是一个包含多个装备对象的表(如 `status[1]`、`status[2]`),但你在 `refreshwin` 中试图用 `for k, v in ipairs(status[1]) do` 来遍历,这会把 `status[1]`(一个装备对象)当作数组来遍历,这会导致 `v` 是 `nil` 或者不是你期望的 `gemInfo` 数据。
2. **嵌套循环逻辑错误**:`for i = 1, 5 do` 和 `for x = 0, 4 do` 的嵌套,导致你尝试为每个孔位(`Gem_i`)设置5次宝石,这显然不对。
**修正后的 `npc:refreshwin` 函数:**
```lua
function npc:refreshwin(pos, status)
-- 清空所有孔位的宝石显示
for i = 1, 5 do
GUI:ItemShow_updateItem(npc.ui["Gem_" .. i], { index = 0, look = true, bgVisible = true })
end
if not status then
return
end
-- 根据选中的装备位置(pos)获取对应的装备数据
-- 注意:pos 是 0(衣服)或 1(武器),但 status 的索引是从 1 开始的
-- 根据你的数据,status[1] 是衣服,status[2] 是武器
local equipIndex = pos + 1 -- 将 0/1 转换为 1/2
local equipData = status[equipIndex]
if not equipData then
return
end
-- 解析 gemInfo 字符串为 Lua 表
local gemInfo = SL:JsonDecode(equipData.gemInfo)
local holeInfo = SL:JsonDecode(equipData.holeInfo)
if not gemInfo or not holeInfo then
return
end
-- 遍历每个孔位(0~9,但你的界面只显示5个,所以用 0~4)
for holeIndex = 0, 4 do
local holeKey = "socket" .. holeIndex
local holeStateKey = "hole" .. holeIndex
-- 检查孔位是否已开(holeInfo[holeStateKey] == 1)
if holeInfo[holeStateKey] == 1 then
local gemId = gemInfo[holeKey]
-- 如果孔位已开且有宝石(gemId > 0),则显示宝石
if gemId and gemId > 0 then
local putIn = {
index = gemId,
look = true,
bgVisible = true,
count = 1
}
-- 注意:你的界面孔位 Gem_1 对应 socket0,所以 holeIndex + 1
GUI:ItemShow_updateItem(npc.ui["Gem_" .. (holeIndex + 1)], putIn)
end
-- 如果孔位已开但没宝石(gemId == -1),上面已经清空了,所以不用处理
else
-- 孔位未开,可以在这里处理,比如显示一个锁的图标或灰色背景
-- GUI:ItemShow_updateItem(npc.ui["Gem_" .. (holeIndex + 1)], { index = 某个表示未开孔的ID, look = true, bgVisible = true })
end
end
end
```
**主要修改点:**
1. **正确获取装备数据**:使用 `local equipData = status[equipIndex]` 根据 `pos`(0或1)获取对应的衣服或武器数据。
2. **解析 JSON 字符串**:使用 `SL:JsonDecode` 将 `gemInfo` 和 `holeInfo` 字符串解析为 Lua 表。
3. **逻辑清晰的遍历**:直接遍历 0~4 的孔位,检查孔位状态(`holeInfo`)和宝石ID(`gemInfo`)。
4. **孔位索引对应**:`holeIndex`(0~4)对应 `Gem_(holeIndex + 1)`。
**其他建议:**
* 在 `npc:openWin` 中调用 `npc:refreshwin` 时,确保 `npc.selectEQ` 的初始值(0或1)与 `status` 数据的索引对应。
* 考虑孔位未开的情况,在界面上做相应显示(如灰色、锁图标等)。
这样修改后,你的宝石显示应该就能正常工作了。如果还有问题,可以再检查一下 `npc.ui["Gem_1"]` 等控件是否存在且命名正确。
← 返回问答库