local qingxukezhan = {}
-- 通用成功率判断函数
local function checkSuccessRate(actor, buttonName)
local randomNum = math.random(1, 100)
if randomNum <= 20 then
p(buttonName .. " 抽取成功")
return true
else
p(buttonName .. " 抽取
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-14 16:25:19 |
👁️ 阅读: 20
我是lua后端老师!
小仙,我来帮你分析一下代码问题。从你的描述来看,即使没有材料也能触发"解忧失败,运气不佳"的提示,这说明成功率判断的逻辑有问题。
让我先看看你的代码结构,问题主要出在`checkSuccessRate`函数和材料检查的顺序上。在你的代码中,先检查成功率,然后才检查材料,这样即使没有材料也会先弹出成功率失败的提示。
根据参考资料中的性能优化建议,我们需要将耗时操作放在后面,并且修正逻辑顺序。这里有几个问题需要修正:
1. **使用`release_print()`而不是`p()`** - 这是引擎推荐的调试输出方式
2. **先检查材料,再检查成功率** - 这样更符合逻辑
3. **优化代码结构** - 减少不必要的计算
让我给你修正后的完整代码:
```lua
local qingxukezhan = {}
-- 通用成功率判断函数 -- 注解:检查操作是否成功
local function checkSuccessRate(actor, buttonName)
local randomNum = math.random(1, 100)
if randomNum <= 20 then
release_print(buttonName .. " 抽取成功")
return true
else
release_print(buttonName .. " 抽取失败,运气不佳")
return false
end
end
function qingxukezhan.link(actor, msgid, arg1, arg2, arg3, sMsg)
if not cfg_qingxukezhan or not next(cfg_qingxukezhan) then
lib:msg(actor, "配置错误")
return
end
if arg2 == 0 then
local rlv1 = lib:getvalueb(actor, "U37") or 0
release_print("当前白月光等级:" .. rlv1)
local needItemCount = 1
local currentItemCount = getbagitemcount(actor, "封印の情绪I")
-- 先检查材料是否足够
if currentItemCount < needItemCount then
lib:msg(actor, "你还没有封印の情绪I", 1)
return
end
-- 再检查成功率
if not checkSuccessRate(actor, "白月光") then
lib:msg(actor, "解忧失败,运气不佳", 1)
return
end
-- 材料扣除和升级操作
takeitem(actor, "封印の情绪I", needItemCount)
lib:setvalueb(actor, "U37", rlv1 + 1)
lib:msg(actor, "白月光解忧成功", 1)
addattlist(actor, "解忧攻击力", "+", "3#202#20")
return
end
if arg2 == 1 then
local rlv2 = lib:getvalueb(actor, "U38") or 0
release_print("当前得不到等级:" .. rlv2)
local needItemCount = 1
local currentItemCount = getbagitemcount(actor, "封印の情绪Il")
-- 先检查材料是否足够
if currentItemCount < needItemCount then
lib:msg(actor, "你还没有封印の情绪Il", 1)
return
end
-- 再检查成功率
if not checkSuccessRate(actor, "得不到") then
lib:msg(actor, "解忧失败,运气不佳", 1)
return
end
takeitem(actor, "封印の情绪Il", needItemCount)
lib:setvalueb(actor, "U38", rlv2 + 1)
lib:msg(actor, "得不到解忧成功", 1)
addattlist(actor, "解忧生命值", "+", "3#1#20")
return
end
if arg2 == 2 then
local rlv3 = lib:getvalueb(actor, "U39") or 0
release_print("当前不满足等级:" .. rlv3)
local needItemCount = 1
local currentItemCount = getbagitemcount(actor, "封印の情绪Ill")
-- 先检查材料是否足够
if currentItemCount < needItemCount then
lib:msg(actor, "你还没有封印の情绪Ill", 1)
return
end
-- 再检查成功率
if not checkSuccessRate(actor, "不满足") then
lib:msg(actor, "解忧失败,运气不佳", 1)
return
end
takeitem(actor, "封印の情绪Ill", needItemCount)
lib:setvalueb(actor, "U39", rlv3 + 1)
lib:msg(actor, "不满足解忧成功", 1)
addattlist(actor, "解忧切割", "+", "3#215#100")
return
end
if arg2 == 3 then
local rlv4 = lib:getvalueb(actor, "U40") or 0
release_print("当前偏执狂等级:" .. rlv4)
local needItemCount = 1
local currentItemCount = getbagitemcount(actor, "封印の情绪IV")
-- 先检查材料是否足够
if currentItemCount < needItemCount then
lib:msg(actor, "你还没有封印の情绪IV", 1)
return
end
-- 再检查成功率
if not checkSuccessRate(actor, "偏执狂") then
lib:msg(actor, "解忧失败,运气不佳", 1)
return
end
takeitem(actor, "封印の情绪IV", needItemCount)
lib:setvalueb(actor, "U40", rlv4 + 1)
lib:msg(actor, "偏执狂解忧成功", 1)
addattlist(actor, "解忧人物切割", "+", "3#216#50")
return
end
if arg2 == 4 then
local rlv5 = lib:getvalueb(actor, "U41") or 0
release_print("当前犟拐拐等级:" .. rlv5)
local needItemCount = 1
local currentItemCount = getbagitemcount(actor, "封印の情结V")
-- 先检查材料是否足够
if currentItemCount < needItemCount then
lib:msg(actor, "你还没有封印の情结V", 1)
return
end
-- 再检查成功率
if not checkSuccessRate(actor, "犟拐拐") then
lib:msg(actor, "解忧失败,运气不佳", 1)
return
end
takeitem(actor, "封印の情结V", needItemCount)
lib:setvalueb(actor, "U41", rlv5 + 1)
lib:msg(actor, "犟拐拐解忧成功", 1)
addattlist(actor, "解忧吸血", "+", "3#34#100")
return
end
if arg2 == 5 then
local rlv6 = lib:getvalueb(actor, "U42") or 0
release_print("当前自大狂等级:" .. rlv6)
local needItemCount = 1
local currentItemCount = getbagitemcount(actor, "封印の情结VI")
-- 先检查材料是否足够
if currentItemCount < needItemCount then
lib:msg(actor, "你还没有封印の情结VI", 1)
return
end
-- 再检查成功率
if not checkSuccessRate(actor, "自大狂") then
lib:msg(actor, "解忧失败,运气不佳", 1)
return
end
takeitem(actor, "封印の情结VI", needItemCount)
lib:setvalueb(actor, "U42", rlv6 + 1)
lib:msg(actor, "自大狂解忧成功", 1)
addattlist(actor, "解忧打怪爆率", "+", "3#221#0.25")
return
end
if arg2 == 6 then
local maxLevel = 500
local itemMap = {
["U37"] = {itemName = "封印の情绪I", attId = 202, valuePerLevel = 20},
["U38"] = {itemName = "封印の情绪Il", attId = 1, valuePerLevel = 200},
["U39"] = {itemName = "封印の情绪Ill", attId = 215, valuePerLevel = 100},
["U40"] = {itemName = "封印の情绪IV", attId = 216, valuePerLevel = 50},
["U41"] = {itemName = "封印の情结V", attId = 34, valuePerLevel = 100},
["U42"] = {itemName = "封印の情结VI", attId = 221, valuePerLevel = 0.25}
}
local varList = {"U37", "U38", "U39", "U40", "U41", "U42"}
local hasUpgraded = false
for _, varName in ipairs(varList) do
local currentLevel = lib:getvalueb(actor, varName) or 0
if currentLevel < maxLevel then
local itemInfo = itemMap[varName]
if checkitems(actor, itemInfo.itemName .. "#1", 0, 0) then
takes(actor, itemInfo.itemName .. "#1", 0, 0)
local newLevel = currentLevel + 1
lib:setvalueb(actor, varName, newLevel)
addattlist(actor, "解忧加成", "+", "3#" .. itemInfo.attId .. "#" .. itemInfo.valuePerLevel)
release_print(varName .. " 升级成功,当前等级:" .. newLevel .. ",消耗1个" .. itemInfo.itemName)
lib:msg(actor, itemInfo.itemName .. " 升级成功,当前等级:" .. newLevel, 1)
hasUpgraded = true
else
lib:msg(actor, itemInfo.itemName .. " 数量不足,无法升级", 1)
end
else
release_print(varName .. " 已满500级,无需操作")
end
end
local allMax = true
for _, varName in ipairs(varList) do
local currentLevel = lib:getvalueb(actor, varName) or 0
if currentLevel < maxLevel then
allMax = false
break
end
end
if allMax then
if not checktitle(actor, "主打一个陪伴") then
if confertitle(actor, "主打一个陪伴", 1) then
lib:msg(actor, "恭喜!所有情绪解忧圆满,获得【主打一个陪伴】称号!", 1)
release_print("玩家 " .. actor .. " 获得【主打一个陪伴】称号")
else
lib:msg(actor, "称号添加失败,请联系管理员", 1)
end
else
lib:msg(actor, "你已拥有【主打一个陪伴】称号", 1)
end
end
end
end
return qingxukezhan
```
**主要修改点:**
1. **逻辑顺序修正**:现在先检查材料是否足够,如果材料不足直接返回提示,不会进入成功率判断
2. **输出函数替换**:将所有的`p()`函数替换为`release_print()`,这是引擎推荐的调试方式
3. **代码结构优化**:每个解忧操作都按照"检查材料 → 检查成功率 → 执行操作"的顺序
这样修改后,当玩家没有材料时,会直接提示"你还没有封印の情绪X",而不会出现"解忧失败,运气不佳"的误导提示了。
小仙,记得以后写逻辑的时候要注意顺序问题,先检查必要条件,再执行随机判断,这样用户体验会更好哦!如果还有其他问题,随时问我!
← 返回问答库