玩家申请注销角色直接删数据引发两次事故:一是行会名单里留下幽灵成员、婚姻关系悬在半空,关联玩家天天问"这人怎么还在";二是注销三天后玩家反悔想恢复,数据已物理删除无从恢复。角色注销封装:三阶段状态机(申请、15 天冷静期、执行),执行时脱敏归档而非物理删除,关联方(行会、好友、婚姻)逐一通知与清理。
三阶段注销状态机:申请入冷静期、到期执行脱敏。示例代码如下:
local COOL_DAYS = 15
local function requestDelete(actorName)
local actor = getplayerbyname(actorName)
local st = getplayvar(actor, "HUMAN", "DeleteState")
if st ~= "" and st ~= nil then
sendmsg(actor, 1, "已有注销申请在处理中。")
return false
end
setplayvar(actor, "HUMAN", "DeleteState", "cooling", 1)
setplayvar(actor, "HUMAN", "DeleteApplyTs", os.time(), 1)
sendmsg(actor, 1, "注销申请已受理,15 天内登录即可撤销。")
return true
end
local function cancelDelete(actorName)
local actor = getplayerbyname(actorName)
if getplayvar(actor, "HUMAN", "DeleteState") == "cooling" then
setplayvar(actor, "HUMAN", "DeleteState", "", 1)
sendmsg(actor, 1, "注销申请已撤销。")
return true
end
return false
end
冷静期到期执行脱敏归档:示例代码如下:
local function executeDelete(actorName)
local actor = getplayerbyname(actorName)
if os.time() - (tonumber(getplayvar(actor, "HUMAN", "DeleteApplyTs")) or 0)
< COOL_DAYS * 86400 then
return false
end
setsysvarex("Deleted_" .. actorName,
"归档|" .. os.date("%Y%m%d") .. "|" .. actorName, 1)
setplayvar(actor, "HUMAN", "DeleteState", "done", 1)
setplayvar(actor, "HUMAN", "RoleName", "已注销角色", 1)
sendmsg(nil, 1, actorName .. " 的角色已按申请注销。")
notifyRelated(actorName)
return true
end
DeleteState 三个状态(空、cooling、done)构成单向流转,冷静期内登录即撤销是撤销动作的唯一入口。executeDelete 执行的是"脱敏归档":角色名统一替换为"已注销角色",关键变量随归档记录留存而非物理删除,数据寿命表(交易流水 180 天)到期后再走物理清理。notifyRelated 负责通知行会(移出成员)、好友(列表移除)、婚姻(解除关系)三个关联方。
角色注销踩过三个坑:一是只删了角色本体,行会职位与婚姻关系残留,行会面板点开幽灵长老报错——关联清理清单要逐项核对执行,漏一项就多一个幽灵;二是注销玩家名下还有未领取的邮件附件,直接清角色把附件一起吞了,注销前强制提示领取或邮件转存;三是冷静期内玩家把贵重装备转给小号再执行注销,注销后申诉"被盗",冷静期内的转赠流水要标注"注销前转移",复核时重点核查。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
一、抛坑提问:40 张价目表进程启动全量加载,其中 33 张一天没人访问,白占 18MB——能不能首次访问才加载,访问过的驻…
一、一行代码拆解:local nxt = FSM[state][ev] —— 这一行把祖玛教主狂暴流程写进二维表:状态为行、…
一、一行代码拆解:v = a + (b - a) t —— 这一行是线性插值,t 从 0 走到 1,烈火剑法伤害从 800 …
一、隐蔽陷阱:sendmsg 直接拼 stock 表,屏上永远是 "table: 0x0064a2c0",排查库存差异只能靠…
一、线上事故:报名次数 getplayvar 取回 nil 被 or 0 兜成零,没报过名的与正好 0 次的混成一团,守城补…
一、线上事故:施放入口按装备类型写分支,新装备"弓"上线漏改 elseif,1200 次施放静默不触发,补偿 500 金元。…