local addonname, addon = ... local PJ = C_PetJournal local filterflags = { [LE_PET_JOURNAL_FLAG_COLLECTED] = false, [LE_PET_JOURNAL_FLAG_FAVORITES] = false, [LE_PET_JOURNAL_FLAG_NOT_COLLECTED] = false } local filtertypes = {} local filtersources = {} local function EventHandler(self, event, ...) if type(self[event]) == "function" then self[event](self, ...) end end function addon:Initialize() self.modules = {} self.petidx = {} self.petown = {} self.frame = CreateFrame"Frame" self.frame:RegisterEvent"ADDON_LOADED" self.frame:RegisterEvent"PET_JOURNAL_LIST_UPDATE" self.frame:SetScript("OnEvent", function(f, ...) EventHandler(addon, ...) end) end function addon:CreateModule(name) local module = CreateFrame"Frame" module:SetScript("OnEvent", EventHandler) self.modules[name] = module return module end function addon:EnableModules() for name, module in pairs(self.modules) do if type(module.Enable) == "function" then module:Enable() end end end function addon:GetNumPets() return #self.petidx end function addon:GetNumUniquePets() local count = 0 for species, owned in pairs(self.petown) do if owned then count = count + 1 end end return count end function addon:GetPetInfo(idx) local species = self.petidx[idx] if species then return species, PJ.GetPetInfoBySpeciesID(species) end end function addon:GetPetInfoByName(name) for i = 1, self:GetNumPets() do local pname = select(2, self:GetPetInfo(i)) if pname == name then return i, self:GetPetInfo(i) end end end function addon:GetPetInfoByGUID(guid) local first3 = tonumber("0x"..guid:sub(3, 5)) local unittype = bit.band(first3, 0x00f) if unittype ~= 0x03 then return end local npcid = tonumber("0x"..guid:sub(7, 10)) for i = 1, self:GetNumPets() do local petnpc = select(5, self:GetPetInfo(i)) if petnpc == npcid then return i, self:GetPetInfo(i) end end end function addon:IsPetSpeciesOwned(species) return self.petown[species] end function addon:ClearPetJournalFilters() self.updating = true for key, val in pairs(filterflags) do filterflags[key] = not PJ.IsFlagFiltered(key) end for i = 1, PJ.GetNumPetTypes() do filtertypes[i] = not PJ.IsPetTypeFiltered(i) PJ.SetPetTypeFilter(i, true) end for i = 1, PJ.GetNumPetSources() do filtersources[i] = not PJ.IsPetSourceFiltered(i) PJ.SetPetSourceFilter(i, true) end PJ.SetFlagFilter(LE_PET_JOURNAL_FLAG_COLLECTED, true) PJ.SetFlagFilter(LE_PET_JOURNAL_FLAG_FAVORITES, false) PJ.SetFlagFilter(LE_PET_JOURNAL_FLAG_NOT_COLLECTED, true) PJ.SetSearchFilter("") self.updating = false end function addon:RestorePetJournalFilters() self.updating = true for key, val in pairs(filterflags) do PJ.SetFlagFilter(key, val) end for i, val in ipairs(filtertypes) do PJ.SetPetTypeFilter(i, val) end for i, val in ipairs(filtersources) do PJ.SetPetSourceFilter(i, val) end if IsAddOnLoaded("Blizzard_PetJournal") then PetJournal_OnSearchTextChanged(PetJournalSearchBox) end self.updating = false end function addon:PET_JOURNAL_LIST_UPDATE(...) if self.updating then return end wipe(self.petidx) wipe(self.petown) self:ClearPetJournalFilters() for i = 1, PJ.GetNumPets(false) do local petid, speciesid, isowned = PJ.GetPetInfoByIndex(i, false) if speciesid then table.insert(self.petidx, speciesid) self.petown[speciesid] = isowned end end self:RestorePetJournalFilters() end function addon:ADDON_LOADED(loaded) if loaded ~= addonname then return end self:EnableModules() self.frame:UnregisterEvent"ADDON_LOADED" end addon:Initialize() PetJournalEx = addon