local baixiaosheng = {}
-- 定义称号列表
local titleList = {
"暗金魔气",
"血木魔气",
"黑水魔气",
"啖火魔气",
"戾土魔气"
}
-- 五行の暗魔体称号
local wuxingTitle = "五行の暗魔体"
function baixiaosheng.link(actor, msgid, arg1, arg2, arg3, sMsg)
if not cfg_baixiaoshe
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-10 22:38:11 |
👁️ 阅读: 8
你好,我是lua后端老师!
看了你提供的代码,修仙者,这是一个实现称号收集和兑换系统的Lua脚本。整体思路清晰,功能也完整,但存在一些需要优化和修正的地方,尤其是在引擎接口的使用和逻辑处理上。
首先,代码中定义了两个同名的 `baixiaosheng.link` 函数,这会覆盖掉第一个定义,导致逻辑混乱。需要将两个函数合并。
其次,关于你提到的“元宝”扣除,代码中使用了 `changemoney(actor, 1, "-", needmoney, "百晓生抽取", true)`。根据引擎接口规范,参数2为1时,操作的是“金币”,而不是“元宝”。操作“元宝”应该使用 `querymoney(actor, 2)` 查询,并用 `changemoney(actor, 2, "-", needmoney, "百晓生抽取", true)` 来扣除。
另外,`lib:msg` 这个函数在引擎标准库中并不存在,建议使用引擎提供的 `sendmsg` 或 `sendmsgnew` 接口来向玩家发送消息。
下面是一个整合并优化后的版本,主要修正了上述问题,并增强了代码的可读性和健壮性:
```lua
local baixiaosheng = {}
-- 定义称号列表
local titleList = {
"暗金魔气",
"血木魔气",
"黑水魔气",
"啖火魔气",
"戾土魔气"
}
-- 终极称号
local wuxingTitle = "五行の暗魔体"
-- 检查是否集齐五个称号
function baixiaosheng.checkAllTitles(actor)
for _, title in ipairs(titleList) do
local titleCount = getbagitemcount(actor, title) -- 检查背包中指定物品的数量
if titleCount <= 0 then
return false, title -- 返回false和缺失的称号名
end
end
return true, nil
end
-- 获取玩家尚未拥有的称号列表
function baixiaosheng.getMissingTitles(actor)
local missing = {}
for _, title in ipairs(titleList) do
local titleCount = getbagitemcount(actor, title)
if titleCount <= 0 then
table.insert(missing, title)
end
end
return missing
end
-- 主处理函数
function baixiaosheng.link(actor, msgid, arg1, arg2, arg3, sMsg)
-- 检查配置(假设cfg_baixiaosheng是全局配置表)
if not cfg_baixiaosheng or not next(cfg_baixiaosheng) then
sendmsg(actor, "配置错误", 1) -- 使用sendmsg发送消息,参数3为消息颜色/类型
return
end
-- 提交化魔志 (arg2 == 2)
if arg2 == 2 then
local needItemCount = 1
local currentItemCount = getbagitemcount(actor, "化魔志")
if currentItemCount < needItemCount then
sendmsg(actor, "你还没有化魔志", 1)
else
takeitem(actor, "化魔志", needItemCount) -- 扣除物品
sendmsg(actor, "提交成功", 1)
end
return
end
-- 使用化魔志抽奖 (arg2 == 3)
if arg2 == 3 then
local needItemCount = 3
local currentItemCount = getbagitemcount(actor, "化魔志")
if currentItemCount < needItemCount then
sendmsg(actor, "化魔志数量不足,需要"..needItemCount.."个", 1)
return
end
-- 检查是否已集齐所有基础称号
local hasAll, _ = baixiaosheng.checkAllTitles(actor)
if hasAll then
sendmsg(actor, "你已经集齐所有魔气称号,请先兑换终极称号!", 1)
return
end
-- 扣除化魔志
takeitem(actor, "化魔志", needItemCount)
-- 25%成功率判断
local randomNum = math.random(1, 100)
if randomNum > 25 then
sendmsg(actor, "抽取失败,运气不佳", 1)
return
end
-- 成功:随机抽取一个玩家尚未拥有的称号
local missingTitles = baixiaosheng.getMissingTitles(actor)
if #missingTitles == 0 then
sendmsg(actor, "未知错误:未检测到缺失称号", 1)
return
end
local randomIndex = math.random(1, #missingTitles)
local getTitle = missingTitles[randomIndex]
-- 给予玩家称号
giveitem(actor, getTitle, 1) -- 给予物品
sendmsg(actor, "恭喜你!获得称号:" .. getTitle, 1)
-- 再次检查是否集齐
local nowHasAll, _ = baixiaosheng.checkAllTitles(actor)
if nowHasAll then
sendmsg(actor, "你已集齐所有魔气称号,可以兑换【" .. wuxingTitle .. "】了!", 1)
end
return
end
-- 使用元宝抽奖 (arg2 == 4)
if arg2 == 4 then
local needYuanBao = 660000
local currentYuanBao = querymoney(actor, 2) -- 查询元宝,参数2=2表示元宝
if currentYuanBao < needYuanBao then
sendmsg(actor, "你的元宝不足,需要"..needYuanBao.."元宝", 1)
return
end
-- 检查是否已集齐所有基础称号
local hasAll, _ = baixiaosheng.checkAllTitles(actor)
if hasAll then
sendmsg(actor, "你已经集齐所有魔气称号,请先兑换终极称号!", 1)
return
end
-- 扣除元宝
changemoney(actor, 2, "-", needYuanBao, "百晓生抽取", true) -- 扣除元宝,参数2=2
-- 25%成功率判断
local randomNum = math.random(1, 100)
if randomNum > 25 then
sendmsg(actor, "抽取失败,运气不佳", 1)
return
end
-- 成功:随机抽取一个玩家尚未拥有的称号
local missingTitles = baixiaosheng.getMissingTitles(actor)
if #missingTitles == 0 then
sendmsg(actor, "未知错误:未检测到缺失称号", 1)
return
end
local randomIndex = math.random(1, #missingTitles)
local getTitle = missingTitles[randomIndex]
-- 给予玩家称号
giveitem(actor, getTitle, 1)
sendmsg(actor, "恭喜你!获得称号:" .. getTitle, 1)
-- 再次检查是否集齐
local nowHasAll, _ = baixiaosheng.checkAllTitles(actor)
if nowHasAll then
sendmsg(actor, "你已集齐所有魔气称号,可以兑换【" .. wuxingTitle .. "】了!", 1)
end
return
end
-- 兑换终极称号 (arg2 == 5)
if arg2 == 5 then
-- 检查是否集齐五个称号
local hasAll, missingTitle = baixiaosheng.checkAllTitles(actor)
if hasAll then
-- 收回五个称号
for _, title in ipairs(titleList) do
takeitem(actor, title, 1)
end
-- 给予五行の暗魔体称号
giveitem(actor, wuxingTitle, 1)
sendmsg(actor, "恭喜你!获得终极称号:" .. wuxingTitle, 1)
else
local missingTitles = baixiaosheng.getMissingTitles(actor)
sendmsg(actor, "兑换失败,你还缺少以下称号:" .. table.concat(missingTitles, "、"), 1)
end
return
end
-- 如果arg2未匹配任何已知操作
sendmsg(actor, "未知的操作选项", 1)
end
return baixiaosheng
```
**主要修改和优化点:**
1. **合并函数**:将两个 `link` 函数合并为一个,避免覆盖。
2. **修正货币操作**:将元宝的查询和扣除参数从 `1` 改为 `2`,符合引擎规范(1=金币,2=元宝)。
3. **替换消息接口**:将 `lib:msg` 替换为引擎标准接口 `sendmsg`。
4. **增强逻辑**:
* 在抽奖前增加了“是否已集齐”的检查,避免无意义的抽取。
* 将“检查缺失称号”和“获取缺失称号列表”抽成独立函数,逻辑更清晰。
* 为每个 `if arg2 == ...` 分支添加了 `return`,确保执行后退出,避免意外执行后续代码。
* 添加了未匹配操作的处理。
**使用提醒:**
* 这个脚本需要被 `QF` 文件中的某个触发(比如 `clicknpc`)调用,并将 `arg2` 参数传递进来。
* 确保 `cfg_baixiaosheng` 这个配置表在脚本被加载时已经正确初始化,否则会提示配置错误。
* `sendmsg` 的最后一个参数 `1` 代表消息颜色,你可以根据引擎文档调整。
如果还有不明白的地方,随时可以再问我,或者去请教我的师傅浮生梦尊师!祝你脚本编写顺利。
← 返回问答库