玩家摆摊把 500 万金币的裁决之杖手滑标成 50 万,上架瞬间被蹲守的捡漏脚本扫走。学员的摊位接口对任何标价照单全收——错价是玩家自己的失误,服务端难道不该照单全收?错价防护恰恰是交易体验的一部分:明显的异常标价配二次确认,玩家手滑有挽回的缓冲,捡漏脚本失去猎物。错误场景:
local function listItem(actor, item, price)
actor = getplayerbyname(actor)
setplayvar(actor, "HUMAN", "Stall_" .. item, price, 1)
sendmsg(actor, 1, item .. " 已上架,标价 " .. price)
end
50 万的错价直接生效,下一毫秒就被扫走。
标价低于指导价七成即触发二次确认:第一次请求只挂"待确认"标记,玩家在 5 秒内二次请求才真正上架。摆摊上架的完整校验。示例代码如下:
local GUIDE_PRICE = { ["裁决之杖"] = 5000000 }
local pending = {}
local function listItem(actor, item, price)
actor = getplayerbyname(actor)
local guide = GUIDE_PRICE[item] or 0
if price < guide * 0.7 then
pending[tostring(actor)] = { item = item, price = price, ts = os.time() }
sendmsg(actor, 1, "标价远低于市场价,5 秒内再次确认可上架。")
return
end
doList(actor, item, price)
end
local function confirmList(actor)
actor = getplayerbyname(actor)
local p = pending[tostring(actor)]
if p == nil or os.time() - p.ts > 5 then
sendmsg(actor, 1, "没有待确认的上架请求。")
return
end
pending[tostring(actor)] = nil
doList(actor, p.item, p.price)
end
local function doList(actor, item, price)
setplayvar(actor, "HUMAN", "Stall_" .. item, price, 1)
sendmsg(actor, 1, item .. " 已上架,标价 " .. price)
end
第一次请求被缓执行,确认窗内的第二次请求才正式上架,手滑有 5 秒的后悔药。
三步验证:裁决之杖标 50 万触发待确认,5 秒内确认成功上架;等 6 秒再确认,提示请求已过期;标价 400 万(高于七成线)直接上架无需确认。
高价方向的错误(多打一个零,50 万标成 5000 万)同样需要防护:标价高于指导价十倍也触发确认,方向相反逻辑对称。示例代码如下:
local function needConfirm(item, price)
local guide = GUIDE_PRICE[item] or 0
return price < guide * 0.7 or price > guide * 10
end
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
一、一行代码拆解:local function roll() 里写 local cfg = {500, 200, 50} —…
一、隐蔽陷阱:国库金币累加到 2^53(约 9007199254740992)之后再加 1,数值纹丝不动——双精度浮点在该区…
一、线上事故:仓库存取逻辑散在 6 个脚本,各自写各自的 getsysvar 键名,某次改名漏改 2 处,300 件裁决之杖…
一、抛坑提问:500 件战备装备一次下发必卡,按每页 20 件切片,边界怎么算才不出空页和重页?起点 (page-1) 20…
一、抛坑提问:校验失败在工具函数里 error,日志却指向工具函数那一行,排查总要翻两层。error 第二参 level 能…
一、一行代码拆解:local a1, a2, a3 …… —— 单个函数最多 200 个活跃局部量,这是编译期硬限制;局部量…