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.

579 lines
30 KiB

--[[
Written by: Simca@Malfurion-US
Thanks to Hugh@Burning-Blade, a co-author for the first few versions of the AddOn.
Special thanks to Ro for letting me bounce solutions off him regarding tooltip conflicts.
]]--
--GLOBALS: BPBID_Options
-- Get folder path and set addon namespace
local addonname, internal = ...
-- The only localized functions needed here
local PB_GetName = _G.C_PetBattles.GetName
local PJ_GetPetInfoByPetID = C_PetJournal.GetPetInfoByPetID
local PJ_GetPetInfoBySpeciesID = C_PetJournal.GetPetInfoBySpeciesID
local PJ_GetPetStats = C_PetJournal.GetPetStats
local ceil = math.ceil
-- Initalize AddOn locals used in this section
local BattleNameText = ""
local BPTNameText = ""
-- This is the new Battle Pet BreedID "Breed Tooltip" creation and setup function
function BPBID_SetBreedTooltip(parent, speciesID, tblBreedID, rareness, tooltipDistance)
-- Impossible checks (if missing parent, speciesID, or "rareness")
local rarity
if (not parent) or (not speciesID) then return end
if (rareness) then
rarity = rareness
else
rarity = 4
end
-- Arrays are now initialized if they weren't before
if (not BPBID_Arrays.BasePetStats) then BPBID_Arrays.InitializeArrays() end
-- Set local reference to my tooltip or create it if it doesn't exist
-- It inherits TooltipBorderedFrameTemplate AND GameTooltipTemplate to match Blizzard's "psuedo-tooltips" yet still make it easy to use
local breedtip
local breedtiptext
if (parent == FloatingBattlePetTooltip) then
breedtiptext = "BPBID_BreedTooltip2"
else
breedtiptext = "BPBID_BreedTooltip"
end
breedtip = _G[breedtiptext] or CreateFrame("GameTooltip", breedtiptext, nil, "GameTooltipTemplate")
-- Check for existence of LibExtraTip
local extratip = false
if (internal.LibExtraTip) and (internal.LibExtraTip.GetExtraTip) then
extratip = internal.LibExtraTip:GetExtraTip(parent)
-- See if it has hooked our parent
if (extratip) and (extratip:IsVisible()) then
parent = extratip
end
end
-- Set positioning/parenting/ownership of Breed Tooltip
breedtip:SetParent(parent)
breedtip:SetOwner(parent, "ANCHOR_NONE")
breedtip:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", 0, tooltipDistance or 2)
breedtip:SetPoint("TOPRIGHT", parent, "BOTTOMRIGHT", 0, tooltipDistance or 2)
-- Workaround for TradeSkillMaster's tooltip
-- Note that setting parent breaks floating tooltip and setting two corner points breaks borders on TSM tooltip
-- Setting parent is also required for BattlePetTooltip because TSMExtraTip constantly reanchors itself on its parent
if (_G.IsAddOnLoaded("TradeSkillMaster")) then
for i = 1, 10 do
local t = _G["TSMExtraTip" .. i]
if t then
-- It probably never matters which point we check to learn the relative frame
-- This is because TSM tooltips should only be relative to one frame each
-- If this changes in the future or this assumption is wrong, we'll have to iterate points here
local _, relativeFrame = t:GetPoint()
if (relativeFrame == BattlePetTooltip) then
t:ClearAllPoints()
t:SetParent(BPBID_BreedTooltip)
t:SetPoint("TOP", BPBID_BreedTooltip, "BOTTOM", 0, -1)
elseif (t:GetParent() == FloatingBattlePetTooltip) then
t:ClearAllPoints()
t:SetPoint("TOP", BPBID_BreedTooltip2, "BOTTOM", 0, -1)
end
end
end
end
-- Set line for "Current pet's breed"
if (BPBID_Options.Breedtip.Current) and (tblBreedID) then
local current = "\124cFFD4A017Current Breed:\124r "
local numBreeds = #tblBreedID
for i = 1, numBreeds do
if (i == 1) then
current = current .. internal.RetrieveBreedName(tblBreedID[i])
elseif (i == 2) and (i == numBreeds) then
current = current .. " or " .. internal.RetrieveBreedName(tblBreedID[i])
elseif (i == numBreeds) then
current = current .. ", or " .. internal.RetrieveBreedName(tblBreedID[i])
else
current = current .. ", " .. internal.RetrieveBreedName(tblBreedID[i])
end
end
breedtip:AddLine(current, 1, 1, 1, 1)
end
-- Set line for "Current pet's possible breeds"
if (BPBID_Options.Breedtip.Possible) then
local possible = "\124cFFD4A017Possible Breed"
if (speciesID) and (BPBID_Arrays.BreedsPerSpecies[speciesID]) then
local numBreeds = #BPBID_Arrays.BreedsPerSpecies[speciesID]
if numBreeds == internal.MAX_BREEDS then
possible = possible .. "s:\124r All"
else
for i = 1, numBreeds do
if (numBreeds == 1) then
possible = possible .. ":\124r " .. internal.RetrieveBreedName(BPBID_Arrays.BreedsPerSpecies[speciesID][i])
elseif (i == 1) then
possible = possible .. "s:\124r " .. internal.RetrieveBreedName(BPBID_Arrays.BreedsPerSpecies[speciesID][i])
elseif (i == 2) and (i == numBreeds) then
possible = possible .. " and " .. internal.RetrieveBreedName(BPBID_Arrays.BreedsPerSpecies[speciesID][i])
elseif (i == numBreeds) then
possible = possible .. ", and " .. internal.RetrieveBreedName(BPBID_Arrays.BreedsPerSpecies[speciesID][i])
else
possible = possible .. ", " .. internal.RetrieveBreedName(BPBID_Arrays.BreedsPerSpecies[speciesID][i])
end
end
end
else
possible = possible .. "s:\124r Unknown"
end
breedtip:AddLine(possible, 1, 1, 1, 1)
end
-- Have to have BasePetStats from here on out
if (BPBID_Arrays.BasePetStats[speciesID]) then
-- Set line for "Pet species' base stats"
if (BPBID_Options.Breedtip.SpeciesBase) then
local speciesbase = "\124cFFD4A017Base Stats:\124r " .. BPBID_Arrays.BasePetStats[speciesID][1] .. "/" .. BPBID_Arrays.BasePetStats[speciesID][2] .. "/" .. BPBID_Arrays.BasePetStats[speciesID][3]
breedtip:AddLine(speciesbase, 1, 1, 1, 1)
end
local extrabreeds
-- Check duplicates (have to have BreedsPerSpecies and tblBreedID for this)
if (BPBID_Arrays.BreedsPerSpecies[speciesID]) and (tblBreedID) then
extrabreeds = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
-- "inspection" time! if the breed is not found in the array, it doesn't get passed on to extrabreeds and is effectively discarded
for q = 1, #tblBreedID do
for i = 1, #BPBID_Arrays.BreedsPerSpecies[speciesID] do
local j = BPBID_Arrays.BreedsPerSpecies[speciesID][i]
if (tblBreedID[q] == j) then extrabreeds[j - 2] = false end -- If the breed is found in both tables, flag it as false
if (extrabreeds[j - 2]) then extrabreeds[j - 2] = j end
end
end
end
-- Set line for "Current breed's base stats (level 1 Poor)" (have to have tblBreedID for this)
if (BPBID_Options.Breedtip.CurrentStats) and (tblBreedID) then
for i = 1, #tblBreedID do
local currentbreed = tblBreedID[i]
local currentstats = "\124cFFD4A017Breed " .. internal.RetrieveBreedName(currentbreed) .. "*:\124r " .. (BPBID_Arrays.BasePetStats[speciesID][1] + BPBID_Arrays.BreedStats[currentbreed][1]) .. "/" .. (BPBID_Arrays.BasePetStats[speciesID][2] + BPBID_Arrays.BreedStats[currentbreed][2]) .. "/" .. (BPBID_Arrays.BasePetStats[speciesID][3] + BPBID_Arrays.BreedStats[currentbreed][3])
breedtip:AddLine(currentstats, 1, 1, 1, 1)
end
end
-- Set line for "All breeds' base stats (level 1 Poor)" (have to have BreedsPerSpecies for this)
if (BPBID_Options.Breedtip.AllStats) and (BPBID_Arrays.BreedsPerSpecies[speciesID]) then
if (not BPBID_Options.Breedtip.CurrentStats) or (not extrabreeds) then
for i = 1, #BPBID_Arrays.BreedsPerSpecies[speciesID] do
local currentbreed = BPBID_Arrays.BreedsPerSpecies[speciesID][i]
local allstatsp1 = "\124cFFD4A017Breed " .. internal.RetrieveBreedName(currentbreed)
local allstatsp2 = ":\124r " .. (BPBID_Arrays.BasePetStats[speciesID][1] + BPBID_Arrays.BreedStats[currentbreed][1]) .. "/" .. (BPBID_Arrays.BasePetStats[speciesID][2] + BPBID_Arrays.BreedStats[currentbreed][2]) .. "/" .. (BPBID_Arrays.BasePetStats[speciesID][3] + BPBID_Arrays.BreedStats[currentbreed][3])
local allstats -- Will be defined by the if statement below to see the asterisk needs to be added
if (not extrabreeds) or ((extrabreeds[currentbreed - 2]) and (extrabreeds[currentbreed - 2] > 2)) then
allstats = allstatsp1 .. allstatsp2
else
allstats = allstatsp1 .. "*" .. allstatsp2
end
breedtip:AddLine(allstats, 1, 1, 1, 1)
end
else
for i = 1, 10 do
if (extrabreeds[i]) and (extrabreeds[i] > 2) then
local currentbreed = i + 2
local allstats = "\124cFFD4A017Breed " .. internal.RetrieveBreedName(currentbreed) .. ":\124r " .. (BPBID_Arrays.BasePetStats[speciesID][1] + BPBID_Arrays.BreedStats[currentbreed][1]) .. "/" .. (BPBID_Arrays.BasePetStats[speciesID][2] + BPBID_Arrays.BreedStats[currentbreed][2]) .. "/" .. (BPBID_Arrays.BasePetStats[speciesID][3] + BPBID_Arrays.BreedStats[currentbreed][3])
breedtip:AddLine(allstats, 1, 1, 1, 1)
end
end
end
end
-- Set line for "Current breed's stats at level 25" (have to have tblBreedID for this)
if (BPBID_Options.Breedtip.CurrentStats25) and (tblBreedID) then
for i = 1, #tblBreedID do
local currentbreed = tblBreedID[i]
local hex = "\124cFF0070DD" -- Always use rare color by default
local quality = 4 -- Always use rare pet quality by default
-- Unless the user specifies they want the real color OR the pet is epic/legendary quality
if (not BPBID_Options.Breedtip.AllStats25Rare) or (rarity > 4) then
hex = ITEM_QUALITY_COLORS[rarity - 1].hex
quality = rarity
end
local currentstats25 = hex .. internal.RetrieveBreedName(currentbreed) .. "* at 25:\124r " .. ceil((BPBID_Arrays.BasePetStats[speciesID][1] + BPBID_Arrays.BreedStats[currentbreed][1]) * 25 * ((BPBID_Arrays.RealRarityValues[quality] - 0.5) * 2 + 1) * 5 + 100 - 0.5) .. "/" .. ceil((BPBID_Arrays.BasePetStats[speciesID][2] + BPBID_Arrays.BreedStats[currentbreed][2]) * 25 * ((BPBID_Arrays.RealRarityValues[quality] - 0.5) * 2 + 1) - 0.5) .. "/" .. ceil((BPBID_Arrays.BasePetStats[speciesID][3] + BPBID_Arrays.BreedStats[currentbreed][3]) * 25 * ((BPBID_Arrays.RealRarityValues[quality] - 0.5) * 2 + 1) - 0.5)
breedtip:AddLine(currentstats25, 1, 1, 1, 1)
end
end
-- Set line for "All breeds' stats at level 25" (have to have BreedsPerSpecies for this)
if (BPBID_Options.Breedtip.AllStats25) and (BPBID_Arrays.BreedsPerSpecies[speciesID]) then
local hex = "\124cFF0070DD" -- Always use rare color by default
local quality = 4 -- Always use rare pet quality by default
-- Unless the user specifies they want the real color OR the pet is epic/legendary quality
if (not BPBID_Options.Breedtip.AllStats25Rare) or (rarity > 4) then
hex = ITEM_QUALITY_COLORS[rarity - 1].hex
quality = rarity
end
-- Choose loop (whether I have to show ALL breeds including the one I am looking at or just the other breeds besides the one I'm looking at)
if ((rarity == 4) and (BPBID_Options.Breedtip.CurrentStats25Rare ~= BPBID_Options.Breedtip.AllStats25Rare)) or (not BPBID_Options.Breedtip.CurrentStats25) or (not extrabreeds) then
for i = 1, #BPBID_Arrays.BreedsPerSpecies[speciesID] do
local currentbreed = BPBID_Arrays.BreedsPerSpecies[speciesID][i]
local allstats25p1 = hex .. internal.RetrieveBreedName(currentbreed)
local allstats25p2 = " at 25:\124r " .. ceil((BPBID_Arrays.BasePetStats[speciesID][1] + BPBID_Arrays.BreedStats[currentbreed][1]) * 25 * ((BPBID_Arrays.RealRarityValues[quality] - 0.5) * 2 + 1) * 5 + 100 - 0.5) .. "/" .. ceil((BPBID_Arrays.BasePetStats[speciesID][2] + BPBID_Arrays.BreedStats[currentbreed][2]) * 25 * ((BPBID_Arrays.RealRarityValues[quality] - 0.5) * 2 + 1) - 0.5) .. "/" .. ceil((BPBID_Arrays.BasePetStats[speciesID][3] + BPBID_Arrays.BreedStats[currentbreed][3]) * 25 * ((BPBID_Arrays.RealRarityValues[quality] - 0.5) * 2 + 1) - 0.5)
local allstats25 -- Will be defined by the if statement below to see the asterisk needs to be added
if (not extrabreeds) or ((extrabreeds[currentbreed - 2]) and (extrabreeds[currentbreed - 2] > 2)) then
allstats25 = allstats25p1 .. allstats25p2
else
allstats25 = allstats25p1 .. "*" .. allstats25p2
end
breedtip:AddLine(allstats25, 1, 1, 1, 1)
end
else
for i = 1, 10 do
if (extrabreeds[i]) and (extrabreeds[i] > 2) then
local currentbreed = i + 2
local allstats25 = hex .. internal.RetrieveBreedName(currentbreed) .. " at 25:\124r " .. ceil((BPBID_Arrays.BasePetStats[speciesID][1] + BPBID_Arrays.BreedStats[currentbreed][1]) * 25 * ((BPBID_Arrays.RealRarityValues[quality] - 0.5) * 2 + 1) * 5 + 100 - 0.5) .. "/" .. ceil((BPBID_Arrays.BasePetStats[speciesID][2] + BPBID_Arrays.BreedStats[currentbreed][2]) * 25 * ((BPBID_Arrays.RealRarityValues[quality] - 0.5) * 2 + 1) - 0.5) .. "/" .. ceil((BPBID_Arrays.BasePetStats[speciesID][3] + BPBID_Arrays.BreedStats[currentbreed][3]) * 25 * ((BPBID_Arrays.RealRarityValues[quality] - 0.5) * 2 + 1) - 0.5)
breedtip:AddLine(allstats25, 1, 1, 1, 1)
end
end
end
end
end
-- Fix wordwrapping on smaller tooltips
if _G[breedtiptext .. "TextLeft1"] then
_G[breedtiptext .. "TextLeft1"]:CanNonSpaceWrap(true)
end
-- Fix fonts to all match (if multiple lines exist, which they should 99.9% of the time)
if _G[breedtiptext .. "TextLeft2"] then
-- Get fonts from line 1
local fontpath, fontheight, fontflags = _G[breedtiptext .. "TextLeft1"]:GetFont()
-- Set iterator at line 2 to start
local iterline = 2
-- Match all fonts to line 1
while _G[breedtiptext .. "TextLeft" .. iterline] do
_G[breedtiptext .. "TextLeft" .. iterline]:SetFont(fontpath, fontheight, fontflags)
_G[breedtiptext .. "TextLeft" .. iterline]:CanNonSpaceWrap(true)
iterline = iterline + 1
end
end
-- Resize height automatically when reshown
breedtip:Show()
end
-- Display breed, quality if necessary, and breed tooltips on pet frames/tooltips in Pet Battles
local function BPBID_Hook_BattleUpdate(self)
if not self.petOwner or not self.petIndex or not self.Name then return end
-- Cache all pets if it is the start of a battle
if (internal.cacheTime == true) then internal.CacheAllPets() internal.cacheTime = false end
-- Check if it is a tooltip
local tooltip = (self:GetName() == "PetBattlePrimaryUnitTooltip")
-- Calculate offset
local offset = 0
if (self.petOwner == 2) then offset = 3 end
-- Retrieve breed
local breed = internal.RetrieveBreedName(internal.breedCache[self.petIndex + offset])
-- Get pet's name
local name = PB_GetName(self.petOwner, self.petIndex)
if not tooltip then
-- Set the name header if the user wants
if (name) and (BPBID_Options.Names.PrimaryBattle) then
-- Set standard text or use hex coloring based on font fix option
if (BPBID_Options.BattleFontFix) then
local _, _, _, hex = GetItemQualityColor(internal.rarityCache[self.petIndex + offset] - 1)
self.Name:SetText("|c"..hex..name.." ("..breed..")".."|r")
else
self.Name:SetText(name.." ("..breed..")")
end
end
else
-- Set the name header if the user wants
if (name) and (BPBID_Options.Names.BattleTooltip) then
-- Set standard text or use hex coloring based on font fix option
if (not BPBID_Options.BattleFontFix) then
local _, _, _, hex = GetItemQualityColor(internal.rarityCache[self.petIndex + offset] - 1)
self.Name:SetText("|c"..hex..name.." ("..breed..")".."|r")
else
self.Name:SetText(name.." ("..breed..")")
end
end
-- If this not the same tooltip as before
if (BattleNameText ~= self.Name:GetText()) then
-- Downside font if the name/breed gets chopped off
if self.Name:IsTruncated() then
-- Retrieve font elements
local fontName, fontHeight, fontFlags = self.Name:GetFont()
-- Manually set height to perserve placing of other elements
self.Name:SetHeight(self.Name:GetHeight())
-- Store font in addon namespace for later
if not internal.BattleFontSize then internal.BattleFontSize = { fontName, fontHeight, fontFlags } end
-- Decrease the font size by 1 until it fits
while self.Name:IsTruncated() do
fontHeight = fontHeight - 1
self.Name:SetFont(fontName, fontHeight, fontFlags)
end
elseif internal.BattleFontSize then
-- Reset font size to original if not truncated and original font size known
self.Name:SetFont(internal.BattleFontSize[1], internal.BattleFontSize[2], internal.BattleFontSize[3])
end
end
-- Set the name text variable to match the real name text now to prepare for the next check
BattleNameText = self.Name:GetText()
-- Send to tooltip
if (BPBID_Options.Tooltips.Enabled) and (BPBID_Options.Tooltips.BattleTooltip) then
BPBID_SetBreedTooltip(PetBattlePrimaryUnitTooltip, internal.speciesCache[self.petIndex + offset], internal.resultsCache[self.petIndex + offset], internal.rarityCache[self.petIndex + offset])
end
end
end
-- Display breed, quality if necessary, and breed tooltips on item-based pet tooltips
local function BPBID_Hook_BPTShow(speciesID, level, rarity, maxHealth, power, speed)
-- Impossible checks for safety reasons
if (not BattlePetTooltip.Name) or (not speciesID) or (not level) or (not rarity) or (not maxHealth) or (not power) or (not speed) then return end
-- Fix rarity to match our system and calculate breedID and breedname
rarity = rarity + 1
local breedNum, quality, resultslist = internal.CalculateBreedID(speciesID, rarity, level, maxHealth, power, speed, false, false)
-- Add the breed to the tooltip's name text
if (BPBID_Options.Names.BPT) then
local breed = internal.RetrieveBreedName(breedNum)
-- BattlePetTooltip does not allow customnames for now, so we can just get this ourself (more reliable)
local currentText = BattlePetTooltip.Name:GetText()
-- Test if we've already written to the tooltip
if not strfind(currentText, " (" .. breed .. ")") then
-- Append breed to tooltip
BattlePetTooltip.Name:SetText(currentText .. " (" .. breed .. ")")
-- If this not the same tooltip as before
if (BPTNameText ~= BattlePetTooltip.Name:GetText()) then
-- Downside font if the name/breed gets chopped off
if BattlePetTooltip.Name:IsTruncated() then
-- Retrieve font elements
local fontName, fontHeight, fontFlags = BattlePetTooltip.Name:GetFont()
-- Manually set height to perserve placing of other elements
BattlePetTooltip.Name:SetHeight(BattlePetTooltip.Name:GetHeight())
-- Store font in addon namespace for later
if not internal.BPTFontSize then internal.BPTFontSize = { fontName, fontHeight, fontFlags } end
-- Decrease the font size by 1 until it fits
while BattlePetTooltip.Name:IsTruncated() do
fontHeight = fontHeight - 1
BattlePetTooltip.Name:SetFont(fontName, fontHeight, fontFlags)
end
elseif (internal.BPTFontSize) then
-- Reset font size to original if not truncated AND original font size known
BattlePetTooltip.Name:SetFont(internal.BPTFontSize[1], internal.BPTFontSize[2], internal.BPTFontSize[3])
end
end
-- Set the name text variable to match the real name text now to prepare for the next check
BPTNameText = BattlePetTooltip.Name:GetText()
end
end
-- Set up the breed tooltip
if (BPBID_Options.Tooltips.Enabled) and (BPBID_Options.Tooltips.BPT) then
BPBID_SetBreedTooltip(BattlePetTooltip, speciesID, resultslist, quality)
end
end
-- Display breed, quality if necessary, and breed tooltips on pet tooltips from chat links
local function BPBID_Hook_FBPTShow(speciesID, level, rarity, maxHealth, power, speed, name)
-- Impossible checks for safety reasons
if (not FloatingBattlePetTooltip.Name) or (not speciesID) or (not level) or (not rarity) or (not maxHealth) or (not power) or (not speed) then return end
-- Fix rarity to match our system and calculate breedID and breedname
rarity = rarity + 1
local breedNum, quality, resultslist = internal.CalculateBreedID(speciesID, rarity, level, maxHealth, power, speed, false, false)
-- Avoid strange quality errors (investigate further?)
if (not quality) then return end
-- Add the breed to the tooltip's name text
if (BPBID_Options.Names.FBPT) then
local breed = internal.RetrieveBreedName(breedNum)
-- Account for possibility of not having the name passed to us
local realname
if (not name) then
realname = PJ_GetPetInfoBySpeciesID(speciesID)
else
realname = name
end
-- Append breed to tooltip
FloatingBattlePetTooltip.Name:SetText(realname.." ("..breed..")")
-- Could potentially try to avoid collisons better here but it will be hard because these aren't even really GameTooltips
-- Resize all relevant parts of tooltip to avoid cutoff breeds/names (since Blizzard made these static-sized!)
-- Use alternative method (Simca has this stored) if this doesn't work long-term
local stringwide = FloatingBattlePetTooltip.Name:GetStringWidth() + 14
if stringwide < 238 then stringwide = 238 end
FloatingBattlePetTooltip:SetWidth(stringwide + 22)
FloatingBattlePetTooltip.Name:SetWidth(stringwide)
FloatingBattlePetTooltip.BattlePet:SetWidth(stringwide)
FloatingBattlePetTooltip.PetType:SetPoint("TOPRIGHT", FloatingBattlePetTooltip.Name, "BOTTOMRIGHT", 0, -2)
FloatingBattlePetTooltip.Level:SetWidth(stringwide)
FloatingBattlePetTooltip.Delimiter:SetWidth(stringwide + 13)
FloatingBattlePetTooltip.JournalClick:SetWidth(stringwide)
end
-- Set up the breed tooltip
if (BPBID_Options.Tooltips.Enabled) and (BPBID_Options.Tooltips.FBPT) then
if petbm and petbm.TooltipHook and petbm.TooltipHook.tooltipFrame and petbm.TooltipHook.tooltipFrame.text then
BPBID_SetBreedTooltip(FloatingBattlePetTooltip, speciesID, resultslist, quality, 0 - (petbm.TooltipHook.tooltipFrame.text:GetHeight() + 6))
else
BPBID_SetBreedTooltip(FloatingBattlePetTooltip, speciesID, resultslist, quality)
end
end
end
-- Display breed, quality if necessary, and breed tooltips on Pet Journal tooltips
function internal.Hook_PJTEnter(self, motion)
-- Impossible check for safety reasons
if (not GameTooltip:IsVisible()) then return end
if (PetJournalPetCard.petID) then
-- Get data from PetID (which can get from the current PetCard since we know the current PetCard has to be responsible for the tooltip too)
local speciesID, _, level = PJ_GetPetInfoByPetID(PetJournalPetCard.petID)
local _, maxHealth, power, speed, rarity = PJ_GetPetStats(PetJournalPetCard.petID)
-- Calculate breedID and breedname
local breedNum, quality, resultslist = internal.CalculateBreedID(speciesID, rarity, level, maxHealth, power, speed, false, false)
-- If fields become nil due to everything being filtered, show the special runthrough tooltip and escape from the function
if not quality then
BPBID_SetBreedTooltip(GameTooltip, PetJournalPetCard.speciesID, false, false)
return
end
-- Add the breed to the tooltip's name text
if (BPBID_Options.Names.PJT) then
local breed = internal.RetrieveBreedName(breedNum)
-- Write breed to tooltip
GameTooltipTextLeft1:SetText(GameTooltipTextLeft1:GetText().." ("..breed..")")
-- Resize to avoid cutting off breed
GameTooltip:Show()
end
-- Color tooltip header
if (BPBID_Options.Names.PJTRarity) then
GameTooltipTextLeft1:SetTextColor(ITEM_QUALITY_COLORS[quality - 1].r, ITEM_QUALITY_COLORS[quality - 1].g, ITEM_QUALITY_COLORS[quality - 1].b)
end
-- Set up the breed tooltip
if (BPBID_Options.Tooltips.Enabled) and (BPBID_Options.Tooltips.PJT) then
BPBID_SetBreedTooltip(GameTooltip, speciesID, resultslist, quality)
end
elseif (PetJournalPetCard.speciesID) and (BPBID_Options.Tooltips.Enabled) and (BPBID_Options.Tooltips.PJT) then
-- Set up the breed tooltip for a special runthrough (no known breed)
BPBID_SetBreedTooltip(GameTooltip, PetJournalPetCard.speciesID, false, false)
end
end
function internal.Hook_PJTLeave(self, motion)
-- Uncolor tooltip header
if (BPBID_Options.Names.PJTRarity) then
GameTooltipTextLeft1:SetTextColor(1, 1, 1)
end
end
-- Hook for ArkInventory compability, following the example of BattlePetTooltip
function internal.Hook_ArkInventory(tooltip, h, i)
-- If the user has chosen not to let ArkInventory handle Battle Pets then we won't need to intervene
if ((tooltip ~= GameTooltip) and (tooltip ~= ItemRefTooltip)) or (not ArkInventory or not ArkInventory.db or not ArkInventory.db.option or not ArkInventory.db.option.tooltip or not ArkInventory.db.option.tooltip.battlepet or not ArkInventory.db.option.tooltip.battlepet.enable) then return end
-- Decode string
local class, speciesID, level, rarity, maxHealth, power, speed = unpack( ArkInventory.ObjectStringDecode( h ) )
-- Escape if not a battlepet link
if class ~= "battlepet" then return end
-- Impossible checks for safety reasons
if (not speciesID) or (not level) or (not rarity) or (not maxHealth) or (not power) or (not speed) then return end
-- Change rarity to match our system and calculate breedID and breedname
rarity = rarity + 1
local breedNum, quality, resultslist = internal.CalculateBreedID(speciesID, rarity, level, maxHealth, power, speed, false, false)
-- Fix width if too small
local reloadTooltip = false
if (tooltip:GetWidth() < 210) then
tooltip:SetMinimumWidth(210)
reloadTooltip = true
end
-- Add the breed to the tooltip's name text
if (BPBID_Options.Names.BPT) and (tooltip == GameTooltip) then
local breed = internal.RetrieveBreedName(breedNum)
local currentText = GameTooltipTextLeft1:GetText()
-- Test if we've already written to the tooltip
if currentText and not strfind(currentText, " (" .. breed .. ")") then
-- Append breed to tooltip
GameTooltipTextLeft1:SetText(currentText .. " (" .. breed .. ")")
reloadTooltip = true
end
elseif (BPBID_Options.Names.FBPT) and (tooltip == ItemRefTooltip) then
local breed = internal.RetrieveBreedName(breedNum)
local currentText = ItemRefTooltipTextLeft1:GetText()
-- Append breed to tooltip
ItemRefTooltipTextLeft1:SetText(currentText .. " (" .. breed .. ")")
reloadTooltip = true
end
-- Reshow tooltip if needed
if reloadTooltip then
tooltip:Show()
end
-- Set up the breed tooltip
if (BPBID_Options.Tooltips.Enabled) and (((BPBID_Options.Tooltips.BPT) and (tooltip == GameTooltip)) or ((BPBID_Options.Tooltips.FBPT) and (tooltip == ItemRefTooltip))) then
BPBID_SetBreedTooltip(tooltip, speciesID, resultslist, quality)
end
end
-- Hook our tooltip functions
hooksecurefunc("PetBattleUnitFrame_UpdateDisplay", BPBID_Hook_BattleUpdate)
hooksecurefunc("BattlePetToolTip_Show", BPBID_Hook_BPTShow)
hooksecurefunc("FloatingBattlePet_Show", BPBID_Hook_FBPTShow)
-- Internal.Hook_PJTEnter is called by the ADDON_LOADED event for Blizzard_Collections in BattlePetBreedID's Core
-- Internal.Hook_PJTLeave is called by the ADDON_LOADED event for Blizzard_Collections in BattlePetBreedID's Core
-- HSFUpdate is handled in BattlePetBreedID's Core entirely because it is unrelated to tooltips