交易行挂单不能撤:玩家把裁决之杖标错价(少打一个零,500 万标成 50 万)只能眼睁睁等流拍或被捡漏,资金与装备占用 7 天;反过来又有人挂高价钓鱼、秒撤再挂,把榜单刷成噪音场。挂单撤销封装:上架 10 分钟内免费撤、之后收标价 1%(最低 1000 金币)撤单税,撤单走统一接口校验归属、防竞态、物品回流。
挂单记录与撤销接口:归属、窗口、竞态三重校验。示例代码如下:
local orders = {}
local function cancelOrder(actor, orderId)
actor = getplayerbyname(actor)
local o = orders[orderId]
if o == nil then
sendmsg(actor, 1, "挂单不存在或已成交。")
return false
end
if o.owner ~= tostring(actor) then
sendmsg(actor, 1, "只能撤销自己的挂单。")
return false
end
if o.sold then
sendmsg(actor, 1, "该单已成交,无法撤销。")
return false
end
local now = os.time()
local tax = 0
if now - o.listTime > 600 then
tax = math.max(math.floor(o.price * 0.01), 1000)
if not takeitem(actor, "金币", tax, 0, "撤单税") then
sendmsg(actor, 1, "撤单税 " .. tax .. " 金币不足,无法撤销。")
return false
end
end
o.sold = true
orders[orderId] = nil
giveitem(actor, o.item, 1, o.bind, "撤单回流")
sendmsg(actor, 1, o.item .. " 已撤单回流,收费 " .. tax .. " 金币。")
return true
end
挂单登记示例代码如下:
local function listOrder(actor, item, price, bind)
actor = getplayerbyname(actor)
local id = "OD" .. os.time()
orders[id] = { owner = tostring(actor), item = item,
price = price, bind = bind, listTime = os.time(), sold = false }
sendmsg(actor, 1, item .. " 已挂单,10 分钟内免费可撤。")
return id
end
orders 内存表存挂单,owner 字段用 tostring(actor) 归一归属比对,非本人撤销直接拒绝。os.time() 差值判定 600 秒免费窗,窗外撤单税取标价 1% 与 1000 金币的较大者。takeitem(actor, "金币", tax, 0, desc) 扣税失败即终止,先扣税再置 sold 标记保证扣不掉就不撤。giveitem(actor, o.item, 1, o.bind, desc) 按挂单时的绑定态原样回流。
挂单撤销踩过三个坑:一是撤单与成交竞态——买家付款与卖家撤单同一毫秒到达,先改 sold 再发货的顺序必须固定,成交侧也要先置 sold 再打款,两侧同一把标记锁才不会双份回流;二是离线撤单的物品回流直接 giveitem 对 nil 对象报错,离线一律改走 sendmail 附件返还,上线领取;三是重复点击撤单,第一笔已置 sold 清表项,第二笔因 orders 里查不到自动返回"挂单不存在",但日志里出现大量重复请求,入口加 2 秒冷却既防连点也防脚本刷接口。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
设计初衷 帮会活动只有攻城与聚餐两板斧:非攻城日帮会频道冷清,成员缺乏共同目标。帮会试炼场设计:帮会自有试炼场(限时挑战波次…
设计初衷 帮会资金靠少数大佬捐献:金主一走帮会资金断崖,普通成员没有参与感也不会珍惜帮会资源。帮会会费设计:成员按职位每周缴…
设计初衷 帮会扩张靠熟人拉人:增长有天花板、新人质量参差、老人不愿带新。募兵编制设计:帮会发布募兵任务包(新人完成入帮任务即…
底层原理 协程体内出错时 resume 返回 ok=false 与错误对象,但协程体若死循环则 resume 永久挂起——错…
底层原理 coroutine.resume 的实参会在协程内成为首个 yield 的返回值;coroutine.yield …
业务场景 挂摊卖药每小时断货:玩家下线前上满货,两小时后摊位空转。摊位自动补货封装:上摊时设定补货仓库(背包或帮会仓),定时…