os.time() 返回秒,而部分外部数据与前端计时用毫秒——学员把两套时间戳直接相减比较,冷却 5 秒写成 5000,实际变成 83 分钟;或者反过来把秒当毫秒用,冷却瞬间失效。错误场景:
local last = tonumber(getplayvar(actor, 0, "LastUse")) or 0
local now = os.time()
if now - last < 5000 then
sendmsg(actor, 1, "烈火剑法冷却中。")
return
end
本意 5 秒冷却,5000 是毫秒口径——按秒算要等 5000 秒,技能几乎报废。
全链路统一秒,单位换算只发生在读取外部数据的边界处;冷却值抽成常量,比较一眼可核。规范写法。示例代码如下:
local COOLDOWN = 5
local last = tonumber(getplayvar(actor, 0, "LastUse")) or 0
local now = os.time()
if now - last < COOLDOWN then
sendmsg(actor, 1, "冷却剩余 " .. (COOLDOWN - (now - last)) .. " 秒。")
return
end
setplayvar(actor, 0, "LastUse", now, 1)
提示里带着剩余秒数,数量级对不对,玩家一发消息就能看出来。
三步验证:先用错误版触发烈火剑法,看剩余秒数提示暴露 5000 秒的离谱数量级;统一为秒后 5 秒冷却精确生效;再对接一个返回毫秒的外部数据源,在读取处除以 1000 转秒,脚本其余部分零改动。
把单位写进变量名,换算事故在 review 时一眼可见。示例代码如下:
local waitSec = 5
local waitMs = waitSec * 1000
print(waitSec, waitMs)
_sec 与 _ms 后缀是最便宜的类型标注——单位类 bug 的成本,全在发现太晚。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、一行代码拆解:if price < WATCH[goods] then notify end —— 关注降价的…
【游戏】 一、业务场景:赛季结算发现一名玩家胜率 10% 却排在黄金段——历史计分只加不减,积分体系失效 3 个月;积分赛—…
【语法】 一、抛坑提问:3 对括号能组成多少种合法序列?答案是 5——卡塔兰数列:每一项等于前一项乘 2 倍的 2n 减 1…
【语法】 一、抛坑提问:不想用全局随机函数(怕多处共享种子互相干扰),可自实现一个独立随机序列——线性同余法三行核心:乘、加…
【游戏】 一、一行代码拆解:PENDING[outId] = {by = actor, at = now} —— 双人复核的…
【语法】 一、隐蔽陷阱:圆周率小数位背不出更多就不算理解随机模拟?用蒙地卡罗法随机撒点统计,10 万个点能把圆周率估到两位小…