我是lua后端老师!
小仙,你好!看了你的代码,主要问题在于变量存储和读取的逻辑上。你的代码中使用了`GetStr`和`SetStr`,但根据你的上下文,应该使用996引擎的变量操作函数。我们来一步步分析:
首先,你的`pickUpItem`函数里使用了`GetStr`和`SetStr`,这看起来是自定义函数,但引擎内置的变量操作函数是`getplayvar`和`setplayvar`(或者`getsysvar`/`setsysvar`用于全局变量)。你需要检查`GMLib:varToTable`和`SetStr`这些自定义函数的具体实现,确保它们能正确读写变量。
其次,代码中打印了`11111111`和`3333`,但没有打印`666`和后续的`555`、`123`、`345`,这说明`getiteminfo`函数可能没有返回预期的`itemId`,或者`itemInfo`参数不是有效的物品对象。在996引擎中,`pickupitemfrontex`或类似触发传递的`itemInfo`通常是物品对象,你需要用正确的函数获取物品ID。
这里给你一个修改思路,使用引擎内置函数来重写核心逻辑:
```lua
function FuLiDaTing2:pickUpItem(actor, itemObj)
-- 首先,确保actor和itemObj有效
if not actor or not itemObj then
return
end
-- 使用getiteminfo获取物品的Idx(物品表中ID)
-- 参数说明: actor=玩家对象, itemObj=物品对象, 2=获取物品Idx
local itemIdx = getiteminfo(actor, itemObj, 2)
if not itemIdx then
release_print("获取物品ID失败")
return
end
release_print("玩家捡取了物品,物品ID:", itemIdx)
-- 使用getplayvar读取玩家变量
local varData = getplayvar(actor, self.VarDT)
local data = {}
-- 如果变量存在且是字符串,尝试转换为table
if varData and type(varData) == "string" and varData ~= "" then
-- 这里假设变量存储的是json字符串,需要根据实际情况解析
-- 可以使用tbl2json/json2tbl,或者你的自定义解析函数
data = json2tbl(varData) or {}
end
-- 遍历配置表
for i = 1, 40 do
local cfg = self.cfg[i]
if cfg and cfg.equip then
for j = 1, #cfg.equip do
local needItemIdx = cfg.equip[j]
if itemIdx == needItemIdx then
local key = "got_" .. i
if not data[key] then
-- 标记已领取
data[key] = 1
-- 使用setplayvar存储变量
local saveData = tbl2json(data) -- 将table转为json字符串存储
setplayvar(actor, self.VarDT, saveData)
-- 发放奖励
if cfg.give then
-- 使用gives函数发放奖励
gives(actor, cfg.give)
release_print("发放奖励:", cfg.give)
end
-- 获取物品名称显示
local itemName = getiteminfo(actor, itemObj, 1) or "未知装备"
sendmsg(actor, "恭喜您!拾取【"..itemName.."】首爆成功!奖励已发放!", 1)
return -- 找到匹配后直接返回,避免重复处理
else
release_print("玩家已领取过该首爆奖励,配置ID:", i)
end
end
end
end
end
end
```
**关键点提醒:**
1. **变量操作**:确保使用正确的变量操作函数。`getplayvar`和`setplayvar`用于玩家私有变量。
2. **数据格式**:引擎变量通常存储字符串,如果你要存table,需要序列化为json字符串(用`tbl2json`),读取时再解析(用`json2tbl`)。
3. **物品信息**:`getiteminfo(actor, itemObj, 2)` 获取的是物品表中`Idx`字段,请确认你的`cfg.equip`配置里存的是不是这个ID。
4. **触发匹配**:在循环中找到匹配项并发放奖励后,建议用`return`退出函数,避免不必要的后续循环。
**调试建议:**
在函数开始处多加几个`release_print`,打印`itemIdx`、`varData`的原始值和解析后的`data`,看看数据到底在哪一步出了问题。
如果还有问题,可以把`GMLib:varToTable`和`SetStr`的实现也贴出来看看,或者直接使用引擎内置函数来重写变量存取部分。记住,不懂的可以问浮生梦尊师哦!