能送玩家回家的入口有四个:回城卷、传送戒指、记忆套装、比奇传送员。各自独立做冷却的后果:玩家回城卷进 10 秒 CD 后转头用传送戒指立刻再走,四个口子形同虚设。工程化收口:所有传送入口共用一把闸门——统一登记、统一判定,任何一个来源触发后,其余三个在冷却期内全部放行不了。
闸门与登记两个函数收口全部来源:判定距上次传送不足 10 秒即拒绝,放行后立刻登记时间戳。示例代码如下:
local TELE_CD = 10
local function teleGate(actor)
actor = getplayerbyname(actor)
local last = tonumber(getplayvar(actor, "HUMAN", "TeleCD")) or 0
local wait = TELE_CD - (os.time() - last)
if wait > 0 then
sendmsg(actor, 1, "传送冷却中,还需等待 " .. wait .. " 秒。")
return false
end
return true
end
local function teleMark(actor)
actor = getplayerbyname(actor)
setplayvar(actor, "HUMAN", "TeleCD", os.time(), 1)
end
各传送入口接入同一把闸门:先判定,传送成功才登记——失败的传送不吃冷却。示例代码如下:
local function ringTeleport(actor, x, y)
actor = getplayerbyname(actor)
if not teleGate(actor) then
return false
end
if not takeitem(actor, "传送戒指", 0) then
sendmsg(actor, 1, "需要佩戴传送戒指。")
return false
end
if beginteleport(actor, x, y) then
teleMark(actor)
sendmsg(actor, 1, "传送戒指生效,全来源共享 10 秒冷却。")
return true
end
return false
end
beginteleport(actor, X, Y) 返回布尔:引擎允许本次传送才为 true,落点被拦(安全区禁入、攻城限制)时为 false——以它的返回值决定是否登记冷却,拒绝传送不该收费。setplayvar 第五参 isSave 传 1:冷却时间戳必须落库,否则重启清零等于冷却归零。tonumber(getplayvar(...)) or 0 的二段兜底,新号首次传送不会因空串崩掉。
共享冷却踩过三个坑:一是闸门只接了回城卷一个入口,传送戒指和记忆套装各自为政,玩家用戒指绕开了全部冷却,共享闸门必须收编所有入口,漏一个就全线失效;二是失败的传送也登记了冷却,玩家被安全区规则拦下反而吃了 10 秒 CD,登记动作必须挂在 beginteleport 返回 true 之后;三是时间戳没落库,停机重启后全员冷却清零,高峰期传送请求瞬间翻倍,费用类冷却一律 isSave 传 1。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
学员常见误区 Lua函数可返回多个值,学员用固定变量数接收时如果变量少于返回值,多余返回值被静默丢弃;如果变量多于返回值,多…
设计初衷 行会建筑的死穴是一次全解锁:会员没有逐步建设的过程感。梯度设计让每栋建筑都有前置条件和资源门槛。 数值模型 建筑分…
设计初衷 婚姻系统的属性加成是社交玩法的经济锚点:加成太弱没人结婚,太强则"为了属性被迫结婚"扭曲了社交本质。婚姻边界的设计…
设计初衷 宝箱类玩法的信任危机都源于同一句话:"概率是不是骗人的。"期望公示把概率从事后争议变成事前契约:奖池概率表全量公示…
设计初衷 流拍物(拍卖未成交的退回物品)堆积在卖家背包里成为死资产:低价值物流拍后无人问津,高价值物流拍后卖家不愿降价重拍。…
业务场景 沙巴克战功榜每周结算,玩家提交战功前不知道"再打多少能进前 10、前 10 的奖励是什么"。名次预览:输入自己的战…