-- server.lua
local luosha_server = {}
-- 装备定义
local EQUIPMENTS = {
{id = 51433, name = "【禁忌ミ魂器】·罗刹骨", prob = 50, desc = "略有聪慧,但威力不俗。"},
{id = 51434, name = "【神级ミ魂器】·罗刹骨", prob = 30, desc = "锻造精良,蕴含修罗战意。"},
{id = 51435, name = "【至尊ミ魂器】·罗
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-26 18:45:21 |
👁️ 阅读: 3
我是lua后端老师!小仙,看了你的代码,你的需求我明白了。你想在点击“回收装备”按钮时,不重置 `U56` 这个变量,只是单纯地收回背包里已经打造出的装备,然后再进行一次随机分配,对吧?
你的代码逻辑基本是正确的,但有两个小问题需要调整:
1. **重置时机不对**:你希望在 `arg2 == 2` 的回收逻辑里,只回收装备,不重置 `U56`。这样玩家回收后,`U56` 仍然是 `1`,可以再次点击 `arg2 == 1` 进行“打造”(即随机分配装备)。这个想法是对的,但你的代码在 `arg2 == 1` 的逻辑里,`lib:setvalueb(actor, "U56", 2)` 这行代码放错了位置。它被放在了 `for` 循环里面,这会导致无论随机到哪件装备,循环结束后 `U56` 都会被设为 `2`,然后玩家就无法再次打造了。这行代码应该放在成功获得装备之后,或者根据你的需求,**干脆不要设置 `U56` 为 2**,因为你希望回收后还能再打造。
2. **消息拼接错误**:在 `arg2 == 2` 的回收成功消息里,你使用了单引号来拼接字符串,这在Lua里会导致语法错误。Lua的字符串拼接应该用 `..` 运算符,并且字符串要用相同的引号(双引号或单引号)包裹。
让我们来修正这两个问题,并优化一下逻辑。主要修改点:
* 移除 `arg2 == 1` 中不必要的 `lib:setvalueb(actor, "U56", 2)`。
* 修正 `arg2 == 2` 中的消息拼接语法。
* 在 `arg2 == 2` 回收成功后,**不重置** `U56`,这样玩家状态依然是“已提交材料”,可以直接再次点击“打造”按钮。
以下是修改后的 `arg2 == 1` 和 `arg2 == 2` 部分代码:
```lua
elseif arg2 == 1 then
if rlv < 1 then
lib:msg(actor, "你还没有提交相应物品,无法进行打造。", 1)
return
end
-- 重置随机数种子
math.randomseed(tostring(os.time()):reverse():sub(1, 7))
local randomNum = math.random(1, totalProb)
release_print("随机数:", randomNum, "总概率:", totalProb)
local selectedEquip = nil
local cumulativeProb = 0
for _, equip in ipairs(EQUIPMENTS) do
cumulativeProb = cumulativeProb + equip.prob
release_print("装备:", equip.name, "概率:", equip.prob, "累计概率:", cumulativeProb)
if randomNum <= cumulativeProb then
selectedEquip = equip
break
end
-- 注意:这里移除了 lib:setvalueb(actor, "U56", 2)
-- 我们不需要在获得装备后把状态改为2,以便回收后还能再打造。
end
if selectedEquip then
-- 将随机装备给予玩家
giveitem(actor, selectedEquip.name, 1)
-- 发送消息给前端展示
local msg = {
action = "show_random_equip",
equipId = selectedEquip.id,
equipName = selectedEquip.name,
equipDesc = selectedEquip.desc
}
local jsonstr = tbl2json(msg)
sendluamsg(58003, 0, 0, 0, jsonstr)
lib:msg(actor, "恭喜你获得了:" .. selectedEquip.name, 1)
-- 重要:我们不再这里重置 U56,保持为1,允许回收后再次打造。
-- lib:setvalueb(actor, "U56", 2) -- 这行被注释掉了
else
lib:msg(actor, "随机生成装备失败,请重试。", 1)
end
elseif arg2 == 2 then
-- 回收装备,重新打造
local hasEquipToReturn = false
local returnedEquipName = ""
-- 遍历所有可打造的装备,检查背包里是否有
for _, equip in ipairs(EQUIPMENTS) do
if hasitem(actor, equip.name) then
-- 找到装备,准备扣除
hasEquipToReturn = true
returnedEquipName = equip.name
takeitem(actor, equip.name, 1) -- 扣除一件
-- 修正字符串拼接语法
lib:msg(actor, "<font color='#ff9900'>已收回「" .. returnedEquipName .. "」,你可以重新提交材料进行打造了。</font>", 1)
break -- 找到一个就退出循环,假设一次只打造一件
end
end
if hasEquipToReturn then
-- 成功收回装备,但**不重置**投喂次数 U56。
-- lib:setvalueb(actor, "U56", 0) -- 这行被注释掉了
-- 此时 U56 仍然为 1,玩家可以立刻点击 arg2 == 1 再次随机获得装备。
lib:msg(actor, "装备已回收,请点击“开始打造”按钮重新随机获取装备。", 1)
else
-- 背包里没有可回收的指定装备
lib:msg(actor, "你的背包中没有本次可回收的打造装备。", 1)
end
end
```
**修改后的流程说明:**
1. 玩家提交材料 (`arg2==0`),`U56` 设为 `1`。
2. 玩家点击打造 (`arg2==1`),随机获得一件装备,`U56` **保持为 `1`**。
3. 玩家对装备不满意,点击回收 (`arg2==2`),装备被收回,`U56` **依然为 `1`**。
4. 玩家可以再次点击打造 (`arg2==1`),因为 `U56` 是 `1`,所以会立刻再进行一次随机分配,无需重新提交材料。
这样就能实现“回收旧装备,再随机给一个新装备”的循环了。小仙,你看这样是不是符合你的需求了?如果还有哪里不明白,随时问我,或者去请教浮生梦尊师也行!
← 返回问答库