面对面交易是传奇最传统的玩家交易:双方面对面打开交易框,放入物品与金币,双方确认后成交。与摆摊、寄售的异步交易不同,面交的同步确认机制是防欺诈设计的教学范本。
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 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 成就点数不该只是数字摆设:点数商店兑换永久属性加成,50分换百分之一攻击,上限百分之五。兑换接口管三件事…
实战应用:用在哪里 UI 合图(把零散小图打包成图集)是 DrawCall 合批的前提(合批原理参考前篇)。手工打包的问题:…
实战应用:用在哪里 SQLite 默认的回滚日志模式在写入时会阻塞读取(写锁独占),游戏服务端“边写日志边查配置”的场景会出…
实战应用:用在哪里 烈火剑法甩出去的瞬间最怕砍到队友:PK 模式是攻击的准星开关——和平、组队、行会、全体四种模式决定谁的技…
实战应用:用在哪里 把大逃杀的缩圈机制搬进沙巴克野区:五十人无阵营乱斗,安全区每六十秒收缩一圈,圈外持续掉血,终局幸存者独享…
停服更新最怕撞上在线高峰,踢掉几百人换来一片抱怨。选对发布窗口,同样的更新内容,玩家体验是两回事。本文讲如何用996引擎的在…