-- p1: 切换显示 初次激活
local t = DATA.mingwen
function mingwen_main(play,p1,p2,p3)
local sc = ""
p2 = tonumber(p2) or getplaydef(play,"N$铭文界面p2")
-- 进度条读取中
local current_tiem = os.time()
local last_time = getint(play,"首次领悟铭文")
if c
后端Lua尊者:嗨,修仙者!我是lua后端老师!
看了你的代码,问题出在重置铭文时,`ransjstr`函数可能会从同一个品质的列表中重复抽取到同一个铭文。你需要一个机制来确保在本次重置中,不会抽取到当前已经装备的铭文。
修改思路是:在重置时,先获取当前装备的铭文名称,然后在随机抽取时,如果抽到了相同的,就重新抽取,直到抽到不同的为止。
这里我们修改 `mingwen_chongzhi` 函数中的随机抽取部分。为了代码清晰,我们可以封装一个辅助函数。
```lua
-- 辅助函数:从指定品质列表中随机抽取一个与当前装备不同的铭文
local function getRandomMingwenExcludingCurrent(play, slot, quality, currentMingwen)
local mingwenList = DATA.mingwen.info[slot][quality] -- 获取该位置、该品质的铭文列表
if not mingwenList then
return nil
end
local newMingwen = ransjstr(table.concat(mingwenList, "#"), 1, 3) -- 先随机一次
local attempts = 0
local maxAttempts = 10 -- 防止死循环,设置最大尝试次数
-- 如果随机到的铭文和当前装备的一样,并且列表中有其他选择,则重新随机
while newMingwen == currentMingwen and #mingwenList > 1 and attempts < maxAttempts do
newMingwen = ransjstr(table.concat(mingwenList, "#"), 1, 3)
attempts = attempts + 1
end
return newMingwen
end
```
然后,修改 `mingwen_chongzhi` 函数中重置部分的逻辑:
```lua
-- 重置铭文
function mingwen_chongzhi(play,p1,p2)
local p2 = getplaydef(play,"N$铭文界面p2")
-- 消耗
local cur_money = querymoney(play,14)
local tar_money = DATA.mingwen.num[p2]
if cur_money < tar_money then
return sendmsg(play, 1, '{"Msg":"<font color=\'#ff0000\'>猎魂值不足!!</font>","Type":9}')
end
-- 任务29
local task_id = getplaydef(play,"U40")
local task_wancheng = getplaydef(play,"U42")
if task_id == 29 and task_wancheng == 0 then
newcompletetask(play, task_id)
setplaydef(play, "U42", 1)
end
-- 先获取当前装备的铭文名称
local currentEquippedMingwen = getstr(play, "铭文装备"..p2)
takew(play, currentEquippedMingwen, 1, "铭文重置") -- 脱下当前铭文
changemoney(play, 14, "-", tar_money, "铭文洗练", true)
sendmsg(play, 1, '{"Msg":"[提示] : 消耗猎魂值*'.. tar_money ..'","FColor":255,"BColor":219,"Type":1}')
-- 随机品质
local ran = ransjstr(DATA.mingwen.ran, 1, 3)
-- 使用新的函数获取一个与当前不同的铭文
local v = getRandomMingwenExcludingCurrent(play, p2, ran, currentEquippedMingwen)
-- 如果经过尝试后v还是nil或者和原来一样(比如列表里只有一个),我们可以做降级处理或者直接使用。
-- 这里我们做一个简单处理:如果v是nil,则从该品质列表中取第一个(假设列表不为空)
if not v or v == "" then
local mingwenList = DATA.mingwen.info[p2][ran]
if mingwenList and #mingwenList > 0 then
v = mingwenList[1] -- 注意:这里假设mingwenList是数组。根据你的数据结构,它可能是用"#"拼接的字符串,也可能是表。
-- 根据你DATA.mingwen.info的结构,它看起来是一个包含字符串的表。我们需要调整。
-- 实际上,你的DATA.mingwen.info[p2][ran] 是一个表,里面是字符串,例如 {"狂屠印","戮兽印"}
-- 所以我们可以这样取第一个:
-- 但为了兼容,我们最好先判断类型
end
end
-- 如果v还是和原来一样(比如该品质只有一个铭文),那也没办法了,只能给一样的。
-- 但通常一个品质会有多个铭文,所以这种情况很少。
setstr(play, "铭文装备"..p2, v)
setstr(play, "铭文类型"..p2, ran)
setstr(play, "铭文图片"..p2, DATA.mingwen.buff[v][2]) -- 注意:这里直接用了DATA.mingwen.buff,你的代码里有这个表吗?我好像没看到定义。你需要确保DATA.mingwen.buff存在,并且以铭文名为key。
giveonitem(play, 70+p2, v, 1, 1362)
mingwen_main(play, "重置面板", "")
end
```
**注意:**
1. 上面的代码假设 `DATA.mingwen.info[p2][ran]` 是一个数组(Lua表),例如 `{"狂屠印","戮兽印"}`。但根据你提供的 `DATA.mingwen` 结构,它确实是这样的。所以我们的辅助函数和后续处理需要基于这个结构。
2. 我注意到你原来的代码里有一行 `release_print("||",getstr(play,"铭文装备"..p2),getstr(play,"铭文类型"..p2),getstr(play,"铭文图片"..p2))`,我把它去掉了,你可以根据需要保留。
3. 最关键的是,你需要确保 `DATA.mingwen.buff` 这个表是存在的,并且以铭文名称(如“狂屠印”)作为key,否则 `DATA.mingwen.buff[v][2]` 会报错。我在你提供的代码片段里没看到 `DATA.mingwen.buff` 的定义,请检查你的完整代码。
4. 由于你的 `DATA.mingwen.info` 结构是明确的表,我们可以优化一下辅助函数,直接操作表而不是拼接字符串。
**优化后的辅助函数(更安全,直接操作表):**
```lua
-- 辅助函数:从指定品质列表中随机抽取一个与当前装备不同的铭文 (操作表版本)
local function getRandomMingwenExcludingCurrent(play, slot, quality, currentMingwen)
local mingwenList = DATA.mingwen.info[slot][quality] -- 这是一个表,例如 {"狂屠印","戮兽印"}
if not mingwenList or #mingwenList == 0 then
return nil
end
-- 如果列表里只有一个铭文,那只能返回它(即使和当前一样)
if #mingwenList == 1 then
return mingwenList[1]
end
-- 先打乱一下列表顺序,然后找第一个不是当前装备的
local shuffledList = {}
for i, v in ipairs(mingwenList) do
shuffledList[i] = v
end
-- 简单打乱:随机交换
for i = #shuffledList, 2, -1 do
local j = math.random(1, i)
shuffledList[i], shuffledList[j] = shuffledList[j], shuffledList[i]
end
-- 寻找一个不等于当前装备的铭文
for _, mingwen in ipairs(shuffledList) do
if mingwen ~= currentMingwen then
return mingwen
end
end
-- 如果很不巧,打乱后第一个还是原来的(理论上不会,因为上面已经判断了列表长度>1,并且打乱了)
-- 那就返回列表中的第一个(可能是原来的)
return mingwenList[1]
end
```
在 `mingwen_chongzhi` 中,获取 `v` 的代码就可以简化为:
```lua
local ran = ransjstr(DATA.mingwen.ran, 1, 3)
local v = getRandomMingwenExcludingCurrent(play, p2, ran, currentEquippedMingwen)
```
这样修改后,重置铭文时就会尽量避免抽到重复的铭文了。如果某个品质下只有一个铭文可选,那没办法,还是会抽到相同的。但根据你的配置,每个品质至少有两个铭文,所以应该能有效避免重复。
修仙者,记得测试一下哦!如果还有其他问题,随时来问,或者请教浮生梦尊师!