面对面交易是传奇最传统的玩家交易:双方面对面打开交易框,放入物品与金币,双方确认后成交。与摆摊、寄售的异步交易不同,面交的同步确认机制是防欺诈设计的教学范本。
function QF.TradeStart(plr, target)
if plr:DistTo(target) > 3 then return false, "距离过远" end
if plr.tradeLock or target.tradeLock then return false, "对方正在交易" end
if plr:InBattle() or target:InBattle() then return false, "战斗中不可交易" end
plr.tradeLock, target.tradeLock = true, true
plr.tradeWith, target.tradeWith = target.id, plr.id
QF_OpenTradeUI(plr, target)
QF_OpenTradeUI(target, plr)
return true
end
function QF.TradePut(plr, slot, count)
local trade = TradeMgr.get(plr.tradeWith, plr.id)
local item = plr.bag[slot]
if not item or item.bind then return false, "绑定物品不可交易" end
plr.bag[slot] = nil
trade.put[plr.id][slot] = { item = item, n = count }
TradeMgr.refresh(trade)
return true
end
开启校验距离、互斥与战斗三态,交易锁防止一 accounts 多开交易框。放入物品即时从背包移入交易框,双方界面实时刷新对方的放入动作,任何一方放入或取出都会重置双方的确认状态。
function QF.TradeConfirm(plr)
local trade = TradeMgr.get(plr.tradeWith, plr.id)
trade.confirmed[plr.id] = true
if trade.confirmed[trade.a] and trade.confirmed[trade.b] then
-- 双方确认,原子成交
local ok = TradeMgr.atomicSettle(trade)
if ok then
QF_SendBoth(trade.a, trade.b, "交易成功")
TradeLog.write("face", trade.a, trade.b, trade.itemList())
end
TradeMgr.close(trade)
else
QF_SendOther(plr, "对方已锁定交易")
end
return true
end
双方都点确认后原子成交:物品与金币的转移在同一个事务里完成,任何一步失败整体回滚。确认后任何一方的再放入操作都会解除双方的确认状态,锁定机制防调包:谈好的交易在确认后被换货是不可能发生的。交易金额与物品的明细写流水,面对面交易的每一笔都有据可查。
交易取消率的监控与交易流水的对账,成交后的物品去向追踪是盗号追赃的通道。
确认状态的解除曾经漏了金币变更的场景,谈好 100 万结果对方偷偷改到 1000 万被确认成交,金额变更重置确认的规则补上。交易框的跨图失效判定缺失出现过双方走远交易继续,距离的持续校验让交易框只在 3 格内有效。
面对面交易的确认重置机制是防调包的核心:任何一方的放入或取出都会解除双方的确认,锁定后的交易框是不可变的合同。交易的距离校验持续到成交,走远三格交易框自动关闭,空间的临近是面交的物理前提。交易流水的双向查询:交易的双方都可以在流水里检索这笔交易,面交的历史是可查证的契约。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 把接口串成功能:一个 BOSS 血条窗口覆盖前端的大半接口面——窗口的打开、控件的创建、网络消息的接收、…
实战应用:用在哪里 控件会动才有生命: GUI:ActionMoveTo 、 ActionFadeIn 、 ActionSc…
实战应用:用在哪里 活动图标、在线奖励按钮、红点提示这些常驻元素要钉在主界面的固定区域: GUI:Attach_MainTo…
实战应用:用在哪里 玩家的每个操作都要有回声: SL:ShowSystemTips 是屏幕中央的系统提示(操作失败、领取成功…
实战应用:用在哪里 前端拿到的大量数据是"字符串形态"的:服务端 sendluamsg 的字符串参数、配置表的行文本、本地缓…
实战应用:用在哪里 界面的炫彩体验有一半来自特效: GUI:Effect_Create 把引擎特效挂到界面控件上,按钮的流光…