You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

167 lines
4.6 KiB

local XLoot = select(2, ...)
local buffer, print = {}, print
local _G = _G
local table_insert, table_concat, string_format = table.insert, table.concat, string.format
local coin_table = {
{ GOLD_AMOUNT, 0, "ffd700" },
{ SILVER_AMOUNT, 0, "c7c7cf" },
{ COPPER_AMOUNT, 0, "eda55f" }
}
for i,v in ipairs(coin_table) do
v[4] = string_format("|cff%s%s|r", v[3], v[1])
end
function XLoot.CopperToString(copper)
coin_table[1][2] = floor(copper / 10000)
coin_table[2][2] = mod(floor(copper / 100), 100)
coin_table[3][2] = mod(copper, 100)
local buffer = wipe(buffer)
for i,v in ipairs(coin_table) do
local n = v[2]
if n and n > 0 then
table_insert(buffer, string_format(v[4], n))
end
end
return table_concat(buffer, ", ")
end
local tooltip = CreateFrame('GameTooltip', 'XLootTooltip', UIParent, 'GameTooltipTemplate')
tooltip:SetOwner(UIParent, "ANCHOR_NONE")
local bind_types = {
[ITEM_BIND_ON_PICKUP] = 'pickup',
[ITEM_BIND_ON_EQUIP] = 'equip',
[ITEM_BIND_ON_USE] = 'use'
}
local tooltip_lines = {
XLootTooltipTextLeft2,
XLootTooltipTextLeft3,
XLootTooltipTextLeft4,
XLootTooltipTextLeft5
}
function XLoot.GetItemBindType(link)
tooltip:ClearLines()
tooltip:SetHyperlink(link)
for i=1, #tooltip_lines do
local value = bind_types[tooltip_lines[i]:GetText()]
if value then
return value
end
end
end
function XLoot.CanEquipItem(link)
if not IsEquippableItem(link) then
return false
end
tooltip:ClearLines()
tooltip:SetHyperlink(link)
for i=2, 5 do
local line = _G["XLootTooltipTextRight"..i]
if line and line:GetText() then
local r, g, b = line:GetTextColor()
local lr, lg, lb = _G["XLootTooltipTextLeft"..i]:GetTextColor()
return (r > .8 and b > .8 and g > .8 and lr > .8 and lg > .8 and lb > .8) and true or false
end
end
end
function XLoot.IsItemUpgrade(link)
if not XLoot.CanEquipItem(link) then
return false
end
local id = string.match(link, "item:(%d+)")
if PawnIsItemIDAnUpgrade and id and PawnIsItemIDAnUpgrade(id) then
return true
end
return false
end
-- Tack role icon on to player name and return class colors
local white = { r = 1, g = 1, b = 1 }
local dimensions = {
HEALER = '48:64',
DAMAGER = '16:32',
TANK = '32:48'
}
function XLoot.FancyPlayerName(name, class, opt)
local c
if _G.CUSTOM_CLASS_COLORS then
c = _G.CUSTOM_CLASS_COLORS[class]
elseif _G.RAID_CLASS_COLORS[class] then
c = _G.RAID_CLASS_COLORS[class]
else
c = white
end
-- !CLASSIC
local role = 'NONE'
if UnitGroupRolesAssigned then
role = UnitGroupRolesAssigned(name)
end
local short, realm = UnitName(name)
if short then
name = short
end
if realm and realm ~= "" then
name = name.."*"
end
if role ~= 'NONE' and opt and opt.role_icon then
name = string_format('\124TInterface\\LFGFRAME\\LFGROLE:12:12:-1:0:64:16:%s:0:16\124t%s', dimensions[role], name)
end
return name, c.r, c.g, c.b
end
local temp_list, template = {},
[[local string_match = string.match
return function(message)
local pcall_status, m1, m2, m3, m4, m5 = pcall(string_match, message, [=[^%s$]=])
assert(pcall_status, "Please report this on XLoot's curse page", message, [=[^%s$]=], m1)
return %s
end]]
-- Return a inverted match string and corresponding list of ordered match slots (m1-m5)
local match, gsub, insert = string.match, string.gsub, table.insert
local function invert(pattern)
local inverted, arglist = pattern
-- Escape magic characters
inverted = gsub(inverted, "%(", "%%(")
inverted = gsub(inverted, "%)", "%%)")
inverted = gsub(inverted, "%-", "%%-")
inverted = gsub(inverted, "%+", "%%+")
inverted = gsub(inverted, "%.", "%%.")
-- Account for reordered replacements
local k = match(inverted, '%%(%d)%$')
if k then
local i, list = 1, wipe(temp_list)
while k ~= nil do
inverted = gsub(inverted, "(%%%d%$.)", "(.-)", 1)
list[i] = 'm'..tostring(k)
k, i = match(inverted, "%%(%d)%$"), i + 1
end
arglist = table.concat(list, ", ")
-- Simple patterns
else
inverted = gsub(inverted, "%%d", "(%%d+)")
inverted = gsub(inverted, "%%s", "(.-)")
arglist = "m1, m2, m3, m4, m5"
end
return inverted, arglist
end
-- Match string against a pattern, caching the inverted pattern
local invert_cache = {}
function XLoot.Deformat(str, pattern)
local func = invert_cache[pattern]
if not func then
local inverted, arglist = invert(pattern)
func = loadstring(template:format(inverted, inverted, arglist))()
invert_cache[pattern] = func
end
return func(str)
end
XLoot.InvertFormatString = invert