查看: 43|回复: 2

[Lua] 每日福利NPC:防重复领取 + 等级限制 + 连续签到奖励

[复制链接]

46

主题

42

回帖

1212

积分

金牌会员

积分
1212
发表于 2026-6-6 10:12:56 | 显示全部楼层 |阅读模式
分享一个每日福利 NPC 的 Lua 写法,主要解决三个问题:
1. 每个角色每天只能领取一次,避免重复领取。
2. 可以限制最低等级,防止小号批量领取。
3. 支持连续签到奖励,适合做开区活跃福利。

不同 VV/VVM2 版本的 Lua API 名称可能不一样,我把引擎调用都放在 VvApi 适配层里了,替换 TODO 部分即可。

-- DailyReward.lua
-- 每日福利:等级限制、防重复领取、连续签到奖励

local VvApi = {}

function VvApi.getPlayerName(player)
    return player.name -- TODO: 替换为引擎获取角色名接口
end

function VvApi.getPlayerLevel(player)
    return player.level or 0 -- TODO: 替换为引擎获取等级接口
end

function VvApi.getVar(key, default)
    -- TODO: 替换为引擎全局/角色变量读取
    _G.__vv_vars = _G.__vv_vars or {}
    local v = _G.__vv_vars[key]
    if v == nil then return default end
    return v
end

function VvApi.setVar(key, value)
    -- TODO: 替换为引擎全局/角色变量保存
    _G.__vv_vars = _G.__vv_vars or {}
    _G.__vv_vars[key] = value
end

function VvApi.addMoney(player, amount)
    -- TODO: 替换为加金币/元宝/绑定货币接口
    print("add money", VvApi.getPlayerName(player), amount)
end

function VvApi.addItem(player, itemName, count)
    -- TODO: 替换为发物品接口
    print("add item", VvApi.getPlayerName(player), itemName, count)
end

function VvApi.sendMsg(player, msg)
    -- TODO: 替换为系统提示接口
    print(msg)
end

local function today()
    return os.date("%Y%m%d")
end

local function yesterday()
    return os.date("%Y%m%d", os.time() - 86400)
end

local DailyReward = {}

DailyReward.config = {
    minLevel = 30,
    baseMoney = 100000,
    baseItems = {
        { name = "绑定元宝", count = 100 },
        { name = "随机传送石", count = 5 },
    },
    streakBonus = {
        [3] = { name = "强化石", count = 3 },
        [7] = { name = "高级转生证明", count = 1 },
        [15] = { name = "稀有材料礼包", count = 1 },
    },
}

function DailyReward.claim(player)
    local name = VvApi.getPlayerName(player)
    local level = VvApi.getPlayerLevel(player)

    if level < DailyReward.config.minLevel then
        VvApi.sendMsg(player, "等级不足,需要达到 " .. DailyReward.config.minLevel .. " 级。")
        return false
    end

    local dateKey = "daily:last:" .. name
    local streakKey = "daily:streak:" .. name
    local lastDate = VvApi.getVar(dateKey, "")

    if lastDate == today() then
        VvApi.sendMsg(player, "今天已经领取过每日福利。")
        return false
    end

    local streak = 1
    if lastDate == yesterday() then
        streak = VvApi.getVar(streakKey, 0) + 1
    end

    VvApi.addMoney(player, DailyReward.config.baseMoney)
    for _, item in ipairs(DailyReward.config.baseItems) do
        VvApi.addItem(player, item.name, item.count)
    end

    local bonus = DailyReward.config.streakBonus[streak]
    if bonus then
        VvApi.addItem(player, bonus.name, bonus.count)
        VvApi.sendMsg(player, "连续签到 " .. streak .. " 天,获得额外奖励:" .. bonus.name)
    else
        VvApi.sendMsg(player, "每日福利领取成功,当前连续签到 " .. streak .. " 天。")
    end

    VvApi.setVar(dateKey, today())
    VvApi.setVar(streakKey, streak)
    return true
end

return DailyReward

1

主题

228

回帖

1585

积分

金牌会员

积分
1585
发表于 2026-6-6 22:06:12 | 显示全部楼层
独家版本后期最怕的不是功能少,而是脚本结构乱。

25

主题

89

回帖

1323

积分

金牌会员

积分
1323
发表于 2026-6-6 23:23:29 | 显示全部楼层
独家版本后期最怕的不是功能少,而是脚本结构乱。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表