NPC 商店不是无限的货架:限量的技能书、每日的补给药水、节日限定的坐骑碎片——库存与补货的管理让商店有了运营的节奏。商店的存储要点是库存的原子扣减、补货的周期与限购的维度。
---NPC 商店:限量商品的购买
function Shop.buy(actor, goodsId)
local player = class(actor)
if not player then return false end
local g = Shop.goods[goodsId]
if not g then return false end
-- 限量商品的库存校验
if g.limit and g.stock <= 0 then
sendmsg(actor, 1, "今日已售罄,请明日再来")
return false
end
-- 限购:单账号的日限
local buyKey = "ShopBuy_" .. goodsId .. "_" .. os.date("%Y%m%d")
local bought = tonumber(getplayvar(actor, 2, buyKey)) or 0
if g.perDay and bought >= g.perDay then
sendmsg(actor, 1, "该商品每日限购 " .. g.perDay .. " 件")
return false
end
if not checkitemw(actor, "金币", g.price) then
sendmsg(actor, 1, "金币不足")
return false
end
takeitem(actor, "金币", g.price, 0, "购买 " .. g.name)
if g.limit then g.stock = g.stock - 1 end
setplayvar(actor, "HUMAN", buyKey, bought + 1, 1)
giveitem(actor, g.name, 1)
sendmsg(actor, 1, "购买成功:" .. g.name)
return true
end
商品的两种限制并行:全服的限量(库存共享,卖完即止)与个人的日限(每账号每日 N 件)——限量的稀缺是全服的竞争,限购的公平是账号的约束。购买的事务四步:库存或限购的校验、金币的扣取、库存与限购的记账、物品的发放,顺序的颠倒任何一步都是漏洞。商店的货架分常驻与限时:常驻的货架无限量(药水、卷轴),限时的货架靠库存与补货制造稀缺。
---限时货架的补货:每日零点回满
setontimerex(112, 60)
function Shop.restock()
local hm = os.date("%H%M")
if hm ~= "0000" then return end
for _, g in pairs(Shop.goods) do
if g.limit and g.daily then
g.stock = g.dailyStock
end
end
Ops.log("商店限时货架补货完成")
end
补货的周期按货架的类型定:每日回满的货架(限量的技能书每日 10 本)、每周回满的货架(稀有的坐骑碎片每周 3 个)、绝不回满的绝版货架——补货的节奏是稀缺的时间维度。补货的播报让玩家知道上架的时刻:限量的技能书每日零点上架,蹲点的玩家形成购买的习惯时刻。售罄的即时呈现与库存的快照推送让货架的数字可信,超发的每一种可能都被原子扣减堵住。
库存的账实核对:销售流水加剩余库存等于投放总量,每日验一次等式;限购的拦截统计与购买的成功率对照,限购的维度是否被绕过看数据。
库存的扣减曾经与校验分离,并发购买超发了 3 本限量书,临界区的互斥修复。限购的键曾经没带日期,跨日不清零,日期键的完整性补齐。补货的时刻曾经与日常重置同一秒,两个批量任务撞车拖慢彼此,错峰到 00:02。
货架的商品、限量的档位与补货的周期进配置,运营的活动节奏自控。售罄的界面标注明日补货的时刻,等待的预期管理。限购的维度与黑市、礼包的限购体系统一,全服的限购语义一致。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 脚本的规范靠人盯盯不过来:命名风格漂移、全局变量乱用、缩进混着来——风格检查器把这些规则的执行自动化。提…
实战应用:用在哪里 拍卖行的出价是一场与时间的博弈:出价的按钮、倒计时的紧迫、截拍瞬间的悬念——拍卖界面的要点是出价的流程、…
实战应用:用在哪里 强化连败七次是什么体验?幸运值机制给失败的玩家一个隐性的承诺:每次失败累加幸运值,幸运值越高下一次的成功…
实战应用:用在哪里 审计日志的价值在于不可抵赖:被改过的日志比没有日志更危险——纠纷的追溯、内部的追责都建立在「日志没被动过…
实战应用:用在哪里 活动结束给 3 万玩家发奖励:一次性群发让邮件表瞬间多 3 万行、投递的队列堵塞正常的通信。批量邮件的分…
实战应用:用在哪里 面对面的交易是传奇最经典的交互:两人面对面、各自放入物品与金币、双方确认后成交。交易的协议要点是会话的建…