local moshen = {}
function moshen.link(actor, msgid, arg1, arg2, arg3, sMsg)
if not cfg_moshen or not next(cfg_moshen) then
lib:msg(actor, "配置错误")
return
end
local rlv = lib:getvalueb(actor, "U44") or 0
你好!我是lua后端老师!
小仙,你这段代码看起来是想要实现一个魔神系统,每次升级只给一次物品。不过我发现了一个问题:你的代码中缺少一个关键机制来记录玩家是否已经领取过对应等级的奖励。
从你的代码来看,当 `arg2 == 1` 时,会根据 `U44`(魔神等级)和 `U45`(魔气值)来判断应该给什么物品。但问题是,这个判断条件每次都会执行,如果玩家满足条件,就会一直给物品,而不是"只给一次"。
你需要增加一个记录机制,比如使用一个变量来标记每个等级的物品是否已经领取过。这里给你一个修改建议:
```lua
local moshen = {}
function moshen.link(actor, msgid, arg1, arg2, arg3, sMsg)
if not cfg_moshen or not next(cfg_moshen) then
lib:msg(actor, "配置错误")
return
end
local rlv = lib:getvalueb(actor, "U44") or 0
if arg2 == 0 then
-- 获取焚天等级
release_print("当前魔神等级:", rlv)
-- 检查是否满级
if rlv >= #cfg_moshen then
lib:msg(actor, "您已满级!")
return
end
local next_level = rlv + 1
local next_cfg = cfg_moshen[next_level]
if not next_cfg then
return
end
local check_data = {
count = 2, -- 只检查2个条件
type1 = "物品",
name1 = next_cfg.name1 or "化魔石",
value1 = tonumber(next_cfg.value1) or 0,
type2 = "货币",
name2 = next_cfg.name2 or "金币",
value2 = tonumber(next_cfg.value2) or 0,
}
release_print("检查条件:")
release_print(" 物品:", check_data.name1, "x", check_data.value1)
release_print(" 金币:", check_data.name2, "x", check_data.value2)
local check = lib:checkitem(actor, check_data, "魔神升级扣除")
if not check then
lib:msg(actor, "魔神条件不满足!")
return
end
-- 提升等级
lib:setvalueb(actor, "U44", next_level)
lib:msg(actor, "恭喜:魔神成功!当前等级:" .. next_level)
elseif arg2 == 1 then
local rlv1 = lib:getvalueb(actor, "U45") or 0
release_print("当前U45等级:", rlv1)
-- 获取已领取记录,使用U46变量来存储
local received = lib:getvalueb(actor, "U46") or 0
local giveItem = false
local itemName = ""
local rewardLevel = 0 -- 记录应该给哪个等级的奖励
-- 判断应该给哪个等级的奖励
if rlv >= 100 and rlv1 >= 512000 and bit.band(received, 1024) == 0 then
itemName = "化魔·萬古聖魔君"
giveItem = true
rewardLevel = 100
elseif rlv >= 90 and rlv1 >= 256000 and bit.band(received, 512) == 0 then
itemName = "化魔·幽魂灭魔尊"
giveItem = true
rewardLevel = 90
elseif rlv >= 80 and rlv1 >= 128000 and bit.band(received, 256) == 0 then
itemName = "化魔·萬界血魔王"
giveItem = true
rewardLevel = 80
elseif rlv >= 70 and rlv1 >= 64000 and bit.band(received, 128) == 0 then
itemName = "化魔·血运天魔尊"
giveItem = true
rewardLevel = 70
elseif rlv >= 60 and rlv1 >= 32000 and bit.band(received, 64) == 0 then
itemName = "化魔·九幽玄冥"
giveItem = true
rewardLevel = 60
elseif rlv >= 50 and rlv1 >= 16000 and bit.band(received, 32) == 0 then
itemName = "化魔·冥都魔神"
giveItem = true
rewardLevel = 50
elseif rlv >= 40 and rlv1 >= 8000 and bit.band(received, 16) == 0 then
itemName = "化魔·六欲天魔"
giveItem = true
rewardLevel = 40
elseif rlv >= 30 and rlv1 >= 4000 and bit.band(received, 8) == 0 then
itemName = "化魔·匈魔尊"
giveItem = true
rewardLevel = 30
elseif rlv >= 20 and rlv1 >= 3000 and bit.band(received, 4) == 0 then
itemName = "化魔·灭燼天魔"
giveItem = true
rewardLevel = 20
elseif rlv >= 10 and rlv1 >= 1000 and bit.band(received, 2) == 0 then
itemName = "化魔·暗煞星魔"
giveItem = true
rewardLevel = 10
end
if giveItem then
-- 给物品
giveitem(actor, itemName)
-- 更新领取记录(使用位运算标记)
local newReceived = bit.bor(received, bit.lshift(1, rewardLevel / 10))
lib:setvalueb(actor, "U46", newReceived)
lib:msg(actor, "获得物品:" .. itemName)
else
-- 检查是否已经领取过
local hasReceived = false
for level = 10, 100, 10 do
if rlv >= level and rlv1 >= (1000 * math.pow(2, (level/10)-1)) then
if bit.band(received, bit.lshift(1, level/10)) ~= 0 then
hasReceived = true
break
end
end
end
if hasReceived then
lib:msg(actor, "该等级的奖励已经领取过了!")
else
lib:msg(actor, "魔王等级或者魔气值不足!!!!")
end
end
end
end
-- 如果bit库不存在,需要自己实现简单的位运算
if not bit then
bit = {}
function bit.band(a, b)
return a & b
end
function bit.bor(a, b)
return a | b
end
function bit.lshift(a, b)
return a << b
end
end
return moshen
```
主要修改:
1. 使用 `U46` 变量来记录玩家已经领取过哪些等级的奖励
2. 使用位运算来标记每个等级是否已领取(每个等级对应一个bit位)
3. 在给物品前检查是否已经领取过
4. 给物品后更新领取记录
5. 添加了简单的位运算函数(如果引擎没有提供bit库)
这样就能确保每个等级的奖励只给一次了!小仙,如果还有其他问题,随时问我哦!