赛季王者、活动纪念、节日限定,限时称号是运营手里最灵活的荣誉工具。限时称号框架要处理三个时间问题:到期自动失效、续期无缝衔接、过期后荣誉档案保留。称号过期不停服、不补偿纠纷,全靠到期时间戳与续期叠加规则这两把尺子。
称号持有记录带到期时间戳,任何引用称号的地方先判过期;每日重置触发统一清理过期称号并写档案,玩家登录时提示续期入口。示例代码如下:
-- 限时称号:到期判定与清理
local player = class(actor)
local function hasValidTitle(player, titleId)
local expire = tonumber(getplayvar(player, "HUMAN", "TitleExp_" .. titleId) or 0)
return expire > os.time()
end
function onTitleSweep(actor)
local player = class(actor)
for i = 1, 8 do
local key = "TitleExp_" .. i
local expire = tonumber(getplayvar(player, key) or 0)
if expire ~= 0 and expire <= os.time() then
setplayvar(player, key, 0, true)
local archive = getplayvar(player, "HUMAN", "TitleArchive") or ""
setplayvar(player, "HUMAN", "TitleArchive",
archive .. i .. "@" .. expire .. ";", true)
sendmsg(player, 1, 0, "称号 " .. i .. " 已到期,可在档案中查看往期荣誉。")
end
end
end
续期不在原时间戳上直接加天数,而是从当前到期时间顺延;叠加规则防漏洞:多次续期按最大到期时间生效,避免并行续期把时间越叠越长。示例代码如下:
-- 限时称号:续期顺延与叠加
local player = class(actor)
local function renewTitle(player, titleId, addDays)
local expire = tonumber(getplayvar(player, "HUMAN", "TitleExp_" .. titleId) or 0)
local base = expire > os.time() and expire or os.time()
local newExpire = base + addDays * 86400
if newExpire <= expire then
sendmsg(player, 1, 0, "续期参数异常,本次续期未生效。")
return
end
setplayvar(player, "HUMAN", "TitleExp_" .. titleId, newExpire, true)
sendmsg(player, 1, 0, "续期成功,新到期时间 " .. os.date("%Y-%m-%d", newExpire) .. "。")
end
验证三条边界:到期前一秒仍有效、到期后自动失效进档案、续期从原到期时间顺延而不是从当前时间起算;过期称号的特权随失效同步停止。线上监控两个指标:续期率与过期提醒点击率,续期率低于四成把提醒提前到到期前三天;档案写入量异常膨胀说明清理逻辑重复执行,档案写入必须带去重标记。
到期判定散落在各处代码,有一处忘记判过期,限时称号被用来在过期后继续传送进城,引用收口成统一函数。续期曾从当前时间起算,未到期续费反而缩短了有效期,玩家按剩余天数投诉有据可依。档案最初没有去重,清理逻辑跑两次写了两条相同档案,去重标记是补丁,也是对所有清理类逻辑的提醒。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 蜈蚣洞深处的黑暗区域是老传奇最经典的压迫感来源:没有火把,屏幕只剩身边一圈微光,黑暗里随时窜出钳虫。视野…
实战应用:用在哪里 行会管理层每周要给成员发福利邮件,一封封发到崩溃。邮件撰写面板支持附件拖拽与群发名单:从背包把物品拖进附…
实战应用:用在哪里 顶级装备直接掉落太破坏生态,长期不掉又让人绝望。碎片兑换把屠龙这样的神器拆成六十块碎片:野外精英怪概率掉…
实战应用:用在哪里 沙巴克守城最怕城防形同虚设:城墙上没箭、城门后没药、守军没人指挥补给。军备库玩法把城防物资做成一套捐献与…
实战应用:用在哪里 金币靠打、元宝靠充,两种货币一旦混在一个变量里记账,对不上账的时候谁都说不清。货币钱包把金币、元宝、绑元…
实战应用:用在哪里 每个在线客户端都要定时发心跳保活,一万在线就是每秒上百个心跳包,其中九成来自挂机与后台窗口。心跳分级按客…