local myname, ns = ... local core = LibStub("AceAddon-3.0"):GetAddon("SilverDragon") local Debug = core.Debug local DebugF = core.DebugF -- a few of these get to be hardcoded, because of bad types in the API local achievements = { [1312] = {}, -- Bloody Rare (BC mobs) [2257] = {}, -- Frostbitten (Wrath mobs) [7317] = { -- One Many Army (Vale) [58771] = 20522, -- Quid [58778] = 20521, -- Aetha [63510] = 20527, -- Wulon }, [7439] = {}, -- Glorious! (Pandaria mobs) [8103] = {}, -- Champions of Lei Shen (Thunder Isle) [8535] = {}, -- Celestial Challenge (Timeless Isle) [8714] = {}, -- Timeless Champion (Timeless Isle) [9216] = {}, -- High-value targets (Ashran) [9400] = {}, -- Gorgrond Monster Hunter [9541] = {}, -- The Song of Silence [9571] = {}, -- Broke Back Precipice [9601] = {}, -- King of the Monsters [9617] = {}, -- Making the Cut [9633] = {}, -- Cut off the Head (Shatt) [9638] = {}, -- Heralds of the Legion (Shatt) [9655] = {}, -- Fight the Power (Gorgrond) [9678] = {}, -- Ancient No More (Gorgrond) [10061] = {}, -- Hellbane (Tanaan) [10070] = {}, -- Jungle Stalker (Tanaan) [11160] = {}, -- Unleashed Monstrosities [11261] = { -- Adventurer of Azsuna [89016] = 33377, -- Ravyn-Drath [90244] = 33262, --Arcavellus [90505] = 33263, -- Syphonus (Syphonus & Leodrath) [90803] = 33264, -- Infernal Lord (Cache of Infernals) [91100] = 32403, -- Brogozog (Marius & Tehd versus a Fel Lord) [91113] = 33267, -- Tide Behemoth [91114] = 33267, -- Tide Behemoth [91115] = 33267, -- Tide Behemoth [91579] = 32402, -- Kazrok (Marius & Tehd versus a Doomlord) [105938] = 32401, -- Felwing (Marius & Tehd versus Felbats) [107113] = 33373, -- Vorthax [107269] = 33374, -- Inquisitor Tivos [107657] = 33372, -- Arcanist Shal'iman [112636] = 33272, -- Sinister Leyrunner (Treacherous Stallions) [112637] = 33272, -- Devious Sunrunner (Treacherous Stallions) }, [11262] = { -- Adventurer of Valsharah [92104] = 34537, -- (Unguarded Thistleleaf Treasure) [93654] = 33279, -- Skul'vrax (Elindya Featherlight) [93679] = 32406, -- Gathenak the Subjugator (Marius & Tehd versus a Satyr) [93758] = 33280, -- Antydas Nightcaller [94414] = 33281, -- Kiranys Duskwhisper (Haunted Manor) [94485] = 33282, -- Pollous the Fetid (Purging the River) [95123] = 33284, -- Grelda the Hag [95221] = 33285, -- Mad Henryk (Old Bear Trap) [95318] = 33286, -- Perrexx the Corruptor [97504] = 33287, -- Wraithtalon [97517] = 33288, -- Dreadbog [98241] = 33289, -- Lyrath Moonfeather [109708] = 33290, -- Undergrell Ringleader (Undergrell Attack) [110562] = 33291, -- Bahagar }, [11263] = { -- Adventurer of Stormheim [90139] = 32404, -- Inquisitor Ernstenbok (Marius & Tehd versus an Inquisitor) [91529] = 33293, -- Glimar Ironfist [91795] = 33294, -- Stormwing Matriarch [91803] = 33295, -- Fathnyr [91874] = 33296, -- Bladesquall [91892] = 33297, -- Thane Irglov the Merciless (Thane's Mead Hall) [92040] = 33298, -- Fenri [92152] = 33299, -- Whitewater Typhoon [92599] = 33300, -- Worg Pack [92685] = 33303, -- Helmouth Raiders [92751] = 33304, -- Ivory Sentinel [92763] = 33305, -- The Nameless King [93166] = 33306, -- Tiptog the Lost (Lost Ettin) [93371] = 33307, -- Mordvigbjorn [93401] = 33308, -- Urgev the Flayer [94413] = 33309, -- Isel the Hammer [97630] = 33310, -- Soulthirster [98188] = 33311, -- Egyl the Enduring [98268] = 33312, -- Tarben [98421] = 33313, -- Kottr Vondyr [98503] = 33314, -- Grrvrgull the Conquerer [107926] = 33315, -- Hannval the Butcher [110363] = 33316, -- Roteye }, [11264] = { -- Adventurer of Highmountain [95872] = 33318, -- Skullhat (Skywhisker Taskmaster) [96410] = 33319, -- Majestic Elderhorn [96590] = 33320, -- Gurbog da Basher [96621] = 33321, -- Mellok, Son of Torok [97093] = 33322, -- Shara Felbreath [97102] = 33334, -- Ram'Pag (Totally Safe Treasure Chest) [97203] = 33323, -- Tenpak Flametotem (The Exiled Shaman) [97220] = 33324, -- Arru (Beastmaster Pao'lek) [97326] = 33325, -- Hartli the Snatcher [97345] = 33326, -- Crawshuk the Hungry [97449] = 33328, -- Bristlemaul [97593] = 33329, -- Mynta Talonscreech (Scout Harefoot) [97653] = 33330, -- Taurson (The Beastly Boxer) [97933] = 33331, -- Crab Rider Grmlrml [98024] = 33332, -- Luggut the Eggeater [98299] = 33375, -- Bodash the Hoarder [98311] = 33333, -- Mrrklr (Captured Survivor) [98890] = 33335, -- Slumber (Slumbering Bear) [100230] = 33336, -- Ryael (Amateur Hunters) [100231] = 33336, -- Dargok (Amateur Hunters) [100232] = 33336, -- Sure Shot (Amateur Hunters) [100302] = 33340, -- Puck (Unethical Adventurers) [100303] = 33340, -- Zenobia (Unethical Adventurers) [100495] = 33337, -- Devouring Darkness [101077] = 33338, -- Sekhan [109498] = 33340, -- Xaander (Unethical Adventurers) [109500] = 33340, -- Jak (Unethical Adventurers) [109501] = 33340, -- Darkful (Unethical Adventurers) }, [11265] = { -- Adventurer of Suramar [99610] = 33341, -- Garvrulg [99792] = 33342, -- Elfbane [100864] = 33343, -- Cora'kar [103183] = 33344, -- Rok'nash [103214] = 33345, -- Har'kess the Insatiable [103223] = 33346, -- Hertha Grimdottir [103575] = 33347, -- Reef Lord Raj'his [103841] = 33348, -- Shadowquil [105547] = 33349, -- Rauren [106351] = 33350, -- Artificer Lothaire [107846] = 33351, -- Pinchshank [109054] = 33352, -- Shal'an [109954] = 33353, -- Magister Phaedris [110024] = 33354, -- Mal'Dreth the Corrupter [110340] = 33355, -- Myonix [110438] = 33356, -- Siegemaster Aedrin [110577] = 33357, -- Oreth the Vile [110656] = 33358, -- Arcanist Lylandre [110726] = 33359, -- Cadraeus [110824] = 33360, -- Tideclaw [110832] = 33361, -- Gorgroth [110870] = 33362, -- Apothecary Faldren [110944] = 33363, -- Guardian Thor'el [111007] = 33364, -- Randril [111063] = 33364, -- Randril [111197] = 33365, -- Anax [111329] = 33366, -- Matron Hagatha [111649] = 33367, -- Ambassador D'vwinn [111651] = 33368, -- Degren [111653] = 33369, -- Miasu [112497] = 33370, -- Maia the White [112802] = 33371, -- Mar'tura [102303] = 33376, -- Lieutenant Strathmar }, [11786] = {}, -- Terrors of the Shore [11841] = {}, -- Naxt Victim [12026] = {}, -- Invasion Obliteration [12028] = {}, -- Envision Invasion Eradication [12078] = { -- Commander of Argus [127323] = 37629, -- Ataxon }, [12944] = { -- Adventurer of Zuldazar [129961] = 41850, -- Atal'zul Gotaka [129954] = 41851, -- Gahz'ralka [136428] = 41852, -- Dark Chronicler [136413] = 41853, -- Syrawon the Dominus [131476] = 41869, -- Zayoos [131233] = 41870, -- Lei-zhi [129343] = 41871, -- Avatar of Xolotal [128699] = 41872, -- Bloodbulge [127939] = 41873, -- Torraske the Eternal [126637] = 41874, -- Kandak [120899] = 41875, -- Kul'krazahn [124185] = 41876, -- Golrakahn [122004] = 41877, -- Umbra'jin [134760] = 41855, -- Darkspeaker Jo'la [134738] = 41856, -- Hakbi the Risen [134048] = 41858, -- Vukuba [133842] = 41859, -- Warcrawler Karkithiss [134782] = 41863, -- Murderbeak [133190] = 41864, -- Daggerjaw [133155] = 41865, -- G'Naat [132244] = 41866, -- Kiboku [131718] = 41867, -- Bramblewing [131687] = 41868, -- Tambano }, [12942] = { -- Adventurer of Nazmir [125250] = 41440, -- Ancient Jawbreaker [134293] = 41447, -- Azerite-Infused Slag [128965] = 41450, -- Uroku the Bound [134296] = 41452, -- Chag's Challenge [125232] = 41454, -- Cursed Chest [121242] = 41456, -- Glompmaw [128974] = 41458, -- Queen Tzxi'kik [133373] = 41460, -- Jax'teb the Reanimated [124397] = 41462, -- Kal'draxa [134295] = 41464, -- Lost Scroll [127820] = 41467, -- Scout Skrasniss [126460] = 41469, -- Tainted Guardian [135565] = 41472, -- Urn of Agussu [126907] = 41474, -- Wardrummer Zurula [129657] = 41476, -- Za'amar the Queen's Blade [133539] = 41478, -- Lo'kuno [134298] = 41444, -- Azerite-Infused Elemental [126635] = 41448, -- Blood Priest Xak'lar [129005] = 41451, -- King Kooba [126187] = 41453, -- Corpse Bringer Yal'kar [127001] = 41455, -- Gwugnug the Cursed [128426] = 41457, -- Gutrip [124399] = 41459, -- Infected Direhorn [133527] = 41461, -- Juba the Scarred [125214] = 41463, -- Krubbs [126142] = 41466, -- Bajiatha [127873] = 41468, -- Scrounger Patriarch [126056] = 41470, -- Totem Maker Jash'ga [126926] = 41473, -- Venomjaw [133531] = 41475, -- Xu'ba [133812] = 41477, -- Zanxib [128930] = 41479, -- Mala'kili and Rohnkor [128935] = 41479, -- Mala'kili and Rohnkor }, [12943] = { -- Adventurer of Vol'Dun [135852] = 41606, -- Ak'tar [130439] = 41607, -- Ashmane [128553] = 41608, -- Azer'tor [128497] = 41609, -- Bajiani the Slick [129476] = 41610, -- Bloated Krolusk [136393] = 41611, -- Bloodwing Bonepicker [136346] = 41612, -- Captain Stef "Marrow" Quin [124722] = 41613, -- Commodore Calhoun [136335] = 41614, -- Enraged Krolusk [128674] = 41615, -- Gut-Gut the Glutton [130443] = 41616, -- Hivemother Kraxi [129283] = 41617, -- Jumbo Sandsnapper [136341] = 41618, -- Jungleweb Hunter [128686] = 41619, -- Kamid the Trapper [137681] = 41620, -- King Clickyclack [128951] = 41621, -- Nez'ara [136340] = 41622, -- Relic Hunter Hazaak [127776] = 41623, -- Scaleclaw Broodmother [136336] = 41624, -- Scorpox [136338] = 41625, -- Sirokar [134571] = 41626, -- Skycaller Teskris [134745] = 41627, -- Skycarver Krakit [136304] = 41628, -- Songstress Nahjeen [130401] = 41629, -- Vathikur [129180] = 41630, -- Warbringer Hozzik [134638] = 41631, -- Warlord Zothix [134625] = 41632, -- Warmother Captive [129411] = 41633, -- Zunashi the Exile }, [12939] = { -- Adventurer of Tiragarde Sound [132182] = 41793, -- Auditor Dolp [129181] = 41795, -- Barman Bill [132068] = 41796, -- Bashmu [132086] = 41797, -- Black-Eyed Bart [139145] = 41798, -- Blackthorne [130508] = 41800, -- Broodmother Razora [132088] = 41806, -- Captain Wintersail [139152] = 41812, -- Carla Smirk [132211] = 41813, -- Fowlmouth [132127] = 41814, -- Foxhollow Skyterror [139233] = 41819, -- Gulliver [131520] = 41820, -- Kulett the Ornery [134106] = 41821, -- Lumbergrasp Sentinel [139290] = 41822, -- Maison the Portable [137183] = 41823, -- Imperiled Merchants (Honey-Coated Slitherer) [131252] = 41824, -- Merianae [139205] = 41825, -- P4-N73R4 [131262] = 41826, -- Pack Leader Asenya [132179] = 41827, -- Raging Swell [139278] = 41828, -- Ranja [127289] = 41829, -- Saurolisk Tamer Mugg (Mugg) [127290] = 41829, -- Saurolisk Tamer Mugg (Mugg) [139287] = 41830, -- Sawtooth [139285] = 41831, -- Shiverscale the Toxic [132280] = 41832, -- Squacks [139135] = 41833, -- Squirgle of the Depths [139280] = 41834, -- Sythian the Swift [133356] = 41835, -- Tempestria [139289] = 41836, -- Tentulos the Drifter [131389] = 41837, -- Teres [139235] = 41838, -- Tort Jaw [132076] = 41839, -- Totes [131984] = 41840, -- Twin-hearted Construct }, [12941] = { -- Adventurer of Drustvar [124548] = 41706, -- Betsy [127333] = 41708, -- Barbthorn Queen [126621] = 41711, -- Bonesquall [127877] = 41713, -- Longfang & Henry Breakwater (Longfang) [127901] = 41713, -- Longfang & Henry Breakwater (Henry) [129904] = 41715, -- Cottontail Matron [128973] = 41718, -- Whargarble the Ill-Tempered [127129] = 41720, -- Grozgore [129805] = 41722, -- Beshol [129995] = 41724, -- Emily Mayville [130143] = 41726, -- Balethorn [134213] = 41728, -- Executioner Blackwell [134754] = 41729, -- Hyo'gi [137529] = 41732, -- Arvon the Betrayed [137825] = 41736, -- Avalanche [138675] = 41742, -- Gorged Boar [138866] = 41748, -- Fungi Trio (quest 51887 also?) [138870] = 41748, -- Fungi Trio (quest 51887 also?) [138871] = 41748, -- Fungi Trio (quest 51887 also?) [139322] = 41751, -- Whitney "Steelclaw" Ramsay [125453] = 41707, -- Quillrat Matriarch [127651] = 41709, -- Vicemaul [127844] = 41712, -- Gluttonous Yeti -- [] = 41714, -- Ancient Sarcophagus [128707] = 41717, -- Rimestone -- [] = 41719, -- Seething Cache [129835] = 41721, -- Gorehorn [129950] = 41723, -- Talon [130138] = 41725, -- Nevermore [132319] = 41727, -- Bilefang Mother [134706] = 42342, -- Deathcap [135796] = 41730, -- Captain Leadfist [137824] = 41733, -- Arclight [138618] = 41739, -- Haywire Golem [138863] = 41745, -- Sister Martha [139321] = 41750, -- Braedan Whitewall }, [12940] = { -- Adventurer of Stormsong Valley [141175] = 41753, -- Song Mistress Dadalea [140997] = 41754, -- Severus the Outcast [138938] = 41755, -- Seabreaker Skoloth [139328] = 41756, -- Sabertron [139356] = 41756, -- Sabertron [136189] = 41757, -- The Lichen King [134884] = 41758, -- Ragna [139319] = 41759, -- Slickspill [137025] = 41760, -- Broodmother [132007] = 41761, -- Galestorm [142088] = 41762, -- Whirlwing [141029] = 41763, -- Kickers [131404] = 41765, -- Foreman Scripps [141286] = 41769, -- Poacher Zane [139298] = 41772, -- Pinku'shon [141059] = 41774, -- Grimscowl the Harebrained [139385] = 41775, -- Deepfang [140938] = 41776, -- Croaker [139968] = 41777, -- Corrupted Tideskipper [136183] = 41778, -- Crushtacean [134897] = 43470, -- Dagrus the Scorned [135939] = 41782, -- Vinespeaker Ratha [135947] = 41787, -- Strange Mushroom Ring [141226] = 41815, -- Haegol the Hammer [141088] = 41816, -- Squall [141039] = 41817, -- Ice Sickle [130897] = 41818, -- Captain Razorspine [129803] = 41841, -- Whiplash [141143] = 41842, -- Sister Absinthe [130079] = 41843, -- Wagga Snarltusk [138963] = 41844, -- Nestmother Acada [141239] = 41845, -- Osca the Bloodied [139988] = 41846, -- Sandfang [139980] = 41847, -- Taja the Tidehowler [140925] = 34, -- Doc Marrtens [141043] = 34, -- Jakala the Cruel }, [12587] = {}, -- Unbound Monstrosities [13027] = {}, -- Mushroom Harvest [13470] = { -- Rest In Pistons (Mechagon) [151124] = 45117, -- Mechagonian Nullifier [151623] = 45118, -- The Scrap King [151625] = 45118, -- The Scrap King [151672] = 45119, -- Mecharantuala [151684] = 45121, -- Jawbreaker [151702] = 45122, -- Paol Pondwader [150575] = 45123, -- Rumblerocks [151934] = 45124, -- Arachnoid Harvester [152007] = 45125, -- Killsaw [151884] = 45126, -- Fungarian Furor [151202] = 45127, -- Foul Manifestation [151569] = 45128, -- Deepwater Maw [151296] = 45129, -- OOX-Avenger/MG [152001] = 45130, -- Bonepicker [151308] = 45131, -- Boggac Skullbash [151940] = 45132, -- Uncle T'Rogg [150937] = 45133, -- Seaspit [153000] = 45134, -- Sparkqueen P'Emp [152182] = 45135, -- Rustfeather [151933] = 45136, -- Malfunctioning Beastbot [152569] = 45137, -- Crazed Trogg [152570] = 45137, -- Crazed Trogg [150342] = 45138, -- Earthbreaker Gulroc [153206] = 45145, -- Ol' Big Tusk [153205] = 45146, -- Gemicide [152764] = 45157, -- Oxidized Leachbeast [153200] = 45152, -- Boilburn [152113] = 45153, -- The Kleptoboss [153226] = 45154, -- Steel Singer Freza [153228] = 45155, -- Gear Checker Cogstar [151627] = 45156, -- Mr. Fixthis [150394] = 45158, -- Vaultbot [154153] = 45373, -- Enforcer KX-T57 [154225] = 45374, -- The Rusty Prince [154701] = 45410, -- Gorged Gear-Cruncher [154739] = 45411, -- Caustic Mechaslime [155060] = 45433, -- The Doppel Gang [155583] = 45691, -- Scrapclaw }, [13690] = { -- Nazjatarget Eliminated (Nazjatar) [153299] = 45504, -- Szun, Breaker of Slaves [153302] = 45505, -- Frozen Winds of Zhiela [153300] = 45506, -- Zoko, Her Iron Defender [153296] = 45507, -- Tempest-Speaker Shalan'ali [153301] = 45508, -- Starseeker of the Shirakess [153311] = 45509, -- Azanz, the Slitherblade [153304] = 45510, -- Undana, Chilling Assassin [153303] = 45511, -- Kassar, Wielder of Dark Blades [153305] = 45512, -- The Zanj'ir Brutalizer [153314] = 45513, -- Champion Aldrantiss, Defender of Her Kingdom [153309] = 45514, -- Champion Alzana, Arrow of Thunder [153315] = 45515, -- Champion Eldanar, Shield of Her Glory [153312] = 45516, -- Champion Kyx'zhul the Deepspeaker [153310] = 45517, -- Champion Qalina, Spear of Ice [153313] = 45518, -- Champion Vyz'olgo the Mind-Taker }, [13691] = {}, -- I Thought You Said They'd Be Rare (Nazjatar) [14159] = {}, -- Combating the Corruption (Assaults) [14276] = {}, -- It's Always Sinny in Revendreth [14307] = { -- Adventurer of Bastion [158659] = 50582, -- Herculon [160721] = 50596, -- Fallen Acolyte Erisne [161527] = 50597, -- Sigilback [161530] = 50598, -- Cloudtail [161529] = 50599, -- Nemaeus [160629] = 50592, -- Baedos [167078] = 50600, -- Wingflayer the Cruel [160882] = 50594, -- Vesper Repair: Sophia's Aria (Nikara Blackheart) [163460] = 50595, -- Dionae [170548] = 50601, -- Sundancer [170659] = 50602, -- Basilofos, King of the Hill [170623] = 50603, -- Dark Watcher [170932] = 50604, -- Cloudfeather Guardian [171009] = 50605, -- Enforcer Aegeon [171008] = 50606, -- Unstable Memory [171013] = 50607, -- Embodied Hunger [171040] = 50608, -- Xixin the Ravening [171041] = 50609, -- Worldfeaster Chronn [171014] = 50610, -- Collector Astorestes [171011] = 50611, -- Demi the Relic Hoarder [171189] = 50612, -- Bookkeeper Mnemis [171211] = 50613, -- Aspirant Eolis [171255] = 50614, -- Echo of Aella [171010] = 50615, -- Corrupted Clawguard [171327] = 50616, -- Reekmonger [161528] = 50617, -- Aethon [160985] = 50593, -- Vesper Repair: Sophia's Overture (Selena the Reborn) [156339] = 50618, -- Orstus and Sotiros [156340] = 50618, -- Orstus and Sotiros [170832] = 50619, -- The Ascended Council (Champion of Loyalty) [170833] = 50619, -- The Ascended Council (Champion of Wisdom) [170834] = 50619, -- The Ascended Council (Champion of Purity) [170835] = 50619, -- The Ascended Council (Champion of Courage) [170836] = 50619, -- The Ascended Council (Champion of Humility) }, [14308] = {}, -- Adventurer of Maldraxxus [14309] = {}, -- Adventurer of Ardenweald [14310] = {}, -- Adventurer of Revendreth [14353] = {}, -- Ardenweald's a Stage [14660] = {}, -- It's About Sending A Message (Maw) [14721] = {}, -- It's In The Mix (Maldraxxus) [14744] = {}, -- Better to Be Lucky Than Dead (Maw) [14779] = {}, -- Wild Hunting (Ardenweald) [14788] = { -- Fractured Faerie Tales (Ardenweald) [174721] = 50012, -- A Meandering Story [174723] = 50013, -- A Wandering Tale [174724] = 50014, -- An Escapist Novel [174725] = 50015, -- A Travel Journal [174726] = 50016, -- A Naughty Story }, [14802] = {}, -- Bloodsport (Maldraxxus) [15037] = { -- This Army completed = CRITERIA_COMPLETED, [177771] = 52044, -- Cutter Fin [177769] = 52045, -- Kearnen the Blade [177764] = 52046, -- Winslow Swan [177767] = 52047, -- Boil Master Yetch [158300] = 52048, -- Flytrap }, [15042] = {completed = CRITERIA_COMPLETED}, -- Tea for the Troubled [15044] = {}, -- Krrprripripkraak's Heroes [15054] = {}, -- Minions of the Cold Dark [15107] = { -- Conquering Korthia [179755] = 52285, -- Consumption (has multiple ids) [179768] = 52285, -- Consumption (has multiple ids) [179769] = 52285, -- Consumption (has multiple ids) }, [15211] = { completed = CRITERIA_COMPLETED, -- COVENANT_SANCTUM_UPGRADE_ACTIVATING? [178835] = 52573, -- Sharpeye Collector [179007] = 52565, -- Overgrown Geomental [181208] = 52567, -- Enchained Servitor [181219] = 52554, -- Moss-Choked Guardian [181221] = 52552, -- Bygone Geomental [181222] = 52606, -- Over-charged Vespoid [181223] = 52553, -- Gaiagantic [181287] = 52566, -- Gorged Runefeaster [181290] = 52569, -- Corrupted Runehoarder [181292] = 52570, -- Misaligned Enforcer [181293] = 52571, -- Suspicious Nesmin [181294] = 52572, -- Runegorged Bufonid [181295] = 52574, -- Runethief Xy'lora [181344] = 52575, -- Runefur [181349] = 52576, -- Cipherclad [181352] = 52577, -- Bitterbeak [182798] = 52686, -- Twisted Warpcrafter [184819] = 52568, -- Dominated Irregular }, -- Completing the Code [15391] = {}, -- Adventurer of Zereth Mortis [15392] = {}, -- Dune Dominance -- TODO: this has overlap with the adventurer mobs, so I need to improve mobs_to_achievement (also all the mobs in the achievement are kill-credit fake mobs, so I need to dig up the actual IDs) -- [16446] = { -- That's Pretty Neat! -- completed = SCREENSHOT_SUCCESS, -- "Screen captured" -- }, [16676] = {}, -- Adventurer of the Waking Shores [16677] = {}, -- Adventurer of the Ohn'ahran Plains [16678] = {}, -- Adventurer of the Azure Span [16679] = {}, -- Adventurer of the Thaldraszus [16424] = {need=EMOTE410_CMD1, completed=DONE}, -- Who's A Good Bakar [16461] = {}, -- Stormed Off [16574] = {need=EMOTE88_CMD1, completed=DONE}, -- Sleeping on the Job [17525] = {}, -- Champion of the Forbidden Reach [17783] = {}, -- Adventurer of Zaralek Cavern [19316] = {}, -- Adventurer of the Emerald Dream } ns.achievements = achievements local mobs_to_achievement = { -- [43819] = 2257, } ns.mobs_to_achievement = mobs_to_achievement local achievements_loaded = false function ns:AchievementMobStatus(id) if not achievements_loaded then self:LoadAllAchievementMobs() end local achievement = mobs_to_achievement[id] if not achievement then return end local criteria = achievements[achievement][id] local _, name, _, achievement_completed, _, _, _, _, _, _, _, _, completedByMe = GetAchievementInfo(achievement) local completed if criteria < 40 then _, _, completed = GetAchievementCriteriaInfo(achievement, criteria) else _, _, completed = GetAchievementCriteriaInfoByID(achievement, criteria) end return achievement, name, completed, achievement_completed and not completedByMe end local allQuestsComplete do local faction = UnitFactionGroup("player") local function doTestAll(test, input, ...) for _, value in ipairs(input) do if not test(value, ...) then return false end end return true end local function doTestAny(test, input, ...) for _, value in ipairs(input) do if test(value, ...) then return true end end return false end local function doTest(test, input, ...) if type(input) == "table" and not input.__parent then if input.alliance then return doTest(test, faction == "Alliance" and input.alliance or input.horde, ...) end if input.any then return doTestAny(test, input, ...) end return doTestAll(test, input, ...) else return test(input, ...) end end local function testMaker(test, override) return function(...) return (override or doTest)(test, ...) end end -- local itemInBags = testMaker(function(item) return GetItemCount(item, true) > 0 end) allQuestsComplete = testMaker(function(quest) return C_QuestLog.IsQuestFlaggedCompleted(quest) end) ns.doTest = doTest end -- return quest_complete, criteria_complete, achievement_completed_by_alt -- `nil` if completion not knowable, true/false if knowable function ns:CompletionStatus(id) if not ns.mobdb[id] then return end local _, _, criteria_complete, achievement_completed_by_alt = ns:AchievementMobStatus(id) local quest_complete if ns.mobdb[id].quest then quest_complete = allQuestsComplete(ns.mobdb[id].quest) end return quest_complete, criteria_complete, achievement_completed_by_alt end function ns:LoadAllAchievementMobs() if ns.CLASSICERA or not _G.GetAchievementInfo then -- with API synchronization, the Classic client now *has* achievement functions, just... uselessly. achievements_loaded = true end if achievements_loaded then return end local known = {} for achievement in pairs(achievements) do local missing = 0 for k,v in pairs(achievements[achievement]) do known[v] = k end local num_criteria = GetAchievementNumCriteria(achievement) for i = 1, num_criteria do local description, ctype, completed, _, _, _, _, id, _, criteriaid = GetAchievementCriteriaInfo(achievement, i) if not known[criteriaid] then if ctype == 0 and id then -- "kill a mob" achievements[achievement][id] = criteriaid -- elseif ctype == 27 then -- "complete a quest" else if missing == 0 then local _, name = GetAchievementInfo(achievement) Debug('Missing mobs from achievement') DebugF('[%s] = { -- %s', achievement, name) end DebugF(' [] = %d, -- %s', criteriaid, description) missing = missing + 1 end end achievements_loaded = true end for mobid, criteriaid in pairs(achievements[achievement]) do mobs_to_achievement[mobid] = achievement end if missing > 0 then DebugF('} -- Got %d of %d', num_criteria - missing, num_criteria) end wipe(known) end end function ns:UpdateTooltipWithCompletion(tooltip, id) if not id then return end local achievement, name, completed = ns:AchievementMobStatus(id) if achievement then tooltip:AddDoubleLine( name, completed and (achievements[achievement].completed or BOSS_DEAD) or (achievements[achievement].need or ACTION_PARTY_KILL), 1, 1, 0, completed and 0 or 1, completed and 1 or 0, 0 ) end if ns.mobdb[id] and ns.mobdb[id].quest then completed = allQuestsComplete(ns.mobdb[id].quest) tooltip:AddDoubleLine( QUESTS_COLON:gsub(":", ""), completed and COMPLETE or INCOMPLETE, 1, 1, 0, completed and 0 or 1, completed and 1 or 0, 0 ) end end