vanilla-wow-addons – Rev 1
?pathlinks?
--[[
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,
}