mirror of
https://github.com/brues-code/pfUI.git
synced 2026-09-22 15:46:56 +00:00
132 lines
4.7 KiB
Lua
132 lines
4.7 KiB
Lua
-- load pfUI environment
|
|
setfenv(1, pfUI:GetEnvironment())
|
|
|
|
local pfSpellScan = CreateFrame("GameTooltip", "pfSpellScan", UIParent, "GameTooltipTemplate")
|
|
pfSpellScan:SetOwner(WorldFrame, "ANCHOR_NONE")
|
|
|
|
-- [ GetSpellMaxRank ]
|
|
-- Returns the maximum rank of a players spell.
|
|
-- 'name' [string] spellname to query
|
|
-- return: [string],[number] maximum rank in characters and the number
|
|
-- e.g "Rank 1" and "1"
|
|
local spellmaxrank = {}
|
|
function pfUI.api.GetSpellMaxRank(name)
|
|
if spellmaxrank[name] then return unpack(spellmaxrank[name]) end
|
|
|
|
local rank = { 0, nil}
|
|
for i = 1, GetNumSpellTabs() do
|
|
local _, _, offset, num = GetSpellTabInfo(i)
|
|
local bookType = BOOKTYPE_SPELL
|
|
for id = offset + 1, offset + num do
|
|
local spellName, spellRank = GetSpellName(id, bookType)
|
|
if spellName == name then
|
|
if not rank[2] then rank[2] = spellRank end
|
|
|
|
local _, _, numRank = string.find(spellRank, " (%d+)$")
|
|
if numRank and tonumber(numRank) > rank[1] then
|
|
rank = { tonumber(numRank), spellRank}
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
spellmaxrank[name] = { rank[2], rank[1] }
|
|
return rank[2], rank[1]
|
|
end
|
|
|
|
-- [ GetSpellIndex ]
|
|
-- Returns the spellbook index and bookid of the given spell.
|
|
-- 'name' [string] spellname to query
|
|
-- 'rank' [string] rank to query (optional)
|
|
-- return: [number],[string] spell index and spellbook id
|
|
local spellindex = {}
|
|
function pfUI.api.GetSpellIndex(name, rank)
|
|
if spellindex[name..(rank or "")] then return unpack(spellindex[name..(rank or "")]) end
|
|
if not rank then rank = GetSpellMaxRank(name) end
|
|
|
|
for i = 1, GetNumSpellTabs() do
|
|
local _, _, offset, num = GetSpellTabInfo(i)
|
|
local bookType = BOOKTYPE_SPELL
|
|
for id = offset + 1, offset + num do
|
|
local spellName, spellRank = GetSpellName(id, bookType)
|
|
if rank and rank == spellRank and name == spellName then
|
|
spellindex[name..rank] = { id, bookType }
|
|
return id, bookType
|
|
elseif not rank and name == spellName then
|
|
spellindex[name] = { id, bookType }
|
|
return id, bookType
|
|
end
|
|
end
|
|
end
|
|
spellindex[name..(rank or "")] = { nil }
|
|
return nil
|
|
end
|
|
|
|
-- [ GetSpellInfo ]
|
|
-- Returns several information about a spell.
|
|
-- 'index' [string/number] Spellname or Index of a spell in the spellbook
|
|
-- 'bookType' [string] Type of spellbook (optional)
|
|
-- return:
|
|
-- [string] Name of the spell
|
|
-- [string] Secondary text associated with the spell
|
|
-- (e.g."Rank 5", "Racial", etc.)
|
|
-- [string] Path to an icon texture for the spell
|
|
-- [number] Casting time of the spell in milliseconds
|
|
-- [number] Minimum range from the target required to cast the spell
|
|
-- [number] Maximum range from the target at which you can cast the spell
|
|
local spellinfo = {}
|
|
function pfUI.api.GetSpellInfo(index, bookType)
|
|
if spellinfo[index] then return unpack(spellinfo[index]) end
|
|
|
|
local name, rank, id
|
|
local icon = ""
|
|
local castingTime = 0
|
|
local minRange = 0
|
|
local maxRange = 0
|
|
|
|
if type(index) == "string" then
|
|
local _, _, sname, srank = string.find(index, '(.+)%((.+)%)')
|
|
name = sname or index
|
|
rank = srank or GetSpellMaxRank(name)
|
|
id, bookType = GetSpellIndex(name, rank)
|
|
else
|
|
name, rank = GetSpellName(index, bookType)
|
|
id, bookType = GetSpellIndex(name, rank)
|
|
end
|
|
|
|
if name and id then
|
|
texture = GetSpellTexture(id, bookType)
|
|
end
|
|
|
|
if id then
|
|
pfSpellScan:ClearLines()
|
|
pfSpellScan:SetSpell(id, bookType)
|
|
|
|
for i=1, 4 do
|
|
for _, text in pairs({_G["pfSpellScanTextLeft"..i], _G["pfSpellScanTextRight"..i]}) do
|
|
if text and text:IsVisible() and text:GetText() then
|
|
local _, _, sec = string.find(text:GetText(), gsub(SPELL_CAST_TIME_SEC, "%%.3g", "%(.+%)"))
|
|
local _, _, min = string.find(text:GetText(), gsub(SPELL_CAST_TIME_MIN, "%%.3g", "%(.+%)"))
|
|
local _, _, range = string.find(text:GetText(), gsub(SPELL_RANGE, "%%s", "%(.+%)"))
|
|
|
|
castingTime = (tonumber(sec) or tonumber(min) or 0) * 1000
|
|
|
|
if range then
|
|
local _, _, min, max = string.find(range, "(.+)-(.+)")
|
|
if min and max then
|
|
minRange = tonumber(min)
|
|
maxRange = tonumber(max)
|
|
else
|
|
minRange = 0
|
|
maxRange = tonumber(range)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
spellinfo[index] = { name, rank, icon, castingTime, minRange, maxRange }
|
|
return name, rank, icon, castingTime, minRange, maxRange
|
|
end
|