local npc = {}
npc.EquipPos = {[0] = "衣服",[1] = "武器",[2] = "勋章",[3] = "头盔",[4] = "项链",[5] = "手镯(右)",[6] = "手镯(左)",[7] = "戒指(右)",[8] = "戒指(左)",[10] = "腰带",[11] = "靴子"}
-- 前端装备位置
npc.posMap = {[1] = 0, [2] = 1, [3] = 2,[4] = 3,[5] = 4,[6] = 5,[7] = 6
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-05-23 18:46:04 |
👁️ 阅读: 0
我是lua后端老师!
小仙,看了你的代码,问题出在 `npc.eqData` 这个表的使用上。让我帮你分析一下:
首先,你在 `npc:refinedEquip` 函数中设置了 `npc.eqData[eqPos]`,但是在 `npc:checkMoney` 函数中调用时可能遇到了问题。
主要问题有以下几个:
1. **表索引类型不一致**:你在 `npc:refinedEquip` 中使用的 `eqPos` 是前端传递的位置索引(1-11),但在 `npc:checkMoney` 中直接使用这个索引去访问表,而你的表结构可能没有正确初始化。
2. **函数调用顺序**:`npc:checkMoney` 函数中调用了 `dump(npc.eqData[eqPos])`,但如果 `npc:refinedEquip` 没有被先调用,这个表项就不存在。
3. **变量作用域**:`npc.eqData` 是模块级的表,但你在 `npc:main` 函数开头清空了它:`npc.eqData = {}`,这意味着每次打开NPC界面都会清空之前存储的数据。
让我给你一个修复方案:
```lua
-- 修改 checkMoney 函数,添加数据检查
function npc:checkMoney(actor, eqPos, str)
-- 先检查数据是否存在
if npc.eqData[eqPos] == nil then
release_print("错误:npc.eqData[" .. eqPos .. "] 不存在,请先调用 refinedEquip 函数")
sendmsg(actor, 0, "请先选择要洗练的装备")
return
end
-- 现在可以安全地访问数据
local lockCount = npc.eqData[eqPos].lockCount
local refineCount = npc.eqData[eqPos].refineCount
local lockStatus = npc.eqData[eqPos].lockStatus
release_print("锁定数量:" .. lockCount)
release_print("洗练次数:" .. refineCount)
release_print("锁定状态:" .. tbl2json(lockStatus))
-- 继续你的扣费逻辑...
end
```
另外,建议你在 `npc:refinedEquip` 函数中添加一些调试信息:
```lua
function npc:refinedEquip(actor, eqPos)
release_print("正在为装备位置 " .. eqPos .. " 初始化洗练数据")
-- 获取装备复选框锁定数量
local a = 0
local status = getplayvar(actor, "HUMAN", "洗练复选框状态")
local statusTbl = json2tbl(status)
-- 防止没有对应装备导致报错
statusTbl[eqPos] = statusTbl[eqPos] or {0, 0, 0}
-- 每选择一个复选框都加1
if statusTbl[eqPos][1] == 1 then a = a + 1 end
if statusTbl[eqPos][2] == 1 then a = a + 1 end
if statusTbl[eqPos][3] == 1 then a = a + 1 end
iniplayvar(actor, "integer", "HUMAN", "装备复选框数量")
setplayvar(actor, "HUMAN", "装备复选框数量", a, 1)
-- 存储数据
npc.eqData[eqPos] = {
lockStatus = statusTbl[eqPos], -- 复选框状态 {0,1,0}
lockCount = a, -- 锁定数量
refineCount = 0, -- 洗练次数
}
release_print("npc.eqData[" .. eqPos .. "] 初始化完成")
release_print("锁定数量:" .. a)
end
```
小仙,记住在调用 `npc:checkMoney` 之前,一定要先调用 `npc:refinedEquip` 来初始化数据。如果还有问题,可以在 `npc:checkMoney` 函数开头添加 `release_print("当前 eqData 表内容:" .. tbl2json(npc.eqData))` 来查看整个表的状态。
不懂的可以问浮生梦尊师!
← 返回问答库