基于ACE3的悬赏任务系统魔兽世界插件

年前和游戏中的朋友交流,他们希望有个魔兽世界内的发布悬赏商品的插件。作为程序狗,一口就汪下来了。哪知踏上了一条坑溢满满的lua开发之路。

背景

作为一个老wower,还是时不时会打开魔兽逛逛。最近在玩一个SF,游戏里很多装备需要其它装备合成。所以游戏里很多小伙伴希望有个便捷装备交易的系统。
说实话,作为不充钱的普通玩家,这本和我无关,不过游戏里有几个玩的不错的wow友,着实很肝。出于对他们的关爱和程序汪的装13心理。我着手设计开发了这个装备悬赏系统插件。

实现效果

home.jpg

架构

luawow.png

功能

  • 玩家可以发布自己的采购需求,并需向管理员支付一定的服务费
  • 玩家看到别人的悬赏物品,及悬赏金额等信息
  • 玩家点击“揭榜”将自动发送指定悬赏金额的物品给发布人,且为付费取货邮件
  • 管理员接收各个玩家发来的消息,处理数据回复给玩家,并会对数据做持久化保存

核心代码

服务端

服务端主要是看不见服务,部分操作也有界面日志输出。

首先注册下插件

RSystemServer = LibStub("AceAddon-3.0"):NewAddon("RSystemServer", "AceConsole-3.0","AceEvent-3.0")

function RSystemServer:OnInitialize()
    self.db = LibStub("AceDB-3.0"):New("RSystemServerDB")
    -- Called when the addon is enabled
    self:RegisterEvent("CHAT_MSG_ADDON")
    self:RegisterEvent("PLAYER_ENTERING_WORLD")
    if (self.db.profile.receiveRequestList) then
        receiveRequestList = self.db.profile.receiveRequestList
    end
end

function RSystemServer:PLAYER_ENTERING_WORLD()
    RegisterAddonMessagePrefix("RSystemServer")
end

监听发来的消息

function RSystemServer:CHAT_MSG_ADDON(_ ,channel, message,_,sender)
    --print("channel:",_ ,channel, message)
    if (channel=="RSystemServer") then
        local tab = { strsplit( "_", message) }
        print("接受到来自"..tab[2].."的"..tab[1].."请求")
        if (tab[1] == "PostRequest") then
            --接受发布请求
            RSystemServer:getPostRequest(tab[2],tab[3],tab[4])
        elseif (tab[1] == "GetRequestList") then
            -- 回复任务列表
            RSystemServer:sendRequestList(tab[2])
        elseif (tab[1] == "DropRequest") then
            -- 撤销任务
            RSystemServer:getDropRequest(tab[3],sender)
        elseif (tab[1] == "PullRequest") then
            -- 撤销任务
            RSystemServer:getPullRequest(tab[3])
        end

    end
end

具体的处理方法见源码,这里主要是把table数据分割,并格式化为了string回复给玩家。

客户端

玩家客户端涉及到界面展示,我使用的ACEGUI3框架,比原生好用很多,不过定制的化能力较弱些。

初始化插件

local AceGUI = LibStub and LibStub("AceGUI-3.0", true)

RSystem = LibStub("AceAddon-3.0"):NewAddon("RSystem", "AceConsole-3.0","AceEvent-3.0","AceComm-3.0")

function RSystem:OnInitialize()
    -- Called when the addon is enabled
    self:RegisterEvent("MAIL_SHOW")
    self:RegisterEvent("MAIL_CLOSED")
    self:RegisterEvent("MAIL_FAILED")
    self:RegisterEvent("MAIL_SEND_SUCCESS")
    self:RegisterEvent("CHAT_MSG_ADDON")
    self:RegisterEvent("PLAYER_ENTERING_WORLD")
    self:RegisterComm("RSystemClient", function() end)
end

可以看到,我们的插件会和邮件系统的事件有很多交互。

创建一个tooltip,后面我们就可以直接调“MyTooltip:Show()”用了

function RSystem:OnEnable()
    -- create tool tip
    if not MyTooltip then
        CreateFrame("GameTooltip", "MyTooltip", nil, "GameTooltipTemplate")
        MyTooltip:SetOwner( WorldFrame, "ANCHOR_NONE" );
        MyTooltip:AddFontStrings(
                MyTooltip:CreateFontString( "$parentTextLeft1", nil, "GameTooltipText" ),
                MyTooltip:CreateFontString( "$parentTextRight1", nil, "GameTooltipText" ) );
    end
end

创建界面元素

function RSystem:createFrameWidgets(f)
    local HeaderFrame = AceGUI:Create("InlineGroup")
    HeaderFrame:SetFullWidth(true)
    HeaderFrame:SetLayout("Flow")
    RSystem:createEditBox(HeaderFrame,"物品ID",200,false,handleRequireNameChange)
    RSystem:createMoneyInput(HeaderFrame)
    RSystem:createButton(HeaderFrame, "发布需求", 100, handlePushRequest)
    RSystem:createTabGroup(f,{{text="找物品", value="item"}, {text="找打手", value="help"}},"item",SelectGroup)
    f:AddChild(HeaderFrame)
end

系统最重要的部分,支付佣金、发送货物模块。

function sendCharge(itemLink,requireMoney)
    local curMoney = GetMoney()
    if (curMoney < (serviceCharge + 30)) then
        TradingUtils_ShowMsg("你的钱还不够支付服务费!")
        requireInfo = {}
        MoneyInputFrame_SetCopper(moneyInputFrame,0)
        return
    elseif (curMoney < (serviceCharge + 30 + requireMoney)) then
        TradingUtils_ShowMsg("你的钱还不够赏金,请尽快补足!")
    end
    local gold, silver, copper = MyCOD_CoppersToGoldSilverCopper(serviceCharge)
    SendMailMoneyGold:SetText(gold);
    SendMailMoneySilver:SetText(silver);
    SendMailMoneyCopper:SetText(copper);
    SendMailSendMoneyButton:SetChecked(true);
    SendMailCODButton:SetChecked(false);
    --SendMailNameEditBox:SetText(adminUserName);
    SendMailSubjectEditBox:SetText("支付佣金")
    SetSendMailMoney(serviceCharge)
    local timeStamp = "20" .. date("%y-%m-%d %H:%M:%S");
    SendMail(adminUserName, "支付佣金", "来自 "..UnitName("player").."的悬赏任务单\r\n悬赏物品:"..itemLink.."\n悬赏金额:"..GetMoneyString(requireMoney).."\n服务佣金:"..GetMoneyString(serviceCharge).."\n发送时间:"..timeStamp)
    RSystem:SendCommMessage(
            "RSystemServer",
            "PostRequest_"..UnitName("player").."_"..requireInfo["itemLink"].."_"..requireInfo["requireMoney"],
            "WHISPER",
            adminUserName);
    requireInfo = {}
    MoneyInputFrame_SetCopper(moneyInputFrame,0)
end

结束

完整的实现代码:https://github.com/t880216t/wowAddonRSystem

虽然玩的私服,但是实际本应用中所有的api和框架都是正式服可用,所以由此C/S架构的插件开发其实我们还可以做更多的扩展,精力有限暂时先折腾这些。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • [转]暴雪创始人暴雪游戏研发的10个核心理念 原文链接:http://www.gamelook.com.cn/20...
    babybus_break阅读 1,013评论 0 2
  • “我的心里眼里全都是你”
    阿云梓阅读 151评论 0 0
  • 今天早早起床,想去商场买条裙子,买件棉衣。热爱生活从现在做起,过好每一天,每一个小时。即使目前有些事以痛吻我,...
    拈花一笑1阅读 527评论 1 3
  • 约定俗成之事才叫礼数,所以行礼才容易被人理解,读书就要学故事、明礼仪,正因为世上想被人误解可容易的紧,才显得礼数的珍贵。
    遇见未来的我阅读 123评论 0 0
  • 池中帝王蟹,威武霸气凶。 不仅名号大,大钳更威风。 据说被钳住,能断铁棍通。 就连海毒蛇,夹住送西天。 可惜遇到银...
    退休人老高阅读 935评论 0 1