---@diagnostic disable: undefined-global, invert-if, unresolved-require
local cfg = require("Envir.core.Npc配置.人物转生配置")
local function main(actor, msgID, param1, param2, param3, str)
if msgID == 4 and param1 == 1 then
local reincarnation_l
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-04-05 20:47:01 |
👁️ 阅读: 0
我是lua后端老师!小仙,我来帮你看看这段转生脚本。代码整体逻辑没问题,但有几个地方可以优化,特别是性能方面。
```lua
---@diagnostic disable: undefined-global, invert-if, unresolved-require
local cfg = require("Envir.core.Npc配置.人物转生配置")
local function main(actor, msgID, param1, param2, param3, str)
if msgID == 4 and param1 == 1 then
-- 先获取当前转生等级
local reincarnation_level = getbaseinfo(actor, 39, param3)
local next_cfg = cfg[reincarnation_level + 1]
if not next_cfg then
sendcentermsg(actor, 180, 0, "转生已达最大等级", 0, 3)
return
end
-- 提前返回,减少不必要的计算
local level = getbaseinfo(actor, 6)
if level < 100 then
sendcentermsg(actor, 180, 0, "等级不足100", 0, 3)
return
end
-- 检查元宝
local money = querymoney(actor, 2)
if money < next_cfg.money then
sendcentermsg(actor, 180, 0, "元宝不足" .. next_cfg.money, 0, 3)
return
end
-- 检查进阶石
local stone = getbagitemcount(actor, "进阶石", 0)
if stone < next_cfg.stone then
sendcentermsg(actor, 180, 0, "进阶石不足" .. next_cfg.stone, 0, 3)
return
end
-- 记录转生前等级
local before_level = getbaseinfo(actor, 39)
-- 扣除材料
local deduct_money = changemoney(actor, 2, "-", next_cfg.money, "转生扣除", 1)
local deduct_stone = takeitem(actor, "进阶石", next_cfg.stone, 0)
if deduct_money and deduct_stone then
renewlevel(actor, 1, 1, 10)
-- 检查转生结果
local after_level = getbaseinfo(actor, 39, param3)
if after_level > before_level then
sendcentermsg(actor, 180, 0, "转生成功!当前转生等级:" .. after_level, 0, 3)
else
-- 转生失败,返还材料
changemoney(actor, 2, "+", next_cfg.money, "转生失败返还", 1)
giveitem(actor, "进阶石", next_cfg.stone, 0) -- 注意:这里应该是进阶石,不是转生石
sendcentermsg(actor, 180, 0, "转生失败,材料已返还", 0, 3)
end
else
sendcentermsg(actor, 180, 0, "扣除材料失败", 0, 3)
end
end
end
return { main = main }
```
**优化点说明:**
1. **性能优化**:将条件检查提前,避免不必要的函数调用。比如先检查等级,再检查元宝和材料,这样如果等级不足就直接返回,不会执行后面的查询。
2. **变量命名**:将`next`改为`next_cfg`,避免与Lua关键字冲突。
3. **逻辑修复**:第45行原本是`giveitem(actor, "转生石", next.stone, 0)`,但前面扣除的是"进阶石",这里应该保持一致,改为"进阶石"。
4. **代码可读性**:将硬编码的`100`改为直接使用数字,避免使用不必要的变量`int`。
5. **错误处理**:在返还元宝时也添加了描述参数,保持一致性。
**特别注意:** 这个脚本应该是通过`sendluamsg`触发的,记得在QF文件中添加对应的接口触发。另外,`renewlevel`函数的参数需要确认是否正确,这个函数是用来重置等级还是进行转生操作。
如果还有不明白的地方,随时问我!浮生梦尊师说过,写脚本要像修仙一样,既要追求功能强大,也要注重性能效率!
我是lua后端老师!小仙,我来帮你看看这段转生脚本。代码整体逻辑没问题,但有几个地方可以优化,特别是性能方面。
```lua
---@diagnostic disable: undefined-global, invert-if, unresolved-require
local cfg = require("Envir.core.Npc配置.人物转生配置")
local function main(actor, msgID, param1, param2, param3, str)
if msgID == 4 and param1 == 1 then
-- 先获取当前转生等级
local reincarnation_level = getbaseinfo(actor, 39, param3)
local next_cfg = cfg[reincarnation_level + 1]
if not next_cfg then
sendcentermsg(actor, 180, 0, "转生已达最大等级", 0, 3)
return
end
-- 提前返回,减少不必要的计算
local level = getbaseinfo(actor, 6)
if level < 100 then
sendcentermsg(actor, 180, 0, "等级不足100", 0, 3)
return
end
-- 检查元宝
local money = querymoney(actor, 2)
if money < next_cfg.money then
sendcentermsg(actor, 180, 0, "元宝不足" .. next_cfg.money, 0, 3)
return
end
-- 检查进阶石
local stone = getbagitemcount(actor, "进阶石", 0)
if stone < next_cfg.stone then
sendcentermsg(actor, 180, 0, "进阶石不足" .. next_cfg.stone, 0, 3)
return
end
-- 记录转生前等级
local before_level = getbaseinfo(actor, 39)
-- 扣除材料
local deduct_money = changemoney(actor, 2, "-", next_cfg.money, "转生扣除", 1)
local deduct_stone = takeitem(actor, "进阶石", next_cfg.stone, 0)
if deduct_money and deduct_stone then
renewlevel(actor, 1, 1, 10)
-- 检查转生结果
local after_level = getbaseinfo(actor, 39, param3)
if after_level > before_level then
sendcentermsg(actor, 180, 0, "转生成功!当前转生等级:" .. after_level, 0, 3)
else
-- 转生失败,返还材料
changemoney(actor, 2, "+", next_cfg.money, "转生失败返还", 1)
giveitem(actor, "进阶石", next_cfg.stone, 0) -- 注意:这里应该是进阶石,不是转生石
sendcentermsg(actor, 180, 0, "转生失败,材料已返还", 0, 3)
end
else
sendcentermsg(actor, 180, 0, "扣除材料失败", 0, 3)
end
end
end
return { main = main }
```
**优化点说明:**
1. **性能优化**:将条件检查提前,避免不必要的函数调用。比如先检查等级,再检查元宝和材料,这样如果等级不足就直接返回,不会执行后面的查询。
2. **变量命名**:将`next`改为`next_cfg`,避免与Lua关键字冲突。
3. **逻辑修复**:第45行原本是`giveitem(actor, "转生石", next.stone, 0)`,但前面扣除的是"进阶石",这里应该保持一致,改为"进阶石"。
4. **代码可读性**:将硬编码的`100`改为直接使用数字,避免使用不必要的变量`int`。
5. **错误处理**:在返还元宝时也添加了描述参数,保持一致性。
**特别注意:** 这个脚本应该是通过`sendluamsg`触发的,记得在QF文件中添加对应的接口触发。另外,`renewlevel`函数的参数需要确认是否正确,这个函数是用来重置等级还是进行转生操作。
如果还有不明白的地方,随时问我!浮生梦尊师说过,写脚本要像修仙一样,既要追求功能强大,也要注重性能效率!
← 返回问答库