结婚系统的求婚流程涉及三方:求婚方出 5 根金条彩礼、系统托管、应答方 24 小时内答复。任何一步断裂钱都必须能回家:应答成礼则彩礼转为结婚戒指发放,婉拒或超时则原路退回。托管台账是唯一可信源——双方各自的记忆都不可靠,钱在哪里、单子在什么状态,只认台账。
求婚登记:彩礼预扣、台账落库、对方送达通知。示例代码如下:
local function propose(actor, targetName)
actor = getplayerbyname(actor)
if not takeitem(actor, "金条", 5) then
sendmsg(actor, 1, "求婚彩礼需要 5 根金条。")
return
end
local pid = "P" .. os.time()
local rec = tostring(actor) .. "|" .. targetName .. "|" .. (os.time() + 86400)
setsysvarex("Propose_" .. pid, rec, 1)
local t = getplayerbyname(targetName)
if t ~= nil and t ~= "" then
sendmsg(t, 1, tostring(actor) .. " 发来求婚,彩礼已由系统托管,24 小时内答复。")
end
sendmsg(actor, 1, "求婚已送达[" .. pid .. "],彩礼托管中。")
end
应答侧:成礼发放结婚戒指,婉拒走邮件原路退回,处理后清台账防重放。示例代码如下:
local function answerPropose(actor, pid, accept)
actor = getplayerbyname(actor)
local rec = tostring(getsysvar("Propose_" .. pid) or "")
local from, to, deadline = string.match(rec, "([^|]+)|([^|]+)|(%d+)")
if from == nil or tonumber(deadline) < os.time() then
sendmsg(actor, 1, "求婚单不存在或已超时失效。")
return
end
setsysvarex("Propose_" .. pid, "", 1)
if accept then
giveitem(getplayerbyname(from), "结婚戒指", 2)
sendmsg(nil, 1, from .. " 与 " .. to .. " 喜结连理,沙巴克证婚人送上祝福!")
else
sendmail("#" .. from, 9040, "求婚婉拒",
"对方婉拒了求婚,彩礼已原路退回。", "金条#5#0")
end
end
takeitem(actor, itemname, qty):彩礼预扣的原子闸门,扣不到即求婚失败。setsysvarex(varName, value, isSave):托管台账落库(第三参 1),处理完成立即置空——台账非空才可结算,先清后结还是先结后清决定竞态方向,本实现先清台账再发结果,宁可漏发走补偿也不重发。sendmail(userid, id, title, memo, rewards):退回走离线邮件,rewards 附件串金条 5 根。string.match 三段解析台账。
求婚托管踩过三个坑:一是彩礼预扣后单号只写在内存,停机重启后钱扣了、单没了,托管台账必须落库且以台账为唯一凭据;二是应答与超时清算的竞态,同一秒内一个应答成礼、一个超时退回,五根金条变十根,处理入口先清台账再走结果,台账已空的一切后续请求直接拒绝;三是应答方已删号或改名,通知发不出去单子悬空 24 小时,发布时校验目标在线可查、离线走 getplayerbyid 确认角色存在,查无此人直接拒绝发布不扣彩礼。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
设计初衷 活动排期凭感觉:周末连开三个重头活动,玩家疲于奔命参与率反跌;工作日大空窗,在线曲线断崖。玩法日历设计:以周为单位…
设计初衷 网络波动掉线让玩家损失战斗进度:世界BOSS打到一半掉线,回来残局已清;副本中掉线,门票作废。掉线补偿设计把掉线当…
底层原理 祭坛围一圈火把、世界BOSS周身一圈水晶,这类环绕阵列需要等角度分布坐标:圆心 (cx, cy)、半径 r、数量 …
设计初衷 排行榜只有顶端可见:进不了前一百的玩家在榜上查无此人,名次没有参照,追赶没有对象。影子榜设计:为每名玩家生成以自己…
业务场景 打错路线或主力减员后想重来,队长单方面重置常引发队内矛盾,误触重置的投诉也不少。投票重置封装:重置需全队表决、同意…
底层原理 存档在写入与传输中可能因意外损坏,读档前需要一道完整性判定。校验和的思路:把数据逐字节累加压缩成一个整数指纹,读档…