vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
TITAN_DURABILITY_ID = "Durability";
TITAN_DURABILITY_FREQUENCY = 1;

TITAN_DURABILITY_FORMAT = "%d%%";

-- Local variables
TitanDurability_totalRepairCost = 0;
TitanDurability_duraPercent = 0;
TitanDurability_duraCurr = 0;
TitanDurability_duraTotal = 0;
TitanDurability_itemstats = {};

function TitanPanelDurabilityButton_OnLoad()
        _, _, TITAN_DURABILITY_TEXT = string.find(DURABILITY_TEMPLATE, "(.+) %%[^%s]+ / %%[^%s]+")
        TITAN_DURABILITY_TOOLTIP_REPAIR = REPAIR_COST.. "\t";
        TITAN_DURABILITY_TOOLTIP_DURA = TITAN_DURABILITY_TEXT.. ":\t"
        TITAN_DURABILITY_LABEL = TITAN_DURABILITY_TEXT.. ": ";

        this.registry = { 
                id = TITAN_DURABILITY_ID,
                menuText = TITAN_DURABILITY_TEXT, 
                buttonTextFunction = "TitanPanelDurabilityButton_GetButtonText", 
                tooltipTitle = TITAN_DURABILITY_TEXT,
                tooltipTextFunction = "TitanPanelDurabilityButton_GetTooltipText", 
                frequency = TITAN_DURABILITY_FREQUENCY, 
                icon = "Interface\\Icons\\Trade_BlackSmithing.blp";     
                iconWidth = 16,          
                savedVariables = {
                        ShowLabelText = 1,
                        ShowColoredText = 1,
                        ShowIcon = 1,                   
                        iteminfo = 0,
                        hideguy = 0,
                }
        };
        
        this:RegisterEvent("PLAYER_ENTERING_WORLD");
        this:RegisterEvent("UPDATE_INVENTORY_ALERTS");
end

function TitanPanelDurabilityButton_GetButtonText(id)
        if (not TitanDurability_duraPercent) then
                return TITAN_DURABILITY_NUDE;
        end
        if ( TitanGetVar(TITAN_DURABILITY_ID, "ShowColoredText") ) then 
                duraRichText = TitanPanelDurability_GetColoredText(TitanDurability_duraPercent);
        else
                local duraText = format(TITAN_DURABILITY_FORMAT,TitanDurability_duraPercent);
                duraRichText = TitanUtils_GetHighlightText(duraText);
        end
        
        return TITAN_DURABILITY_LABEL,duraRichText;
end

function TitanPanelDurabilityButton_GetTooltipText()
        local retstr = "\n";
        if (not TitanDurability_duraPercent) then
                retstr = retstr.. TITAN_DURABILITY_TOOLTIP_DURA.. GSC_NONE.. "\n";
        else    
                retstr = retstr.. TITAN_DURABILITY_TOOLTIP_DURA.. TitanPanelDurability_GetColoredText(TitanDurability_duraPercent).. "\n";
        end
        retstr = retstr.. TITAN_DURABILITY_TOOLTIP_REPAIR.. TitanPanelDurability_GetTextGSC(TitanDurability_totalRepairCost);
        
        if (TitanGetVar(TITAN_DURABILITY_ID, "iteminfo")) then
                local slots = {
                        {"Head", HEADSLOT},
                        {"Shoulder", SHOULDERSLOT},
                        {"Chest", CHESTSLOT},
                        {"Wrist", WRISTSLOT},
                        {"Hands", HANDSSLOT},           
                        {"Waist", WAISTSLOT},
                        {"Legs", LEGSSLOT},
                        {"Feet", FEETSLOT},
                        {"MainHand", MAINHANDSLOT},
                        {"SecondaryHand", SECONDARYHANDSLOT},
                        {"Ranged", RANGEDSLOT},
                };

                retstr = retstr.. "\n"; 
                for i,arr in slots do
                        local stats = TitanDurability_itemstats[arr[1]]
                        if (stats) then
                                if (stats[1] == GSC_NONE) then
                                        retstr = retstr.. "\n".. arr[2]..":\t".. stats[1];
                                else
                                        if ( TitanGetVar(TITAN_DURABILITY_ID, "ShowColoredText") ) then 
                                                retstr = retstr.. "\n".. arr[2]..":\t".. TitanPanelDurability_GetColoredText(stats[1]);
                                        else
                                                local duraText = TitanUtils_GetHighlightText(format(TITAN_DURABILITY_FORMAT,stats[1]));
                                                retstr = retstr.. "\n".. arr[2]..":\t".. duraText;
                                        end
                                end
                        end
                end
                retstr = retstr.. "\n"; 
                for i,arr in slots do
                        cost = TitanDurability_itemstats[arr[1]][2];
                        if (cost ~= GSC_NONE) then
                                retstr = retstr.. "\n".. arr[2]..":\t".. cost;
                        end
                end
        end
        
        return retstr;
end

function TitanPanelDurabilityButton_OnEvent()
        if (event == "PLAYER_ENTERING_WORLD") 
                or (event == "UPDATE_INVENTORY_ALERTS") 
                then
                TitanPanelDurability_CalcValues();
        end
end

function TitanPanelRightClickMenu_PrepareDurabilityMenu()
        local id = "Durability";
        local info = {};

        TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_DURABILITY_ID].menuText);
        TitanPanelRightClickMenu_AddSpacer();           

        info = {};
        info.text = TITAN_DURABILITY_MENU_ITEMS;
        info.value = "iteminfo";
        info.func = TitanPanelDurability_Toggle;
        info.checked = TitanGetVar(TITAN_DURABILITY_ID, "iteminfo");
        UIDropDownMenu_AddButton(info);

        info = {};
        info.text = TITAN_DURABILITY_MENU_GUY;
        info.value = "hideguy";
        info.func = TitanPanelDurability_Toggle;
        info.checked = TitanGetVar(TITAN_DURABILITY_ID, "hideguy");
        UIDropDownMenu_AddButton(info);

        TitanPanelRightClickMenu_AddToggleIcon(TITAN_DURABILITY_ID);    
        TitanPanelRightClickMenu_AddToggleLabelText(TITAN_DURABILITY_ID);
        TitanPanelRightClickMenu_AddToggleColoredText(TITAN_DURABILITY_ID);     
        TitanPanelRightClickMenu_AddCommand(TITAN_PANEL_MENU_HIDE, id, TITAN_PANEL_MENU_FUNC_HIDE);
end

function TitanPanelDurability_Toggle()
        TitanToggleVar(TITAN_DURABILITY_ID, this.value);
        TitanPanelButton_UpdateButton(TITAN_DURABILITY_ID);
        
        if (this.value == "hideguy") then TitanPanelDurability_CalcValues(); end
end

function TitanPanelDurability_CalcValues()
        -- hide Durability "guy"
        if (TitanGetVar(TITAN_DURABILITY_ID, "hideguy")) then
                if (DurabilityFrame:IsVisible()) then
                        DurabilityFrame:Hide();
                end
        end

        local slotnames = {
                "Head",
                "Shoulder",
                "Chest",
                "Wrist",
                "Hands",                
                "Waist",
                "Legs",
                "Feet",
                "MainHand",
                "SecondaryHand",
                "Ranged",
        };
        
        local id, hasItem, repairCost;
        local itemName, durability, tmpText, midpt, lval, rval;

        TitanDurability_totalRepairCost = 0;
        TitanDurability_duraPercent = 0;
        TitanDurability_duraCurr = 0;
        TitanDurability_duraTotal = 0;

        for i,slotName in slotnames do
                id, _ = GetInventorySlotInfo(slotName.. "Slot");
                TPDurTooltip:Hide()
                TPDurTooltip:SetOwner(this, "ANCHOR_LEFT");
                hasItem, _, repairCost = TPDurTooltip:SetInventoryItem("player", id);

                if ( not hasItem ) then
                        TPDurTooltip:ClearLines()
                else 
                        itemName = TPDurTooltipTextLeft1:GetText(); 
        
                        --Search for durability line
                        for i=2, 15, 1 do
                                tmpText = getglobal("TPDurTooltipTextLeft"..i);
                                lval = nil;
                                rval = nil;
                                if (tmpText:GetText()) then
                                        
                                        local searchstr = string.gsub(DURABILITY_TEMPLATE, "%%d", "(.+)")
                                        _, _, lval, rval = string.find(tmpText:GetText(), searchstr);
                                end
                                if (lval and rval) then break; end
                        end
                end
                if (lval and rval) then
                        local currpercent;
                        if (rval == 0) then
                                currpercent = GSC_NONE;
                        else
                                currpercent = math.floor(lval / rval * 100);
                        end
                        TitanDurability_itemstats[slotName] = {currpercent, TitanPanelDurability_GetTextGSC(repairCost)};
                        TitanDurability_duraCurr = TitanDurability_duraCurr + lval;
                        TitanDurability_duraTotal = TitanDurability_duraTotal + rval;
                        TitanDurability_totalRepairCost = TitanDurability_totalRepairCost + repairCost
                        lval = 0;
                        rval = 0;
                else
                        TitanDurability_itemstats[slotName] = {GSC_NONE, GSC_NONE};
                end
        end
        TPDurTooltip:Hide()
        if (TitanDurability_duraTotal == 0) then
                TitanDurability_duraPercent = nil
        else
                TitanDurability_duraPercent = math.floor(TitanDurability_duraCurr / TitanDurability_duraTotal * 100);
        end
end

-------------------------------------------------------------------------------
-- Gold formatting code, shamelessly "borrowed" from Auctioneer
-------------------------------------------------------------------------------

function TitanPanelDurability_GetGSC(money)
        local neg = false;
        if (money == nil) then money = 0; end
        if (money < 0) then 
                neg = true;
                money = money * -1;
        end
        local g = math.floor(money / 10000);
        local s = math.floor((money - (g*10000)) / 100);
        local c = math.floor(money - (g*10000) - (s*100));
        return g,s,c,neg;
end

GSC_GOLD="ffd100";
GSC_SILVER="e6e6e6";
GSC_COPPER="c8602c";
GSC_START="|cff%s%d|r";
GSC_PART=".|cff%s%02d|r";
GSC_NONE="|cffa0a0a0"..NONE.."|r";

function TitanPanelDurability_GetTextGSC(money)
        local g, s, c, neg = TitanPanelDurability_GetGSC(money);
        local gsc = "";
        if (g > 0) then
                gsc = format(GSC_START, GSC_GOLD, g);
                gsc = gsc..format(GSC_PART, GSC_SILVER, s);
                gsc = gsc..format(GSC_PART, GSC_COPPER, c);
        elseif (s > 0) then
                gsc = format(GSC_START, GSC_SILVER, s);
                if (c > 0) then
                        gsc = gsc..format(GSC_PART, GSC_COPPER, c);
                end
        elseif (c > 0) then
                gsc = gsc..format(GSC_START, GSC_COPPER, c);
        else
                gsc = GSC_NONE;
        end
        
        if (neg) then gsc = "(".. gsc.. ")"; end

        return gsc;
end

function TitanPanelDurability_GetColoredText(percent)
        local green = GREEN_FONT_COLOR;         -- 0.1, 1.00, 0.1
        local yellow = NORMAL_FONT_COLOR;       -- 1.0, 0.82, 0.0
        local red = RED_FONT_COLOR;                             -- 1.0, 0.10, 0.1
        
        percent = percent / 100;
        local color = {};
        
        if (percent == 1.0) then
                color = green;
        elseif (percent == 0.5) then
                color = yellow;
        elseif (percent == 0.0) then
                color = red;
        elseif (percent > 0.5) then
                local pct = (1.0 - percent) * 2;
                color.r =(yellow.r - green.r)*pct + green.r;
                color.g = (yellow.g - green.g)*pct + green.g;
                color.b = (yellow.b - green.b)*pct + green.b;
        elseif (percent < 0.5) then
                local pct = (0.5 - percent) * 2;
                color.r = (red.r - yellow.r)*pct + yellow.r;
                color.g = (red.g - yellow.g)*pct + yellow.g;
                color.b = (red.b - yellow.b)*pct + yellow.b;
        end
        
        local txt = format(TITAN_DURABILITY_FORMAT,percent*100);        
        local colortxt = TitanUtils_GetColoredText(txt, color);

        return colortxt;
end