匿名拍卖_实现原理

本文档说明 BiaoGe 插件「匿名拍卖」功能是如何实现的,数据流与蓝龙 CD 同步类似,都基于 SendAddonMessage / CHAT_MSG_ADDON 在团队(RAID)频道内通信。

一、模式定义

拍卖有三种模式,由 BiaoGe.Auction.mod 控制:

-- Core/Module/Auction.lua ~330
mods = {
    normal    = L["普通模式"],
    anonymous = L["匿名模式"],
    roll      = L["roll点模式"],
}
BiaoGe.Auction.mod = BiaoGe.Auction.mod or "normal"
  • 普通模式(normal):出价人显示真实名字。
  • 匿名模式(anonymous):出价人显示为「别人(匿名)」,隐藏真实身份。
  • roll 模式:仅作兼容,代码里会被强制转回 normal。

二、关键前提:必须第二代(gen == 2)

匿名模式只有在 BiaoGe.Auction.gen == 2 时才可用,否则下拉框里「匿名模式」是禁用的:

-- Core/Module/Auction.lua ~816
if BiaoGe.Auction.gen ~= 2 and mod == "anonymous" then
    info.disabled = true
end

团长/ML 发起拍卖时,会把当前 gen 与 mod 一起广播出去。

三、发起拍卖:广播 StartAuction 消息

团长点击开始拍卖时,调用 BG.SendStartAuctionMsg,把 mod 写进消息体并发送:

-- Core/Module/Auction.lua ~348
function BG.SendStartAuctionMsg(isGen2, itemID, money, duration, mod, link, resetThreshold)
    local channel, text
    if isGen2 then
        channel = BGA.aura_env.GetAddonChannelName()
        text = format("StartAuction^%s^%s^%s^%s^^%s^%s^%s",
            GetTime(), itemID, money, duration, mod, link, resetThreshold)
    else
        channel = "BiaoGeAuction"
        text = format("StartAuction,%s,%s,%s,%s,,%s,%s",
            GetTime(), itemID, money, duration, mod, link)
    end
    C_ChatInfo.SendAddonMessage(channel, text, "RAID")
end

注意第 5 段(^ 分隔)就是 mod,值为 "normal""anonymous",随消息广播给全团。

四、接收端:团员根据 mod 创建拍卖窗口

团员的插件收到 StartAuction 消息后,按消息里的 mod 创建拍卖窗口 f,窗口对象上的 f.mod 即等于收到的模式:

  • mod == "anonymous":该窗口按匿名渲染,出价人显示为「别人(匿名)」。
  • mod == "normal":显示真实出价人。

关键:匿名「显示替换」发生在每个团员自己的客户端显示层。WA 字符串(Auction.lua 末尾的 !WA:2!...)读取 f.mod,当其为 "anonymous" 时把出价人替换成「别人(匿名)」;拍卖结束后 WA 会显示真实名字。

注意:拍卖竞价窗口本身由插件内置(BGA.Frames)提供,不依赖手动导入 WA 光环。WA 字符串只是给那些「没装 BiaoGe 本体、只装了 WA」的人提供的兼容方案。只要装了表格插件本体,即可正常使用匿名拍卖。

五、团长 / ML 无视匿名

团长或物品分配者(RL/ML)在记账时不会受匿名影响,仍使用更可靠的交易记账看到真实出价人(见更新日志 v2.9:「匿名模式下团长现在可以无视匿名」)。这是插件内置逻辑,无需团员做任何事。

六、数据流总结

团长设置 mod=anonymous + gen=2
        │
        ▼  C_ChatInfo.SendAddonMessage("RAID", "StartAuction^...^anonymous^...")
团员插件收到消息,创建 f,f.mod = "anonymous"
        │
        ▼  WA / 内置窗口读取 f.mod
显示层:出价人 → "别人(匿名)";结束后显示真实名字
团长/ML:直接看到真实出价人(不受匿名影响)

七、相关文件

  • Core/Module/Auction.lua:模式定义、SendStartAuctionMsg 广播、窗口创建 BG.HookCreateAuction、WA 字符串。
  • BiaoGe.Auction.mod / BiaoGe.Auction.gen:保存在角色存档里的当前模式与第二代标记。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注