721 lines
24 KiB
Lua
721 lines
24 KiB
Lua
--[[
|
|
Enchantrix Addon for World of Warcraft(tm).
|
|
Version: 5.9.4961 (WhackyWallaby)
|
|
Revision: $Id: EnxTooltip.lua 4933 2010-10-13 17:16:14Z Nechckn $
|
|
URL: http://enchantrix.org/
|
|
|
|
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 GPL.txt); if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
Note:
|
|
This AddOn's source code is specifically designed to work with
|
|
World of Warcraft's interpreted AddOn system.
|
|
You have an implicit license to use this AddOn with these facilities
|
|
since that is its designated purpose as per:
|
|
http://www.fsf.org/licensing/licenses/gpl-faq.html#InterpreterIncompat
|
|
]]
|
|
Enchantrix_RegisterRevision("$URL: http://svn.norganna.org/auctioneer/branches/5.9/Enchantrix/EnxTooltip.lua $", "$Rev: 4933 $")
|
|
|
|
-- Global functions
|
|
local addonLoaded -- Enchantrix.Tooltip.AddonLoaded()
|
|
local tooltipFormat -- Enchantrix.Tooltip.Format
|
|
|
|
-- Local functions
|
|
local itemTooltip
|
|
local enchantTooltip
|
|
local hookItemTooltip, hookSpellTooltip
|
|
|
|
local tooltip = LibStub("nTipHelper:1")
|
|
|
|
function addonLoaded()
|
|
-- Hook in new tooltip code
|
|
tooltip:Activate()
|
|
tooltip:AddCallback( { type = "item", callback = hookItemTooltip }, 400)
|
|
tooltip:AddCallback( { type = "spell", callback = hookSpellTooltip }, 400)
|
|
end
|
|
|
|
tooltipFormat = {
|
|
currentFormat = "fancy",
|
|
format = {
|
|
["fancy"] = " $prob% |q$name|r $rate",
|
|
["default"] = " $name: $prob% $rate",
|
|
},
|
|
patterns = {
|
|
-- Strings
|
|
["$prob"] = "", -- Probability: "75"
|
|
["$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)
|
|
this.format[fmt] = val
|
|
end,
|
|
GetFormat = function(this, fmt, counts)
|
|
if not this.format[fmt] then return end
|
|
return this.format[fmt]
|
|
end,
|
|
GetString = function(this)
|
|
local line = this.format[this.currentFormat]
|
|
-- Replace patterns
|
|
for pat, repl in pairs(this.patterns) do
|
|
line = line:gsub(pat, repl or "")
|
|
end
|
|
return line
|
|
end,
|
|
SetPattern = function(this, pat, repl)
|
|
this.patterns[pat] = repl
|
|
end,
|
|
}
|
|
|
|
|
|
local function prospectTooltip(prospect, tooltip, name, link, quality, count)
|
|
|
|
local embed = Enchantrix.Settings.GetSetting('ToolTipEmbedInGameTip')
|
|
|
|
local lines
|
|
|
|
local totalFive = {}
|
|
local totalHSP, totalMed, totalMkt, totalFive = 0,0,0,0
|
|
local totalNumber, totalQuantity
|
|
|
|
for result, resYield in pairs( prospect ) do
|
|
if (not lines) then lines = {} end
|
|
local style, extra = Enchantrix.Util.GetPricingModel();
|
|
local hsp, med, mkt, five = Enchantrix.Util.GetReagentPrice(result,extra)
|
|
local resHSP, resMed, resMkt, resFive = (hsp or 0)*resYield, (med or 0)*resYield, (mkt or 0)*resYield, (five or 0)*resYield
|
|
totalHSP = totalHSP + resHSP
|
|
totalMed = totalMed + resMed
|
|
totalMkt = totalMkt + resMkt
|
|
totalFive = totalFive + resFive
|
|
|
|
-- Probabilities
|
|
local prob = tostring( resYield * 100 )
|
|
tooltipFormat:SetPattern("$prob", prob)
|
|
|
|
-- Name and quality
|
|
local rName, _, rQuality = Enchantrix.Util.GetReagentInfo(result)
|
|
local _, _, _, color = GetItemQualityColor(rQuality or 0)
|
|
tooltipFormat:SetPattern("|q", color or "|cffcccc33")
|
|
if (not rName) then rName = "item:"..result; end
|
|
tooltipFormat:SetPattern("$name", rName)
|
|
|
|
-- Rate is always unity here (not really 1, but handled in the probability)
|
|
tooltipFormat:SetPattern("$rate", "")
|
|
|
|
-- Store this line and sort key
|
|
local line = tooltipFormat:GetString(false) -- no counts here
|
|
table.insert(lines, {str = line, sort = resYield})
|
|
end
|
|
|
|
|
|
-- multiply values by the number of items in this stack
|
|
local groups = count / 5;
|
|
totalHSP = totalHSP * groups;
|
|
totalMed = totalMed * groups;
|
|
totalMkt = totalMkt * groups;
|
|
totalFive = totalFive * groups;
|
|
|
|
tooltip:SetColor(0.8,0.8,0.2);
|
|
if (Enchantrix.Settings.GetSetting('TooltipProspectMats')) then
|
|
-- Header
|
|
local totalText = ""
|
|
tooltip:AddLine(_ENCH('FrmtProspectInto')..totalText, nil, embed);
|
|
-- 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
|
|
tooltip:AddLine(line.str, nil, embed)
|
|
if n >= 13 then break end -- Don't add more than 13 lines (1 Powder + 6 Uncommon + 6 Rare)
|
|
end
|
|
end
|
|
|
|
if (Enchantrix.Settings.GetSetting('TooltipProspectLevels')) then
|
|
local reqSkill = Enchantrix.Util.JewelCraftSkillRequiredForItem(link);
|
|
local userSkill = Enchantrix.Util.GetUserJewelCraftingSkill();
|
|
local deText = format(_ENCH("TooltipProspectLevel"), reqSkill );
|
|
if (userSkill < reqSkill) then
|
|
tooltip:AddLine(deText, nil, 0.8,0.1,0.1, embed); -- reddish
|
|
else
|
|
tooltip:AddLine(deText, nil, 0.1,0.8,0.1, embed); -- greenish
|
|
end
|
|
end
|
|
|
|
tooltip:SetColor(0.1,0.6,0.6);
|
|
if (Enchantrix.Settings.GetSetting('TooltipProspectValues')) then
|
|
if (AucAdvanced and Enchantrix.Settings.GetSetting('TooltipProspectShowAuctAdvValue') and totalFive > 0) then
|
|
tooltip:AddLine(_ENCH('FrmtProspectValueAuctVal'), totalFive, embed);
|
|
end
|
|
if (Enchantrix.Settings.GetSetting('TooltipProspectShowAuctValueHSP') and totalHSP > 0) then
|
|
tooltip:AddLine(_ENCH('FrmtProspectValueAuctHsp'), totalHSP, embed);
|
|
end
|
|
if (Enchantrix.Settings.GetSetting('TooltipProspectShowAuctValueMedian') and totalMed > 0) then
|
|
tooltip:AddLine(_ENCH('FrmtProspectValueAuctMed'), totalMed, embed);
|
|
end
|
|
if (Enchantrix.Settings.GetSetting('TooltipProspectShowBaselineValue') and totalMkt > 0) then
|
|
tooltip:AddLine(_ENCH('FrmtProspectValueMarket'), totalMkt, embed);
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
|
|
-- ccox - TODO WOTLK - change strings to milling, see if this can share code with prospecting!
|
|
-- probably not
|
|
|
|
local function millingTooltip(prospect, tooltip, name, link, quality, count)
|
|
|
|
local embed = Enchantrix.Settings.GetSetting('ToolTipEmbedInGameTip')
|
|
|
|
local lines
|
|
|
|
local totalFive = {}
|
|
local totalHSP, totalMed, totalMkt, totalFive = 0,0,0,0
|
|
local totalNumber, totalQuantity
|
|
|
|
for result, resYield in pairs( prospect ) do
|
|
if (not lines) then lines = {} end
|
|
local style, extra = Enchantrix.Util.GetPricingModel();
|
|
local hsp, med, mkt, five = Enchantrix.Util.GetReagentPrice(result,extra)
|
|
local resHSP, resMed, resMkt, resFive = (hsp or 0)*resYield, (med or 0)*resYield, (mkt or 0)*resYield, (five or 0)*resYield
|
|
totalHSP = totalHSP + resHSP
|
|
totalMed = totalMed + resMed
|
|
totalMkt = totalMkt + resMkt
|
|
totalFive = totalFive + resFive
|
|
|
|
-- Probabilities
|
|
local prob = tostring( resYield * 100 )
|
|
tooltipFormat:SetPattern("$prob", prob)
|
|
|
|
-- Name and quality
|
|
local rName, _, rQuality = Enchantrix.Util.GetReagentInfo(result)
|
|
local _, _, _, color = GetItemQualityColor(rQuality or 0)
|
|
tooltipFormat:SetPattern("|q", color or "|cffcccc33")
|
|
if (not rName) then rName = "item:"..result; end
|
|
tooltipFormat:SetPattern("$name", rName)
|
|
|
|
-- Rate is always unity here (not really 1, but handled in the probability)
|
|
tooltipFormat:SetPattern("$rate", "")
|
|
|
|
-- Store this line and sort key
|
|
local line = tooltipFormat:GetString(false) -- no counts here
|
|
table.insert(lines, {str = line, sort = resYield})
|
|
end
|
|
|
|
|
|
-- multiply values by the number of items in this stack
|
|
local groups = count / 5;
|
|
totalHSP = totalHSP * groups;
|
|
totalMed = totalMed * groups;
|
|
totalMkt = totalMkt * groups;
|
|
totalFive = totalFive * groups;
|
|
|
|
tooltip:SetColor(0.8,0.8,0.2)
|
|
if (Enchantrix.Settings.GetSetting('TooltipMillingMats')) then
|
|
-- Header
|
|
local totalText = ""
|
|
tooltip:AddLine(_ENCH('FrmtMillsInto')..totalText, nil, embed);
|
|
-- 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
|
|
tooltip:AddLine(line.str, nil, embed)
|
|
if n >= 13 then break end -- Don't add more than 13 lines (1 Powder + 6 Uncommon + 6 Rare)
|
|
end
|
|
end
|
|
|
|
|
|
if (Enchantrix.Settings.GetSetting('TooltipMillingLevels')) then
|
|
local reqSkill = Enchantrix.Util.InscriptionSkillRequiredForItem(link);
|
|
local userSkill = Enchantrix.Util.GetUserInscriptionSkill();
|
|
local deText = format(_ENCH("TooltipMillingLevel"), reqSkill );
|
|
if (userSkill < reqSkill) then
|
|
tooltip:AddLine(deText, nil, 0.8,0.1,0.1, embed); -- reddish
|
|
else
|
|
tooltip:AddLine(deText, nil, 0.1,0.8,0.1, embed); -- greenish
|
|
end
|
|
end
|
|
|
|
tooltip:SetColor(0.1,0.6,0.6)
|
|
if (Enchantrix.Settings.GetSetting('TooltipMillingValues')) then
|
|
if (AucAdvanced and Enchantrix.Settings.GetSetting('TooltipMillingShowAuctAdvValue') and totalFive > 0) then
|
|
tooltip:AddLine(_ENCH('FrmtMillingValueAuctVal'), totalFive, embed);
|
|
end
|
|
if (Enchantrix.Settings.GetSetting('TooltipMillingShowAuctValueHSP') and totalHSP > 0) then
|
|
tooltip:AddLine(_ENCH('FrmtMillingValueAuctHsp'), totalHSP, embed);
|
|
end
|
|
if (Enchantrix.Settings.GetSetting('TooltipMillingShowAuctValueMedian') and totalMed > 0) then
|
|
tooltip:AddLine(_ENCH('FrmtMillingValueAuctMed'), totalMed, embed);
|
|
end
|
|
if (Enchantrix.Settings.GetSetting('TooltipProspectShowBaselineValue') and totalMkt > 0) then
|
|
tooltip:AddLine(_ENCH('FrmtMillingValueMarket'), totalMkt, embed);
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
function itemTooltip(tooltip, name, link, itemType, itemId, quality, count)
|
|
if Enchantrix.Settings.GetSetting('ModTTShow') and not IsAltKeyDown() then
|
|
return
|
|
end
|
|
|
|
-- see if this is a simple reagent produced from disenchanting, prospecting or milling
|
|
if ( Enchantrix.Settings.GetSetting('TooltipShowMatSources') ) then
|
|
|
|
local deReagent = Enchantrix.Constants.ReverseDisenchantLevelList[ itemId ]
|
|
if (deReagent) then
|
|
local lowest = deReagent[1]
|
|
local highest = deReagent[2]
|
|
if (lowest and highest) then
|
|
local deText = format( _ENCH('FrmtDEItemLevels'), lowest, highest )
|
|
tooltip:SetColor(0.8,0.8,0.2);
|
|
tooltip:AddLine(deText, nil, embed)
|
|
return
|
|
end
|
|
end
|
|
|
|
local prospectGem = Enchantrix.Constants.ReverseProspectingSources[ itemId ]
|
|
if (prospectGem) then
|
|
local oreCount = #prospectGem
|
|
local oreString = Enchantrix.Util.GetReagentInfo( prospectGem[1] )
|
|
for index = 2, oreCount, 1 do
|
|
oreString = oreString..", "..Enchantrix.Util.GetReagentInfo( prospectGem[ index ] )
|
|
end
|
|
local prospectText = format( _ENCH('FrmtProspectFrom'), oreString )
|
|
tooltip:SetColor(0.8,0.8,0.2);
|
|
tooltip:AddLine( prospectText, nil, embed)
|
|
return
|
|
end
|
|
|
|
local inkList = Enchantrix.Constants.ReverseInkList[ itemId ]
|
|
if (inkList) then
|
|
local pigmentString = Enchantrix.Util.GetReagentInfo( inkList[1] )
|
|
local inkText = format( _ENCH('FrmtInkFrom'), pigmentString )
|
|
tooltip:SetColor(0.8,0.8,0.2);
|
|
tooltip:AddLine(inkText, nil, embed)
|
|
return
|
|
end
|
|
|
|
end
|
|
|
|
|
|
-- first, see if this is a prospectable item (short list)
|
|
local prospect = Enchantrix.Storage.GetItemProspects(link)
|
|
if (prospect and Enchantrix.Settings.GetSetting('TooltipShowProspecting')) then
|
|
prospectTooltip(prospect, tooltip, name, link, quality, count)
|
|
return
|
|
end
|
|
|
|
-- next, see if this is a millable item (short list)
|
|
local milling = Enchantrix.Storage.GetItemMilling(link)
|
|
if (milling and Enchantrix.Settings.GetSetting('TooltipShowMilling')) then
|
|
millingTooltip(milling, tooltip, name, link, quality, count)
|
|
return
|
|
end
|
|
|
|
-- then see if it's disenchantable
|
|
local data = Enchantrix.Storage.GetItemDisenchants(link)
|
|
if not data then
|
|
-- error message would have been printed inside GetItemDisenchants
|
|
return
|
|
end
|
|
|
|
local lines
|
|
|
|
local total = data.total
|
|
local totalFive = {}
|
|
local totalHSP, totalMed, totalMkt, totalFive = 0,0,0,0
|
|
local totalNumber, totalQuantity
|
|
local allFixed = true
|
|
|
|
if (total and total[1] > 0) then
|
|
totalNumber, totalQuantity = unpack(total)
|
|
for result, resData in pairs(data) do
|
|
if (result ~= "total") then
|
|
if (not lines) then lines = {} end
|
|
|
|
local resNumber, resQuantity = unpack(resData)
|
|
local style, extra = Enchantrix.Util.GetPricingModel()
|
|
local hsp, med, mkt, five, fix = Enchantrix.Util.GetReagentPrice(result, extra)
|
|
local resProb, resCount = resNumber/totalNumber, resQuantity/resNumber
|
|
local resYield = resProb * resCount; -- == resQuantity / totalNumber;
|
|
local resHSP, resMed, resMkt, resFive, resFix = (hsp or 0)*resYield, (med or 0)*resYield, (mkt or 0)*resYield, (five or 0)*resYield, (fix or 0)*resYield
|
|
if (fix) then
|
|
resHSP, resMed, resMkt, resFive = resFix,resFix,resFix,resFix
|
|
else
|
|
allFixed = false
|
|
end
|
|
totalHSP = totalHSP + resHSP
|
|
totalMed = totalMed + resMed
|
|
totalMkt = totalMkt + resMkt
|
|
totalFive = totalFive + resFive
|
|
|
|
local prob = 100 * resProb
|
|
|
|
-- Probabilities
|
|
tooltipFormat:SetPattern("$prob", tostring(prob))
|
|
|
|
-- Name and quality
|
|
local rName, _, rQuality = Enchantrix.Util.GetReagentInfo(result)
|
|
local _, _, _, color = GetItemQualityColor(rQuality or 0)
|
|
tooltipFormat:SetPattern("|q", color or "|cffcccc33")
|
|
if (not rName) then rName = "item:"..result; end
|
|
tooltipFormat:SetPattern("$name", rName)
|
|
|
|
-- Rate
|
|
tooltipFormat:SetPattern("$rate", ("x%0.1f"):format(resCount))
|
|
|
|
-- Store this line and sort key
|
|
local line = tooltipFormat:GetString()
|
|
table.insert(lines, {str = line, sort = prob})
|
|
end
|
|
end
|
|
else
|
|
return
|
|
end
|
|
|
|
-- normally disenchanting deals with single items
|
|
-- but the appraiser window can show multiple items and wants a value for the group
|
|
totalHSP = totalHSP * count;
|
|
totalMed = totalMed * count;
|
|
totalMkt = totalMkt * count;
|
|
totalFive = totalFive * count;
|
|
|
|
local embed = Enchantrix.Settings.GetSetting('ToolTipEmbedInGameTip')
|
|
|
|
tooltip:SetColor(0.8,0.8,0.2);
|
|
if (Enchantrix.Settings.GetSetting('TooltipShowDisenchantMats')) then
|
|
-- Header
|
|
local totalText = ""
|
|
tooltip:AddLine(_ENCH('FrmtDisinto')..totalText, nil, embed);
|
|
-- 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
|
|
tooltip:AddLine(line.str, nil, embed)
|
|
if n >= 5 then break end -- Don't add more than 5 lines
|
|
end
|
|
end
|
|
|
|
if (Enchantrix.Settings.GetSetting('TooltipShowDisenchantLevel')) then
|
|
local reqSkill = Enchantrix.Util.DisenchantSkillRequiredForItem(link);
|
|
local userSkill = Enchantrix.Util.GetUserEnchantingSkill();
|
|
local deText = format(_ENCH("TooltipShowDisenchantLevel"), reqSkill );
|
|
if (userSkill < reqSkill) then
|
|
tooltip:AddLine(deText, nil, 0.8,0.1,0.1, embed); -- reddish
|
|
else
|
|
tooltip:AddLine(deText, nil, 0.1,0.8,0.1, embed); -- greenish
|
|
end
|
|
end
|
|
|
|
tooltip:SetColor(0.1,0.6,0.6);
|
|
if (Enchantrix.Settings.GetSetting('TooltipShowValues')) then
|
|
if (allFixed) then
|
|
tooltip:AddLine(_ENCH('FrmtValueFixedVal'), totalHSP, embed);
|
|
else
|
|
if (AucAdvanced and Enchantrix.Settings.GetSetting('TooltipShowAuctAdvValue') and totalFive > 0) then
|
|
tooltip:AddLine(_ENCH('FrmtValueAuctVal'), totalFive, embed);
|
|
end
|
|
if (Enchantrix.Settings.GetSetting('TooltipShowAuctValueHSP') and totalHSP > 0) then
|
|
tooltip:AddLine(_ENCH('FrmtValueAuctHsp'), totalHSP, embed);
|
|
end
|
|
if (Enchantrix.Settings.GetSetting('TooltipShowAuctValueMedian') and totalMed > 0) then
|
|
tooltip:AddLine(_ENCH('FrmtValueAuctMed'), totalMed, embed);
|
|
end
|
|
if (Enchantrix.Settings.GetSetting('TooltipShowBaselineValue') and totalMkt > 0) then
|
|
tooltip:AddLine(_ENCH('FrmtValueMarket'), totalMkt, embed);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- using the Trade APIs
|
|
local function getReagentsFromTradeFrame(craftIndex)
|
|
local reagentList = {}
|
|
|
|
local numReagents = GetTradeSkillNumReagents(craftIndex)
|
|
for i = 1, numReagents do
|
|
local link = GetTradeSkillReagentItemLink(craftIndex, i)
|
|
if link then
|
|
local hlink = link:match("|H([^|]+)|h")
|
|
local reagentName, reagentTexture, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(craftIndex, i)
|
|
table.insert(reagentList, {hlink, reagentCount})
|
|
end
|
|
end
|
|
|
|
return reagentList
|
|
end
|
|
|
|
-- NOTE - ccox - to match non enchants, I'd need to search for "Requires (.+)"
|
|
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 = _G[frameName.."TextLeft"..i]:GetText()
|
|
|
|
-- text:find("Reagents: (.+)")
|
|
local _, _, r = text:find(_ENCH('PatReagents'))
|
|
if r then
|
|
reagents = r
|
|
--Enchantrix.Util.DebugPrintQuick("matched reagents line ", reagents )
|
|
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 = reagent:gsub("^%s*", "") -- remove leading spaces
|
|
reagent = reagent:gsub("%s*$", "") -- remove trailing spaces
|
|
--reagent = reagent:gsub("%c*", "") -- remove all control characters
|
|
-- ...and newlines
|
|
reagent = reagent:gsub("%|n", "") -- remove blizzard style newline codes
|
|
-- ...and color codes
|
|
reagent = reagent:gsub("^%|c%x%x%x%x%x%x%x%x", "")
|
|
reagent = reagent:gsub("%|r$", "") -- remove blizzard style return at end of line
|
|
|
|
-- NOTE - ccox - if reagents aren't being found, Blizzard may have added more formatting that needs to be removed above
|
|
-- Enchantrix.Util.DebugPrintQuick("cleaned reagent string ", reagent )
|
|
|
|
-- Get and chomp counts, e.g "Strange Dust (2)"
|
|
local _, _, count = reagent:find("%((%d+)%)$")
|
|
if count then
|
|
reagent = reagent:gsub("%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
|
|
|
|
|
|
-- this can be used by non enchanters when clicking on an enchant tooltip
|
|
-- this WAS also used inside the enchanting/crafting trade window, but that broke when the new tooltip library was added
|
|
|
|
function enchantTooltip(tooltip, name, link, isItem)
|
|
|
|
-- TODO - ccox - for items, get the number made! But what about items with random yield?
|
|
-- TODO - ccox - this really should recursively descend crafted items for true costs not AH prices
|
|
-- most of the time they'll be in the cache, so it won't add a lot of time to the search
|
|
local craftIndex = nil
|
|
local tradeIndex = nil
|
|
local reagentList
|
|
local frame = tooltip:GetFrame()
|
|
|
|
-- if it's an item, try our cache
|
|
if isItem then
|
|
reagentList = Enchantrix.Util.GetCraftReagentInfoFromCache(name)
|
|
end
|
|
|
|
if not reagentList or (#reagentList < 1) then
|
|
|
|
-- clean up the craft item string
|
|
--Enchantrix.Util.DebugPrintQuick("original name is ", name )
|
|
name = name:gsub("^%a+:", "") -- remove crafting type "Enchanting:"
|
|
name = name:gsub("^%s*", "") -- remove leading spaces
|
|
--Enchantrix.Util.DebugPrintQuick("cleaned name is ", name )
|
|
|
|
for i = GetFirstTradeSkill(), GetNumTradeSkills() do
|
|
local tradeName = GetTradeSkillInfo(i);
|
|
if name == tradeName then
|
|
tradeIndex = i
|
|
break
|
|
end
|
|
end
|
|
|
|
if tradeIndex then
|
|
reagentList = getReagentsFromTradeFrame(tradeIndex)
|
|
else
|
|
-- if all else fails
|
|
reagentList = getReagentsFromTooltip(frame)
|
|
end
|
|
|
|
if not reagentList or (#reagentList < 1) then
|
|
--Enchantrix.Util.DebugPrintQuick("no reagents found for ", link, " in ", name )
|
|
return
|
|
end
|
|
|
|
-- now save it to the cache
|
|
if isItem then
|
|
Enchantrix.Util.SaveCraftReagentInfoToCache( name, reagentList );
|
|
end
|
|
|
|
end
|
|
|
|
-- Append additional reagent info
|
|
for _, reagent in ipairs(reagentList) do
|
|
local rName, _, rQuality = Enchantrix.Util.GetReagentInfo(reagent[1])
|
|
local style, extra = Enchantrix.Util.GetPricingModel();
|
|
local hsp, median, market, five, fix = Enchantrix.Util.GetReagentPrice(reagent[1],extra)
|
|
local _, _, _, color = GetItemQualityColor(rQuality)
|
|
|
|
reagent[1] = rName
|
|
table.insert(reagent, rQuality)
|
|
table.insert(reagent, color)
|
|
if fix then
|
|
table.insert(reagent, fix)
|
|
elseif AucAdvanced and five and five > 0 then
|
|
table.insert(reagent, five)
|
|
else
|
|
table.insert(reagent, hsp)
|
|
end
|
|
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
|
|
tooltip:SetColor(0.7,0.7,0.1)
|
|
local embed = Enchantrix.Settings.GetSetting('ToolTipEmbedInGameTip');
|
|
if not embed and not isItem then
|
|
local hLink = link:match("|H([^|]+)|h")
|
|
if not hLink then hLink = link end
|
|
tooltip:AddLine(hLink)
|
|
end
|
|
tooltip:AddLine(_ENCH('FrmtSuggestedPrice'), 0.8,0.8,0.2, embed)
|
|
|
|
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.." ".._ENCH('FrmtPriceEach'):format(AucAdvanced.Coins(Enchantrix.Util.Round(reagent[PRICE], 3)))
|
|
tooltip:AddLine(line, Enchantrix.Util.Round(reagent[PRICE] * reagent[COUNT], 3), embed)
|
|
price = price + reagent[PRICE] * reagent[COUNT]
|
|
elseif reagent[PRICE] then
|
|
tooltip:AddLine(line, Enchantrix.Util.Round(reagent[PRICE], 3), embed)
|
|
price = price + reagent[PRICE]
|
|
else
|
|
tooltip:AddLine(line, nil, embed)
|
|
unknownPrices = true
|
|
end
|
|
end
|
|
|
|
-- Totals
|
|
tooltip:SetColor(0.8,0.8,0.2)
|
|
if price > 0 then
|
|
tooltip:AddLine(_ENCH('FrmtTotal'), Enchantrix.Util.Round(price, 2.5), embed)
|
|
|
|
-- add barker line, if barker is loaded
|
|
if (Barker and Barker.Settings.GetSetting('barker')) then
|
|
local margin = Barker.Settings.GetSetting("barker.profit_margin")
|
|
local profit = price * margin * 0.01
|
|
profit = math.min(profit, Barker.Settings.GetSetting("barker.highest_profit"))
|
|
local barkerPrice = Enchantrix.Util.Round(price + profit)
|
|
-- "Barker Price (%d%% margin)"
|
|
tooltip:AddLine(_ENCH('FrmtBarkerPrice'):format(Barker.Util.Round(margin)), barkerPrice, embed)
|
|
end
|
|
|
|
if not Enchantrix.State.Auctioneer_Loaded then
|
|
tooltip:AddLine(_ENCH('FrmtWarnAuctNotLoaded'), 0.6,0.6,0.1, embed)
|
|
end
|
|
|
|
if unknownPrices then
|
|
tooltip:AddLine(_ENCH('FrmtWarnPriceUnavail'), 0.6,0.6,0.1, embed)
|
|
end
|
|
else
|
|
tooltip:AddLine(_ENCH('FrmtWarnNoPrices'), 0.6,0.6,0.1, embed)
|
|
end
|
|
end
|
|
|
|
function hookItemTooltip(tipFrame, item, count, name, link, quality)
|
|
if ((not Enchantrix.Settings.GetSetting('all'))
|
|
or (not Enchantrix.Settings.GetSetting('TooltipShowReagents'))) then return end
|
|
|
|
-- we're getting nil links in here somehow, just return if that happens
|
|
if (link == nil) then return end
|
|
|
|
tooltip:SetFrame(tipFrame)
|
|
-- ccox - tooltip:DecodeLink will only work with type "item"
|
|
local itemType, itemId = tooltip:DecodeLink(link)
|
|
|
|
if itemType == "item" then
|
|
name = name or ""
|
|
-- safety, some other addons pass in strings for count by mistake
|
|
count = tonumber(count) or 1
|
|
itemTooltip(tooltip, name, link, itemType, itemId, quality, count)
|
|
if (Enchantrix.Settings.GetSetting('ShowAllCraftReagents')) then
|
|
enchantTooltip(tooltip, name, link, true)
|
|
end
|
|
end
|
|
tooltip:ClearFrame(tipFrame)
|
|
end
|
|
|
|
function hookSpellTooltip(tipFrame, link, name, rank)
|
|
if ((not Enchantrix.Settings.GetSetting('all'))
|
|
or (not Enchantrix.Settings.GetSetting('TooltipShowReagents'))) then return end
|
|
|
|
-- we're getting nil links in here somehow, just return if that happens
|
|
if (link == nil) then return end
|
|
|
|
tooltip:SetFrame(tipFrame)
|
|
if link:sub(0, 8) == "enchant:" or link:sub(0, 6) == "spell:" then
|
|
link = "|H"..link.."|h|cffffffff["..name.."]|r|h"
|
|
end
|
|
-- ccox - tooltip:DecodeLink will only work with type "item", returning nil for any other link type
|
|
-- so we have to do this the hard way
|
|
local itemType, itemId = tooltip:BreakHyperlink("H", 1, strsplit("|", link))
|
|
|
|
if itemType == "enchant" or itemType == "spell" then
|
|
name = name or ""
|
|
enchantTooltip(tooltip, name, link, false)
|
|
end
|
|
tooltip:ClearFrame(tipFrame)
|
|
end
|
|
|
|
Enchantrix.Tooltip = {
|
|
Revision = "$Revision: 4933 $",
|
|
|
|
AddonLoaded = addonLoaded,
|
|
Format = tooltipFormat,
|
|
}
|