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