bbe2492a5b
Each DataStore_* / Altoholic_* addon now lives at the repo root, matching the Exiles fork-layout convention (one folder per addon, no wrapper dir).
149 lines
3.9 KiB
Lua
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
|