好友 100 人上限满员后新友加不进来:手动删人得罪人,不删新人流失。满员腾位:加好友时若已满,自动找出“最久未互动”的好友作为候选淘汰人,向玩家展示该候选与互动间隔,玩家确认后腾位加新——自动找候选、玩家做决定,既不越权删除也不放任满员卡死。
候选定位与腾位确认:扫描好友的末次互动时间戳,取最久者作为淘汰候选。示例代码如下:
local function findIdlest(actor)
actor = getplayerbyname(actor)
local list = getplayvar(actor, "HUMAN", "FriendList") or ""
local idlest, idleGap = "", -1
local now = os.time()
for name in string.gmatch(list, "[^|]+") do
local last = tonumber(getplayvar(actor, "HUMAN", "Touch_" .. name) or "") or now
if now - last > idleGap then
idlest, idleGap = name, now - last
end
end
return idlest, idleGap
end
local function proposeSwap(actor, newName)
actor = getplayerbyname(actor)
local idlest, idleGap = findIdlest(actor)
if idlest == "" then
sendmsg(actor, 1, "好友列表为空,可直接添加。")
return
end
sendmsg(actor, 1, "最久未互动:" .. idlest ..
"(" .. math.floor(idleGap / 86400) .. " 天),确认后腾位给 " .. newName)
end
确认腾位:删除候选、写入新好友、更新互动时间戳。示例代码如下:
local function confirmSwap(actor, oldName, newName)
actor = getplayerbyname(actor)
local list = getplayvar(actor, "HUMAN", "FriendList") or ""
local kept = {}
for name in string.gmatch(list, "[^|]+") do
if name ~= oldName then
kept[#kept + 1] = name
end
end
kept[#kept + 1] = newName
setplayvar(actor, "HUMAN", "FriendList", table.concat(kept, "|"), 1)
setplayvar(actor, "HUMAN", "Touch_" .. newName, os.time(), 1)
sendmsg(actor, 1, "腾位完成:" .. oldName .. " 移出," .. newName .. " 已加为好友。")
end
Touch_好友名 记录末次互动时刻:私聊、组队、赠送三类入口都要刷新该戳——互动判定口径统一走这一个戳。findIdlest 用线性扫描取最久者,百人名单毫秒级。confirmSwap 重建名单时逐项过滤再追加,保证删除与添加原子呈现。setplayvar 第五参 1 落库:好友名单与互动戳都是长期资产。
腾位功能踩过三个坑:一是互动戳只在私聊时刷新,组队打本一个月的好友被误判“半年未互动”成了首候选,三类互动入口统一刷同一个戳;二是腾位确认没有二次展示候选名,玩家手滑把长期好友腾了出去,确认框必须完整回显候选名与互动间隔天数;三是名单满员检测用 #list 而名单是竖线字符串,长度永远是字符串字节长,满员判定要用 gmatch 计数。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
设计初衷 活动币(节日代币、赛季积分)的灵魂问题是“过期怎么办”:永久保留则库存越滚越大、商店压力与经济失衡逐年加剧;一刀清…
设计初衷 打宝地图(高产出高风险的专属地图)是服务器产出的调节阀:普通图产出保底,打宝图产出上浮但设门槛。准入凭证的设计目标…
底层原理 把表转成可读字符串(调试输出、存档导出)时,循环引用是最大障碍:A 引用 B、B 引用 A,朴素递归无限展开直到栈…
底层原理 外部依赖抖动时,每次调用都傻等超时(2 秒),高峰期的失败请求排队堆积把脚本线程拖垮。熔断器的状态机:连续失败达到…
设计初衷 行会日常缺少“全 会一起嗨”的集体时刻:活动是少数人打的,福利是各自领的。行会祝福由会长或官员主动触发,全行会成员…
业务场景 新人入会是行会活跃的风向标:一条及时的欢迎语让新人三分钟内融入。自动欢迎的痛点是刷屏与模板疲劳:欢迎语千篇一律、连…