WOW战场报新场宏实现(以及该插件实现研究)

不用插件的只用一个宏:/run空格JoinBattlefield(0)打开战场npc ,然后等喊排时点这个宏排队,这样排队的战场列表不会消失,等出场时,如果列表里没有你出的场就是新场.有的话就是老场了
/**************************************************************************************************8888*/

【插件说明】

  战场国家队插件BattleInfo主要功能是报新场,最适合奥山团排,其他战场配合dbm能达到所有战场插件的效果。

/bi 或 /battleinfo 来设置比分栏的命令:
  /bi center 设置到屏幕中央
  /bi top 设置到默认位置

7月20日更新:
1、增加了按键邦定功能,设置可以在 ESC菜单 绑定按键中找到;
2、bug修正
  -- 如果用户加载了QuestRepeat Bi的自动交牌子功能会自惭形秽的关闭
  -- 取消了打开排队窗口时 ctrl 排队
  -- 修成了一个不常见的Titan兼容问题
  -- 修正了好久好久以前遗留的不常见

7月11日更新:
修正回车不能加入bug

7月11日更新:
v1.41 svn r48
根据 单翼天使 的反馈 修改了收回快捷窗的方式
快捷窗消失原因打字了
现在删除了打字关闭对 话框的功能
按">"后变成 1.40 的工作方式

v1.41 svn r47
根据Juha的建议
修改的快速排队的出现方式
现在大家可以通过">"来调用快速排队界面
快速排队界面默认关闭再也不会影响到打字了
另外ctrl+npc那句话也改为白色方便阅读

7月5日更新:
修正了按回车键不影响正常聊天;

6月29日更新:
1 与SSPVP兼容
现在同时使用BI和SSPVP也可以看到新旧场次了
sspvp和bi有些交集功能 关闭注意关闭两个

2 快速排队界面调整
快速排队界面作了调整 有了小队快速加入功能

3 奥山开战前有了比分栏
这个市Blz bug 我代为修正 现在奥山战斗不开始也能看到比分栏使人数一目了然

4 新旧场提示调整
增加一个可能的提示
由于网络延迟 有些人提示新 有喜人提示旧 最后导致坑的出现
现在对于刚刚变成旧场的场次 有了一个新的称号 可能

5月19日更新:
1、增加一个离场时候的计算功能。计算你进入战场到战斗结束的时间;你在在场中一共获得多少荣誉;这将帮助你更好选择队伍;
2、增加一个屏蔽战斗结束时候离队信息的功能。默认是关闭的,/bi 开启之后,战斗结束后就不会有烦人的XX离开团队了;
3、倒计时被移动到按钮上防止刷屏;

5月17日更新:
纠正一个打开关闭地图时候引起新旧重复的bug

5月13日更新:
1 添加 输出到当前聊天 解决 密语 和 各种怪异频道的要求
2 添加 输出到输入框 使灵活性更大 方便复制粘贴

4月19日更新:
1 增加了一个图形设置界面 移除了陈旧的命令行设置方式
2 自动离开战场增加了一个开关
3 显示帮助信息增加了一个开关
4 修改比分栏重置方式以修正与Titan冲突问题 (看不见就/bi重置下 一般就能看见了)
5 所有的语言信息被重新制作以防止未知冲突
6 修正非战场时报告的问题
7 修正一个可能引发新旧场报告错误的bug
8 全新的定向报告方式可以方便的定位到各频道
9 解决部落用户无法使用自动交牌自功能
10 修正自己交牌子时候提示交牌子完成的bug

建议删除/addons下原来的battleinfo目录 再安装
原来的用户配置没有跟随升级 请/bi重新设置
繁体中文配置文件需要彻底更新

4月7日更新:
1 增加了一个自动化模块 这个模块包括
* CTRL+NPC自动排队
* 自动释放灵魂
* 战斗结束3秒自动退场
目前只有 自动释放灵魂设有开关 /bi norel
2 修正灵魂医者计时器字体过大问题
3 调整灵魂医者计时器
* 我发现灵魂医者 复活不是统一时间的 而且间断的周期 在奥山要比其他战场稍微长些


4月6日更新:
1 加入了一个灵魂医者复活计时 可以让你方便了知道什么时候释放尸体
2 代码重构 现在BattleInfo被按模块封装起来 任何人都可以通过简单的代码调用BattleInfo的功能 轻松完成2次开发
3 灵敏性再一次被提高 不会出现提示人数与实际人数不符了
4 本地化模块被分离出来 自带了一个不太完整的 繁体中文模块 这个模块是参考 nnjack512 制作的BI v0.44繁体中文版制作的
5 参考了gzkuru修改版BI添加了搜索新场功能
6 现在默认的提示会告诉你是不是国家队而不是一个服务器的名字
7 奥特兰克山谷现在也像其他战场一样提示是否是国家队了

4月3日更新:
1 新增 自动提交牌子功能 大家可以输入/bi x=? 来交牌子 当然用鼠标点开NPC还是不能避免的 但是工作量也大大减少
2 更新TOC 适应2.4
3 修正了一个引起场次可能不被报告的bug

v0.44 更新说明 2008-2-14
增加ctrl+进入战场不向团队发送新场。自己没有排到需要重排的时候,就不会向团队发送错误信息了
取消将比分牌移动到屏幕中间和玩家头像下方命令,改以ctrl+拖动改变比分牌位置。新的位置能够被保存。
解决本插件一直以来每次进入游戏,比分牌位置与头像重叠bug
解决非战场区域,比分牌与头像重叠bug
去除非战场区域,比分牌前面的“?”
将按着ctrl不发送信息改为按着ctrl键才向团队发送

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

【作者专区】

  作为国内最大和最早的中文魔兽世界插件网站之一,本站欢迎各位魔兽世界插件爱好者发布原创和汉化的优秀插件,并作为稳定的发布页面。插件发布Email:iqq800@gmail.com。所有经测试认证的发布插件都将在本站首页作者专区推荐下载!

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

【本站说明】

1.插件下载后解压缩到World of Warcraft 目录里Interface文件夹下 AddOns目录里。

2.如下载的插件包内有任何不明.EXE文件,请不要执行。应立即用新版杀毒软件查杀。

3.下载插件请到正规专题网站下载,以防资料被盗。本站所有插件均已通过安全性测试。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                                         『魔兽世界插件中文站团队』于江苏常州
/*******************************************************************************************/
## Interface: 20400
## Title: BattleInfo V 1.42
## Notes: 战场详情指示器 by T.G.(farmer1992@gmail.com)
## SavedVariablesPerCharacter: BattleInfoDB

localization/localization.lua
localization/enUS.lua
localization/zhCN.lua
localization/zhTW.lua

BattleInfo.xml

mod/common.lua
mod/server.lua
mod/newbattle.lua
mod/quest.lua
mod/auto.lua
mod/option.lua
mod/av.lua
mod/binding.lua
BattleInfo.lua

/********************************************************************************************/
local L=BATTLEINFO_LOACALE

local biS=BattleInfo_Server:New()
local biNF=BattleInfo_NewBattleFinder:New()
local biQ=BattleInfo_Quest:New()
local biA=BattleInfo_AutoExeC:New()

function BattleInfo_ReportTo(tostr)
    if BattleInfo_InBattle() then
        local tstr={strsplit("*", biS:Report())}
       
        for i in pairs(tstr) do 
            SendChatMessage(tstr[i],tostr)
        end
    end
end

--国家队分析Hook的callbak
function BattleInfo_Update()
    BattleInfo1Text:SetText("")
    BattleInfo0Text:SetText("")
    BattleInfoSHText:SetText("")
   
    if AlwaysUpFrame1Text then
        BattleInfo1:SetParent("AlwaysUpFrame1")
        BattleInfo1:SetPoint("RIGHT", "AlwaysUpFrame1Text", "LEFT", -8, 0)
        BattleInfo1:Show()
       
        BattleInfoSH:SetParent("AlwaysUpFrame1")
        BattleInfoSH:SetPoint("RIGHT", "AlwaysUpFrame1Text", "LEFT", -8, 20)
       
        BattleInfoSH:Hide()
       
        if BattleInfo_InBattle() then
            BattleInfo1Text:SetText(biS.data[1].num)
            BattleInfo1Text:SetTextColor(biS.data[1].color.r,biS.data[1].color.g,biS.data[1].color.b)
            AlwaysUpFrame1.tooltip=biS.data[1]:GetTooltip()
            x=biS:GetAreaSpiritHealerTime()
            if x then
                BattleInfoSHText:SetText(x)
                BattleInfoSH:Show()               
            end
        else
            biS.timesh=nil
        end
    end

    if AlwaysUpFrame2Text then
        BattleInfo0:SetParent("AlwaysUpFrame2")
        BattleInfo0:SetPoint("RIGHT", "AlwaysUpFrame2Text", "LEFT", -8, 0)
        BattleInfo0:Show()
       
        if BattleInfo_InBattle() then
            BattleInfo0Text:SetText(biS.data[0].num)
            BattleInfo0Text:SetTextColor(biS.data[0].color.r,biS.data[0].color.g,biS.data[0].color.b)
            AlwaysUpFrame2.tooltip=biS.data[0]:GetTooltip()
        end
    end
   

end

local Keyin=""

function BattleInfo_OnKey(k)
        if k=="ENTER" then
            BattleInfo_QS()
        --elseif k=="LCTRL" or k=="RCTRL" then
        --    BattlefieldFrameJoinButton_OnClick()
        elseif k==nil then
            Keyin=""
        elseif k=="BACKSPACE" or k=="NUMPADMINUS" then
            Keyin=string.sub(Keyin,1,-2) or ""               
        elseif k=="NUMPADPLUS" then
            Keyin=Keyin=="" and "0" or Keyin
            BattleInfo_QS(CanJoinBattlefieldAsGroup() and IsPartyLeader())   
        elseif k=="DELETE" or k=="NUMPADDECIMAL" then
            Keyin=""
        elseif k=="ESCAPE" then
            HideUIPanel(BattlefieldFrame)
        else
            local _,_,x,_ =strfind(k,".*(%d+)")
            if x and string.len(Keyin)<3 then
                Keyin=Keyin..x
            else
            end
        end
           
        BIQuickSortTip:SetOwner(BIQuickSort, "ANCHOR_RIGHT",-50);
        BIQuickSortTip:AddLine(string.format(L.QUICKJOINTIP,Keyin))
        BIQuickSortTip:Show()
end

function BattleInfo_QS(t)
    if Keyin=="" then
        return
    elseif Keyin=="0" then
        JoinBattlefield(0,t)
        BattleInfo_Print(string.format(L.QUICKJOIN,L.QUICKJOIN_FIRST))
        BattleInfo_OnKey()
        return
    else
        for i=1, GetNumBattlefields()  do
            if Keyin == GetBattlefieldInstanceInfo(i) .."" then
                JoinBattlefield(i,t)
                BattleInfo_Print(string.format(L.QUICKJOIN,Keyin))
                BattleInfo_OnKey()
                return
            end
        end
    end
    BattleInfo_Print(string.format(L.QUICKJOIN_CANTFIND,Keyin))
    BattleInfo_OnKey()
end

local QsShow=nil;
local keyupf=function() BattleInfo_OnKey(arg1) end
local eventf=function() BattleInfo_OnKey() end

function BattleInfo_QsShowHide(force,fv)

    if force then
        QsShow= fv
    else
     QsShow=not QsShow
    end
   
    if QsShow then
        BIQuickSortShowHide:SetNormalTexture("Interface//Buttons//UI-SpellbookIcon-PrevPage-Up")
        BIQuickSortShowHide:SetPushedTexture("Interface//Buttons//UI-SpellbookIcon-PrevPage-Down")
        BIQuickSortShowHide:SetDisabledTexture("Interface//Buttons//UI-SpellbookIcon-PrevPage-Disabled")
        BIQuickSort:SetScript("OnKeyUp",keyupf)
        BIQuickSort:SetScript("OnEvent",eventf)
        BattleInfo_OnKey()       
    else
        BIQuickSortShowHide:SetNormalTexture("Interface//Buttons//UI-SpellbookIcon-NextPage-Up")
        BIQuickSortShowHide:SetPushedTexture("Interface//Buttons//UI-SpellbookIcon-NextPage-Down")
        BIQuickSortShowHide:SetDisabledTexture("Interface//Buttons//UI-SpellbookIcon-NextPage-Disabled")
        BIQuickSort:SetScript("OnKeyUp",nil)
        BIQuickSort:SetScript("OnEvent",nil)
        BIQuickSortTip:Hide()
    end
end

-- 参考 Talented
local function getChatWrite(tostr)
    local edit = DEFAULT_CHAT_FRAME.editBox
    local SendChatMessage = SendChatMessage
    local type = edit:GetAttribute("chatType")
    local lang = edit.language
   
    if tostr~=nil then
        return function (text, ...)
            SendChatMessage(text, tostr, lang, channel)
        end
    end
   
    if type == "WHISPER" then
        local target = edit:GetAttribute("tellTarget")
        return function (text, ...)
            if text:find("%", 1, true) then text = text:format(...) end
            SendChatMessage(text, type, lang, target)
        end
    elseif type == "CHANNEL" then
        local channel = edit:GetAttribute("channelTarget")
        return function (text, ...)
            if text:find("%", 1, true) then text = text:format(...) end
            SendChatMessage(text, type, lang, channel)
        end
    else
        return function (text, ...)
            if text:find("%", 1, true) then text = text:format(...) end
            SendChatMessage(text, type, lang)
        end
    end
end

function BattleInfo_SCan()
    local mapName= GetBattlefieldInfo()
    local t={}
    for i=1, GetNumBattlefields()  do
        instanceID = GetBattlefieldInstanceInfo(i)
        table.insert(t,instanceID)
    end
   
    table.sort(t)   
   
    local write=getChatWrite("SAY")
   
    if biNF.sayto==L.SELF then
        BattleInfo_Print(string.format(L.HINT3,mapName))
        BattleInfo_Print("|CFF00FF00"..biNF:FindNew(t).."|r")
        BattleInfo_Print(L.HINT1,1)
    elseif biNF.sayto==L.CHATBOX then
        DEFAULT_CHAT_FRAME.editBox:SetText(DEFAULT_CHAT_FRAME.editBox:GetText()..biNF:FindNew(t))
        DEFAULT_CHAT_FRAME.editBox:Show()
    else
        if biNF.sayto==L.YELL  then
            write=getChatWrite("YELL")
        elseif biNF.sayto==L.RAID or biNF.sayto==L.PARTY then
            if UnitInRaid("player") then
                write=getChatWrite("RAID")
            elseif UnitInParty("player") then
                write=getChatWrite("PARTY")
            else
                BattleInfo_Print(L.HINT2,1)
            end           
        elseif biNF.sayto==L.CURRENT then
            write = getChatWrite()
        end
       
        write(string.format(L.HINT3,mapName))
        write(biNF:FindNew(t))
    end
end

function BattleInfo_Reset()
        BattleInfoParent:ClearAllPoints()
        BattleInfoParent:SetPoint("TOP", "UIParent", "TOP",-5,-15)
        WorldStateAlwaysUpFrame:ClearAllPoints()
        WorldStateAlwaysUpFrame:SetPoint("TOPLEFT","BattleInfoParent","TOPLEFT",0,0)
end

function BattleInfo_Command(msg)
        local _,_,x,_ =strfind(msg,"x=(%d+)")
        x=tonumber(x)
        if x then
            if x>=0 and x<=100 then
                BattleInfo_Print(string.format(L.MARKINIT,x))
                biQ.pMax=x
            else
                BattleInfo_Print(L.MARKERR)
            end
        elseif msg=="titan" then
            BattleInfoDB.titanpatch=not BattleInfoDB.titanpatch
            BattleInfo_Print("Moving patch is now "..(BattleInfoDB.titanpatch and "on" or "off").." Reload UI (/console reloadui)")
        else
            InterfaceOptionsFrame_OpenToFrame("BattleInfo")
        end
end

local function BattleInfo_Apply()
        biNF.selfsay=BattleInfoDB.selfsay
        biNF.sayto=BattleInfoDB.sayto
        biA.autorelease=BattleInfoDB.autorelease
        biA.autoleave=BattleInfoDB.autoleave
        biA.leavetime=BattleInfoDB.leavetime
        biA.stat=BattleInfoDB.showstat
        biA.igleft=BattleInfoDB.igleft
end

function BattleInfo_OnLoad()
    biS:Hook(BattleInfo_Update)
    biNF:Hook(BattleInfo_SCan)
    if not IsAddOnLoaded("QuestRepeat") then
      biQ:Hook()
    end
   
    biA:Hook()
   
    BattleInfoDBDefault=
    {
        sayto=L.SELF,
        leavetime=3,       
    }
   
    BattleInfoDB=BattleInfoDB or {
        showhelp=1,
        selfsay=1,
        autorelease=1,
        autoleave=1,
        showstat=1,
        igleft=nil,
    }
   
    for i,v in pairs(BattleInfoDBDefault) do
            BattleInfoDB[i]= BattleInfoDB[i] or v
    end
   
    BIOption:Hook(BattleInfo_Apply)
    BattleInfo_Apply()

    BattleInfo_QsShowHide(1)
    SlashCmdList["BATTLEINFO"] = BattleInfo_Command;
    SLASH_BATTLEINFO1 = "/BATTLEINFO";
    SLASH_BATTLEINFO2 = "/BI";
   
    --titan and other WorldStateAlwaysUpFrame moving ui patch
    if BattleInfoDB.titanpatch then
        hooksecurefunc(WorldStateAlwaysUpFrame,"SetPoint",function(...)
            local _,_,l=...;
            if l~="BattleInfoParent" then
                WorldStateAlwaysUpFrame:SetPoint("TOPLEFT","BattleInfoParent","TOPLEFT",0,0)
            end
        end)
    end
end

/*******************************************************************************************/
#下面是报WOW战场新场关键代码
/*******************************************************************************************/
local L=BATTLEINFO_LOACALE
local BINewBattle={}

function BINewBattle:New()
    local x={}
    x.OldBT={}
    x.OldOldBT={}
    x.OldTime=GetTime()
    x.Clicking=0
    self.__index = self
    setmetatable(x, self)
    return x
end

function BINewBattle:lastNew(id)
    if #(self.OldOldBT)==0 or GetTime()-self.OldTime>60 then
        return nil
    end
   
    for i in pairs(self.OldOldBT) do
        if self.OldOldBT[i]..""==id then
            return nil
        end
    end
    return 1   
end

function BINewBattle:IsNew(id)
    if self.Clicking==0 then
        return nil
    end
   
    for i in pairs(self.OldBT) do
        if self.OldBT[i]..""==id then
            if self:lastNew(id) then
                return L.PERHAPS
            else
                return L.OLD
            end
        end
    end
    return L.NEW
end

function BINewBattle:BeforeJoin()
    self.Clicking=1
    self.OldOldBT=self.OldBT
    self.OldTime=GetTime()
    self.OldBT={}

    for i=1, GetNumBattlefields()  do
        instanceID = GetBattlefieldInstanceInfo(i)
        table.insert(self.OldBT,instanceID)
    end
   
    table.sort(self.OldBT)
end

BattleInfo_NewBattleFinder={}

function BattleInfo_NewBattleFinder:New()
    local x={}
    x.data={
        [L.WARSONG]=BINewBattle:New(),
        [L.ARATHI]=BINewBattle:New(),
        [L.EYE]=BINewBattle:New(),
        [L.ALTERAC]=BINewBattle:New(),
        ["DEFAULT"]={},
    }
    x.selfsay=true
    x.sayto=L.SELF
    x.f= CreateFrame("Frame", nil)
    self.__index = self
    setmetatable(x, self)
    return x
end

function BattleInfo_NewBattleFinder:FindNew(t)
    local outstr=""
    local lsj=1
    for i in pairs(t) do
        j=lsj
        while j<=t[i]-1 do       
            k=t[i]-1-j
            if k>2 then
                outstr=outstr..j.."->"..j+k.." "
                break
            else
                outstr=outstr..j.." "
                j=j+1
            end
        end
        lsj=t[i]+1
       
    end
    outstr=outstr..lsj..L.ANDAFTER
   
    return outstr
end

function BattleInfo_NewBattleFinder:Hook(callback)
    --CONFIRM_NEW_BFENTRY SSPVP
   
    if StaticPopupDialogs["CONFIRM_BATTLEFIELD_ENTRY"] then
        StaticPopupDialogs["CONFIRM_BATTLEFIELD_ENTRY"].button2=L.LEAVEBUTTON

        StaticPopupDialogs["CONFIRM_BATTLEFIELD_ENTRY"].OnCancel=function(arg1,arg2)
            if IsControlKeyDown() and arg2=="clicked" then
                AcceptBattlefieldPort(arg1,nil)
            end
        end
       
        StaticPopupDialogs["CONFIRM_BATTLEFIELD_ENTRY"].OnShow=function()
            local thisBT=getglobal(this:GetName().."Text")
            local tx=thisBT:GetText()
            if string.find(tx,L.OLD,1,1) or string.find(tx,L.NEW,1,1) then           
                return
            end
            for i in pairs(self.data) do
                local _,_,toJ,_ = string.find(tx, ".+"..i.." (%d+).+");   
                if toJ then                       
                    thisBT:SetText(string.gsub(tx,toJ,toJ..(self.data[i]:IsNew(toJ) or "")))
                    break
                end
            end       
        end
   
    elseif StaticPopupDialogs["CONFIRM_NEW_BFENTRY"] then
        StaticPopupDialogs["CONFIRM_NEW_BFENTRY"].button2=L.LEAVEBUTTON

        StaticPopupDialogs["CONFIRM_NEW_BFENTRY"].OnCancel=function(arg1,arg2)
            if IsControlKeyDown() and arg2=="clicked" then
                AcceptBattlefieldPort(arg1,nil)
            end
        end
        hooksecurefunc(StaticPopupDialogs["CONFIRM_NEW_BFENTRY"],"OnUpdate",function()
            local thisBT=getglobal(this:GetName().."Text")
            local tx=thisBT:GetText()
            if string.find(tx,L.OLD,1,1) or string.find(tx,L.NEW,1,1) or string.find(tx,L.OLD,1,1) then           
                return
            end
            for i in pairs(self.data) do
                local _,_,toJ,_ = string.find(tx, ".+"..i.." #(%d+).+");   
                if toJ then                       
                    thisBT:SetText(string.gsub(tx,"#"..toJ,"#"..toJ..(self.data[i]:IsNew(toJ) or "")))
                    break
                end
            end       
        end)
    end


    --BattlefieldFrameJoinButton_OnClick
    hooksecurefunc("JoinBattlefield",function()
        local mapName= GetBattlefieldInfo()
        if self.data[mapName] then
            self.data[mapName]:BeforeJoin()
            if self.selfsay then
                callback()
            end
        end
    end)

    self.f:SetScript("OnEvent", function()
                self.data[BattleInfo_SafeZone()].Clicking=0
        end)
    self.f:RegisterEvent("PLAYER_ENTERING_WORLD")
   
end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rains卍Soft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值