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 20:45:22 |
👁️ 阅读: 0
我是lua后端老师!
小仙,你的代码我看了,想要通过`npc.eqData[eqPos].lockStatus`中的1来获取`npc.Attribute`表里对应的属性名,这个思路是对的。不过你的代码里有些小问题需要调整。
首先,你的`npc.Attribute.attName`表是从索引1开始的,而`lockStatus`是一个数组,比如`{1,0,1}`,表示第一个和第三个属性被锁定。当`lockStatus[k] == 1`时,`k`就是对应的属性索引。
在你的`checkMoney`函数里,可以这样修改:
```lua
function npc:checkMoney(actor, eqPos,str)
npc.eqData = npc:refinedEquip(actor, eqPos)
local lockCount = npc.eqData[eqPos].lockCount
release_print(lockCount)
-- 扣钱
local money = querymoney(actor, 1) -- 需要货币数量
local needItem = getbagitemcount(actor,"祖玛凭证", 0) -- 需要物品数量
local equipPos = npc.posMap[eqPos] -- 装备常量
local equipName = getconst(actor,"<$USEITEMNAME["..equipPos.."]>") -- 通过装备常量获取装备名
local equipObj = linkbodyitem(actor, equipPos) -- 身上对应位置装备的对象
-- 获取洗练次数
local oldTimes = getitemintparam(actor, -2, 1, equipObj) -- 将洗练次数存到装备上
oldTimes = tonumber(oldTimes) or 0
local totalCostMoney = 100 + (oldTimes * 100) -- 累积费用
local totalCostItem = 0 -- 累积材料
-- 多个复选框额外花费/材料
local lockExtraMoney = 0
local lockExtraItem = 0
if lockCount == 3 then
sendmsg(actor, 1,'{"Msg":"全部词条都被锁定无法刷新!","Type":9,"Time":2}')
return
end
if lockCount == 0 then
lockExtraMoney = 100 + (oldTimes * 100)
totalCostMoney = totalCostMoney + lockExtraMoney -- 累积花费
lockExtraItem = 10 + (oldTimes * 2)
totalCostItem = totalCostItem + lockExtraItem -- 累积材料
elseif lockCount == 1 then
lockExtraMoney = 200 + (oldTimes * 100)
totalCostMoney = totalCostMoney + lockExtraMoney -- 累积花费
lockExtraItem = 15 + (oldTimes * 5)
totalCostItem = totalCostItem + lockExtraItem -- 累积材料
elseif lockCount == 2 then
lockExtraMoney = 500 + (oldTimes * 100)
totalCostMoney = totalCostMoney + lockExtraMoney -- 累积花费
lockExtraItem = 18 + (oldTimes * 8)
totalCostItem = totalCostItem + lockExtraItem -- 累积材料
end
release_print(totalCostItem,totalCostMoney,"//////",lockExtraItem,lockExtraMoney)
-- 检测货币
if money < totalCostItem then
sendmsg(actor, 1,'{"Msg":"你身上的元宝不足,洗练失败!","Type":9,"Time":2}')
return
end
-- 检测材料
if needItem < totalCostItem then
sendmsg(actor, 1,'{"Msg":"你身上的材料不足,洗练失败!","Type":9,"Time":2}')
return
end
-- 扣除前先获取被锁定的属性
local lockedAttrs = {}
for k, v in ipairs(npc.eqData[eqPos].lockStatus) do
if v == 1 then -- 如果这个位置被锁定
local attrName = npc.Attribute.attName[k] -- 获取对应的属性名
if attrName then
table.insert(lockedAttrs, attrName)
release_print("锁定的属性:", k, attrName)
end
end
end
-- 这里可以继续你的洗练逻辑
-- 比如根据锁定的属性来决定哪些属性需要保留
sendmsg(actor, 1,'{"Msg":"恭喜你,洗练成功!","Type":9,"Time":2}')
end
```
主要改动:
1. 把循环条件从`if k == 0 then break end`改成了直接遍历`lockStatus`数组
2. 判断`v == 1`而不是`k == 1`
3. 通过`npc.Attribute.attName[k]`获取对应的属性名
4. 把锁定的属性名存到`lockedAttrs`表中,方便后续使用
这样当`lockStatus = {1,0,1}`时,就会获取到"血量"和"攻击下限"这两个属性名。
小仙,你的代码框架很不错,就是遍历逻辑有点小问题。记住,`ipairs`遍历数组时,`k`是索引,`v`是值。不懂的可以问我浮生梦尊师哦!
← 返回问答库