--[[ Enchantrix Addon for World of Warcraft(tm). Version: 3.6.1 (Platypus) Revision: $Id: EnxTooltip.lua 911 2006-06-23 10:08:24Z aradan $ Tooltip functions. License: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program(see GLP.txt); if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]] -- Global functions local addonLoaded -- Enchantrix.Tooltip.AddonLoaded() local tooltipFormat -- Enchantrix.Tooltip.Format -- Local functions local itemTooltip local enchantTooltip local hookTooltip function addonLoaded() -- Hook in new tooltip code Stubby.RegisterFunctionHook("EnhTooltip.AddTooltip", 400, hookTooltip) end tooltipFormat = { currentFormat = "fancy", format = { ["fancy"] = { -- counts = off ['off'] = " $conf% |q$name|r $rate", -- counts = on ['on'] = " $conf% |q$name|r $rate |e(B=$bcount L=$lcount)|r", }, ["default"] = { ['off'] = " $name: $prob% $rate", ['on'] = " $name: $prob% $rate |e(B=$bcount L=$lcount)|r", }, }, patterns = { -- Strings ["$prob"] = "", -- Probability: "75" ["$conf"] = "", -- Confidence interval: "<1", "72-78", ">99" ["$count"] = "", -- Local + base counts: "51" ["$lcount"] = "", -- Local count: "13" ["$bcount"] = "", -- Base count: "38" ["$name"] = "", -- Name: "Lesser Magic Essence" ["$rate"] = "", -- Avg drop amount: "x1.5" -- Colors ["|q"] = "", -- Quality color ["|E"] = "|cffcccc33", -- Yellow ("Enchantrix" color) ["|e"] = "|cff7f7f00", -- Dark yellow ["|r"] = "|r", -- Reset color }, SelectFormat = function(this, fmt) if this.format[fmt] then this.currentFormat = fmt else this.currentFormat = "default" end end, SetFormat = function(this, fmt, val, counts) if counts == nil then counts = Enchantrix.Config.GetFilter('counts') end if counts then this.format[fmt]['on'] = val else this.format[fmt]['off'] = val end end, GetFormat = function(this, fmt, counts) if not this.format[fmt] then return end if counts == nil then counts = Enchantrix.Config.GetFilter('counts') end if counts then return this.format[fmt]['on'] else return this.format[fmt]['off'] end end, GetString = function(this, counts) local line if counts == nil then counts = Enchantrix.Config.GetFilter('counts') end if counts then line = this.format[this.currentFormat]['on'] else line = this.format[this.currentFormat]['off'] end -- Replace patterns for pat, repl in pairs(this.patterns) do line = string.gsub(line, pat, repl or "") end return line end, SetPattern = function(this, pat, repl) this.patterns[pat] = repl end, } function itemTooltip(funcVars, retVal, frame, name, link, quality, count) local embed = Enchantrix.Config.GetFilter('embed'); -- Check for disenchantable target local id = Enchantrix.Util.GetItemIdFromLink(link) if (not id or id == 0 or not Enchantrix.Util.IsDisenchantable(id)) then return end local disenchantsTo = Enchantrix.Storage.GetItemDisenchants(Enchantrix.Util.GetSigFromLink(link), name, true); -- Process the results local totals = disenchantsTo.totals; disenchantsTo.totals = nil; if (totals and totals.total > 0) then -- Terse mode if Enchantrix.Config.GetFilter('terse') and not IsControlKeyDown() then if Enchantrix.Config.GetFilter('valuate-hsp') and totals.hspValue > 0 then EnhTooltip.AddLine(_ENCH('FrmtValueAuctHsp'), Enchantrix.Util.Round(totals.hspValue * totals.conf, 3), embed); EnhTooltip.LineColor(0.1,0.6,0.6); elseif Enchantrix.Config.GetFilter('valuate-median') and totals.medValue > 0 then EnhTooltip.AddLine(_ENCH('FrmtValueAuctMed'), Enchantrix.Util.Round(totals.medValue * totals.conf, 3), embed); EnhTooltip.LineColor(0.1,0.6,0.6); elseif Enchantrix.Config.GetFilter('valuate-baseline') and totals.mktValue > 0 then EnhTooltip.AddLine(_ENCH('FrmtValueMarket'), Enchantrix.Util.Round(totals.mktValue * totals.conf, 3), embed); EnhTooltip.LineColor(0.1,0.6,0.6); end return end -- If it looks quirky, and we haven't disenchanted it, then ignore it... if (totals.iCount + totals.biCount < 1) then return; end -- Header local total = "" if (Enchantrix.Config.GetFilter('counts')) then total = string.format(" |cff7f7f00(%d)|r", totals.total) end EnhTooltip.AddLine(_ENCH('FrmtDisinto')..total, nil, embed); EnhTooltip.LineColor(0.8,0.8,0.2); local lines = {} for dSig, counts in pairs(disenchantsTo) do local p = (counts.biCount + counts.iCount) / totals.total local pmin, pmax = Enchantrix.Util.ConfidenceInterval(p, totals.total) -- Probabilities p, pmin, pmax = math.floor(p * 100 + 0.5), math.floor(pmin * 100 + 0.5), math.floor(pmax * 100 + 0.5) tooltipFormat:SetPattern("$prob", tostring(p)) if pmin == 0 then tooltipFormat:SetPattern("$conf", "<"..max(pmax, 1)) elseif pmax == 100 then tooltipFormat:SetPattern("$conf", ">"..min(pmin, 99)) else if pmin ~= pmax then tooltipFormat:SetPattern("$conf", pmin.."-"..pmax) else tooltipFormat:SetPattern("$conf", tostring(p)) end end -- Counts tooltipFormat:SetPattern("$count", tostring(counts.biCount + counts.iCount)) tooltipFormat:SetPattern("$lcount", tostring(counts.iCount)) tooltipFormat:SetPattern("$bcount", tostring(counts.biCount)) -- Name and quality local name, _, quality = Enchantrix.Util.GetReagentInfo(dSig) local _, _, _, color = GetItemQualityColor(quality or 0) tooltipFormat:SetPattern("|q", color or "|cffcccc33") tooltipFormat:SetPattern("$name", name or counts.name) -- Rate if counts.rate ~= 1 then tooltipFormat:SetPattern("$rate", string.format("x%0.1f", counts.rate)) else tooltipFormat:SetPattern("$rate", "") end -- Store this line and sort key local line = tooltipFormat:GetString(Enchantrix.Config.GetFilter('counts')) table.insert(lines, {str = line, sort = pmin}) end -- Sort in order of decreasing probability before adding to tooltip table.sort(lines, function(a, b) return a.sort > b.sort end) for n, line in ipairs(lines) do EnhTooltip.AddLine(line.str, nil, embed) EnhTooltip.LineColor(0.8, 0.8, 0.2); if n >= 5 then break end -- Don't add more than 5 lines end if (Enchantrix.Config.GetFilter('valuate')) then local confidence = totals.conf; if (Enchantrix.Config.GetFilter('valuate-hsp') and totals.hspValue > 0) then EnhTooltip.AddLine(_ENCH('FrmtValueAuctHsp'), Enchantrix.Util.Round(totals.hspValue * confidence, 3), embed); EnhTooltip.LineColor(0.1,0.6,0.6); end if (Enchantrix.Config.GetFilter('valuate-median') and totals.medValue > 0) then EnhTooltip.AddLine(_ENCH('FrmtValueAuctMed'), Enchantrix.Util.Round(totals.medValue * confidence, 3), embed); EnhTooltip.LineColor(0.1,0.6,0.6); end if (Enchantrix.Config.GetFilter('valuate-baseline') and totals.mktValue > 0) then EnhTooltip.AddLine(_ENCH('FrmtValueMarket'), Enchantrix.Util.Round(totals.mktValue * confidence, 3), embed); EnhTooltip.LineColor(0.1,0.6,0.6); end end end end local function getReagentsFromCraftFrame(craftIndex) local reagentList = {} local numReagents = GetCraftNumReagents(craftIndex) for i = 1, numReagents do local link = GetCraftReagentItemLink(craftIndex, i) if link then local hlink = EnhTooltip.HyperlinkFromLink(link) local reagentName, reagentTexture, reagentCount, playerReagentCount = GetCraftReagentInfo(craftIndex, i) table.insert(reagentList, {hlink, reagentCount}) end end return reagentList end local function getReagentsFromTooltip(frame) local frameName = frame:GetName() local nLines = frame:NumLines() local reagents -- Find reagents line ("Reagents: ...") for i = 1, nLines do local text = getglobal(frameName.."TextLeft"..i):GetText() -- string.find(text, "Reagents: (.+)") local _, _, r = string.find(text, _ENCH('PatReagents')) if r then reagents = r break end end if not reagents then return end local reagentList = {} local name, quality, color, hlink -- Process reagents separated by "," for reagent in Enchantrix.Util.Spliterator(reagents, ",") do -- Chomp whitespace reagent = string.gsub(reagent, "^%s*", "") reagent = string.gsub(reagent, "%s*$", "") -- ...and color codes reagent = string.gsub(reagent, "^%|c%x%x%x%x%x%x%x%x", "") reagent = string.gsub(reagent, "%|r$", "") -- Get and chomp counts, e.g "Strange Dust (2)" local _, _, count = string.find(reagent, "%((%d+)%)$") if count then reagent = string.gsub(reagent, "%s*%(%d+%)$", "") count = tonumber(count) else count = 1 end hlink = Enchantrix.Util.GetLinkFromName(reagent) if hlink then table.insert(reagentList, {hlink, count}) else return end end return reagentList end function enchantTooltip(funcVars, retVal, frame, name, link) local embed = Enchantrix.Config.GetFilter('embed'); local craftIndex for i = 1, GetNumCrafts() do local craftName = GetCraftInfo(i) if name == craftName then craftIndex = i break end end -- Get reagent list local reagentList if craftIndex then reagentList = getReagentsFromCraftFrame(craftIndex) else reagentList = getReagentsFromTooltip(frame) end if not reagentList or table.getn(reagentList) < 1 then return end -- Append additional reagent info for _, reagent in ipairs(reagentList) do local name, link, quality = Enchantrix.Util.GetReagentInfo(reagent[1]) local hsp, median, market = Enchantrix.Util.GetReagentPrice(reagent[1]) local _, _, _, color = GetItemQualityColor(quality) reagent[1] = name table.insert(reagent, quality) table.insert(reagent, color) table.insert(reagent, hsp) end local NAME, COUNT, QUALITY, COLOR, PRICE = 1, 2, 3, 4, 5 -- Sort by rarity and price table.sort(reagentList, function(a,b) if (not b) or (not a) then return end return ((b[QUALITY] or -1) < (a[QUALITY] or -1)) or ((b[PRICE] or 0) < (a[PRICE] or 0)) end) -- Header if not embed then local icon if craftIndex then icon = GetCraftIcon(craftIndex) else icon = "Interface\\Icons\\Spell_Holy_GreaterHeal" end EnhTooltip.SetIcon(icon) EnhTooltip.AddLine(name) EnhTooltip.AddLine(EnhTooltip.HyperlinkFromLink(link)) end EnhTooltip.AddLine(_ENCH('FrmtSuggestedPrice'), nil, embed) EnhTooltip.LineColor(0.8,0.8,0.2) local price = 0 local unknownPrices -- Add reagent list to tooltip and sum reagent prices for _, reagent in pairs(reagentList) do local line = " " if reagent[COLOR] then line = line..reagent[COLOR] end line = line..reagent[NAME] if reagent[COLOR] then line = line.."|r" end line = line.." x"..reagent[COUNT] if reagent[COUNT] > 1 and reagent[PRICE] then line = line.." "..string.format(_ENCH('FrmtPriceEach'), EnhTooltip.GetTextGSC(Enchantrix.Util.Round(reagent[PRICE], 3))) EnhTooltip.AddLine(line, Enchantrix.Util.Round(reagent[PRICE] * reagent[COUNT], 3), embed) price = price + reagent[PRICE] * reagent[COUNT] elseif reagent[PRICE] then EnhTooltip.AddLine(line, Enchantrix.Util.Round(reagent[PRICE], 3), embed) price = price + reagent[PRICE] else EnhTooltip.AddLine(line, nil, embed) unknownPrices = true end EnhTooltip.LineColor(0.7,0.7,0.1) end -- Barker price local margin = Enchantrix_BarkerGetConfig("profit_margin") local profit = price * margin * 0.01 profit = math.min(profit, Enchantrix_BarkerGetConfig("highest_profit")) local barkerPrice = Enchantrix_RoundPrice(price + profit) -- Totals if price > 0 then EnhTooltip.AddLine(_ENCH('FrmtTotal'), Enchantrix.Util.Round(price, 2.5), embed) EnhTooltip.LineColor(0.8,0.8,0.2) if Enchantrix.Config.GetFilter('barker') and (GetLocale() == "enUS") then -- "Barker Price (%d%% margin)" EnhTooltip.AddLine(string.format(_ENCH('FrmtBarkerPrice'), Enchantrix.Util.Round(margin)), barkerPrice, embed) EnhTooltip.LineColor(0.8,0.8,0.2) end if not Enchantrix.State.Auctioneer_Loaded then EnhTooltip.AddLine(_ENCH('FrmtWarnAuctNotLoaded')) EnhTooltip.LineColor(0.6,0.6,0.1) end if unknownPrices then EnhTooltip.AddLine(_ENCH('FrmtWarnPriceUnavail')) EnhTooltip.LineColor(0.6,0.6,0.1) end else EnhTooltip.AddLine(_ENCH('FrmtWarnNoPrices')) EnhTooltip.LineColor(0.6,0.6,0.1) end end function hookTooltip(funcVars, retVal, frame, name, link, quality, count) -- nothing to do, if enchantrix is disabled if (not Enchantrix.Config.GetFilter('all')) then return end local ltype = EnhTooltip.LinkType(link) if ltype == "item" then itemTooltip(funcVars, retVal, frame, name, link, quality, count) elseif ltype == "enchant" then enchantTooltip(funcVars, retVal, frame, name, link) end end Enchantrix.Tooltip = { Revision = "$Revision: 911 $", AddonLoaded = addonLoaded, Format = tooltipFormat, }