ItemDbTrigger.func50_cfg = {
{ "天剑魔御宝石lv1", "天剑防御宝石lv1", "天剑魔血宝石lv1", "圣莲忽视宝石lv1", "圣莲伤害宝石lv1", "圣莲暴击宝石lv1", name = "Lv1宝石自选箱(天剑圣莲)" },
{ "天剑魔御宝石lv2", "天剑防御宝石lv2", "天剑魔血宝石lv2", "圣莲忽视宝石lv2", "圣莲伤害宝石lv2", "圣莲暴击宝石lv2", name = "Lv2宝石自选箱(天剑圣莲)" },
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-17 01:43:49 |
👁️ 阅读: 12
lua后端老师!小仙,你这脚本问题出在几个地方,我帮你看看:
1. **`item_idx` 变量作用域问题**:在 `item_50` 函数里,你直接用了 `ItemDbTrigger.func50_cfg[item_idx].name`,但 `item_idx` 这个变量在这个函数里**根本没有定义**,它是 `stdmodefunc50` 函数里的局部变量。两个函数是独立的,`item_50` 访问不到 `stdmodefunc50` 里的 `item_idx`。
2. **Input关联逻辑**:你的界面里,每个选项的输入框 `Input` 的 `inputid` 都设置成了循环变量 `k`(1到6)。但是,在 `item_50` 函数中,你使用 `parsetext("<$NPCINPUT(1)>", actor)` 等方式获取输入值时,这个 `1` 是写死的,它应该和你界面中某个 `Input` 控件的 `inputid` 值对应才能取到值。目前你的逻辑是尝试取6个输入框,但界面生成和输入框的 `inputid` 设置是动态的(`k`),而获取时是静态的(1,2,3,4,5,6),这需要确保它们匹配。
3. **物品消耗判断**:`getbagitemcount(actor, ItemDbTrigger.func50_cfg[item_idx].name)` 这里,`item_idx` 未定义,而且你应该是想判断玩家背包里是否有这个自选箱道具,然后根据输入的数量给对应宝石。但这里直接用了配置里的 `name` 字段,你需要先确定玩家打开的是哪个箱子(哪个`item_idx`)。
**修复思路**:
你需要把玩家打开的那个箱子的索引(`item_idx`)传递到 `item_50` 函数。在996引擎里,可以通过设置玩家自定义变量来实现。
修改后的 `stdmodefunc50` 函数末尾,在弹出界面后,将 `item_idx` 存到玩家变量中:
```lua
function stdmodefunc50(actor, item_obj)
stop(actor)
local item_name = getiteminfo(actor, item_obj, 7)
local item_cfg = ItemDbTrigger.func50_cfg
local startPos, endPos = string.find(item_name, "%d+")
local numberStr = string.sub(item_name, startPos, endPos)
local item_idx = tonumber(numberStr)
-- 将当前打开的箱子索引存入玩家变量,供item_50函数使用
setplayvar(actor, "integer", "当前宝石箱索引", item_idx) -- 使用自定义变量暂存索引
local msg = ""
local msg1 = ""
local msg_id = ""
for k, v in ipairs(item_cfg[item_idx]) do
msg_id = msg_id .. string.format("z_%d,", k)
msg1 = msg1 ..
string.format([[<Button|id=z_%d|children=b_%d,c_%d|esc=0|color=243|nimg=public/1900000678.png|text=%s>
<ItemShow|id=a_%d|x=-2|y=-2|width=70|height=70|itemname=%s|itemcount=1|bgtype=0|showtips=1>
<Img|id=b_%d|children=a_%d|x=30|y=40|esc=0|img=public/1900000651_1.png>
<Button|id=c_%d|children=d_%d|x=15|y=105|width=91|height=27|nimg=public/bg_bti_07.png|color=255|size=18>
<Input|id=d_%d|x=3|y=-1|width=89|height=25|color=255|errortips=1|mincount=1|type=1|place=输入选择数量|size=12|inputid=%d>
]],
k, k, k, v,
k, v,
k, k,
k, k,
k, k)
end
msg = [[<Img|width=588|height=235|bg=1|move=0|esc=1|show=5|reset=1|img=public_win32/000360.png|loadDelay=0>
<Layout|x=545|y=0|width=80|height=80|link=@exit>
<Button|x=546|y=0|pimg=public/1900000511.png|nimg=public/1900000510.png|link=@exit>
<ListView|x=35.0|y=28.0|children=]] .. msg_id .. [[|width=522|height=135|color=x|direction=2|bounce=0>
<Button|x=232.0|y=178.0|width=97|height=31|submitInput=1|nimg=public/1900000662.png|color=243|size=15|text=确定选择|link=@item_50>
]] .. msg1
say(actor, msg)
end
```
然后修改 `item_50` 函数,从玩家变量中读取 `item_idx`,并正确获取每个输入框的值(注意,你的输入框 `inputid` 是动态的 `k`,所以获取时也要用循环或对应关系):
```lua
function item_50(actor)
-- 从玩家变量中获取之前存储的箱子索引
local item_idx = getplayvar(actor, "integer", "当前宝石箱索引") -- 获取自定义变量
if not item_idx then
say(actor, "参数错误!")
return
end
local cfg = ItemDbTrigger.func50_cfg[item_idx]
if not cfg then
say(actor, "配置错误!")
return
end
local box_name = cfg.name -- 自选箱的名称
local item_count = getbagitemcount(actor, box_name) -- 检查背包中该自选箱的数量
if item_count <= 0 then
say(actor, "背包中没有" .. box_name)
return
end
-- 动态获取每个输入框的值,因为输入框的inputid是1,2,3,4,5,6
local input_vals = {}
for i = 1, 6 do
local input_val = tonumber(parsetext("<$NPCINPUT(" .. i .. ")>", actor))
input_vals[i] = input_val or 0
release_print("输入框" .. i .. "的值:", input_val)
end
-- 这里你可以编写逻辑,根据 input_vals 中每个输入框的数量,给予对应 cfg[i] 的宝石,并扣除 box_name 道具
-- 例如:检查总输入数量是否合理,然后循环给予物品
local total_choose = 0
for i, val in ipairs(input_vals) do
total_choose = total_choose + (val or 0)
end
if total_choose <= 0 then
say(actor, "请至少选择一个宝石!")
return
end
-- 假设一次只能打开一个箱子,消耗一个自选箱
if item_count >= 1 then
takeitem(actor, box_name, 1) -- 扣除一个自选箱
for i, val in ipairs(input_vals) do
if val and val > 0 then
giveitem(actor, cfg[i], val) -- 给予对应数量的宝石
end
end
say(actor, "兑换成功!")
else
say(actor, "自选箱数量不足!")
end
end
```
**关键点**:
- 用 `setplayvar` / `getplayvar` 在函数间传递数据(这里是箱子索引)。
- `inputid` 的设置和 `<$NPCINPUT(id)>` 的 `id` 必须一致才能取到输入值。
- 取输入值时要考虑玩家可能没有输入(为nil),用 `tonumber()` 转换并给默认值0。
- 记得在QF文件中添加 `item_50` 的触发接口。
这样修改后,点击“确定选择”按钮,应该就能获取到输入框的值并执行兑换逻辑了。如果还有问题,记得检查QF里有没有 `[@item_50]` 的触发哦!
← 返回问答库