Files
coa-altoholic/Altoholic-Addon/DataStore_Pets/DataStore_Pets.lua
T

149 lines
3.9 KiB
Lua

--[[ *** DataStore_Pets ***
Written by : Thaoky, EU-Marécages de Zangar
June 22st, 2009
--]]
if not DataStore then return end
local addonName = "DataStore_Pets"
_G[addonName] = LibStub("AceAddon-3.0"):NewAddon(addonName, "AceConsole-3.0", "AceEvent-3.0")
local addon = _G[addonName]
local THIS_ACCOUNT = "Default"
local AddonDB_Defaults = {
global = {
Characters = {
['*'] = { -- ["Account.Realm.Name"]
lastUpdate = nil,
CRITTER = {}, -- companion types are used as table names
MOUNT = {},
}
}
}
}
-- *** Scanning functions ***
local COMPANION_ICON_PATH = "Interface\\Icons\\"
local function ScanCompanions(companionType)
local list = addon.ThisCharacter[companionType]
wipe(list)
for i = 1, GetNumCompanions(companionType) do
local modelID, name, spellID, icon = GetCompanionInfo(companionType, i);
if modelID and name and spellID and icon then
-- trim icon path to save memory
list[i] = modelID .. "|" .. name .. "|" .. spellID .. "|" .. string.gsub(icon, COMPANION_ICON_PATH, "")
end
end
addon.ThisCharacter.lastUpdate = time()
end
-- *** Event Handlers ***
local function OnPlayerAlive()
-- print("DataStore_Pets.lua") -- DEBUG 2025 07 21
if not UnitIsGhost("player") then return end -- only scan if player released spirit and went to graveyard
ScanCompanions("CRITTER")
ScanCompanions("MOUNT")
end
local function OnCompanionUpdate()
-- COMPANION_UPDATE is triggered very often, but after the very first call, pets & mounts can be scanned automatically. After that, we only need to track COMPANION_LEARNED
addon:UnregisterEvent("COMPANION_UPDATE")
ScanCompanions("CRITTER")
ScanCompanions("MOUNT")
end
local function OnCompanionLearned()
ScanCompanions("CRITTER")
ScanCompanions("MOUNT")
end
-- ** Mixins **
local function _GetPets(character, companionType)
return character[companionType]
end
local function _GetNumPets(pets)
assert(type(pets) == "table") -- this is the pointer to a pet table, obtained through GetPets()
return #pets
end
local function _GetPetInfo(pets, index)
local pet = pets[index]
if pet then
local modelID, name, spellID, icon = strsplit("|", pet)
return tonumber(modelID), name, tonumber(spellID), "Interface\\Icons\\" .. icon
end
end
local function _IsPetKnown(character, companionType, spellID)
local pets = _GetPets(character, companionType)
for i = 1, #pets do
local _, _, id = _GetPetInfo(pets, i)
if id == spellID then
return true -- returns true if a given spell ID is a known pet or mount
end
end
end
local function _GetMountList()
return addon.MountList
end
local function _GetMountSpellID(itemID)
-- returns nil if id is not in the DB, returns the spellID otherwise
return addon.MountToSpellID[itemID]
end
local function _GetCompanionList()
return addon.CompanionList
end
local function _GetCompanionSpellID(itemID)
-- returns nil if id is not in the DB, returns the spellID otherwise
return addon.CompanionToSpellID[itemID]
end
local function _GetCompanionLink(spellID)
local name = GetSpellInfo(spellID)
return format("|cff71d5ff|Hspell:%s|h[%s]|h|r", spellID, name)
end
local PublicMethods = {
GetPets = _GetPets,
GetNumPets = _GetNumPets,
GetPetInfo = _GetPetInfo,
IsPetKnown = _IsPetKnown,
GetMountList = _GetMountList,
GetMountSpellID = _GetMountSpellID,
GetCompanionList = _GetCompanionList,
GetCompanionSpellID = _GetCompanionSpellID,
GetCompanionLink = _GetCompanionLink,
}
function addon:OnInitialize()
addon.db = LibStub("AceDB-3.0"):New(addonName .. "DB", AddonDB_Defaults)
DataStore:RegisterModule(addonName, addon, PublicMethods)
DataStore:SetCharacterBasedMethod("GetPets")
DataStore:SetCharacterBasedMethod("IsPetKnown")
end
function addon:OnEnable()
addon:RegisterEvent("PLAYER_ALIVE", OnPlayerAlive)
addon:RegisterEvent("COMPANION_UPDATE", OnCompanionUpdate)
addon:RegisterEvent("COMPANION_LEARNED", OnCompanionLearned)
end
function addon:OnDisable()
addon:UnregisterEvent("PLAYER_ALIVE")
addon:UnregisterEvent("COMPANION_LEARNED")
end