-- 铭文
DATA.mingwen = {
-- 激活条件
lv = {"40级解锁","45级解锁","50级解锁","55级解锁","60级解锁","65级解锁","一转解锁"},
-- 自定义装备位置
where = {301,302,303,304,305,306,307},
-- 重置消耗猎魔值
num = {10,30,50,100,150,300,500},
-- 随机抽取
ran = "普通#52|优秀#32|稀有
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-05-08 11:18:20 |
👁️ 阅读: 6
我是lua后端老师!
小仙,你这个问题很常见,想要每次抽取的铭文不重复,关键在于在抽取时排除已经拥有的铭文。我们可以通过修改 `mingwen_jihuo` 和 `mingwen_chongzhi` 函数中的随机抽取逻辑来实现。
核心思路是:
1. 在抽取前,获取当前技能槽位(`num`)下所有可选的铭文列表。
2. 从列表中移除掉玩家当前已经拥有的铭文(`getstr(play,"铭文装备"..num)`)。
3. 从剩下的列表中随机抽取一个。
这里,我们主要需要修改两个地方:**首次激活**和**重置铭文**。我会为你提供一个封装好的函数来处理这个“去重随机”的逻辑,然后在两个地方调用它。
```lua
-- 新增:获取不重复的随机铭文函数
-- 参数: play (玩家对象), num (技能槽位 1-7)
-- 返回: 铭文名称, 品质
function get_unique_mingwen(play, num)
local t = DATA.mingwen
local current_mingwen = getstr(play, "铭文装备" .. num) -- 当前已装备的铭文名
local available_list = {} -- 用于存储可选的铭文
-- 1. 根据权重随机出品质
local quality = ransjstr(t.ran, 1, 3) -- "普通", "优秀"等
-- 2. 获取该品质下该技能的所有铭文
local mingwen_pool = t.info[num][quality]
-- 3. 构建一个不包含当前已拥有铭文的列表
for _, mingwen_name in ipairs(mingwen_pool) do
if mingwen_name ~= current_mingwen then
table.insert(available_list, mingwen_name)
end
end
-- 4. 如果过滤后列表为空(比如只有两个选项且已拥有其中一个),则回退到整个池子
if #available_list == 0 then
available_list = mingwen_pool
release_print("[铭文系统] 槽位" .. num .. "品质" .. quality .. "下无其他可选铭文,使用全池抽取。")
end
-- 5. 从可用列表中随机一个
local random_index = math.random(1, #available_list)
local selected_mingwen = available_list[random_index]
return selected_mingwen, quality
end
-- 修改后的首次激活函数
function mingwen_jihuo(play,p1,p2)
local num = getplaydef(play,"N$铭文激活位置")
p2 = tonumber(p2)
if num < 1 or num > 7 then return end
-- 使用新的去重随机函数
local v, ran = get_unique_mingwen(play, num)
setstr(play,"铭文装备"..num, v)
setstr(play,"铭文类型"..num, ran)
setstr(play,"铭文图片"..num, t.buff[v][2]) -- 注意这里用v,因为v是铭文名
giveonitem(play, 70+num, v, 1, 1362) -- 注意这里用v
setplaydef(play,"N$铭文激活位置",0)
release_print("首次激活:", ran, num, v)
mingwen_main(play)
end
-- 修改后的重置铭文函数
function mingwen_chongzhi(play,p1,p2)
local p2 = getplaydef(play,"N$铭文界面p2") or p2
-- 消耗
local cur_money = querymoney(play,14)
local tar_money = t.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
-- 脱下旧的
takew(play, getstr(play,"铭文装备"..p2), 1, "铭文重置")
changemoney(play,14,"-",tar_money,"铭文洗练",true)
sendmsg(play, 1, '{"Msg":"[提示] : 消耗猎魂值*'.. tar_money ..'","FColor":255,"BColor":219,"Type":1}')
-- 使用新的去重随机函数抽取新的
local v, ran = get_unique_mingwen(play, p2)
setstr(play,"铭文装备"..p2, v)
setstr(play,"铭文类型"..p2, ran)
setstr(play,"铭文图片"..p2, t.buff[v][2]) -- 注意这里用v
release_print("重置获得:", ran, p2, v)
giveonitem(play, 70+p2, v, 1, 1362) -- 注意这里用v
mingwen_main(play,"重置面板","")
end
```
**修改点说明:**
1. **新增 `get_unique_mingwen` 函数**:这个函数封装了核心的去重逻辑。它先根据权重随机品质,然后获取该品质下的铭文列表,并过滤掉当前已装备的铭文,最后从剩下的列表中随机一个。
2. **修改 `mingwen_jihuo` 函数**:将原来直接使用 `ransjstr` 随机品质和铭文的两行代码,替换为调用 `get_unique_mingwen(play, num)` 函数。
3. **修改 `mingwen_chongzhi` 函数**:同样,将原来随机品质和铭文的两行代码,替换为调用 `get_unique_mingwen(play, p2)` 函数。
4. **细节调整**:在设置 `铭文图片` 和 `giveonitem` 时,将原来的 `getstr(play,"铭文装备"..num)` 改为直接使用函数返回的新铭文名 `v`,因为此时玩家变量还未更新。
这样修改后,玩家在激活或重置铭文时,就不会再抽到当前已经装备着的同名铭文了。如果某个品质下只有一种铭文,函数有回退机制,会从整个池子里抽,避免出错。
如果还有其他问题,随时可以问我,或者请教浮生梦尊师哦!
← 返回问答库