|
|
分享一个每日福利 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
|
|