vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        Alkitron Honor Tab
        Replaces the standard Honor tab with an enhanced version.
        
        by morganti@laughing skull, http://ui.worldofwar.net/users.php?name=morg
]]


HF_INFO = {};
hfsaved = {};
honor_last = 0;
--don't change these values
last_update = time();
scoreboardscan_interval = 1;

function HonorFrame_OnLoad()
        this:RegisterEvent("VARIABLES_LOADED");
        this:RegisterEvent("PLAYER_PVP_KILLS_CHANGED");
        this:RegisterEvent("PLAYER_ENTERING_WORLD");
        this:RegisterEvent("PLAYER_PVP_RANK_CHANGED");
        this:RegisterEvent("CHAT_MSG_COMBAT_HONOR_GAIN");
        this:RegisterEvent("CHAT_MSG_SPELL_CREATURE_VS_CREATURE_BUFF");
        this:RegisterEvent("UPDATE_BATTLEFIELD_STATUS");
        this:RegisterEvent("UPDATE_BATTLEFIELD_SCORE");
        this:RegisterEvent("UPDATE_WORLD_STATES");
end

function resethonor()
                local hky, dky, contributiony = GetPVPYesterdayStats();
                local hkt, dkt = GetPVPSessionStats();
                local hkw, contributionw = GetPVPThisWeekStats();
                
                player = UnitName("player").." - "..GetRealmName();

                HF_INFO[player] = {
                        ["honor_yesterday"] = contributiony;
                        ["honor"]                                               = 0;
                        ["honor_bonus"]                 = 0;
                        ["kills_today"]                 = hkt;
                        ["kills_yesterday"]  = hky;
                        ["honor_week"]                  = contributionw;
                        ["faction"]                                     = checkfaction();
                        ["verbose"]                                     = 1;
                }
                HF_INFO[player]['hk_list'] = {};
                
                hfsaved = HF_INFO[player];
                HonorFrame_Update();

                DEFAULT_CHAT_FRAME:AddMessage("[Alkitron Honor Tab] RESET: UnitFactionGroup returned " .. hfsaved.faction);
end

function checkfaction()
        local factiongroup = UnitFactionGroup("player");

                if (factiongroup == "Alliance") then 
                        factiongroup = 1;
                elseif (factiongroup == "Horde") then
                        factiongroup = 0;
                elseif (factiongroup == nil) then
                        factiongroup = 2;
                        DEFAULT_CHAT_FRAME:AddMessage("[Alkitron Honor Tab] ERROR: UnitFactionGroup() returned nil");
                end

        return factiongroup;
end

function HonorFrame_OnEvent(event)
        if (event == "VARIABLES_LOADED") then

                local hky, dky, contributiony = GetPVPYesterdayStats();
                local hkt, dkt = GetPVPSessionStats();
                local hkw, contributionw = GetPVPThisWeekStats();

                player = UnitName("player").." - "..GetRealmName();
                
                if (not HF_INFO[player]) then
                        HF_INFO[player] = {
                                ["honor_yesterday"] = contributiony;
                                ["honor"]                                               = 0;
                                ["honor_bonus"]                 = 0;
                                ["kills_today"]                 = hkt;
                                ["kills_yesterday"]  = hky;
                                ["honor_week"]                  = contributionw;
                                ["faction"]                                     = checkfaction();
                                ["verbose"]                                     = 1;
                        }
                end
                
                hfsaved = HF_INFO[player];

                if (hfsaved.kills_today == nil) then hfsaved.kills_today = hkt; end
                if (hfsaved.kills_yesterday == nil) then hfsaved.kills_yesterday = hky; end
                if (HF_INFO[player]['hk_list'] == nil) then HF_INFO[player]['hk_list'] = {}; end
                if (hfsaved.honor_week == nil) then hfsaved.honor_week = contributionw; end
                if (hfsaved.faction == nil) then hfsaved.faction = checkfaction(); end
                if (hfsaved.verbose == nil) then hfsaved.verbose = 1; end

                HonorFrame_Update();
                DEFAULT_CHAT_FRAME:AddMessage("[Alkitron Honor Tab] Loaded for " .. player);
                
        elseif ( event == "PLAYER_PVP_KILLS_CHANGED" or event == "PLAYER_PVP_RANK_CHANGED") then
        
                HonorFrame_Update();
                
        elseif ( event == "PLAYER_ENTERING_WORLD" ) then
        
                HonorFrame_Update();
                
        elseif ( event == "CHAT_MSG_COMBAT_HONOR_GAIN") then
        
                local Pattern =  string.gsub(string.gsub(COMBATLOG_HONORGAIN, "([()])", "%%%1"), "%%[ds]", "([%%w ]+)");
                local s,e,hk_thisplayer,honor_thisplayer,honor_diminished,diminishing_return,ename,erank,ehonor;

                s, e, ename, erank, ehonor = string.find(arg1, Pattern);

                if (ename) and (erank) and (ehonor) then
                
                        if (not HF_INFO[player]['hk_list'][ename]) then
                                HF_INFO[player]['hk_list'][ename] = { ['killed'] = 1; ['honor_total'] = 0; };   
                        else
                                HF_INFO[player]['hk_list'][ename]['killed'] = HF_INFO[player]['hk_list'][ename]['killed'] + 1;
                                --HF_INFO[player]['hk_list'][ename]['honor_total'] = HF_INFO[player]['hk_list'][ename]['honor_total'] + ehonor;
                        end
                        
                        hk_thisplayer = HF_INFO[player]['hk_list'][ename]['killed'];
                        honor_thisplayer = HF_INFO[player]['hk_list'][ename]['honor_total'];
                        
                        if (hk_thisplayer == 1) then
                                diminishing_return = 1;
                        elseif (hk_thisplayer == 2) then
                                diminishing_return = .75;
                        elseif (hk_thisplayer == 3) then
                                diminishing_return = .50;
                        elseif (hk_thisplayer == 4) then
                                diminishing_return = .25;
                        else
                                diminishing_return = 0;
                        end
                        
                        honor_diminished = ehonor * diminishing_return;
                        
                        if (honor_diminished - floor(honor_diminished) > .5) then
                                honor_diminished = ceil(honor_diminished);
                        else
                                honor_diminished = floor(honor_diminished);
                        end

                        HF_INFO[player]['hk_list'][ename]['honor_total'] = HF_INFO[player]['hk_list'][ename]['honor_total'] + honor_diminished;

                        if (hfsaved.verbose == 1 and diminishing_return == 0) then
        DEFAULT_CHAT_FRAME:AddMessage(ename .. " is no longer worth any honor (" .. hk_thisplayer .. " kills / " .. honor_thisplayer .. " honor)");
      end

                        HonorFrame_Update(honor_diminished,1);
                        
                end
                
        elseif ( event == "CHAT_MSG_SPELL_CREATURE_VS_CREATURE_BUFF") then
        
                local bonushonortext = "begins to cast Honor Points %+(%d+)";
                local bonushonor = 0;
                
                for bonushonor in string.gfind(arg1, bonushonortext) do 
                        hfsaved.honor_bonus = hfsaved.honor_bonus + tonumber(bonushonor);
                        DEFAULT_CHAT_FRAME:AddMessage("Bonus Honor gained: " .. bonushonor .. ".", 1, 1, 0);
                        HonorFrame_Update();
                end
                
        elseif (event == "UPDATE_BATTLEFIELD_STATUS") then

                        RequestBattlefieldScoreData();
                        
        elseif (event == "UPDATE_BATTLEFIELD_SCORE") then

                checkscoreboard();

  elseif (event == "UPDATE_WORLD_STATES") then
  
        local temptime = time() - last_update;
        
                if (temptime >= scoreboardscan_interval) then
                        checkscoreboard();
    end
    
        end
end

function checkscoreboard()
            local name, kills, killingBlows, deaths, honorGained, faction, rank, race, class, tempbonus, i, e;
            
                        RequestBattlefieldScoreData();
                        e = GetNumBattlefieldScores();
                        last_update = time();
                        
        for i=1, e do
                                name, killingBlows, honorableKills, deaths, honorGained,
                                faction, rank, race, class = GetBattlefieldScore(i);
                                if (faction == hfsaved.faction) then
                if (name == UnitName("player")) then
                                if (honorGained == 0) then
                                        honor_last = 0;
                                end
                                if (honorGained > honor_last) then
                                                tempbonus = (honorGained - honor_last);
                                                honor_last = honorGained;
                                                                hfsaved.honor_bonus = hfsaved.honor_bonus + tempbonus;
                                                HonorFrame_Update();
                                                
                                                if (hfsaved.verbose == 1) then
                                                        DEFAULT_CHAT_FRAME:AddMessage("Adding " .. tempbonus .. " bonus honor.", 1, 1, 0);
                                                end
                                end
                                i = e;
                end
              else
                if (hfsaved.faction == 2) then
                        DEFAULT_CHAT_FRAME:AddMessage("[Alkitron Honor Tab] Improper faction variable detected, attempting to fix...");
                        hfsaved.faction = checkfaction();
                        DEFAULT_CHAT_FRAME:AddMessage("[Alkitron Honor Tab] Faction set to: " .. hfsaved.faction .. " (1=Alliance,0=Horde,2=nil)");
                                        end
              end
        end
end

function checkrollover()
        local hkw, contributionw = GetPVPThisWeekStats();
        local hky, dky, contributiony = GetPVPYesterdayStats();
        local hks, dks = GetPVPSessionStats();

                if (hfsaved.honor_week < contributionw) then

                        hfsaved.kills_yesterday = hfsaved.kills_today;
                        hfsaved.honor_yesterday = hfsaved.honor + hfsaved.honor_bonus;
                        hfsaved.honor_bonus = 0;
                        hfsaved.honor  = 0;
                        hfsaved.kills_today = 0;
                        hfsaved.honor_week = contributionw;
                        HF_INFO[player]['hk_list'] = {};

                        DEFAULT_CHAT_FRAME:AddMessage("[Alkitron Honor Tab] Just reset stats for the day. (1)");

                elseif (hfsaved.honor_week > contributionw and contributionw == 0) then
                        
                        local hklw, dklw, contributionlw, ranklw = GetPVPLastWeekStats();
        
                                if (hfsaved.honor_week < contributionlw) then

                                        hfsaved.kills_yesterday = hfsaved.kills_today;
                                        hfsaved.honor_yesterday = hfsaved.honor + hfsaved.honor_bonus;
                                        hfsaved.honor_bonus = 0;
                                        hfsaved.honor  = 0;
                                        hfsaved.kills_today = 0;
                                        hfsaved.honor_week = contributionw;
                                        HF_INFO[player]['hk_list'] = {};

                                        DEFAULT_CHAT_FRAME:AddMessage("[Alkitron Honor Tab] Just reset stats for the week.");

                                end

                elseif (hfsaved.honor_week == contributionw) then

                        if (hky == 0 and contributiony == 0) then
                                if(hks == 0) then
                                        hfsaved.kills_yesterday = hfsaved.kills_today;
                                        hfsaved.honor_yesterday = hfsaved.honor + hfsaved.honor_bonus;
                                        hfsaved.honor_bonus = 0;
                                        hfsaved.honor  = 0;
                                        hfsaved.kills_today = 0;
                                        hfsaved.honor_week = contributionw;
                                        HF_INFO[player]['hk_list'] = {};
                                        DEFAULT_CHAT_FRAME:AddMessage("[Alkitron Honor Tab] Just reset stats for the day. (2)");
                                end
                        end

                end
end

function HonorFrame_Update(honor,kill)
        local hk, hky, dk, contribution, rank, highestRank, rankName, rankNumber, temptotal;

        checkrollover();

        if (honor) then
                hfsaved.honor = honor + hfsaved.honor;
        end
        
        if (kill) then
                hfsaved.kills_today = hfsaved.kills_today + 1;
        end

        hk = hfsaved.kills_today;
        temptotal = hfsaved.honor + hfsaved.honor_bonus;

        -- This session's values
        HonorFrameCurrentHKText:SetText("Kills");
        --HonorFrameCurrentSessionTitle:SetText("Today's Honor");
        HonorFrameCurrentHKValue:SetTextColor(1,1,1);
        HonorFrameCurrentHKValue:SetText("Estimated / Bonus / Total Honor");
        HonorFrameCurrentDKText:SetTextColor(0,1,0);    
        HonorFrameCurrentDKText:SetText(hk);
        HonorFrameCurrentDKValue:SetTextColor(0,1,0);
        if (hfsaved.honor == 0 and hfsaved.honor_bonus == 0) then
                HonorFrameCurrentDKValue:SetText("none");
        else
                HonorFrameCurrentDKValue:SetText(hfsaved.honor .. " + " .. hfsaved.honor_bonus .. " = " .. temptotal);  
        end
        
        
        -- Yesterday's values
        hk, dk, contribution = GetPVPYesterdayStats();
        hky = hfsaved.kills_yesterday;
        
        --HonorFrameYesterdayTitle:SetText("Yesterday's Honor");
        HonorFrameYesterdayHKText:SetText("Kills");
        HonorFrameYesterdayHKValue:SetTextColor(1,1,1); 
        HonorFrameYesterdayHKValue:SetText("Estimated / Actual Honor"); 
        HonorFrameYesterdayContributionText:SetTextColor(0,1,0);
        HonorFrameYesterdayContributionText:SetText(hk);
        HonorFrameYesterdayContributionValue:SetTextColor(0,1,0);
        if (contribution == 0) then
                HonorFrameYesterdayContributionValue:SetText("none");   
        else
                HonorFrameYesterdayContributionValue:SetText(hfsaved.honor_yesterday .. " / " .. contribution);
        end


        -- This Week's values
        hk, contribution = GetPVPThisWeekStats();               
        local temptotal2 = contribution + temptotal;
        local temptotal3 = hk + hfsaved.kills_today;

        --HonorFrameThisWeekTitle:SetText("This Week's Honor");
        HonorFrameThisWeekHKText:SetTextColor(1,1,1);   
        HonorFrameThisWeekHKText:SetText("Kills");
        HonorFrameThisWeekContributionText:SetTextColor(0,1,0);
        HonorFrameThisWeekContributionText:SetText(temptotal3); 
        HonorFrameThisWeekHKValue:SetTextColor(1,1,1);  
        HonorFrameThisWeekHKValue:SetText("Today / This Week / Total Honor");
        HonorFrameThisWeekContributionValue:SetTextColor(0,1,0);
        if (contribution == 0) then
                HonorFrameThisWeekContributionValue:SetText("none");            
        else
                HonorFrameThisWeekContributionValue:SetText(temptotal .. " + " .. contribution .. " = " .. temptotal2); 
        end

        -- Last Week's values
        hk, dk, contribution, rank = GetPVPLastWeekStats();
        HonorFrameLastWeekHKValue:SetText(hk);
        HonorFrameLastWeekContributionValue:SetTextColor(1,.5,0);
        HonorFrameLastWeekContributionValue:SetText(contribution);
        HonorFrameLastWeekStandingValue:SetText(rank);


        -- Lifetime stats
        hk, dk, highestRank = GetPVPLifetimeStats();
        HonorFrameLifeTimeHKValue:SetText(hk);
        HonorFrameLifeTimeDKValue:SetText(dk);
        rankName, rankNumber = GetPVPRankInfo(highestRank);
        if ( not rankName ) then
                rankName = NONE;
        end
        HonorFrameLifeTimeRankValue:SetText(rankName);

        -- Set rank name and number
        rankName, rankNumber = GetPVPRankInfo(UnitPVPRank("player"));
        if ( not rankName ) then
                rankName = NONE;
        end
        
        -- Calculate How far we are into current rank
        rankPercent = tostring(GetPVPRankProgress() * 100);
        rankPercent = string.sub(rankPercent, 1, 5);
        
        HonorFrameCurrentPVPTitle:SetText(rankName);
        HonorFrameCurrentPVPRank:SetText("("..RANK.." "..rankNumber..")   " .. rankPercent .. "%");
        
        -- Set icon
        if ( rankNumber > 0 ) then
                HonorFramePvPIcon:SetTexture(format("%s%02d","Interface\\PvPRankBadges\\PvPRank",rankNumber));
                HonorFramePvPIcon:Show();
        else
                HonorFramePvPIcon:Hide();
        end
        
        -- Set rank progress and bar color
        local factionGroup, factionName = UnitFactionGroup("player");
        if ( factionGroup == "Alliance" ) then
                HonorFrameProgressBar:SetStatusBarColor(0.05, 0.15, 0.36);
        else
                HonorFrameProgressBar:SetStatusBarColor(0.63, 0.09, 0.09);
        end
        HonorFrameProgressBar:SetValue(GetPVPRankProgress());

        -- Recenter rank text
        HonorFrameCurrentPVPTitle:SetPoint("TOP", "HonorFrame", "TOP", - HonorFrameCurrentPVPRank:GetWidth()/2, -83);
end

function showkills()
        local ename,kills,htotal;
        local i = 0;
        for ename in HF_INFO[player]['hk_list'] do
                i = i+ 1;
                kills = HF_INFO[player]['hk_list'][ename]['killed'];
                htotal = HF_INFO[player]['hk_list'][ename]['honor_total'];
                DEFAULT_CHAT_FRAME:AddMessage(ename .. " " ..  kills .. " " .. htotal);
        end
        DEFAULT_CHAT_FRAME:AddMessage(i .. " entries found");
end

Generated by GNU Enscript 1.6.5.90.