攻城战奖励、排行结算这类系统邮件,发出时玩家可能正在断线或背包已满,直接丢弃就是客诉源头。补发机制把投递失败的邮件落库挂起,玩家上线或清包后自动补投,七天未领取的转入过期回收。方案覆盖攻城奖励补投与活动补偿两个场景,沙巴克胜利奖励也在内。
首次投递失败时把邮件要素写入角色待补变量,附带金额与附件描述;同一封邮件只记一次,用业务单号去重。示例代码如下:
-- 投递失败:按单号落库挂起
local player = class(actor)
local function pendMail(player, orderNo, title, memo, rewards)
local pend = getplayvar(player, "HUMAN", "MailPend") or ""
if string.find(pend, orderNo, 1, true) then return end
local n = tonumber(getplayvar(player, "HUMAN", "MailPendN") or 0)
if n >= 50 then
sendmsg(player, 1, 0, "待补邮件已满 50 封,请先领取。")
return
end
setplayvar(player, "HUMAN", "MailPend", pend .. orderNo .. ",", true)
setplayvar(player, "HUMAN", "MailPendN", n + 1, true)
setplayvar(player, "HUMAN", "MailPendData", (getplayvar(player, "HUMAN", "MailPendData") or "") .. orderNo .. "|" .. title .. "|" .. memo .. "|" .. rewards .. "&", true)
end
登录触发里检查待补队列,每 300 毫秒投一封防止邮件箱瞬间塞满;落库超过七天的转入过期回收并公告处理结果。示例代码如下:
-- QF触发: login 分批补投待补邮件
function onLoginMail(actor)
local player = class(actor)
local data = getplayvar(player, "HUMAN", "MailPendData") or ""
local idx = 0
for item in string.gmatch(data, "[^&]+") do
local orderNo, title, memo, rewards = string.match(item, "([^|]+)|([^|]+)|([^|]+)|(.+)")
if orderNo then
idx = idx + 1
if idx <= 10 then
sendmail("#" .. (getbaseinfo(player, 3) or ""), 8002, title, memo, rewards)
end
end
end
if idx > 0 then
sendmsg(player, 1, 0, "补发系统邮件 " .. math.min(idx, 10) .. " 封,请查收。")
end
end
测试用背包塞满触发首次投递失败,确认落库后清包上线能收到补投,附件数量与单号一致;灌入五十一封验证上限拦截。线上监控每日待补总量与补投成功率,连续两天成功率低于九成说明背包压力过大,把单批投递从十封降到五封并提示清理。
待补数据最初全部塞进一个变量,超过四千字符被静默截断,后半段邮件永远补不出来,改成序号加数据的分段存储后才稳。单号去重曾用时间戳,活动重跑时同批奖励生成了两个单号,出现双倍补发,单号改用业务类型加期号。补投还漏过一次防刷:补投接口被客户端重连触发连发十次,靠单号去重兜住,但日志量暴增,重连路径上加了冷却判断。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 装备回收商 NPC 每天按评分收购玩家的装备,裁决之杖、骨玉权杖按攻击、持久加权打分,榜上只要前五名。数…
实战应用:用在哪里 沙巴克攻城是全服行会战的最高舞台:攻方砸开城门、抢占皇宫,守方依托城墙与复活点反打。规则设计的关键是节奏…
实战应用:用在哪里 影分身玩法给法师职业补上生存短板:危急时刻召唤四个影分身分担仇恨,敌人需要在六格范围内分辨真身,猜错就浪…
实战应用:用在哪里 组队邀请、行会宣战这类关键信令丢了没有兜底,玩家只能反复手点,高峰期体验很差。重试机制给信令加确认回执:…
实战应用:用在哪里 新资料片上线首日预约量常是日常十倍,一口气全开会让数据库与登录网关同时过载。滚动开区把开区动作排成队列:…
实战应用:用在哪里 百人同屏的沙巴克外围战场,每个玩家每秒跑动会触发数次位置更新,全部即时下发时广播量随人数平方增长,网关先…