[2026/6/16 星期二 2:40:58] CallLua1 Func:addbagbefore 18 luaErr:.\Envir\QuestDiary/点击NPC模块/addbagbefore.lua:681: attempt to index a nil value
stack traceback:
.\Envir\QuestDiary/点击NPC模块/addbagbefore.lua:681: in function 'addbagbefore'
.\Envir\Market_D
我是lua后端老师!
小仙,看到你的错误了,这个脚本在第681行出现了"attempt to index a nil value"(尝试索引一个nil值)的错误。让我帮你分析一下问题所在。
从你的代码来看,问题出在嵌套循环这里:
```lua
for m, n in ipairs(B.firstExplosion) do
if v.idx == n[k].idx == itemidx then
```
这里有几个问题:
1. **`B.firstExplosion`的结构问题**:`B.firstExplosion`是一个以数字为键的表格,比如`[1]`、`[2]`等,每个键对应一个包含多个装备信息的表格。但你在循环时使用了`ipairs`,这会导致`n`是每个子表格(比如`B.firstExplosion[1]`、`B.firstExplosion[2]`等),而不是装备信息。
2. **索引错误**:`n[k].idx`这里,`k`是外层循环的索引(1-28),但`n`是子表格,`n[k]`可能不存在,因为`n`本身就是一个包含10个装备的表格,索引应该是1-10。
3. **逻辑错误**:`v.idx == n[k].idx == itemidx`这个判断条件在Lua中不会按你期望的方式工作。Lua不支持连续比较,应该写成`v.idx == n[k].idx and n[k].idx == itemidx`。
正确的写法应该是:
```lua
function B.addbagbefore(actor, item, itemidx, itemMakeIndex)
local eqExposeJson = getsysvar("装备首爆")
if eqExposeJson == nil then
eqExposeJson = ""
end
local eqExposeJsonTbl = json2tbl(eqExposeJson)
if eqExposeJsonTbl == nil then
eqExposeJsonTbl = {}
end
local has = checktitle(actor, "王者特权")
-- 遍历所有装备组
for groupIndex, groupData in ipairs(B.eqExposeTbl) do
-- 遍历组内的每个装备
for itemIndex, itemData in ipairs(groupData) do
-- 检查是否是当前进入背包的物品
if itemData.idx == itemidx then
-- 检查是否已经爆出过
if B.firstExplosion[groupIndex] and B.firstExplosion[groupIndex][itemIndex] then
local explosionData = B.firstExplosion[groupIndex][itemIndex]
if explosionData.isExpose == 0 then
if has then
-- 如果有"王者特权"称号,给非绑定金币
givemoney(actor, 2, itemData.rewardCount)
else
-- 如果没有"王者特权"称号,给绑定金币
givemoney(actor, 3, itemData.rewardCount)
end
-- 更新首爆记录
explosionData.isExpose = 1
explosionData.time = os.date("%Y年%m月%d日%H时%M分%S秒")
release_print(explosionData.time)
-- 保存到系统变量
local eqJson = tbl2json(B.firstExplosion)
inisysvar("string", "装备首爆", 1)
setsysvarex("装备首爆", eqJson, 1)
sendluamsg(actor, 1001, 1, 2, 3, "分享邀请码")
end
end
end
end
end
end
```
另外,我还注意到你的代码中使用了`givemoney`函数,但这个函数在你的函数库列表中没有看到。你可能需要使用`changemoney`函数来给玩家金币:
```lua
-- 使用changemoney函数
changemoney(actor, 2, itemData.rewardCount) -- 非绑定金币
changemoney(actor, 3, itemData.rewardCount) -- 绑定金币
```
小仙,写代码时要特别注意表格的结构和索引方式。下次遇到类似问题,可以先打印一下表格的结构,看看实际的数据是什么样子的。如果还有不懂的地方,可以问浮生梦尊师!