Files
AtlasLoot/Core/AtlasLoot.lua
T
2026-04-02 09:24:56 +03:00

3449 lines
132 KiB
Lua

--[[
Atlasloot Enhanced
Author Daviesh
Loot browser associating loot with instance bosses
Can be integrated with Atlas (http://www.atlasmod.com)
]]
local _G = _G or getfenv(0)
local refreshTimeout = 2
-- Bindings
BINDING_HEADER_ATLASLOOT_TITLE = "AtlasLoot Bindings"
BINDING_NAME_ATLASLOOT_TOGGLE = "Toggle AtlasLoot"
BINDING_NAME_ATLASLOOT_OPTIONS = "Toggle Options"
BINDING_NAME_ATLASLOOT_QL1 = "QuickLook 1"
BINDING_NAME_ATLASLOOT_QL2 = "QuickLook 2"
BINDING_NAME_ATLASLOOT_QL3 = "QuickLook 3"
BINDING_NAME_ATLASLOOT_QL4 = "QuickLook 4"
BINDING_NAME_ATLASLOOT_WISHLIST = "WishList"
AtlasLoot = AceLibrary("AceAddon-2.0"):new("AceDB-2.0")
-- Instance required libraries
local AL = AceLibrary("AceLocale-2.2"):new("AtlasLoot");
-- Establish version number and compatible version of Atlas
local ver = string.gsub(GetAddOnMetadata("AtlasLoot", "Version"), "%.", "0")
_,_, ver = string.find(ver, "(%d+)")
local version = tonumber(ver)
ATLASLOOT_VERSION = "|cffFF8400AtlasLoot TW Edition v"..GetAddOnMetadata("AtlasLoot", "Version").."|r";
-- Compatibility with old EquipCompare/EQCompare
ATLASLOOT_OPTIONS_EQUIPCOMPARE = AL["Use EquipCompare"];
ATLASLOOT_OPTIONS_EQUIPCOMPARE_DISABLED = AL["|cff9d9d9dUse EquipCompare|r"];
-- Make the Hewdrop menu in the standalone loot browser accessible here
AtlasLoot_Hewdrop = AceLibrary("Hewdrop-2.0");
AtlasLoot_HewdropSubMenu = AceLibrary("Hewdrop-2.0");
-- Colours stored for code readability
local GREY = "|cff999999";
local RED = "|cffff0000";
local WHITE = "|cffFFFFFF";
local GREEN = "|cff1eff00";
local PURPLE = "|cff9F3FFF";
local BLUE = "|cff0070dd";
local ORANGE = "|cffFF8400";
local DEFAULT = "|cffFFd200";
-- Establish number of boss lines in the Atlas frame for scrolling
local ATLAS_LOOT_BOSS_LINES = 24;
local Anchor_Atlas = { "TOPLEFT", "AtlasFrame", "TOPLEFT", 18, -84 }
local Anchor_AlphaMap = { "TOPLEFT", "AlphaMapAlphaMapFrame", "TOPLEFT", 0, 0 }
local Anchor_Default = { "TOPLEFT", "AtlasLootDefaultFrame", "TOPLEFT", 45, -85 }
-- Variables to hold hooked Atlas functions
local Original_Atlas_Refresh;
local Original_Atlas_OnShow;
local Original_AtlasScrollBar_Update;
AtlasLootCharDB = {};
AtlasLoot:RegisterDB("AtlasLootDB");
-- Popup Box for first time users
StaticPopupDialogs["ATLASLOOT_SETUP"] = {
text = AL["Welcome to Atlasloot Enhanced. Please take a moment to set your preferences."],
button1 = AL["Setup"],
OnAccept = function()
AtlasLootOptions_Toggle();
end,
timeout = 0,
whileDead = 1,
hideOnEscape = 1
};
AtlasLoot_Data["AtlasLootFallback"] = {
EmptyInstance = {};
};
AtlasLoot_MenuList = {
["DUNGEONSMENU1"] = "AtlasLoot_DungeonsMenu1",
["DUNGEONSMENU2"] = "AtlasLoot_DungeonsMenu2",
["PVPMENU"] = "AtlasLootPvPMenu",
["ABRepMenu"] = "AtlasLootABRepMenu",
["AVRepMenu"] = "AtlasLootAVRepMenu",
["WSGRepMenu"] = "AtlasLootWSGRepMenu",
["BRRepMenu"] = "AtlasLootBRRepMenu",
["PVPSET"] = "AtlasLootPVPSetMenu",
["SETMENU"] = "AtlasLootSetMenu",
["AQ20SET"] = "AtlasLootAQ20SetMenu",
["AQ40SET"] = "AtlasLootAQ40SetMenu",
["KARASET"] = "AtlasLoot_Kara40SetMenu",
["PRE60SET"] = "AtlasLootPRE60SetMenu",
["ZGSET"] = "AtlasLootZGSetMenu",
["T3SET"] = "AtlasLootT3SetMenu",
["T2SET"] = "AtlasLootT2SetMenu",
["T1SET"] = "AtlasLootT1SetMenu",
["T0SET"] = "AtlasLootT0SetMenu",
["REPMENU"] = "AtlasLootRepMenu",
["WORLDEVENTMENU"] = "AtlasLootWorldEventMenu",
["ALCHEMYMENU"] = "AtlasLoot_AlchemyMenu",
["CRAFTINGMENU"] = "AtlasLoot_CraftingMenu",
["SMITHINGMENU"] = "AtlasLoot_SmithingMenu",
["ENCHANTINGMENU"] = "AtlasLoot_EnchantingMenu",
["ENGINEERINGMENU"] = "AtlasLoot_EngineeringMenu",
["LEATHERWORKINGMENU"] = "AtlasLoot_LeatherworkingMenu",
["TAILORINGMENU"] = "AtlasLoot_TailoringMenu",
["JEWELCRAFTMENU"] = "AtlasLoot_JewelcraftingMenu",
["CRAFTSET"] = "AtlasLootCraftedSetMenu",
["WORLDBOSSMENU"] = "AtlasLoot_WorldBossMenu",
};
-- This is a multi-layer table defining the main loot listing.
-- Entries have the text to display, loot table or sub table to link to and if the link is to a loot table or sub table
AtlasLoot_HewdropDown = {
{[AL["Dungeons & Raids"]] = {
{{ WHITE.."[13-18]|r "..AL["Ragefire Chasm"], "RagefireChasm", "Submenu" },},
{{ WHITE.."[13-20]|r "..AL["Frostmane Hollow"], "FrostmaneHollow", "Submenu" },},
{{ WHITE.."[17-24]|r "..AL["Wailing Caverns"], "WailingCaverns", "Submenu" },},
{{ WHITE.."[17-24]|r "..AL["The Deadmines"], "Deadmines", "Submenu" },},
{{ WHITE.."[22-30]|r "..AL["Shadowfang Keep"], "ShadowfangKeep", "Submenu" },},
{{ WHITE.."[23-32]|r "..AL["Blackfathom Deeps"], "BlackfathomDeeps", "Submenu" },},
{{ WHITE.."[25-33]|r "..AL["Windhorn Canyon"], "WindhornCanyon", "Submenu" },},
{{ WHITE.."[22-30]|r "..AL["The Stockade"], "TheStockade", "Submenu" },},
{{ WHITE.."[26-35]|r "..AL["Dragonmaw Retreat"], "DragonmawRetreat", "Submenu" },},
{{ WHITE.."[29-38]|r "..AL["Gnomeregan"], "Gnomeregan", "Submenu" },},
{{ WHITE.."[29-38]|r "..AL["Razorfen Kraul"], "RazorfenKraul", "Submenu" },},
{{ WHITE.."[32-38]|r "..AL["The Crescent Grove"], "TheCrescentGrove", "Submenu" },},
{[ WHITE.."[27-45]|r "..AL["Scarlet Monastery"]] = {
{ WHITE.."[27-36]|r "..AL["Scarlet Monastery (Graveyard)"], "SMGraveyard", "Submenu" },
{ WHITE.."[28-39]|r "..AL["Scarlet Monastery (Library)"], "SMLibrary", "Submenu" },
{ WHITE.."[32-41]|r "..AL["Scarlet Monastery (Armory)"], "SMArmory", "Submenu" },
{ WHITE.."[35-45]|r "..AL["Scarlet Monastery (Cathedral)"], "SMCathedral", "Submenu" },
},},
{{ WHITE.."[32-44]|r "..AL["Stormwrought Ruins"], "StormwroughtRuins", "Submenu" },},
{{ WHITE.."[36-46]|r "..AL["Razorfen Downs"], "RazorfenDowns", "Submenu" },},
{{ WHITE.."[40-51]|r "..AL["Uldaman"], "Uldaman", "Submenu" },},
{{ WHITE.."[42-50]|r "..AL["Gilneas City"], "GilneasCity", "Submenu" },},
{{ WHITE.."[45-55]|r "..AL["Maraudon"], "Maraudon", "Submenu" },},
{{ WHITE.."[44-54]|r "..AL["Zul'Farrak"], "ZulFarrak", "Submenu" },},
{{ WHITE.."[50-60]|r "..AL["The Sunken Temple"], "SunkenTemple", "Submenu" },},
{{ WHITE.."[50-60]|r "..AL["Hateforge Quarry"], "HateforgeQuarry", "Submenu" },},
{{ WHITE.."[52-60]|r "..AL["Blackrock Depths"], "BlackrockDepths", "Submenu" },},
{[ WHITE.."[55-60]|r "..AL["Dire Maul"]] = {
{ WHITE.."[55-60]|r "..AL["Dire Maul (East)"], "DireMaulEast", "Submenu" },
{ WHITE.."[57-60]|r "..AL["Dire Maul (West)"], "DireMaulWest", "Submenu" },
{ WHITE.."[57-60]|r "..AL["Dire Maul (North)"], "DireMaulNorth", "Submenu" },
},},
{{ WHITE.."[58-60]|r "..AL["Scholomance"], "Scholomance", "Submenu" },},
{{ WHITE.."[58-60]|r "..AL["Stratholme"], "Stratholme", "Submenu" },},
{{ WHITE.."[55-60]|r "..AL["Lower Blackrock Spire"], "LowerBlackrock", "Submenu" },},
{{ WHITE.."[58-60]|r "..AL["Upper Blackrock Spire"], "UpperBlackrock", "Submenu" },},
{{ WHITE.."[58-60]|r "..AL["Karazhan Crypt"], "KarazhanCrypt", "Submenu" },},
{{ WHITE.."[60]|r "..AL["Caverns of Time: Black Morass"], "CavernsOfTimeBlackMorass", "Submenu" },},
{{ WHITE.."[60]|r "..AL["Stormwind Vault"], "StormwindVault", "Submenu" },},
{{ RED.."[RAID]|r "..AL["Zul'Gurub"], "ZulGurub", "Submenu" },},
{{ RED.."[RAID]|r "..AL["Ruins of Ahn'Qiraj"], "RuinsofAQ", "Submenu" },},
{{ RED.."[RAID]|r "..AL["Molten Core"], "MoltenCore", "Submenu" },},
{{ RED.."[RAID]|r "..AL["Onyxia's Lair"], "Onyxia", "Submenu" },},
{{ RED.."[RAID]|r "..AL["Lower Karazhan Halls"], "LowerKara", "Submenu" },},
{{ RED.."[RAID]|r "..AL["Blackwing Lair"], "BlackwingLair", "Submenu" },},
{{ RED.."[RAID]|r "..AL["Emerald Sanctum"], "EmeraldSanctum", "Submenu" },},
{{ RED.."[RAID]|r "..AL["Timbermaw Hold"], "TimbermawHold", "Submenu" },},
{{ RED.."[RAID]|r "..AL["Temple of Ahn'Qiraj"], "TempleofAQ", "Submenu" },},
{{ RED.."[RAID]|r "..AL["Naxxramas"], "Naxxramas", "Submenu" },},
{{ RED.."[RAID]|r "..AL["Upper Karazhan Halls"], "UpperKara", "Submenu" },},
},
},
{[AL["World Bosses"]] = {
{{AL["Azuregos"], "AAzuregos", "Table" },},
{{AL["Emeriss"], "DEmeriss", "Table" },},
{{AL["Lethon"], "DLethon", "Table" },},
{{AL["Taerar"], "DTaerar", "Table" },},
{{AL["Ysondre"], "DYsondre", "Table" },},
{{AL["Lord Kazzak"], "KKazzak", "Table" },},
{{AL["Nerubian Overseer"], "Nerubian", "Table" },},
{{AL["Dark Reaver of Karazhan"], "Reaver", "Table" },},
{{AL["Ostarius"], "Ostarius", "Table" },},
{{AL["Concavius"], "Concavius", "Table" },},
{{AL["Moo"], "CowKing", "Table" },},
{{AL["Cla'ckora"], "Clackora", "Table"},},
},
},
{[AL["PvP Rewards"]] = {
{{ AL["PvP Armor Sets"], "PVPSET", "Table" },},
{{ AL["PvP Accessories"], "PvP60Accessories1", "Table" },},
{{ AL["Rank 14 Weapons"], "PVPWeapons1", "Table" },},
{{ AL["PvP Mounts"], "PvPMountsPvP", "Table" },},
{{ AL["Blood Ring"], "BRRepMenu", "Table" },},
{{ AL["Alterac Valley"], "AVRepMenu", "Table" },},
{{ AL["Arathi Basin"], "ABRepMenu", "Table" },},
{{ AL["Warsong Gulch"], "WSGRepMenu", "Table" },},
},
},
{[AL["Collections"]] = {
{{ AL["Sets"], "PRE60SET", "Table" },},
{{ AL["Zul'Gurub Sets"], "ZGSET", "Table" },},
{{ AL["Ruins of Ahn'Qiraj Sets"], "AQ20SET", "Table" },},
{{ AL["Temple of Ahn'Qiraj Sets"], "AQ40SET", "Table" },},
{{ AL["Karazhan Sets"], "KARASET", "Table" },},
{{ AL["Dungeon 1/2 Sets"], "T0SET", "Table" },},
{{ AL["Tier 1 Sets"], "T1SET", "Table" },},
{{ AL["Tier 2 Sets"], "T2SET", "Table" },},
{{ AL["Tier 3 Sets"], "T3SET", "Table" },},
{{ AL["Legendary Items"], "Legendaries", "Table" },},
{{ AL["World Epics"], "WorldEpics1", "Table" },},
{{ AL["Rare Pets"], "RarePets1", "Table" },},
{{ AL["Rare Mounts"], "RareMounts", "Table" },},
{{ AL["Tabards"], "Tabards", "Table" },},
},
},
{[AL["Factions"]] = {
{{ AL["Argent Dawn"], "Argent1" , "Table" },},
{{ AL["Brood of Nozdormu"], "AQBroodRings", "Table" },},
{{ AL["Darkmoon Faire"], "Darkmoon", "Table" },},
{{ AL["Hydraxian Waterlords"], "WaterLords1", "Table" },},
{{ AL["Thorium Brotherhood"], "Thorium1", "Table" },},
{{ AL["Cenarion Circle"], "Cenarion1", "Table" }},
{{ AL["Shen'dralar"], "Shendralar", "Table" },},
{{ AL["Draenei Exiles"], "DraeneiExiles", "Table" },},
{{ AL["Bloodsail Buccaneers"], "Bloodsail1", "Table" },},
{{ AL["Zandalar Tribe"], "Zandalar1", "Table" },},
{{ AL["Timbermaw Hold"], "Timbermaw", "Table" },},
{{ AL["Wardens of Time"], "Wardens1", "Table" },},
{{ AL["Gelkis Clan Centaur"], "GelkisClan1", "Table" },},
{{ AL["Magram Clan Centaur"], "MagramClan1", "Table" },},
{{ BLUE.."["..AL["Alliance"].."]|r "..AL["Stormwind"], "Stormwind", "Table" },},
{{ BLUE.."["..AL["Alliance"].."]|r "..AL["Ironforge"], "Ironforge", "Table" },},
{{ BLUE.."["..AL["Alliance"].."]|r "..AL["Gnomeregan Exiles"], "GnomereganExiles", "Table" },},
{{ BLUE.."["..AL["Alliance"].."]|r "..AL["Darnassus"], "Darnassus", "Table" },},
{{ BLUE.."["..AL["Alliance"].."]|r "..AL["Silvermoon Remnant"], "Helf", "Table" },},
{{ BLUE.."["..AL["Alliance"].."]|r "..AL["Dalaran"], "Dalaran", "Table" },},
{{ BLUE.."["..AL["Alliance"].."]|r "..AL["Wintersaber Trainers"], "Wintersaber1", "Table" },},
{{ BLUE.."["..AL["Alliance"].."]|r "..AL["Wildhammer Clan"], "Wildhammer", "Table" },},
{{ RED.."["..AL["Horde"].."]|r "..AL["Orgrimmar"], "Orgrimmar", "Table" },},
{{ RED.."["..AL["Horde"].."]|r "..AL["Darkspear Trolls"], "DarkspearTrolls", "Table" },},
{{ RED.."["..AL["Horde"].."]|r "..AL["Thunder Bluff"], "ThunderBluff", "Table" },},
{{ RED.."["..AL["Horde"].."]|r "..AL["Undercity"], "Undercity", "Table" },},
{{ RED.."["..AL["Horde"].."]|r "..AL["Durotar Labor Union"], "DurotarLaborUnion", "Table" },},
{{ RED.."["..AL["Horde"].."]|r "..AL["Revantusk Trolls"], "Revantusk", "Table" },},
{{ RED.."["..AL["Horde"].."]|r "..AL["Earthen Ring"], "EarthenRing", "Table" },},
},
},
{[AL["World Events"]] = {
{{ AL["Abyssal Council"], "AbyssalTemplars", "Table" },},
{{ AL["Children's Week"], "ChildrensWeek", "Table" },},
{{ AL["Elemental Invasion"], "ElementalInvasion", "Table" },},
{{ AL["Feast of Winter Veil"], "Winterviel1", "Table" },},
{{ AL["Gurubashi Arena"], "GurubashiArena", "Table" },},
{{ AL["Hallow's End"], "Halloween1", "Table" },},
{{ AL["Harvest Festival"], "HarvestFestival", "Table" },},
{{ AL["Love is in the Air"], "Valentineday", "Table" },},
{{ AL["Lunar Festival"], "LunarFestival1", "Table" },},
{{ AL["Midsummer Fire Festival"], "MidsummerFestival", "Table" },},
{{ AL["Noblegarden"], "Noblegarden", "Table" },},
{{ AL["Scourge Invasion"], "ScourgeInvasionEvent1", "Table" },},
{{ AL["Stranglethorn Fishing Extravaganza"], "FishingExtravaganza", "Table" },},
},
},
{[AL["Crafting"]] = {
{ { AL["Alchemy"], "ALCHEMYMENU", "Table" }, },
{ { AL["Blacksmithing"], "SMITHINGMENU", "Table" }, },
{ { AL["Enchanting"], "ENCHANTINGMENU", "Table" }, },
{ { AL["Engineering"], "ENGINEERINGMENU", "Table" }, },
{ { AL["Herbalism"], "Herbalism1", "Table" }, },
{ { AL["Leatherworking"], "LEATHERWORKINGMENU", "Table" }, },
{ { AL["Jewelcrafting"], "JEWELCRAFTMENU", "Table" }, },
{ { AL["Mining"], "Mining1", "Table" }, },
{ { AL["Tailoring"], "TAILORINGMENU", "Table" }, },
{ { AL["Cooking"], "CookingApprentice1", "Table" }, },
{ { AL["First Aid"], "FirstAid1", "Table" }, },
{ { AL["Survival"], "SurvivalApprentice1", "Table" }, },
{ { AL["Gardening"], "Gardening1", "Table" }, },
{ { AL["Poisons"], "Poisons1", "Table" }, },
{ { AL["Crafted Sets"], "CRAFTSET", "Table" },},
{ { AL["Crafted Epic Weapons"], "CraftedWeapons1", "Table" }, },
},
},
{{ "Rare Spawns", "RareSpawns", "Submenu" },},
};
-- This table defines all the subtables needed for the full menu
-- Each sub table entry contains the text entry and the loot table that goes wih it
AtlasLoot_HewdropDown_SubTables = {
["FrostmaneHollow"] = {
{ AL["Tan'sha the Sleek"], "FMHTansha" },
{ AL["Kan'za the Seer"], "FMHKanza" },
{ AL["Battlemaster Ubukaz"], "FMHBattlemaster" },
{ AL["Hailar the Frigid"], "FMHHailar" },
},
["TimbermawHold"] = {
{ AL["Karrsh the Sentinel"], "TMHKarrsh" },
{ AL["Rotgrowl"], "TMHRotgrowl" },
{ AL["Loktanag the Vile"], "TMHLoktanag" },
{ AL["Ormanos the Cracked"], "TMHOrmanos" },
{ AL["Chieftain Partath"], "TMHPartath" },
{ AL["Archdruid Kronn"], "TMHKronn" },
{ AL["Selenaxx Foulheart"], "TMHSelenaxx" },
{ AL["Trioch the Devourer"], "TMHTrioch" },
{ AL["Ursol"], "TMHUrsol" },
{ AL["Peroth'arn"], "TMHPerotharn" },
},
["WindhornCanyon"] = {
{ AL["Pathun Duskhide"], "WHCPathun" },
{ AL["Ahgk'tos the Pure"], "WHCAhgktos" },
{ AL["Ambassador Vortalus"], "WHCAmbassador" },
{ AL["Walgan Bloodcaller"], "WHCWalgan" },
{ AL["Bonespeaker Narlgom"], "WHCBonespeaker" },
{ AL["Prophet Stormhoof"], "WHCProphet" },
{ AL["Chieftain Shalk Blackwind"], "WHCChieftan" },
},
["HateforgeQuarry"] = {
{ AL["High Foreman Bargul Blackhammer"], "HQHighForemanBargulBlackhammer" },
{ AL["Engineer Figgles"], "HQEngineerFiggles" },
{ AL["Corrosis"], "HQCorrosis" },
{ AL["Hatereaver Annihilator"], "HQHatereaverAnnihilator" },
{ AL["Har'gesh Doomcaller"], "HQHargeshDoomcaller" },
{ AL["Trash Mobs"], "HQTrash" },
},
["BlackrockDepths"] = {
{ AL["Lord Roccor"], "BRDLordRoccor" },
{ AL["High Interrogator Gerstahn"], "BRDHighInterrogatorGerstahn" },
{ AL["Anub'shiah"], "BRDAnubshiah" },
{ AL["Eviscerator"], "BRDEviscerator" },
{ AL["Gorosh the Dervish"], "BRDGorosh" },
{ AL["Grizzle"], "BRDGrizzle" },
{ AL["Hedrum the Creeper"], "BRDHedrum" },
{ AL["Ok'thor the Breaker"], "BRDOkthor" },
{ AL["Theldren"], "BRDTheldren" },
{ AL["Houndmaster Grebmar"], "BRDHoundmaster" },
{ AL["Pyromancer Loregrain"].." ("..AL["Rare"]..")", "BRDPyromancerLoregrain" },
{ AL["The Vault"], "BRDTheVault" },
{ AL["Warder Stilgiss"].." ("..AL["Rare"]..")", "BRDWarderStilgiss" },
{ AL["Verek"].." ("..AL["Rare"]..")", "BRDVerek" },
{ AL["Fineous Darkvire"], "BRDFineousDarkvire" },
{ AL["Lord Incendius"], "BRDLordIncendius" },
{ AL["Bael'Gar"], "BRDBaelGar" },
{ AL["General Angerforge"], "BRDGeneralAngerforge" },
{ AL["Golem Lord Argelmach"], "BRDGolemLordArgelmach" },
{ AL["The Grim Guzzler"], "BRDGuzzler" },
{ AL["Ambassador Flamelash"], "BRDFlamelash" },
{ AL["Panzor the Invincible"].." ("..AL["Rare"]..")", "BRDPanzor" },
{ AL["Summoner's Tomb"], "BRDTomb" },
{ AL["Magmus"], "BRDMagmus" },
{ AL["Princess Moira Bronzebeard"], "BRDPrincess" },
{ AL["Emperor Dagran Thaurissan"], "BRDEmperorDagranThaurissan" },
{ AL["Trash Mobs"], "BRDTrash" },
},
["LowerBlackrock"] = {
{ AL["Spirestone Butcher"].." ("..AL["Rare"]..")", "LBRSSpirestoneButcher" },
{ AL["Spirestone Battle Lord"].." ("..AL["Rare"]..")", "LBRSSpirestoneBattleLord" },
{ AL["Spirestone Lord Magus"].." ("..AL["Rare"]..")", "LBRSSpirestoneLordMagus" },
{ AL["Highlord Omokk"], "LBRSOmokk" },
{ AL["Shadow Hunter Vosh'gajin"], "LBRSVosh" },
{ AL["War Master Voone"], "LBRSVoone" },
{ AL["Burning Felguard"].." ("..AL["Rare"]..")", "LBRSFelguard" },
{ AL["Mor Grayhoof"], "LBRSGrayhoof" },
{ AL["Bannok Grimaxe"].." ("..AL["Rare"]..")", "LBRSGrimaxe" },
{ AL["Mother Smolderweb"], "LBRSSmolderweb" },
{ AL["Crystal Fang"].." ("..AL["Rare"]..")", "LBRSCrystalFang" },
{ AL["Urok Doomhowl"], "LBRSDoomhowl" },
{ AL["Quartermaster Zigris"], "LBRSZigris" },
{ AL["Halycon"], "LBRSHalycon" },
{ AL["Gizrul the Slavener"], "LBRSSlavener" },
{ AL["Ghok Bashguud"].." ("..AL["Rare"]..")", "LBRSBashguud" },
{ AL["Overlord Wyrmthalak"], "LBRSWyrmthalak" },
{ AL["Trash Mobs"], "LBRSTrash" },
},
["UpperBlackrock"] = {
{ AL["Pyroguard Emberseer"], "UBRSEmberseer" },
{ AL["Solakar Flamewreath"], "UBRSSolakar" },
{ AL["Father Flame"], "UBRSFlame" },
{ AL["Jed Runewatcher"].." ("..AL["Rare"]..")", "UBRSRunewatcher" },
{ AL["Goraluk Anvilcrack"].." ("..AL["Rare"]..")", "UBRSAnvilcrack" },
{ AL["Warchief Rend Blackhand"], "UBRSRend" },
{ AL["Gyth"], "UBRSGyth" },
{ AL["The Beast"], "UBRSBeast" },
{ AL["Lord Valthalak"], "UBRSValthalak" },
{ AL["General Drakkisath"], "UBRSDrakkisath" },
{ AL["Trash Mobs"], "UBRSTrash" },
},
["KarazhanCrypt"] = {
{ AL["Marrowspike"], "KCMarrowspike" },
{ AL["Hivaxxis"], "KCHivaxxis" },
{ AL["Corpsemuncher"], "KCCorpsemuncher" },
{ AL["Guard Captain Gort"], "KCGuardCaptainGort" },
{ AL["Archlich Enkhraz"], "KCArchlichEnkhraz" },
{ AL["Commander Andreon"], "KCCommanderAndreon" },
{ AL["Alarus"], "KCAlarus" },
{ AL["Half-Buried Treasure Chest"], "KCTreasure" },
{ AL["Trash Mobs"], "KCTrash" },
},
["CavernsOfTimeBlackMorass"] = {
{ AL["Chronar"], "COTBMChronar" },
{ AL["Epidamu"], "COTBMEpidamu" },
{ AL["Drifting Avatar of Sand"], "COTBMDriftingAvatar" },
{ AL["Time-Lord Epochronos"], "COTBMTimeLordEpochronos" },
{ AL["Mossheart"], "COTBMMossheart" },
{ AL["Rotmaw"], "COTBMRotmaw" },
{ AL["Antnormi"], "COTBMAntnormi" },
{ AL["Trash Mobs"], "COTTrash" },
-- { AL["Infinite Chromie"], "COTBMInfiniteChromie" },
},
["StormwindVault"] = {
{ AL["Aszosh Grimflame"], "SWVAszoshGrimflame" },
{ AL["Tham'Grarr"], "SWVThamGrarr" },
{ AL["Black Bride"], "SWVBlackBride" },
{ AL["Damian"], "SWVDamian" },
{ AL["Volkan Cruelblade"], "SWVVolkanCruelblade" },
{ AL["Arc'tiras"], "SWVVaultArmoryEquipment" },
{ AL["Trash Mobs"], "SWVTrash" },
},
["BlackwingLair"] = {
{ AL["Razorgore the Untamed"], "BWLRazorgore" },
{ AL["Vaelastrasz the Corrupt"], "BWLVaelastrasz" },
{ AL["Broodlord Lashlayer"], "BWLLashlayer" },
{ AL["Firemaw"], "BWLFiremaw" },
{ AL["Ezzel Darkbrewer"], "BWLEzzel" },
{ AL["Ebonroc"], "BWLEbonroc" },
{ AL["Flamegor"], "BWLFlamegor" },
{ AL["Chromaggus"], "BWLChromaggus" },
{ AL["Nefarian"], "BWLNefarian" },
{ AL["Trash Mobs"], "BWLTrashMobs" },
},
["Deadmines"] = {
{ AL["Jared Voss"], "DMJaredVoss" },
{ AL["Rhahk'Zor"], "DMRhahkZor" },
{ AL["Miner Johnson"].." ("..AL["Rare"]..")", "DMMinerJohnson" },
{ AL["Sneed"], "DMSneed" },
{ AL["Sneed's Shredder"], "DMSneedsShredder" },
{ AL["Gilnid"], "DMGilnid" },
{ AL["Masterpiece Harvester"], "DMHarvester" },
{ AL["Mr. Smite"], "DMMrSmite" },
{ AL["Cookie"], "DMCookie" },
{ AL["Captain Greenskin"], "DMCaptainGreenskin" },
{ AL["Edwin VanCleef"], "DMVanCleef" },
{ AL["Trash Mobs"], "DMTrash" },
},
["TheCrescentGrove"] = {
{ AL["Grovetender Engryss"], "TCGGrovetenderEngryss" },
{ AL["Keeper Ranathos"], "TCGKeeperRanathos" },
{ AL["High Priestess A'lathea"], "TCGHighPriestessAlathea" },
{ AL["Fenektis the Deceiver"], "TCGFenektistheDeceiver" },
{ AL["Master Raxxieth"], "TCGMasterRaxxieth" },
{ AL["Trash Mobs"], "TCGTrash" },
},
["Gnomeregan"] = {
{ AL["Grubbis"], "GnGrubbis" },
{ AL["Viscous Fallout"], "GnViscousFallout" },
{ AL["Electrocutioner 6000"], "GnElectrocutioner6000" },
{ AL["Crowd Pummeler 9-60"], "GnCrowdPummeler960" },
{ AL["Dark Iron Ambassador"], "GnDIAmbassador" },
{ AL["Mekgineer Thermaplugg"], "GnMekgineerThermaplugg" },
{ AL["Trash Mobs"], "GnTrash" },
},
["MoltenCore"] = {
{ AL["Incindis"], "MCIncindis" },
{ AL["Lucifron"], "MCLucifron" },
{ AL["Magmadar"], "MCMagmadar" },
-- { AL["Gehennas"], "MCGehennas" },
{ AL["Garr"], "MCGarr" },
{ AL["Shazzrah"], "MCShazzrah" },
{ AL["Baron Geddon"], "MCGeddon" },
{ AL["Golemagg the Incinerator"], "MCGolemagg" },
{ AL["Basalthar & Smoldaris"], "MCTwins" },
{ AL["Sorcerer-Thane Thaurissan"], "MCThaurissan" },
{ AL["Sulfuron Harbinger"], "MCSulfuron" },
{ AL["Majordomo Executus"], "MCMajordomo" },
{ AL["Ragnaros"], "MCRagnaros" },
{ AL["Trash Mobs"], "MCTrashMobs" },
{ AL["Random Boss Loot"], "MCRANDOMBOSSDROPS" },
},
["Naxxramas"] = {
{ AL["Patchwerk"], "NAXPatchwerk" },
{ AL["Grobbulus"], "NAXGrobbulus" },
{ AL["Gluth"], "NAXGluth" },
{ AL["Thaddius"], "NAXThaddius" },
{ AL["Anub'Rekhan"], "NAXAnubRekhan" },
{ AL["Grand Widow Faerlina"], "NAXGrandWidowFaerlina" },
{ AL["Maexxna"], "NAXMaexxna" },
{ AL["Noth the Plaguebringer"], "NAXNoththePlaguebringer" },
{ AL["Heigan the Unclean"], "NAXHeigantheUnclean" },
{ AL["Loatheb"], "NAXLoatheb" },
{ AL["Instructor Razuvious"], "NAXInstructorRazuvious" },
{ AL["Gothik the Harvester"], "NAXGothiktheHarvester" },
{ AL["The Four Horsemen"], "NAXTheFourHorsemen" },
{ AL["Sapphiron"], "NAXSapphiron" },
{ AL["Kel'Thuzad"], "NAXKelThuzard" },
{ AL["Trash Mobs"], "NAXTrash" },
},
["SMGraveyard"] = {
{ AL["Interrogator Vishas"], "SMVishas" },
{ AL["Duke Dreadmoore"], "SMDukeDreadmoore" },
{ AL["Scorn"].." ("..AL["Scourge Invasion"]..")", "SMScorn" },
{ AL["Ironspine"].." ("..AL["Rare"]..")", "SMIronspine" },
{ AL["Azshir the Sleepless"].." ("..AL["Rare"]..")", "SMAzshir" },
{ AL["Fallen Champion"].." ("..AL["Rare"]..")", "SMFallenChampion" },
{ AL["Bloodmage Thalnos"], "SMBloodmageThalnos" },
{ AL["Trash Mobs"], "SMGTrash" },
},
["SMLibrary"] = {
{ AL["Houndmaster Loksey"], "SMHoundmasterLoksey" },
{ AL["Brother Wystan"], "SMBrotherWystan" },
{ AL["Arcanist Doan"], "SMDoan" },
{ AL["Trash Mobs"], "SMLTrash" },
},
["SMArmory"] = {
{ AL["Herod"], "SMHerod" },
{ AL["Armory Quartermaster Daghelm"], "SMQuartermaster" },
{ AL["Trash Mobs"], "SMATrash" },
},
["SMCathedral"] = {
{ AL["High Inquisitor Fairbanks"], "SMFairbanks" },
{ AL["Scarlet Commander Mograine"], "SMMograine" },
{ AL["High Inquisitor Whitemane"], "SMWhitemane" },
{ AL["Trash Mobs"], "SMCTrash" },
},
["Scholomance"] = {
-- { AL["Blood Steward of Kirtonos"], "SCHOLOBlood" },
{ AL["Kirtonos the Herald"], "SCHOLOKirtonostheHerald" },
{ AL["Jandice Barov"], "SCHOLOJandiceBarov" },
{ AL["Lord Blackwood"].." ("..AL["Scourge Invasion"]..")", "SCHOLOLordBlackwood" },
{ AL["Rattlegore"], "SCHOLORattlegore" },
{ AL["Death Knight Darkreaver"], "SCHOLODeathKnight" },
{ AL["Marduk Blackpool"], "SCHOLOMarduk" },
{ AL["Vectus"], "SCHOLOVectus" },
{ AL["Ras Frostwhisper"], "SCHOLORasFrostwhisper" },
{ AL["Kormok"], "SCHOLOKormok" },
{ AL["Instructor Malicia"], "SCHOLOInstructorMalicia" },
{ AL["Doctor Theolen Krastinov"], "SCHOLODoctorTheolenKrastinov" },
{ AL["Lorekeeper Polkelt"], "SCHOLOLorekeeperPolkelt" },
{ AL["The Ravenian"], "SCHOLOTheRavenian" },
{ AL["Lord Alexei Barov"], "SCHOLOLordAlexeiBarov" },
{ AL["Lady Illucia Barov"], "SCHOLOLadyIlluciaBarov" },
{ AL["Darkmaster Gandling"], "SCHOLODarkmasterGandling" },
{ AL["Trash Mobs"], "SCHOLOTrash" },
},
["ShadowfangKeep"] = {
{ AL["Rethilgore"], "SFKRethilgore" },
{ AL["Fel Steed"], "SFKFelSteed" },
{ AL["Razorclaw the Butcher"], "SFKRazorclawtheButcher" },
{ AL["Baron Silverlaine"], "SFKSilverlaine" },
{ AL["Commander Springvale"], "SFKSpringvale" },
{ AL["Sever"].." ("..AL["Scourge Invasion"]..")", "SFKSever" },
{ AL["Odo the Blindwatcher"], "SFKOdotheBlindwatcher" },
{ AL["Deathsworn Captain"].." ("..AL["Rare"]..")", "SFKDeathswornCaptain" },
{ AL["Fenrus the Devourer"], "SFKFenrustheDevourer" },
{ AL["Arugal's Voidwalker"], "SFKArugalsVoidwalker" },
{ AL["Wolf Master Nandos"], "SFKWolfMasterNandos" },
{ AL["Archmage Arugal"], "SFKArchmageArugal" },
{ AL["Prelate Ironmane"], "SFKPrelate"},
{ AL["Trash Mobs"], "SFKTrash" },
},
["TheStockade"] = {
{ AL["Targorr the Dread"], "SWStTargorr" },
{ AL["Kam Deepfury"], "SWStKamDeepfury" },
{ AL["Hamhock"], "SWStHamhock" },
{ AL["Dextren Ward"], "SWStDextren" },
{ AL["Bazil Thredd"], "SWStBazil" },
{ AL["Bruegal Ironknuckle"].." ("..AL["Rare"]..")", "SWStBruegalIronknuckle" },
{ AL["Trash Mobs"], "SWStTrash" },
},
["Stratholme"] = {
{ AL["Skul"].." ("..AL["Rare"]..")", "STRATSkull" },
{ AL["Stratholme Courier"], "STRATStratholmeCourier" },
{ AL["Postmaster Malown"], "STRATPostmaster" },
{ AL["Fras Siabi"], "STRATFrasSiabi" },
{ AL["Atiesh"], "STRATAtiesh" },
{ AL["Balzaphon"].." ("..AL["Scourge Invasion"]..")", "STRATBalzaphon" },
{ AL["Hearthsinger Forresten"].." ("..AL["Rare"]..")", "STRATHearthsingerForresten" },
{ AL["The Unforgiven"], "STRATTheUnforgiven" },
{ AL["Timmy the Cruel"], "STRATTimmytheCruel" },
{ AL["Malor the Zealous"], "STRATMalor" },
{ AL["Malor's Strongbox"], "STRATMalorsStrongbox" },
{ AL["Crimson Hammersmith"], "STRATCrimsonHammersmith" },
{ AL["Cannon Master Willey"], "STRATCannonMasterWilley" },
{ AL["Archivist Galford"], "STRATArchivistGalford" },
{ AL["Balnazzar"], "STRATBalnazzar" },
{ AL["Sothos"].." & "..AL["Jarien"], "STRATSothosJarien" },
{ AL["Stonespine"].." ("..AL["Rare"]..")", "STRATStonespine" },
{ AL["Baroness Anastari"], "STRATBaronessAnastari" },
{ AL["Black Guard Swordsmith"], "STRATBlackGuardSwordsmith" },
{ AL["Nerub'enkan"], "STRATNerubenkan" },
{ AL["Maleki the Pallid"], "STRATMalekithePallid" },
{ AL["Magistrate Barthilas"], "STRATMagistrateBarthilas" },
{ AL["Ramstein the Gorger"], "STRATRamsteintheGorger" },
{ AL["Baron Rivendare"], "STRATBaronRivendare" },
{ AL["Trash Mobs"], "STRATTrash" },
},
["SunkenTemple"] = {
{ AL["Balcony Minibosses"], "STBalconyMinibosses" },
{ AL["Atal'alarion"], "STAtalalarion" },
{ AL["Spawn of Hakkar"], "STSpawnOfHakkar" },
{ AL["Avatar of Hakkar"], "STAvatarofHakkar" },
{ AL["Jammal'an the Prophet"], "STJammalan" },
{ AL["Ogom the Wretched"], "STOgom" },
{ AL["Dreamscythe"], "STDreamscythe" },
{ AL["Weaver"], "STWeaver"},
{ AL["Morphaz"], "STMorphaz" },
{ AL["Hazzas"], "STHazzas" },
{ AL["Shade of Eranikus"], "STEranikus" },
{ AL["Trash Mobs"], "STTrash" },
},
["Uldaman"] = {
{ AL["Baelog"], "UldBaelog" },
{ AL["Olaf"], "UldOlaf" },
{ AL["Eric 'The Swift'"], "UldEric" },
{ AL["Revelosh"], "UldRevelosh" },
{ AL["Ironaya"], "UldIronaya" },
{ AL["Ancient Stone Keeper"], "UldAncientStoneKeeper" },
{ AL["Galgann Firehammer"], "UldGalgannFirehammer" },
{ AL["Grimlok"], "UldGrimlok" },
{ AL["Archaedas"], "UldArchaedas" },
{ AL["Trash Mobs"], "UldTrash" },
},
["GilneasCity"] = {
{ AL["Matthias Holtz"], "GCMatthiasHoltz" },
{ AL["Packmaster Ragetooth"], "GCPackmasterRagetooth" },
{ AL["Judge Sutherland"], "GCJudgeSutherland" },
{ AL["Dustivan Blackcowl"], "GCDustivanBlackcowl" },
{ AL["Marshal Magnus Greystone"], "GCMarshalMagnusGreystone" },
{ AL["Horsemaster Levvin"], "GCHorsemasterLevvin" },
{ AL["Harlow Family Chest"], "GCHarlowFamilyChest" },
{ AL["Genn Greymane"], "GCGennGreymane" },
{ AL["Trash Mobs"], "GCTrash" },
},
["ZulGurub"] = {
{ AL["High Priestess Jeklik"], "ZGJeklik" },
{ AL["High Priest Venoxis"], "ZGVenoxis" },
{ AL["High Priestess Mar'li"], "ZGMarli" },
{ AL["Bloodlord Mandokir"], "ZGMandokir" },
{ AL["Gri'lek"], "ZGGrilek" },
{ AL["Hazza'rah"], "ZGHazzarah" },
{ AL["Renataki"], "ZGRenataki" },
{ AL["Wushoolay"], "ZGWushoolay" },
{ AL["Gahz'ranka"], "ZGGahzranka" },
{ AL["High Priest Thekal"], "ZGThekal" },
{ AL["High Priestess Arlokk"], "ZGArlokk" },
{ AL["Jin'do the Hexxer"], "ZGJindo" },
{ AL["Hakkar"], "ZGHakkar" },
{ AL["Random Boss Loot"], "ZGShared" },
{ AL["Trash Mobs"], "ZGTrash1" },
{ AL["ZG Enchants"], "ZGEnchants" },
},
["BlackfathomDeeps"] = {
{ AL["Ghamoo-ra"], "BFDGhamoora" },
{ AL["Lady Sarevess"], "BFDLadySarevess" },
{ AL["Gelihast"], "BFDGelihast" },
{ AL["Baron Aquanis"], "BFDBaronAquanis" },
{ AL["Velthelaxx the Defiler"], "BFDVelthelaxx"},
{ AL["Twilight Lord Kelris"], "BFDTwilightLordKelris" },
{ AL["Old Serra'kis"], "BFDOldSerrakis" },
{ AL["Aku'mai"], "BFDAkumai" },
{ AL["Trash Mobs"], "BFDTrash" },
},
["DireMaulEast"] = {
{ AL["Pusillin"], "DMEPusillin" },
{ AL["Zevrim Thornhoof"], "DMEZevrimThornhoof" },
{ AL["Hydrospawn"], "DMEHydro" },
{ AL["Lethtendris"], "DMELethtendris" },
{ AL["Pimgib"], "DMEPimgib" },
{ AL["Isalien"], "DMEIsalien" },
{ AL["Alzzin the Wildshaper"], "DMEAlzzin" },
{ AL["Trash Mobs"], "DMETrash" },
{ AL["Dire Maul Books"], "DMEBooks" },
},
["DireMaulWest"] = {
{ AL["Tendris Warpwood"], "DMWTendrisWarpwood" },
{ AL["Illyanna Ravenoak"], "DMWIllyannaRavenoak" },
{ AL["Magister Kalendris"], "DMWMagisterKalendris" },
{ AL["Tsu'zee"].." ("..AL["Rare"]..")", "DMWTsuzee" },
{ AL["Revanchion"].." ("..AL["Scourge Invasion"]..")", "DMWRevanchion" },
{ AL["Immol'thar"], "DMWImmolthar" },
{ AL["Lord Hel'nurath"].." ("..AL["Rare"]..")", "DMWHelnurath" },
{ AL["Prince Tortheldrin"], "DMWPrinceTortheldrin" },
{ AL["Trash Mobs"], "DMWTrash" },
{ AL["Dire Maul Books"], "DMWBooks" },
},
["DireMaulNorth"] = {
{ AL["Guard Mol'dar"], "DMNGuardMoldar" },
{ AL["Stomper Kreeg"], "DMNStomperKreeg" },
{ AL["Guard Fengus"], "DMNGuardFengus" },
{ AL["Knot Thimblejack"], "DMNThimblejack" },
{ AL["Guard Slip'kik"], "DMNGuardSlipkik" },
{ AL["Captain Kromcrush"], "DMNCaptainKromcrush" },
{ AL["Cho'Rush the Observer"], "DMNChoRush" },
{ AL["King Gordok"], "DMNKingGordok" },
{ AL["Tribute Run"], "DMNTRIBUTERUN" },
{ AL["Trash Mobs"], "DMNTrash" },
{ AL["Dire Maul Books"], "DMNBooks" },
},
["Maraudon"] = {
{ AL["Noxxion"], "MaraNoxxion" },
{ AL["Razorlash"], "MaraRazorlash" },
{ AL["Lord Vyletongue"], "MaraLordVyletongue" },
{ AL["Meshlok the Harvester"].." ("..AL["Rare"]..")", "MaraMeshlok" },
{ AL["Celebras the Cursed"], "MaraCelebras" },
{ AL["Landslide"], "MaraLandslide" },
{ AL["Tinkerer Gizlock"], "MaraTinkererGizlock" },
{ AL["Rotgrip"], "MaraRotgrip" },
{ AL["Princess Theradras"], "MaraPrincessTheradras" },
{ AL["Trash Mobs"], "MaraTrash" },
},
["Onyxia"] = {
{ AL["Broodcommander Axelus"], "Axelus" },
{ AL["Onyxia"], "Onyxia" },
},
["RagefireChasm"] = {
{ AL["Taragaman the Hungerer"], "RFCTaragaman" },
{ AL["Oggleflint"], "RFCOggleflint" },
{ AL["Jergosh the Invoker"], "RFCJergosh" },
{ AL["Bazzalan"], "RFCBazzalan" },
},
["RazorfenDowns"] = {
{ AL["Tuten'kash"], "RFDTutenkash" },
{ AL["Lady Falther'ess"].." ("..AL["Scourge Invasion"]..")", "RFDLadyF" },
{ AL["Plaguemaw the Rotting"], "RFDPlaguemaw" },
{ AL["Mordresh Fire Eye"], "RFDMordreshFireEye" },
{ AL["Glutton"], "RFDGlutton" },
{ AL["Death Prophet Rakameg"], "RFDDeathProphet" },
{ AL["Ragglesnout"].." ("..AL["Rare"]..")", "RFDRagglesnout" },
{ AL["Amnennar the Coldbringer"], "RFDAmnennar" },
{ AL["Trash Mobs"], "RFDTrash" },
},
["RazorfenKraul"] = {
{ AL["Aggem Thorncurse"], "RFKAggem" },
{ AL["Death Speaker Jargba"], "RFKDeathSpeakerJargba" },
{ AL["Overlord Ramtusk"], "RFKOverlordRamtusk" },
{ AL["Razorfen Spearhide"].." ("..AL["Rare"]..")", "RFKRazorfenSpearhide" },
{ AL["Agathelos the Raging"], "RFKAgathelos" },
{ AL["Blind Hunter"].." ("..AL["Rare"]..")", "RFKBlindHunter" },
{ AL["Charlga Razorflank"], "RFKCharlgaRazorflank" },
{ AL["Earthcaller Halmgar"].." ("..AL["Rare"]..")", "RFKEarthcallerHalmgar" },
{ AL["Rotthorn"], "RFKRotthorn" },
{ AL["Trash Mobs"], "RFKTrash" },
},
["RuinsofAQ"] = {
{ AL["Kurinnaxx"], "AQ20Kurinnaxx" },
{ AL["Lieutenant General Andorov"], "AQ20Andorov" },
{ AL["Rajaxx's Captains"], "AQ20CAPTAIN" },
{ AL["General Rajaxx"], "AQ20Rajaxx" },
{ AL["Moam"], "AQ20Moam" },
{ AL["Buru the Gorger"], "AQ20Buru" },
{ AL["Ayamiss the Hunter"], "AQ20Ayamiss" },
{ AL["Ossirian the Unscarred"], "AQ20Ossirian" },
{ AL["Trash Mobs"], "AQ20Trash" },
{ AL["Class Books"], "AQ20ClassBooks" },
{ AL["AQ Enchants"], "AQ20Enchants" },
},
["TempleofAQ"] = {
{ AL["The Prophet Skeram"], "AQ40Skeram" },
{ AL["The Bug Family"], "AQ40Trio" },
{ AL["Battleguard Sartura"], "AQ40Sartura" },
{ AL["Fankriss the Unyielding"], "AQ40Fankriss" },
{ AL["Viscidus"], "AQ40Viscidus" },
{ AL["Princess Huhuran"], "AQ40Huhuran" },
{ AL["The Twin Emperors"], "AQ40Emperors" },
{ AL["Ouro"], "AQ40Ouro" },
{ AL["C'Thun"], "AQ40CThun" },
{ AL["Trash Mobs"], "AQ40Trash1" },
{ AL["Trash Mobs"], "AQ40Trash2" },
{ AL["AQ Enchants"], "AQEnchants" },
{ AL["AQ Opening Quest Chain"], "AQOpening" },
},
["WailingCaverns"] = {
{ AL["Lord Cobrahn"], "WCLordCobrahn" },
{ AL["Lady Anacondra"], "WCLadyAnacondra" },
{ AL["Kresh"], "WCKresh" },
{ AL["Deviate Faerie Dragon"].." ("..AL["Rare"]..")", "WCDeviateFaerieDragon" },
{ AL["Zandara Windhoof"], "WCZandara" },
{ AL["Lord Pythas"], "WCLordPythas" },
{ AL["Skum"], "WCSkum" },
{ AL["Vangros"], "WCVangros" },
{ AL["Lord Serpentis"], "WCLordSerpentis" },
{ AL["Verdan the Everliving"], "WCVerdan" },
{ AL["Mutanus the Devourer"], "WCMutanus" },
{ AL["Trash Mobs"], "WCTrash" },
},
["ZulFarrak"] = {
{ AL["Antu'sul"], "ZFAntusul" },
{ AL["Witch Doctor Zum'rah"], "ZFWitchDoctorZumrah" },
{ AL["Shadowpriest Sezz'ziz"], "ZFSezzziz" },
{ AL["Dustwraith"].." ("..AL["Rare"]..")", "ZFDustwraith" },
{ AL["Zerillis"].." ("..AL["Rare"]..")", "ZFZerillis" },
{ AL["Gahz'rilla"], "ZFGahzrilla" },
{ AL["Chief Ukorz Sandscalp"], "ZFChiefUkorzSandscalp" },
{ AL["Zel'jeb the Ancient"], "ZFZeljeb" },
{ AL["Champion Razjal the Quick"], "ZFChampion" },
{ AL["Trash Mobs"], "ZFTrash" },
},
["EmeraldSanctum"] = {
{ AL["Erennius"], "ESErennius" },
{ AL["Solnius the Awakener"], "ESSolnius1" },
{ AL["Favor of Erennius (ES Hard Mode)"], "ESHardMode" },
{ AL["Trash Mobs"], "ESTrash" },
},
["LowerKara"] = {
{ AL["Master Blacksmith Rolfen"], "LKHRolfen" },
{ AL["Brood Queen Araxxna"], "LKHBroodQueenAraxxna" },
{ AL["Grizikil"], "LKHGrizikil" },
{ AL["Clawlord Howlfang"], "LKHClawlordHowlfang" },
{ AL["Lord Blackwald II"], "LKHLordBlackwaldII" },
{ AL["Moroes"], "LKHMoroes" },
{ AL["Trash Mobs"], "LKHTrash" },
{ AL["LKH Enchants"], "LKHEnchants" },
},
["UpperKara"] = {
{ AL["Keeper Gnarlmoon"], "UKHGnarlmoon" },
{ AL["Ley-Watcher Incantagos"], "UKHIncantagos" },
{ AL["Anomalus"], "UKHAnomalus" },
{ AL["Echo of Medivh"], "UKHEcho" },
{ AL["King (Chess fight)"], "UKHKing" },
{ AL["Sanv Tas'dal"], "UKHSanvTasdal" },
{ AL["Kruul"], "UKHKruul" },
{ AL["Rupturan the Broken"], "UKHRupturan" },
{ AL["Mephistroth"], "UKHMephistroth" },
{ AL["Trash Mobs"], "UKHTrash" },
},
["WorldBosses"] = {
{ AL["Azuregos"], "AAzuregos" },
{ AL["Emeriss"], "DEmeriss" },
{ AL["Lethon"], "DLethon"},
{ AL["Taerar"], "DTaerar" },
{ AL["Ysondre"], "DYsondre" },
{ AL["Lord Kazzak"], "KKazzak"},
{ AL["Nerubian Overseer"], "Nerubian" },
{ AL["Dark Reaver of Karazhan"], "Reaver" },
{ AL["Ostarius"], "Ostarius" },
{ AL["Concavius"], "Concavius" },
{ AL["Moo"], "CowKing" },
{ AL["Cla'ckora"], "Clackora" },
},
["RareSpawns"] = {
{ WHITE.."[17]"..DEFAULT.." "..AL["Earthcaller Rezengal"] .." "..WHITE.."("..AL["Stonetalon Mountains"]..")", "EarthcallerRezengal" },
{ WHITE.."[17]"..DEFAULT.." "..AL["Shade Mage"] .." "..WHITE.."("..AL["Tirisfal Glades"] ..")", "ShadeMage" },
{ WHITE.."[18]"..DEFAULT.." "..AL["Graypaw Alpha"] .." "..WHITE.."("..AL["Tirisfal Glades"] ..")", "GraypawAlpha" },
{ WHITE.."[24]"..DEFAULT.." "..AL["Blazespark"] .." "..WHITE.."("..AL["Stonetalon Mountains"]..")", "Blazespark" },
{ WHITE.."[35]"..DEFAULT.." "..AL["Witch Doctor Tan'zo"] .." "..WHITE.."("..AL["Arathi Highlands"] ..")", "WitchDoctorTanzo" },
{ WHITE.."[40]"..DEFAULT.." "..AL["Widow of the Woods"] .." "..WHITE.."("..AL["Gilneas"] ..")", "WidowoftheWoods" },
{ WHITE.."[40]"..DEFAULT.." "..AL["Dawnhowl"] .." "..WHITE.."("..AL["Gilneas"] ..")", "Dawnhowl" },
{ WHITE.."[43]"..DEFAULT.." "..AL["Maltimor's Prototype"] .." "..WHITE.."("..AL["Gilneas"] ..")", "MaltimorsPrototype" },
{ WHITE.."[44]"..DEFAULT.." "..AL["Bonecruncher"] .." "..WHITE.."("..AL["Gilneas"] ..")", "Bonecruncher" },
{ WHITE.."[44]"..DEFAULT.." "..AL["Duskskitter"] .." "..WHITE.."("..AL["Gilneas"] ..")", "Duskskitter" },
{ WHITE.."[45]"..DEFAULT.." "..AL["Baron Perenolde"] .." "..WHITE.."("..AL["Gilneas"] ..")", "BaronPerenolde" },
{ WHITE.."[45]"..DEFAULT.." "..AL["Kin'Tozo"] .." "..WHITE.."("..AL["Stranglethorn Vale"] ..")", "KinTozo" },
{ WHITE.."[47]"..DEFAULT.." "..AL["Grug'thok the Seer"] .." "..WHITE.."("..AL["Feralas"] ..")", "Grugthok" },
{ WHITE.."[47]"..DEFAULT.." "..AL["M-0L1Y"] .." "..WHITE.."("..AL["Dun Morogh"] ..")", "M0L1Y" },
{ WHITE.."[49]"..DEFAULT.." "..AL["Explorer Ashbeard"] .." "..WHITE.."("..AL["Searing Gorge"] ..")", "Ashbeard" },
{ WHITE.."[50]"..DEFAULT.." "..AL["Jal'akar"] .." "..WHITE.."("..AL["Hinterlands"] ..")", "Jalakar" },
{ WHITE.."[51]"..DEFAULT.." "..AL["Embereye"] .." "..WHITE.."("..AL["Gilijim Isle"] ..")", "Embereye" },
{ WHITE.."[51]"..DEFAULT.." "..AL["Ruk'thok the Pyromancer"].." "..WHITE.."("..AL["Lapidis Isle"] ..")", "Rukthok" },
{ WHITE.."[51]"..DEFAULT.." "..AL["Tarangos"] .." "..WHITE.."("..AL["Azshara"] ..")", "Tarangos" },
{ WHITE.."[51]"..DEFAULT.." "..AL["Ripjaw"] .." "..WHITE.."("..AL["Lapidis Isle"] ..")", "Ripjaw" },
{ WHITE.."[53]"..DEFAULT.." "..AL["Xalvic Blackclaw"] .." "..WHITE.."("..AL["Felwood"] ..")", "Xalvic" },
{ WHITE.."[54]"..DEFAULT.." "..AL["Aquitus"] .." "..WHITE.."("..AL["Gilijim Isle"] ..")", "Aquitus" },
{ WHITE.."[55]"..DEFAULT.." "..AL["Firstborn of Arugal"] .." "..WHITE.."("..AL["Gilneas"] ..")", "FirstbornofArugal" },
{ WHITE.."[55]"..DEFAULT.." "..AL["Letashaz"] .." "..WHITE.."("..AL["Gilijim Isle"] ..")", "Letashaz" },
{ WHITE.."[55]"..DEFAULT.." "..AL["Margon the Mighty"] .." "..WHITE.."("..AL["Lapidis Isle"] ..")", "MargontheMighty" },
{ WHITE.."[55]"..DEFAULT.." "..AL["The Wandering Knight"] .." "..WHITE.."("..AL["Western Plaguelands"] ..")", "WanderingKnight" },
{ WHITE.."[56]"..DEFAULT.." "..AL["Stoneshell"] .." "..WHITE.."("..AL["Tel'abim"] ..")", "Stoneshell" },
{ WHITE.."[57]"..DEFAULT.." "..AL["Zareth Terrorblade"] .." "..WHITE.."("..AL["Blasted Lands"] ..")", "Zareth" },
{ WHITE.."[58]"..DEFAULT.." "..AL["Highvale Silverback"] .." "..WHITE.."("..AL["Tel'abim"] ..")", "HighvaleSilverback" },
{ WHITE.."[58]"..DEFAULT.." "..AL["Mallon The Moontouched"] .." "..WHITE.."("..AL["Winterspring"] ..")", "Mallon" },
{ WHITE.."[59]"..DEFAULT.." "..AL["Blademaster Kargron"] .." "..WHITE.."("..AL["Burning Steppes"] ..")", "Kargron" },
{ WHITE.."[59]"..DEFAULT.." "..AL["Professor Lysander"] .." "..WHITE.."("..AL["Eastern Plaguelands"] ..")", "ProfessorLysander" },
{ WHITE.."[60]"..DEFAULT.." "..AL["Admiral Barean Westwind"].." "..WHITE.."("..AL["Scarlet Enclave"] ..")", "AdmiralBareanWestwind" },
{ WHITE.."[60]"..DEFAULT.." "..AL["Azurebeak"] .." "..WHITE.."("..AL["Hyjal"] ..")", "Azurebeak" },
{ WHITE.."[60]"..DEFAULT.." "..AL["Barkskin Fisher"] .." "..WHITE.."("..AL["Hyjal"] ..")", "BarkskinFisher" },
{ WHITE.."[61]"..DEFAULT.." "..AL["Crusader Larsarius"] .." "..WHITE.."("..AL["Eastern Plaguelands"] ..")", "CrusaderLarsarius" },
{ WHITE.."[61]"..DEFAULT.." "..AL["Shadeflayer Goliath"] .." "..WHITE.."("..AL["Hyjal"] ..")", "ShadeflayerGoliath" },
},
["DragonmawRetreat"] = {
{ AL["Gowlfang"], "DMRGowlfang" },
{ AL["Cavernweb Broodmother"], "DMRBroodmother" },
{ AL["Web Master Torkon"], "DMRWebMaster" },
{ AL["Garlok Flamekeeper"], "DMRGarlok" },
{ AL["Halgan Redbrand"], "DMRHalgan" },
{ AL["Slagfist Destroyer"],"DMRSlagfist" },
{ AL["Overlord Blackheart"], "DMROverlord" },
{ AL["Elder Hollowblood"], "DMRElderHollowblood" },
{ AL["Searistrasz"], "DMRSearistrasz" },
{ AL["Zuluhed the Whacked"], "DMRZuluhed" },
{ AL["Trash Mobs"], "DMRTrash" },
},
["StormwroughtRuins"] = {
{ AL["Oronok Torn-Heart"], "SWROronok" },
{ AL["Dagar the Glutton"], "SWRDagar" },
{ AL["Duke Balor the IV"], "SWRDukeBalor" },
{ AL["Librarian Theodorus"], "SWRLibrarian" },
{ AL["Chieftain Stormsong"], "SWRChieftain" },
{ AL["Deathlord Tidebane"], "SWRDeathlord" },
{ AL["Subjugator Halthas Shadecrest"], "SWRSubjugator" },
{ AL["Mycellakos"], "SWRMycellakos" },
{ AL["Eldermaw the Primordial"], "SWREldermaw" },
{ AL["Lady Drazare"], "SWRLadyDrazare" },
{ AL["Remains of the Innocent"], "SWRRemains" },
{ AL["Mergothid"], "SWRMergothid" },
{ AL["Trash Mobs"], "SWRTrash" },
},
};
--[[
AtlasLootDefaultFrame_OnShow:
Called whenever the loot browser is shown and sets up buttons and loot tables
]]
function AtlasLootDefaultFrame_OnShow()
-- Definition of where I want the loot table to be shown
AtlasLoot_AnchorPoint = Anchor_Default;
-- Having the Atlas and loot browser frames shown at the same time would
-- cause conflicts, so I hide the Atlas frame when the loot browser appears
if ( AtlasFrame ) then
AtlasFrame:Hide();
end
-- Remove the selection of a loot table in Atlas
AtlasLootItemsFrame.activeBoss = nil;
-- Set the item table to the loot table
-- AtlasLoot_SetItemInfoFrame(AtlasLoot_AnchorPoint);
-- Show the last displayed loot table
if ( AtlasLootCharDB.LastBoss == "WishList" ) then
AtlasLoot_ShowWishList()
return
elseif ( AtlasLootCharDB.LastBoss == "SearchResult" ) then
AtlasLoot:ShowSearchResult()
return
end
if ( AtlasLootItemsFrame.refresh ) then
AtlasLoot_ShowBossLoot(AtlasLootItemsFrame.refresh[1], AtlasLootItemsFrame.refresh[3])
else
AtlasLoot_ShowBossLoot(AtlasLootCharDB.LastBoss, AtlasLootCharDB.LastBossText);
end
end
--[[
AtlasLoot_OnEvent(event):
event - Name of the event, passed from the API
Invoked whenever a relevant event is detected by the engine. The function then
decides what action to take depending on the event.
]]
function AtlasLoot_OnEvent()
-- Addons all loaded
if ( event == "ADDON_LOADED" and arg1 == "AtlasLoot" ) then
this:UnregisterEvent("ADDON_LOADED")
AtlasLoot_OnVariablesLoaded();
end
end
--[[
AtlasLoot_OnVariablesLoaded:
Invoked by the VARIABLES_LOADED event. Now that we are sure all the assets
the addon needs are in place, we can properly set up the mod
]]
function AtlasLoot_OnVariablesLoaded()
if ( not AtlasLootCharDB ) then AtlasLootCharDB = {} end
if ( not AtlasLootCharDB["WishList"] ) then AtlasLootCharDB["WishList"] = {} end
if ( not AtlasLootCharDB["QuickLooks"] ) then AtlasLootCharDB["QuickLooks"] = {} end
if ( not AtlasLootCharDB["SearchResult"] ) then AtlasLootCharDB["SearchResult"] = {} end
-- Add the loot browser to the special frames tables to enable closing wih the ESC key
tinsert(UISpecialFrames, "AtlasLootDefaultFrame");
tinsert(UISpecialFrames, "AtlasLootOptionsFrame")
-- Set up options frame
AtlasLootOptions_OnLoad();
-- Legacy code for those using the ultimately failed attempt at making Atlas load on demand
if ( AtlasButton_LoadAtlas ) then
AtlasButton_LoadAtlas();
end
-- Hook the necessary Atlas functions
Original_Atlas_Refresh = Atlas_Refresh;
Atlas_Refresh = AtlasLoot_Refresh;
Original_Atlas_OnShow = Atlas_OnShow;
Atlas_OnShow = AtlasLoot_Atlas_OnShow;
-- Instead of hooking, replace the scrollbar driver function
Original_AtlasScrollBar_Update = AtlasScrollBar_Update;
AtlasScrollBar_Update = AtlasLoot_AtlasScrollBar_Update;
-- Disable options that don't have the supporting mods
if ( not LootLink_SetTooltip and (AtlasLootCharDB.LootlinkTT == true ) ) then
AtlasLootCharDB.LootlinkTT = false;
AtlasLootCharDB.DefaultTT = true;
end
if ( not ItemSync and (AtlasLootCharDB.ItemSyncTT == true) ) then
AtlasLootCharDB.ItemSyncTT = false;
AtlasLootCharDB.DefaultTT = true;
end
if ( (not IsAddOnLoaded("EQCompare") and not IsAddOnLoaded("EquipCompare")) and (AtlasLootCharDB.EquipCompare == true) ) then
AtlasLootCharDB.EquipCompare = false;
end
-- If using an opaque items frame, change the alpha value of the backing texture
if ( AtlasLootCharDB.Opaque ) then
AtlasLootItemsFrame_Back:SetTexture(0, 0, 0, 1);
else
AtlasLootItemsFrame_Back:SetTexture(0, 0, 0, 0.65);
end
-- If Atlas is installed, set up for Atlas
if ( Original_Atlas_Refresh ) then
AtlasLoot_SetupForAtlas();
-- If a first time user, set up options
if ( AtlasLootCharDB.FirstTime == nil or AtlasLootCharDB.FirstTime == true ) then
StaticPopup_Show ("ATLASLOOT_SETUP");
AtlasLootCharDB.FirstTime = false;
end
-- If an older version
if ( AtlasLootCharDB.FirstTime == nil and version < 40500 ) then
-- AtlasLootCharDB.SafeLinks = true;
-- AtlasLootCharDB.AllLinks = false;
StaticPopup_Show ("ATLASLOOT_SETUP");
AtlasLootCharDB.FirstTime = false;
end
Original_Atlas_Refresh();
else
-- If we are not using Atlas, keep the items frame out of the way
AtlasLootItemsFrame:Hide();
end
for k, v in pairs(AtlasLootCharDB["WishList"]) do
if ( type(v[2]) == "table" ) then
v[2] = v[2][3] or "INV_Misc_QuestionMark"
break
end
end
-- Adds an AtlasLoot button to the Feature Frame in Cosmos
if ( EarthFeature_AddButton ) then
EarthFeature_AddButton(
{
id = string.sub(ATLASLOOT_VERSION, 11, 28);
name = string.sub(ATLASLOOT_VERSION, 11, 28);
subtext = string.sub(ATLASLOOT_VERSION, 30, 39);
tooltip = "";
icon = "Interface\\Icons\\INV_Box_01";
callback = AtlasLoot_ShowMenu;
test = nil;
}
);
-- Adds AtlasLoot to old style Cosmos installations
elseif ( Cosmos_RegisterButton ) then
Cosmos_RegisterButton(
string.sub(ATLASLOOT_VERSION, 11, 28),
string.sub(ATLASLOOT_VERSION, 11, 28),
"",
"Interface\\Icons\\INV_Box_01",
AtlasLoot_ShowMenu
);
end
-- Set up the menu in the loot browser
AtlasLoot_HewdropRegister();
-- Enable or disable AtlasLootFu based on seleced options
-- If EquipCompare is available, use it
if ( IsAddOnLoaded("EquipCompare") and AtlasLootCharDB.EquipCompare == true ) then
EquipCompare_RegisterTooltip(AtlasLootTooltip);
EquipCompare_RegisterTooltip(AtlasLootTooltip2);
end
if ( IsAddOnLoaded("EQCompare") and (AtlasLootCharDB.EquipCompare == true) ) then
EQCompare:RegisterTooltip(AtlasLootTooltip);
EQCompare:RegisterTooltip(AtlasLootTooltip2);
end
-- Position relevant UI objects for loot browser and set up menu
AtlasLootDefaultFrame_SelectedCategory:SetPoint("TOP", "AtlasLootDefaultFrame_Menu", "BOTTOM", 0, -4);
AtlasLootDefaultFrame_SelectedTable:SetPoint("TOP", "AtlasLootDefaultFrame_SubMenu", "BOTTOM", 0, -4);
AtlasLootDefaultFrame_SelectedCategory:SetText(AtlasLootCharDB.LastBossText);
AtlasLootDefaultFrame_SelectedTable:SetText("");
AtlasLootDefaultFrame_SelectedCategory:Show();
AtlasLootDefaultFrame_SelectedTable:Show();
AtlasLootDefaultFrame_SubMenu:Disable();
end
--[[
AtlasLootOptions_OnLoad:
Function is loaded when the addon is loaded
]]
function AtlasLootOptions_OnLoad()
-- Disable checkboxes of missing addons
if ( not LootLink_SetTooltip ) then
AtlasLootOptionsFrameLootlinkTT:Disable();
AtlasLootOptionsFrameLootlinkTTText:SetText(AL["|cff9d9d9dLootlink Tooltips|r"]);
end
if ( not ItemSync ) then
AtlasLootOptionsFrameItemSyncTT:Disable();
AtlasLootOptionsFrameItemSyncTTText:SetText(AL["|cff9d9d9dItemSync Tooltips|r"]);
end
if ( not IsAddOnLoaded("EQCompare") and not IsAddOnLoaded("EquipCompare") ) then
AtlasLootOptionsFrameEquipCompare:Disable();
AtlasLootOptionsFrameEquipCompareText:SetText(AL["|cff9d9d9dUse EquipCompare|r"]);
end
AtlasLootOptions_Init();
UIPanelWindows['AtlasLootOptionsFrame'] = {area = 'center', pushable = 0};
end
--[[
AtlasLootOptions_Init:
Initiates the options.
]]
function AtlasLootOptions_Init()
-- clear saved vars for a new version (or a new install!)
if ( AtlasLootCharDB.FirstTime == nil ) then
AtlasLootOptions_Fresh();
end
-- Initialise all the check boxes on the options frame
-- AtlasLootOptionsFrameSafeLinks:SetChecked(AtlasLootCharDB.SafeLinks);
-- AtlasLootOptionsFrameAllLinks:SetChecked(AtlasLootCharDB.AllLinks);
AtlasLootOptionsFrameDefaultTT:SetChecked(AtlasLootCharDB.DefaultTT);
AtlasLootOptionsFrameLootlinkTT:SetChecked(AtlasLootCharDB.LootlinkTT);
AtlasLootOptionsFrameItemSyncTT:SetChecked(AtlasLootCharDB.ItemSyncTT);
AtlasLootOptionsFrameShowSource:SetChecked(AtlasLootCharDB.ShowSource);
AtlasLootOptionsFrameWishlistGroupedByDungeon:SetChecked(AtlasLootCharDB.WishlistGroupedByDungeon);
AtlasLootOptionsFrameEquipCompare:SetChecked(AtlasLootCharDB.EquipCompare);
AtlasLootOptionsFrameOpaque:SetChecked(AtlasLootCharDB.Opaque);
AtlasLootOptionsFrameItemID:SetChecked(AtlasLootCharDB.ItemIDs);
-- AtlasLootOptionsFrameItemSpam:SetChecked(AtlasLootCharDB.ItemSpam);
AtlasLootOptionsFrameHidePanel:SetChecked(AtlasLootCharDB.HidePanel);
AtlasLootOptionsFrameMinimap:SetChecked(AtlasLootCharDB.MinimapButton);
AtlasLootOptionsFrameSliderButtonPos:SetValue(AtlasLootCharDB.MinimapButtonPosition);
AtlasLootOptionsFrameSliderButtonRad:SetValue(AtlasLootCharDB.MinimapButtonRadius);
AtlasLootMinimapButtonFrame:SetPoint(
"TOPLEFT",
"Minimap",
"TOPLEFT",
54 - (AtlasLootCharDB.MinimapButtonRadius * cos(AtlasLootCharDB.MinimapButtonPosition)),
(AtlasLootCharDB.MinimapButtonRadius * sin(AtlasLootCharDB.MinimapButtonPosition)) - 55
);
end
--[[
Atlas_FreshOptions:
Sets default options on a fresh start.
]]
function AtlasLootOptions_Fresh()
-- AtlasLootCharDB.SafeLinks = false;
-- AtlasLootCharDB.AllLinks = true;
AtlasLootCharDB.DefaultTT = true;
AtlasLootCharDB.LootlinkTT = false;
AtlasLootCharDB.ItemSyncTT = false;
AtlasLootCharDB.ShowSource = true;
AtlasLootCharDB.WishlistGroupedByDungeon = true;
AtlasLootCharDB.EquipCompare = false;
AtlasLootCharDB.Opaque = false;
AtlasLootCharDB.ItemIDs = false;
AtlasLootCharDB.FirstTime = true;
-- AtlasLootCharDB.ItemSpam = true;
AtlasLootCharDB.MinimapButton = true;
AtlasLootCharDB.MinimapButtonPosition = 315;
AtlasLootCharDB.MinimapButtonRadius = 78;
AtlasLootCharDB.HidePanel = false;
AtlasLootCharDB.LastBoss = "DUNGEONSMENU1";
AtlasLootCharDB.LastBossText = AL["Dungeons & Raids"];
-- AtlasLootCharDB.AutoQuery = false;
AtlasLootCharDB.PartialMatching = true;
end
--[[
AtlasLoot_OnLoad:
Performs inital setup of the mod and registers it for further setup when
the required resources are in place
]]
function AtlasLoot_OnLoad()
this:RegisterEvent("ADDON_LOADED");
-- Enable the use of /al or /atlasloot to open the loot browser
SLASH_ATLASLOOT1 = "/atlasloot";
SLASH_ATLASLOOT2 = "/al";
SlashCmdList["ATLASLOOT"] = function(msg)
AtlasLoot_SlashCommand(msg);
end
AtlasLootItemsFrame.queue = {}
end
--[[
AtlasLoot_SlashCommand(msg):
msg - takes the argument for the /atlasloot command so that the appropriate action can be performed
If someone types /atlasloot, bring up the options box
]]
function AtlasLoot_SlashCommand(msg)
if ( msg == AL["reset"] ) then
AtlasLootOptions_ResetPosition();
elseif ( msg == AL["default"] ) then
AtlasLootOptions_DefaultSettings();
elseif ( msg == AL["options"] ) then
AtlasLootOptions_Toggle();
else
AtlasLootDefaultFrame:Show();
end
end
--[[
AtlasLootDefaultFrame_OnHide:
When we close the loot browser, re-bind the item table to Atlas
and close all Hewdrop menus
]]
function AtlasLootDefaultFrame_OnHide()
if ( AtlasFrame ) then
AtlasLoot_SetupForAtlas();
end
AtlasLoot_Hewdrop:Close(1);
AtlasLoot_HewdropSubMenu:Close(1);
if ( AtlasLootItemsFrame.refresh ) then
AtlasLootCharDB.LastBoss = AtlasLootItemsFrame.refresh[1]
AtlasLootCharDB.LastBossText = AtlasLootItemsFrame.refresh[3]
end
end
--[[
AtlasLoot_SetupForAtlas:
This function sets up the Atlas specific XML objects
]]
function AtlasLoot_SetupForAtlas()
-- Poisition the frame with the AtlasLoot version details in the Atlas frame
AtlasLootInfo:ClearAllPoints();
AtlasLootInfo:SetParent(AtlasFrame);
AtlasLootInfo:SetPoint("TOPLEFT", "AtlasFrame", "TOPLEFT", 546, -3);
AtlasLootInfo:SetFrameLevel(AtlasFrame:GetFrameLevel() + 1)
AtlasLootInfo:Show()
-- Anchor the bottom panel to the Atlas frame
AtlasLootPanel:ClearAllPoints();
AtlasLootPanel:SetParent(AtlasFrame);
AtlasLootPanel:SetPoint("TOP", "AtlasFrame", "BOTTOM", 0, 9);
AtlasLootPanel:SetFrameLevel(AtlasFrame:GetFrameLevel() + 1)
AtlasLootPanel:Show()
AtlasLoot_AnchorPoint = Anchor_Atlas
AtlasLootItemsFrame:Hide();
end
--[[
AtlasLoot_AtlasScrollBar_Update:
Hooks the Atlas scroll frame.
Required as the Atlas function cannot deal with the AtlasLoot button template or the added Atlasloot entries
]]
function AtlasLoot_AtlasScrollBar_Update()
Original_AtlasScrollBar_Update()
local zoneID = ATLAS_DROPDOWNS[AtlasOptions.AtlasType][AtlasOptions.AtlasZone];
-- Make note of how far in the scroll frame we are
for line = 1, ATLAS_NUM_LINES do
local lineplusoffset = line + FauxScrollFrame_GetOffset(AtlasScrollBar);
local entry = _G["AtlasEntry" .. line]
local loot = _G["AtlasEntry" .. line .. "_Loot"]
local selected = _G["AtlasEntry" .. line .. "_Selected"]
if ( loot and lineplusoffset <= ATLAS_CUR_LINES ) then
_G["AtlasEntry" .. line .. "_Text"]:SetText(ATLAS_SCROLL_LIST[lineplusoffset]);
local showIcon = (AtlasLootBossButtons[zoneID] and AtlasLootBossButtons[zoneID][lineplusoffset] and AtlasLootBossButtons[zoneID][lineplusoffset] ~= "") or
(AtlasLootWBBossButtons[zoneID] and AtlasLootWBBossButtons[zoneID][lineplusoffset] and AtlasLootWBBossButtons[zoneID][lineplusoffset] ~= "") or
(AtlasLootBattlegrounds[zoneID] and AtlasLootBattlegrounds[zoneID][lineplusoffset] and AtlasLootBattlegrounds[zoneID][lineplusoffset] ~= "")
if ( AtlasLootItemsFrame.activeBoss == lineplusoffset ) then
entry:Enable();
loot:Hide();
selected:Show();
elseif ( showIcon ) then
entry:Enable();
loot:Show();
selected:Hide();
else
entry:Disable();
loot:Hide();
selected:Hide();
end
entry.idnum = lineplusoffset;
end
end
end
--[[
AtlasLoot_Refresh:
Replacement for Atlas_Refresh, required as the template for the boss buttons in Atlas is insufficient
Called whenever the state of Atlas changes
]]
function AtlasLoot_Refresh(keepSelection)
-- Reset which loot page is 'current'
if ( not keepSelection ) then
AtlasLootItemsFrame.activeBoss = nil
end
if ( AtlasLootItemsFrame.activeBoss ) then
AtlasLootItemsFrame:Show()
else
AtlasLootItemsFrame:Hide()
end
-- Call original function
Original_Atlas_Refresh()
for i = 1, ATLAS_NUM_LINES do
local entry = _G["AtlasEntry" .. i]
if ( entry and not _G["AtlasEntry"..i.."_Loot"] ) then
-- Add deselected icon
local loot = entry:CreateTexture("$parent_Loot", "OVERLAY");
loot:SetWidth(16)
loot:SetHeight(16)
loot:SetPoint("RIGHT", entry, 0, 0)
loot:SetTexture("Interface\\AddOns\\AtlasLoot\\Images\\looticon")
loot:Show()
-- Add selected icon
local selected = entry:CreateTexture("$parent_Selected", "OVERLAY")
selected:SetWidth(16)
selected:SetHeight(16)
selected:SetPoint("RIGHT", entry, 0, 0)
selected:SetTexture("Interface\\AddOns\\AtlasLoot\\Images\\gold")
selected:Hide()
-- Add OnClick function
entry:SetScript("OnClick", AtlasLootBoss_OnClick)
entry:SetHighlightTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
end
end
end
--[[
AtlasLoot_Atlas_OnShow:
Hooks Atlas_OnShow() to add extra setup routines that AtlasLoot needs for
integration purposes.
]]
function AtlasLoot_Atlas_OnShow()
AtlasLoot_Refresh(true);
-- We don't want Atlas and the Loot Browser open at the same time, so the Loot Browser is close
if ( AtlasLootDefaultFrame ) then
AtlasLootDefaultFrame:Hide();
AtlasLoot_SetupForAtlas();
end
-- Call the Atlas function
Original_Atlas_OnShow();
-- If we were looking at a loot table earlier in the session, it is still
-- saved on the item frame, so restore it in Atlas
if ( AtlasLootItemsFrame.activeBoss ) then
AtlasLootItemsFrame:Show()
else
AtlasLootItemsFrame:Hide()
end
-- Consult the saved variable table to see whether to show the bottom panel
if ( AtlasLootCharDB.HidePanel == true ) then
AtlasLootPanel:Hide();
else
AtlasLootPanel:Show();
end
AtlasLoot_AtlasScrollBar_Update()
end
--[[
AtlasLoot_Toggle:
Simple function to toggle the visibility of the AtlasLoot frame.
]]
function AtlasLoot_Toggle()
if ( AtlasLootDefaultFrame:IsVisible() ) then
HideUIPanel(AtlasLootDefaultFrame);
else
ShowUIPanel(AtlasLootDefaultFrame);
end
end
--[[
AtlasLootBoss_OnClick:
Invoked whenever a boss line in Atlas is clicked
Shows a loot page if one is associated with the button
]]
function AtlasLootBoss_OnClick()
local name = this:GetName()
local zoneID = ATLAS_DROPDOWNS[AtlasOptions.AtlasType][AtlasOptions.AtlasZone];
local id = this.idnum;
-- If the loot table was already shown and boss clicked again, hide the loot table and fix boss list icons
if ( _G[name.."_Selected"]:IsVisible() ) then
_G[name.."_Selected"]:Hide();
_G[name.."_Loot"]:Show();
AtlasLootItemsFrame:Hide();
AtlasLootItemsFrame.activeBoss = nil;
else
-- If an loot table is associated with the button, show it. Note multiple tables need to be checked due to the database structure
if ( AtlasLootBossButtons[zoneID] and AtlasLootBossButtons[zoneID][id] and AtlasLootBossButtons[zoneID][id] ~= "" ) then
-- if ( AtlasLoot_IsLootTableAvailable(AtlasLootBossButtons[zoneID][id]) ) then
_G[name.."_Selected"]:Show();
_G[name.."_Loot"]:Hide();
local _,_,boss = string.find(_G[name.."_Text"]:GetText(), "|c%x%x%x%x%x%x%x%x%s*[%dX']*[%) ]*(.*[^%,])[%,]?$");
AtlasLoot_ShowBossLoot(AtlasLootBossButtons[zoneID][id], boss);
AtlasLootItemsFrame.activeBoss = id;
AtlasLoot_AtlasScrollBar_Update();
AtlasLootCharDB.LastBoss = AtlasLootBossButtons[zoneID][id]
-- dont show navigation buttons if its not rep or set
local match = string.find(boss, AL["Reputation"]) or string.find(boss, AL["Set"])
if ( not match ) then
AtlasLootItemsFrame_BACK:Hide();
AtlasLootItemsFrame_NEXT:Hide();
AtlasLootItemsFrame_PREV:Hide();
end
-- end
elseif ( AtlasLootWBBossButtons[zoneID] and AtlasLootWBBossButtons[zoneID][id] and AtlasLootWBBossButtons[zoneID][id] ~= "" ) then
-- if ( AtlasLoot_IsLootTableAvailable(AtlasLootWBBossButtons[zoneID][id]) ) then
_G[name.."_Selected"]:Show();
_G[name.."_Loot"]:Hide();
local _,_,boss = string.find(_G[name.."_Text"]:GetText(), "|c%x%x%x%x%x%x%x%x%s*[%dX]*[%) ]*(.*[^%,])[%,]?$");
AtlasLoot_ShowBossLoot(AtlasLootWBBossButtons[zoneID][id], boss);
AtlasLootItemsFrame.activeBoss = id;
AtlasLoot_AtlasScrollBar_Update();
AtlasLootCharDB.LastBoss = AtlasLootWBBossButtons[zoneID][id]
-- dont show navigation buttons
AtlasLootItemsFrame_BACK:Hide();
AtlasLootItemsFrame_NEXT:Hide();
AtlasLootItemsFrame_PREV:Hide();
-- end
elseif ( AtlasLootBattlegrounds[zoneID] and AtlasLootBattlegrounds[zoneID][id] and AtlasLootBattlegrounds[zoneID][id] ~= "" ) then
-- if ( AtlasLoot_IsLootTableAvailable(AtlasLootBattlegrounds[zoneID][id]) ) then
_G[name.."_Selected"]:Show();
_G[name.."_Loot"]:Hide();
local _,_,boss = string.find(_G[name.."_Text"]:GetText(), "|c%x%x%x%x%x%x%x%x%s*[%wX]*[%) ]*(.*[^%,])[%,]?$");
AtlasLoot_ShowBossLoot(AtlasLootBattlegrounds[zoneID][id], boss);
AtlasLootItemsFrame.activeBoss = id;
AtlasLoot_AtlasScrollBar_Update();
AtlasLootCharDB.LastBoss = AtlasLootBattlegrounds[zoneID][id]
-- end
end
end
-- This has been invoked from Atlas, so we remove any claim external mods have on the loot table
AtlasLootItemsFrame.externalBoss = nil;
-- Hide the AtlasQuest frame if present so that the AtlasLoot items frame is not stuck under it
if ( AtlasQuestInsideFrame ) then
AtlasQuestInsideFrame:Hide();
end
end
--[[
AtlasLoot_ShowMenu:
Legacy function used in Cosmos integration to open the loot browser
]]
function AtlasLoot_ShowMenu()
AtlasLootDefaultFrame:Show();
end
--[[
AtlasLootOptions_SafeLinksToggle:
Toggles SafeLinks. Items uncached will be linked as their names.
]]
-- function AtlasLootOptions_SafeLinksToggle()
-- if ( AtlasLootCharDB.SafeLinks ) then
-- AtlasLootCharDB.SafeLinks = false;
-- else
-- AtlasLootCharDB.SafeLinks = true;
-- AtlasLootCharDB.AllLinks = false;
-- end
-- AtlasLootOptions_Init();
-- end
--[[
AtlasLootOptions_AllLinksToggle:
Toggles AllLinks. All items will be linked.
]]
-- function AtlasLootOptions_AllLinksToggle()
-- if ( AtlasLootCharDB.AllLinks ) then
-- AtlasLootCharDB.AllLinks = false;
-- else
-- AtlasLootCharDB.AllLinks = true;
-- AtlasLootCharDB.SafeLinks = false;
-- end
-- AtlasLootOptions_Init();
-- end
--[[
AtlasLootOptions_DefaultTTToggle:
Toggles DefaultTooltips. Uses default tooltips.
]]
function AtlasLootOptions_DefaultTTToggle()
AtlasLootCharDB.DefaultTT = true;
AtlasLootCharDB.LootlinkTT = false;
AtlasLootCharDB.ItemSyncTT = false;
AtlasLootOptions_Init();
end
--[[
AtlasLootOptions_LootlinkTTToggle:
Toggles Lootlink tooltips instead of the default ones.
]]
function AtlasLootOptions_LootlinkTTToggle()
AtlasLootCharDB.DefaultTT = false;
AtlasLootCharDB.LootlinkTT = true;
AtlasLootCharDB.ItemSyncTT = false;
AtlasLootOptions_Init();
end
--[[
AtlasLootOptions_ItemSyncTTToggle:
Toggles ItemSync tooltips instead of the default ones.
]]
function AtlasLootOptions_ItemSyncTTToggle()
AtlasLootCharDB.DefaultTT = false;
AtlasLootCharDB.LootlinkTT = false;
AtlasLootCharDB.ItemSyncTT = true;
AtlasLootOptions_Init();
end
function AtlasLootOptions_ShowSourceToggle()
if ( AtlasLootCharDB.ShowSource ) then
AtlasLootCharDB.ShowSource = false;
else
AtlasLootCharDB.ShowSource = true;
end
AtlasLootOptions_Init();
end
function AtlasLootOptions_WishlistGroupedByDungeonToggle()
if ( AtlasLootCharDB.WishlistGroupedByDungeon ) then
AtlasLootCharDB.WishlistGroupedByDungeon = false;
else
AtlasLootCharDB.WishlistGroupedByDungeon = true;
end
AtlasLootOptions_Init();
AtlasLoot_WishList = AtlasLoot_CategorizeWishList(AtlasLootCharDB["WishList"]);
local dataID = AtlasLootItemsFrame.refresh[1];
if ( dataID == 'WishList' ) then
AtlasLoot_ShowWishList();
end
end
--[[
AtlasLootOptions_EquipCompareToggle:
Toggles EquipCompare. Adds a tooltip with the equipped item (if it's the case) next to the default one.
]]
function AtlasLootOptions_EquipCompareToggle()
if ( AtlasLootCharDB.EquipCompare ) then
AtlasLootCharDB.EquipCompare = false;
if ( IsAddOnLoaded("EquipCompare") ) then
EquipCompare_UnregisterTooltip(AtlasLootTooltip);
EquipCompare_UnregisterTooltip(AtlasLootTooltip2);
end
if ( IsAddOnLoaded("EQCompare") ) then
EQCompare:UnRegisterTooltip(AtlasLootTooltip);
EQCompare:UnRegisterTooltip(AtlasLootTooltip2);
end
else
AtlasLootCharDB.EquipCompare = true;
if ( IsAddOnLoaded("EquipCompare") ) then
EquipCompare_RegisterTooltip(AtlasLootTooltip);
EquipCompare_RegisterTooltip(AtlasLootTooltip2);
end
if ( IsAddOnLoaded("EQCompare") ) then
EQCompare:RegisterTooltip(AtlasLootTooltip);
EQCompare:RegisterTooltip(AtlasLootTooltip2);
end
end
AtlasLootOptions_Init();
end
--[[
AtlasLootOptions_OpaqueToggle:
Toggles opacity of the items frame.
]]
function AtlasLootOptions_OpaqueToggle()
AtlasLootCharDB.Opaque = AtlasLootOptionsFrameOpaque:GetChecked();
if ( AtlasLootCharDB.Opaque ) then
AtlasLootItemsFrame_Back:SetTexture(0, 0, 0, 1);
else
AtlasLootItemsFrame_Back:SetTexture(0, 0, 0, 0.65);
end
AtlasLootOptions_Init();
end
--[[
AtlasLootOptions_ItemIDToggle:
Toggles items ID.
]]
function AtlasLootOptions_ItemIDToggle()
if ( AtlasLootCharDB.ItemIDs ) then
AtlasLootCharDB.ItemIDs = false;
else
AtlasLootCharDB.ItemIDs = true;
end
AtlasLootOptions_Init();
end
--[[
AtlasLootOptions_ItemSpam:
Toggles item query spam.
]]
-- function AtlasLootOptions_ItemSpam()
-- if ( AtlasLootCharDB.ItemSpam ) then
-- AtlasLootCharDB.ItemSpam = false;
-- else
-- AtlasLootCharDB.ItemSpam = true;
-- end
-- AtlasLootOptions_Init();
-- end
--[[
AtlasLootOptions_Toggle:
Toggle on/off the options window
]]
function AtlasLootOptions_Toggle()
if ( AtlasLootOptionsFrame:IsVisible() ) then
-- Hide the options frame if already shown
AtlasLootOptionsFrame:Hide();
else
AtlasLootOptionsFrame:Show();
-- Workaround for a weird quirk where tooltip settings so not immediately take effect
if ( AtlasLootCharDB.DefaultTT == true ) then
AtlasLootOptions_DefaultTTToggle();
elseif ( AtlasLootCharDB.LootlinkTT == true ) then
AtlasLootOptions_LootlinkTTToggle();
elseif ( AtlasLootCharDB.ItemSyncTT == true ) then
AtlasLootOptions_ItemSyncTTToggle();
end
end
end
function AtlasLootItemsFrame_OnUpdate()
if ( not this.refreshTime ) then
return
end
this.refreshTime = (this.refreshTime or refreshTimeout) - arg1
local done = true
for item in pairs(this.queue) do
if not GetItemInfo(item) then
done = false
break
end
end
if ( done or this.refreshTime <= 0 ) then
this.refreshTime = nil
for k in pairs(this.queue) do
this.queue[k] = nil
end
if ( this.refresh and this.refresh[1] and this.refresh[2] and this.refresh[3] ) then
AtlasLoot_ShowItemsFrame(this.refresh[1], this.refresh[2], this.refresh[3])
end
end
end
--[[
AtlasLoot_ShowItemsFrame(dataID, dataSource, boss, pFrame):
dataID - Name of the loot table
dataSource - Table in the database where the loot table is stored
boss - Text string to use as a title for the loot page
pFrame - Data structure describing how and where to anchor the item frame (more details, see the function AtlasLoot_SetItemInfoFrame)
This fuction is not normally called directly, it is usually invoked by AtlasLoot_ShowBossLoot.
It is the workhorse of the mod and allows the loot tables to be displayed any way anywhere in any mod.
]]
function AtlasLoot_ShowItemsFrame(dataID, dataSource, boss)
AtlasLootItemsFrame.refreshTime = nil
if ( AtlasLootItemsFrameContainer:IsShown() and AtlasLootItemsFrame.refresh and dataID ~= AtlasLootItemsFrame.refresh[1] ) then
AtlasLootItemsFrameContainer:Hide()
end
-- Set up local variables needed for GetItemInfo, etc
local iconFrame, nameFrame, extraFrame, itemButton;
local text, extra;
local wlPage, wlPageMax = 1, 1;
local isItem, isEnchant, isSpell;
local spellName, spellIcon;
-- if ( dataID == "SearchResult" and dataID == "WishList" ) then
-- AtlasLoot_IsLootTableAvailable(dataID);
-- end
-- If the data source has not been passed, throw up a debugging statement
-- if ( dataSource == nil ) then
-- DEFAULT_CHAT_FRAME:AddMessage("No dataSource!");
-- end
-- If the loot table name has not been passed, throw up a debugging statement
-- if ( dataID == nil ) then
-- DEFAULT_CHAT_FRAME:AddMessage("No dataID!");
-- end
local dataSource_backup = dataSource;
if ( dataSource ~= "dummy" ) then
if ( dataID == "SearchResult" or dataID == "WishList" ) then
dataSource = {};
-- Match the page number to display
wlPage = tonumber(string.sub(dataSource_backup, string.find(dataSource_backup, "%d"), string.len(dataSource_backup)));
-- Aquiring items of the page
if ( dataID == "SearchResult" ) then
dataSource[dataID], wlPageMax = AtlasLoot:GetSearchResultPage(wlPage);
elseif ( dataID == "WishList" ) then
dataSource[dataID], wlPageMax = AtlasLoot_GetWishListPage(wlPage);
end
-- Make page number reasonable
if ( wlPage < 1 ) then wlPage = 1 end
if ( wlPage > wlPageMax ) then wlPage = wlPageMax end
else
dataSource = AtlasLoot_Data[dataSource_backup];
end
end
-- Get AtlasQuest out of the way
if ( AtlasQuestInsideFrame ) then
AtlasQuestInsideFrame:Hide();
end
-- Store data about the state of the items frame to allow minor tweaks or a recall of the current loot page
AtlasLootItemsFrame.refresh = { dataID, dataSource_backup, boss, AtlasLoot_AnchorPoint };
-- Escape out of this function if creating a menu, this function only handles loot tables.
-- Inserting escapes in this way allows consistant calling of data whether it is a loot table or a menu.
if ( AtlasLoot_MenuList[dataID] ) then
-- Ditch the Quicklook selector
AtlasLoot_QuickLooks:Hide();
AtlasLootQuickLooksButton:Hide();
_G[AtlasLoot_MenuList[dataID]]()
else
-- This is a valid QuickLook, so show the UI objects
if ( dataID ~= "SearchResult" and dataID ~= "WishList" ) then
AtlasLoot_QuickLooks:Show();
AtlasLootQuickLooksButton:Show();
end
-- Iterate through each item object and set its properties
for i = 1, 30, 1 do
-- Hide the menu objects. These are not required for a loot table
_G["AtlasLootMenuItem_"..i]:Hide();
-- Check for a valid object (that it exists, and that it has a name)
if ( dataSource[dataID][i] and dataSource[dataID][i][3] ~= "" ) then
-- Use shortcuts for easier reference to parts of the item button
itemButton = _G["AtlasLootItem_"..i];
iconFrame = _G["AtlasLootItem_"..i.."_Icon"];
nameFrame = _G["AtlasLootItem_"..i.."_Name"];
extraFrame = _G["AtlasLootItem_"..i.."_Extra"];
local quantity = _G["AtlasLootItem_"..i.."_Quantity"]
local iconBorder = _G["AtlasLootItem_"..i.."_IconBorder"]
iconBorder:SetVertexColor(1, 1, 1)
if ( string.sub(dataSource[dataID][i][1], 1, 1) == "s" ) then
isItem = false;
isEnchant = false;
isSpell = true;
elseif ( string.sub(dataSource[dataID][i][1], 1, 1) == "e" ) then
isItem = false;
isEnchant = true;
isSpell = false;
else
isItem = true;
isEnchant = false;
isSpell = false;
end
if ( isItem ) then
local itemID = tonumber(dataSource[dataID][i][1])
local itemName, _, itemQuality = GetItemInfo(itemID);
-- If the client has the name of the item in cache, use that instead.
-- This is poor man's localisation, English is replaced be whatever is needed
if ( itemName ) then
local r, g, b, itemColor = GetItemQualityColor(itemQuality);
text = itemColor..itemName;
iconBorder:SetVertexColor(r, g, b)
else
if ( itemID and itemID ~= 0 ) then
AtlasLootCacheTooltip:SetHyperlink("item:"..itemID)
AtlasLootItemsFrame.refreshTime = refreshTimeout
AtlasLootItemsFrame.queue[itemID] = true
iconBorder:SetVertexColor(1, 0, 0)
end
text = AtlasLoot_FixText(dataSource[dataID][i][3]);
end
quantity:SetText("")
itemButton.dressingroomID = dataSource[dataID][i][1];
elseif ( isEnchant ) then
local spellID = tonumber(string.sub(dataSource[dataID][i][1], 2))
local craftItem = tonumber(GetSpellInfoAtlasLootDB["enchants"][spellID]["item"])
if ( SpellInfo ) then
spellName = SpellInfo(spellID)
else
if ( spellID and spellID ~= 0 ) then
AtlasLootCacheTooltip:SetHyperlink("enchant:"..spellID)
spellName = AtlasLootCacheTooltipTextLeft1:GetText()
end
if ( not (spellName and spellName ~= "") ) then
spellName = GetSpellInfoAtlasLootDB["enchants"][spellID]["name"]
end
end
spellIcon = dataSource[dataID][i][2]
if ( craftItem ) then
local r, g, b, color, quality
text, _, quality = GetItemInfo(craftItem)
if ( not text ) then
if ( craftItem and craftItem ~= 0 ) then
AtlasLootCacheTooltip:SetHyperlink("item:"..craftItem)
AtlasLootItemsFrame.refreshTime = refreshTimeout
AtlasLootItemsFrame.queue[craftItem] = true
end
text = AtlasLoot_FixText(spellName);
end
if ( quality ) then
r, g, b, color = GetItemQualityColor(quality)
text = color..(text or "")
iconBorder:SetVertexColor(r, g, b)
end
itemButton.dressingroomID = craftItem;
else
text = spellName
itemButton.dressingroomID = nil;
end
quantity:SetText("")
elseif ( isSpell ) then
local spellID = tonumber(string.sub(dataSource[dataID][i][1], 2))
local craftItem = tonumber(GetSpellInfoAtlasLootDB["craftspells"][spellID]["craftItem"])
local reagents = GetSpellInfoAtlasLootDB["craftspells"][spellID]["reagents"]
if ( type(reagents) == "table" ) then
for j = 1, table.getn(reagents) do
local reagent = GetSpellInfoAtlasLootDB["craftspells"][spellID]["reagents"][j]
if ( not GetItemInfo(reagent[1]) ) then
AtlasLootCacheTooltip:SetHyperlink("item:"..reagent[1]);
end
end
end
if ( SpellInfo ) then
spellName = SpellInfo(spellID)
else
spellName = GetSpellInfoAtlasLootDB["craftspells"][spellID]["name"]
end
spellIcon = dataSource[dataID][i][2]
if ( craftItem ) then
local r, g, b, color, quality
text, _, quality = GetItemInfo(craftItem)
if ( not text ) then
if ( craftItem ~= 0 ) then
AtlasLootCacheTooltip:SetHyperlink("item:"..craftItem)
text = AtlasLoot_FixText(spellName);
AtlasLootItemsFrame.refreshTime = refreshTimeout
AtlasLootItemsFrame.queue[craftItem] = true
end
end
if ( quality ) then
r, g, b, color = GetItemQualityColor(quality)
text = color..(text or "")
iconBorder:SetVertexColor(r, g, b)
end
itemButton.dressingroomID = craftItem;
else
text = spellName
itemButton.dressingroomID = nil
end
local qtyMin = GetSpellInfoAtlasLootDB["craftspells"][spellID]["craftQuantityMin"];
local qtyMax = GetSpellInfoAtlasLootDB["craftspells"][spellID]["craftQuantityMax"];
if ( qtyMin ) then
if ( qtyMax ) then
quantity:SetText(qtyMin.. "-"..qtyMax)
else
quantity:SetText(qtyMin)
end
else
quantity:SetText("")
end
end
-- Insert the item description
extra = AtlasLoot_FixText(dataSource[dataID][i][4]);
local iconData = dataSource[dataID][i][2]
-- If there is no data on the texture an item should have, show a big red question mark
if ( strsub(iconData, 1, 5) == "CLASS" ) then
iconFrame:SetTexture("Interface\\AddOns\\AtlasLoot\\Images\\"..strsub(iconData, 6))
elseif ( isItem and type(dataSource[dataID][i][1]) == "number" ) then
local _, _, _, _, _, _, _, _, texture = GetItemInfo(dataSource[dataID][i][1])
if ( not texture and type(iconData) == "string" ) then
texture = "Interface\\Icons\\"..iconData
end
iconFrame:SetTexture(texture);
elseif ( not isItem and spellIcon ) then
if ( type(iconData) == "number" ) then
local _, _, _, _, _, _, _, _, texture = GetItemInfo(iconData)
iconFrame:SetTexture(texture);
elseif ( type(iconData) == "string" ) then
iconFrame:SetTexture("Interface\\Icons\\"..iconData);
else
iconFrame:SetTexture(spellIcon);
end
else
iconFrame:SetTexture("Interface\\Icons\\"..iconData);
end
if ( iconFrame:GetTexture() == nil ) then
iconFrame:SetTexture("Interface\\Icons\\INV_Misc_QuestionMark");
end
-- Set the name and description of the item
nameFrame:SetText(text);
extraFrame:SetText(extra);
extraFrame:Show();
-- Set prices for items, up to 5 different currencies can be used in combination
for j = 1, 5 do
_G["AtlasLootItem_"..i.."_PriceText"..j]:Hide();
_G["AtlasLootItem_"..i.."_PriceIcon"..j]:Hide();
end
local index = 1
for j = 6, 14, 2 do
local pricetext = _G["AtlasLootItem_"..i.."_PriceText"..index]
local priceicon = _G["AtlasLootItem_"..i.."_PriceIcon"..index]
if ( dataSource[dataID][i][j] and dataSource[dataID][i][j] ~= "" ) then
pricetext:SetText(dataSource[dataID][i][j])
priceicon:SetTexture(AtlasLoot_FixText(dataSource[dataID][i][j + 1]))
pricetext:Show()
priceicon:Show()
end
index = index + 1
end
if ( (dataID == "SearchResult" or dataID == "WishList") and dataSource[dataID][i][5] ) then
local _, _, wishDataID, wishDataSource = strfind(dataSource[dataID][i][5], "(.+)|(.+)")
if ( wishDataSource == "AtlasLootRepItems" ) then
if ( wishDataID --[[and AtlasLoot_IsLootTableAvailable(wishDataID)]] ) then
for _, v in ipairs(AtlasLoot_Data[wishDataSource][wishDataID]) do
if ( dataSource[dataID][i][1] == v[1] ) then
index = 1
for j = 6, 14, 2 do
local pricetext = _G["AtlasLootItem_"..i.."_PriceText"..index]
local priceicon = _G["AtlasLootItem_"..i.."_PriceIcon"..index]
if ( v[j] and v[j] ~= "" ) then
pricetext:SetText(v[j])
priceicon:SetTexture(AtlasLoot_FixText(v[j + 1]))
pricetext:Show()
priceicon:Show()
end
index = index + 1
end
break;
end
end
end
end
if ( wishDataSource == "AtlasLootItems" and AtlasLootCharDB.WishlistGroupedByDungeon ) then
-- Set boss
if ( wishDataID --[[and AtlasLoot_IsLootTableAvailable(wishDataID)]] ) then
for _, v in ipairs(AtlasLoot_Data[wishDataSource][wishDataID]) do
if ( dataSource[dataID][i][1] == v[1] ) then
local boss = AtlasLoot_GetWishListSubheadingBoss(wishDataID)
if ( boss ) then
extraFrame:SetText(extra .. " - "..boss)
end
end
end
end
end
end
-- For convenience, we store information about the objects in the objects so that it can be easily accessed later
itemButton.itemID = dataSource[dataID][i][1];
itemButton.itemIDName = dataSource[dataID][i][3];
itemButton.itemIDExtra = dataSource[dataID][i][4];
itemButton.container = dataSource[dataID][i][16]
if ( type(itemButton.container) == "table" ) then
iconBorder:SetVertexColor(1, 0.82, 0)
for row = 1, getn(itemButton.container) do
for item = 1, getn(itemButton.container[row]) do
AtlasLoot_CacheItem(itemButton.container[row][item][1])
end
end
end
itemButton.droprate = nil;
if ( dataID == "SearchResult" or dataID == "WishList" ) then
itemButton.sourcePage = dataSource[dataID][i][5];
else
local droprate = dataSource[dataID][i][5];
if ( droprate and string.find(droprate, "%%") ) then
itemButton.droprate = droprate
end
end
itemButton:Show();
if ( GetMouseFocus() == itemButton ) then
itemButton:Hide()
itemButton:Show()
end
else
_G["AtlasLootItem_"..i]:Hide();
end
end
-- Hide navigation buttons by default, only show what we need
AtlasLootItemsFrame_BACK:Hide();
AtlasLootItemsFrame_NEXT:Hide();
AtlasLootItemsFrame_PREV:Hide();
AtlasLoot_BossName:SetText(boss);
-- Consult the button registry to determine what nav buttons are required
if ( dataID == "SearchResult" or dataID == "WishList" ) then
if ( wlPage < wlPageMax ) then
AtlasLootItemsFrame_NEXT:Show();
AtlasLootItemsFrame_NEXT.lootpage = dataID.."Page"..(wlPage + 1);
end
if ( wlPage > 1 ) then
AtlasLootItemsFrame_PREV:Show();
AtlasLootItemsFrame_PREV.lootpage = dataID.."Page"..(wlPage - 1);
end
elseif ( AtlasLoot_ButtonRegistry[dataID] ) then
local tablebase = AtlasLoot_ButtonRegistry[dataID];
AtlasLoot_BossName:SetText(tablebase.Title);
if ( tablebase.Next_Page ) then
AtlasLootItemsFrame_NEXT:Show();
AtlasLootItemsFrame_NEXT.lootpage = tablebase.Next_Page;
if ( AtlasLoot_ButtonRegistry[tablebase.Next_Page] ) then
AtlasLootItemsFrame_NEXT.title = AtlasLoot_ButtonRegistry[tablebase.Next_Page].Title;
end
end
if ( tablebase.Prev_Page ) then
AtlasLootItemsFrame_PREV:Show();
AtlasLootItemsFrame_PREV.lootpage = tablebase.Prev_Page;
if ( AtlasLoot_ButtonRegistry[tablebase.Prev_Page] ) then
AtlasLootItemsFrame_PREV.title = AtlasLoot_ButtonRegistry[tablebase.Prev_Page].Title;
end
end
if ( tablebase.Back_Page ) then
AtlasLootItemsFrame_BACK:Show();
AtlasLootItemsFrame_BACK.lootpage = tablebase.Back_Page;
if ( AtlasLoot_ButtonRegistry[tablebase.Back_Page] ) then
AtlasLootItemsFrame_BACK.title = AtlasLoot_ButtonRegistry[tablebase.Back_Page].Title;
end
if ( AtlasFrame and AtlasFrame:IsVisible() ) then
local sourceKey
for k, v in pairs(AtlasLoot_Data) do
if ( v == dataSource ) then
sourceKey = k
end
end
-- Hide navigation buttons if we click on boss loot in Atlas
if ( sourceKey == "AtlasLootItems" or sourceKey == "AtlasLootWBItems" ) then
AtlasLootItemsFrame_BACK:Hide()
AtlasLootItemsFrame_NEXT:Hide()
AtlasLootItemsFrame_PREV:Hide()
end
-- Hide navigation buttons if we click Quicklooks in Atlas
for i = 1, 4 do
if ( AtlasLootCharDB["QuickLooks"][i] and dataID == AtlasLootCharDB["QuickLooks"][i][1] ) then
AtlasLootItemsFrame_BACK:Hide();
AtlasLootItemsFrame_NEXT:Hide();
AtlasLootItemsFrame_PREV:Hide();
end
end
end
end
end
end
-- For Alphamap and Atlas integration, show a 'close' button to hide the loot table and restore the map view
AtlasLootItemsFrame_CloseButton:Hide();
if ( AtlasFrame and AtlasFrame:IsShown() or AlphaMapAlphaMapFrame and AlphaMapAlphaMapFrame:IsShown() ) then
AtlasLootItemsFrame_CloseButton:Show();
end
local subMenu = nil
local bossName = ""
for k in pairs(AtlasLoot_HewdropDown_SubTables) do
if ( subMenu ) then
break
end
for _, n in pairs(AtlasLoot_HewdropDown_SubTables[k]) do
if ( n[2] == dataID ) then
subMenu = AtlasLoot_HewdropDown_SubTables[k]
bossName = n[1]
break
end
end
end
if ( subMenu ) then
AtlasLoot_HewdropSubMenuRegister(subMenu)
AtlasLootDefaultFrame_SubMenu:Enable()
AtlasLootDefaultFrame_SelectedTable:SetText(bossName)
AtlasLootDefaultFrame_SelectedTable:Show()
else
AtlasLootDefaultFrame_SubMenu:Disable()
AtlasLootDefaultFrame_SelectedTable:Hide()
end
-- Anchor the item frame where it is supposed to be
AtlasLootItemsFrame:SetParent(_G[AtlasLoot_AnchorPoint[2]]);
AtlasLootItemsFrame:ClearAllPoints();
AtlasLootItemsFrame:SetPoint(AtlasLoot_AnchorPoint[1], AtlasLoot_AnchorPoint[2], AtlasLoot_AnchorPoint[3], AtlasLoot_AnchorPoint[4], AtlasLoot_AnchorPoint[5]);
AtlasLootItemsFrame:Show();
end
--[[
AtlasLoot_HewdropClick(tablename, text, tabletype):
tablename - Name of the loot table in the database
text - Heading for the loot table
tabletype - Whether the tablename indexes an actual table or needs to generate a submenu
Called when a button in AtlasLoot_Hewdrop is clicked
]]
function AtlasLoot_HewdropClick(tablename, text, tabletype)
-- AtlasLootCharDB.LastMenu = { tablename, text, tabletype }
-- Definition of where I want the loot table to be shown
AtlasLoot_AnchorPoint = Anchor_Default
-- If the button clicked was linked to a loot table
if ( tabletype == "Table" ) then
-- Show the loot table
AtlasLoot_ShowBossLoot(tablename, text);
-- Save needed info for fuure re-display of the table
AtlasLootCharDB.LastBoss = tablename;
AtlasLootCharDB.LastBossText = text;
-- Purge the text label for the submenu and disable the submenu
AtlasLootDefaultFrame_SubMenu:Disable();
AtlasLootDefaultFrame_SelectedTable:SetText("");
AtlasLootDefaultFrame_SelectedTable:Show();
-- If the button links to a sub menu definition
else
-- Enable the submenu button
AtlasLootDefaultFrame_SubMenu:Enable();
-- Show the first loot table associated with the submenu
AtlasLoot_ShowBossLoot(AtlasLoot_HewdropDown_SubTables[tablename][1][2], AtlasLoot_HewdropDown_SubTables[tablename][1][1]);
-- Save needed info for fuure re-display of the table
AtlasLootCharDB.LastBoss = AtlasLoot_HewdropDown_SubTables[tablename][1][2];
AtlasLootCharDB.LastBossText = AtlasLoot_HewdropDown_SubTables[tablename][1][1];
-- Load the correct submenu and associated with the button
AtlasLoot_HewdropSubMenu:Unregister(AtlasLootDefaultFrame_SubMenu);
AtlasLoot_HewdropSubMenuRegister(AtlasLoot_HewdropDown_SubTables[tablename]);
-- Show a text label of what has been selected
AtlasLootDefaultFrame_SelectedTable:SetText(AtlasLoot_HewdropDown_SubTables[tablename][1][1]);
AtlasLootDefaultFrame_SelectedTable:Show();
end
-- Show the category that has been selected
AtlasLootDefaultFrame_SelectedCategory:SetText(text);
AtlasLootDefaultFrame_SelectedCategory:Show();
AtlasLoot_Hewdrop:Close(1);
end
--[[
AtlasLoot_HewdropSubMenuClick(tablename, text):
tablename - Name of the loot table in the database
text - Heading for the loot table
Called when a button in AtlasLoot_HewdropSubMenu is clicked
]]
function AtlasLoot_HewdropSubMenuClick(tablename, text)
-- Definition of where I want the loot table to be shown
AtlasLoot_AnchorPoint = Anchor_Default
-- Show the select loot table
AtlasLoot_ShowBossLoot(tablename, text);
-- Save needed info for fuure re-display of the table
AtlasLootCharDB.LastBoss = tablename;
AtlasLootCharDB.LastBossText = text;
-- Show the table that has been selected
AtlasLootDefaultFrame_SelectedTable:SetText(text);
AtlasLootDefaultFrame_SelectedTable:Show();
AtlasLoot_HewdropSubMenu:Close(1);
end
--[[
AtlasLoot_HewdropSubMenuRegister(loottable):
loottable - Table defining the sub menu
Generates the sub menu needed by passing a table of loot tables and titles
]]
function AtlasLoot_HewdropSubMenuRegister(loottable)
AtlasLoot_HewdropSubMenu:Register(AtlasLootDefaultFrame_SubMenu,
'point', function(parent)
return "TOP", "BOTTOM"
end,
'children', function(level, value)
if ( level == 1 ) then
for k,v in pairs(loottable) do
AtlasLoot_HewdropSubMenu:AddLine(
'text', v[1],
'func', AtlasLoot_HewdropSubMenuClick,
'arg1', v[2],
'arg2', v[1],
'notCheckable', true
)
end
end
end,
'dontHook', true
)
end
--[[
AtlasLoot_HewdropRegister:
Constructs the main category menu from a tiered table
]]
function AtlasLoot_HewdropRegister()
AtlasLoot_Hewdrop:Register(AtlasLootDefaultFrame_Menu,
'point', function(parent)
return "TOP", "BOTTOM"
end,
'children', function(level, value)
if ( level == 1 ) then
if ( AtlasLoot_HewdropDown ) then
for k,v in ipairs(AtlasLoot_HewdropDown) do
-- If a link to show a submenu
if ( type(v[1]) == "table" and type(v[1][1]) == "string" ) then
if ( v[1][3] == "Submenu" ) then
AtlasLoot_Hewdrop:AddLine(
'text', v[1][1],
'textR', 1,
'textG', 0.82,
'textB', 0,
'func', AtlasLoot_HewdropClick,
'arg1', v[1][2],
'arg2', v[1][1],
'arg3', v[1][3],
'notCheckable', true
)
end
else
local lock = 0;
-- If an entry linked to a subtable
for i,j in pairs(v) do
if ( lock == 0 ) then
AtlasLoot_Hewdrop:AddLine(
'text', i,
'textR', 1,
'textG', 0.82,
'textB', 0,
'hasArrow', true,
'value', j,
'func', AtlasLoot_OpenMenu,
'arg1', i,
'notCheckable', true
)
lock = 1;
end
end
end
end
end
elseif ( level == 2 ) then
if ( value ) then
for k,v in ipairs(value) do
if ( type(v) == "table" ) then
if ( type(v[1]) == "table" and type(v[1][1]) == "string" ) then
-- If an entry to show a submenu
if ( v[1][3] == "Submenu" ) then
AtlasLoot_Hewdrop:AddLine(
'text', v[1][1],
'textR', 1,
'textG', 0.82,
'textB', 0,
'func', AtlasLoot_HewdropClick,
'arg1', v[1][2],
'arg2', v[1][1],
'arg3', v[1][3],
'notCheckable', true
)
-- An entry to show a specific loot page
else
AtlasLoot_Hewdrop:AddLine(
'text', v[1][1],
'textR', 1,
'textG', 0.82,
'textB', 0,
'func', AtlasLoot_HewdropClick,
'arg1', v[1][2],
'arg2', v[1][1],
'arg3', v[1][3],
'notCheckable', true
)
end
else
local lock = 0;
-- Entry to link to a sub table
for i,j in pairs(v) do
if ( lock == 0 ) then
AtlasLoot_Hewdrop:AddLine(
'text', i,
'textR', 1,
'textG', 0.82,
'textB', 0,
'hasArrow', true,
'value', j,
'notCheckable', true
)
lock = 1;
end
end
end
end
end
end
elseif ( level == 3 ) then
-- Essentially the same as level == 2
if ( value ) then
for k,v in pairs(value) do
if ( type(v[1]) == "string" ) then
if ( v[3] == "Submenu" ) then
AtlasLoot_Hewdrop:AddLine(
'text', v[1],
'textR', 1,
'textG', 0.82,
'textB', 0,
'func', AtlasLoot_HewdropClick,
'arg1', v[2],
'arg2', v[1],
'arg3', v[3],
'notCheckable', true
)
else
AtlasLoot_Hewdrop:AddLine(
'text', v[1],
'textR', 1,
'textG', 0.82,
'textB', 0,
'func', AtlasLoot_HewdropClick,
'arg1', v[2],
'arg2', v[1],
'arg3', v[3],
'notCheckable', true
)
end
elseif ( type(v) == "table" ) then
AtlasLoot_Hewdrop:AddLine(
'text', k,
'textR', 1,
'textG', 0.82,
'textB', 0,
'hasArrow', true,
'value', v,
'notCheckable', true
)
end
end
end
end
end,
'dontHook', true
)
end
function AtlasLoot_OpenMenu(menuName)
AtlasLoot_QuickLooks:Hide();
AtlasLootQuickLooksButton:Hide();
AtlasLootDefaultFrame_SelectedCategory:SetText(menuName)
AtlasLootDefaultFrame_SubMenu:Disable();
AtlasLootDefaultFrame_SelectedTable:SetText("");
AtlasLootDefaultFrame_SelectedTable:Show();
AtlasLootCharDB.LastBoss = this.lootpage;
AtlasLootCharDB.LastBossText = menuName;
if ( menuName == AL["Crafting"] ) then
AtlasLoot_ShowItemsFrame("CRAFTINGMENU", "dummy", "dummy")
elseif ( menuName == AL["PvP Rewards"] ) then
AtlasLoot_ShowItemsFrame("PVPMENU", "dummy", "dummy")
elseif ( menuName == AL["World Events"] ) then
AtlasLoot_ShowItemsFrame("WORLDEVENTMENU", "dummy", "dummy")
elseif ( menuName == AL["Collections"] ) then
AtlasLoot_ShowItemsFrame("SETMENU", "dummy", "dummy")
elseif ( menuName == AL["Factions"] ) then
AtlasLoot_ShowItemsFrame("REPMENU", "dummy", "dummy")
elseif ( menuName == AL["World Bosses"] ) then
AtlasLoot_ShowItemsFrame("WORLDBOSSMENU", "dummy", "dummy")
elseif ( menuName == AL["Dungeons & Raids"] ) then
AtlasLoot_ShowItemsFrame("DUNGEONSMENU1", "dummy", "dummy")
end
CloseDropDownMenus()
end
--[[
AtlasLootItemsFrame_OnCloseButton:
Called when the close button on the item frame is clicked
]]
function AtlasLootItemsFrame_OnCloseButton()
-- Set no loot table as currently selected
AtlasLootItemsFrame.activeBoss = nil;
-- Fix the boss buttons so the correct icons are displayed
if ( AtlasFrame and AtlasFrame:IsVisible() ) then
for i = 1, ATLAS_NUM_LINES do
if ( _G["AtlasEntry"..i.."_Selected"] and _G["AtlasEntry"..i.."_Selected"]:IsShown() ) then
_G["AtlasEntry"..i.."_Selected"]:Hide();
_G["AtlasEntry"..i.."_Loot"]:Show();
end
end
end
-- Hide the item frame
AtlasLootItemsFrame:Hide();
end
--[[
AtlasLootMenuItem_OnClick:
Requests the relevant loot page from a menu screen
]]
function AtlasLootMenuItem_OnClick()
if ( this.container ) then
AtlasLoot_ShowContainerFrame()
return
end
if ( this.isheader == nil or this.isheader == false ) then
local pagename = _G[this:GetName().."_Name"]:GetText()
for k,v in ipairs(AtlasLoot_HewdropDown) do
if ( not (type(v[1]) == "table") ) then
for k2, v2 in pairs(v) do
for k3, v3 in pairs(v2) do
for k4, v4 in pairs(v3) do
if ( not (type(v4[1]) == "table") ) then
if ( v4[1] == pagename and v4[3] ~= "Table" ) then
AtlasLoot_HewdropClick(v4[2],v4[1],v4[3])
end
else
for k5,v5 in pairs(v4) do
if ( v5[1] == pagename ) then
AtlasLoot_HewdropClick(v5[2],v5[1],v5[3])
end
end
end
end
end
end
end
end
CloseDropDownMenus()
AtlasLootCharDB.LastBoss = this.lootpage;
AtlasLootCharDB.LastBossText = pagename;
AtlasLoot_ShowBossLoot(this.lootpage, pagename);
AtlasLootDefaultFrame_SelectedCategory:SetText(pagename);
AtlasLootDefaultFrame_SelectedCategory:Show();
end
end
--[[
AtlasLoot_NavButton_OnClick:
Called when <-, -> or 'Back' are pressed and calls up the appropriate loot page
]]
function AtlasLoot_NavButton_OnClick()
if ( AtlasLootItemsFrame.refresh and AtlasLootItemsFrame.refresh[1] and AtlasLootItemsFrame.refresh[2]) then
if ( AtlasLootItemsFrame.refresh[1] == "DUNGEONSMENU1" ) then
AtlasLootItemsFrame.refresh[1] = "DUNGEONSMENU2"
AtlasLoot_DungeonsMenu2()
AtlasLootDefaultFrame_SubMenu:Disable();
return
elseif ( AtlasLootItemsFrame.refresh[1] == "DUNGEONSMENU2" ) then
AtlasLootItemsFrame.refresh[1] = "DUNGEONSMENU1"
AtlasLoot_DungeonsMenu1()
AtlasLootDefaultFrame_SubMenu:Disable();
return
end
if ( string.sub(this.lootpage, 1, 16) == "SearchResultPage" ) then
AtlasLoot_ShowItemsFrame("SearchResult", this.lootpage, string.format((AL["Search Result: %s"]), AtlasLootCharDB.LastSearchedText or ""));
elseif ( string.sub(this.lootpage, 1, 12) == "WishListPage" ) then
AtlasLoot_ShowItemsFrame("WishList", this.lootpage, AL["WishList"]);
else
AtlasLootCharDB.LastBoss = this.lootpage;
AtlasLootCharDB.LastBossText = this.title;
AtlasLoot_ShowItemsFrame(this.lootpage, AtlasLootItemsFrame.refresh[2], this.title);
if ( AtlasLootDefaultFrame_SelectedTable:GetText() ) then
AtlasLootDefaultFrame_SelectedTable:SetText(AtlasLoot_BossName:GetText())
else
AtlasLootDefaultFrame_SelectedCategory:SetText(AtlasLoot_BossName:GetText())
end
end
elseif ( AtlasLootItemsFrame.refresh and AtlasLootItemsFrame.refresh[2] ) then
AtlasLoot_ShowItemsFrame(this.lootpage, AtlasLootItemsFrame.refresh[2], this.title);
else
-- Fallback for if the requested loot page is a menu and does not have a .refresh instance
AtlasLoot_ShowItemsFrame(this.lootpage, "dummy", this.title);
end
for k in pairs(AtlasLoot_MenuList) do
if ( this.lootpage == k ) then
AtlasLootDefaultFrame_SubMenu:Disable();
AtlasLootDefaultFrame_SelectedCategory:SetText(AtlasLootCharDB.LastBossText)
AtlasLootDefaultFrame_SelectedTable:SetText("")
end
end
end
--[[
AtlasLoot_IsLootTableAvailable(dataID):
Checks if a loot table is in memory and attempts to load the correct LoD module if it isn't
dataID: Loot table dataID
]]
function AtlasLoot_IsLootTableAvailable(dataID)
if ( not dataID ) then return false end
local menu_check = false;
for k in pairs(AtlasLoot_MenuList) do
if ( k == dataID ) then
menu_check = true;
end
end
if ( menu_check ) then
return true;
else
if ( not AtlasLoot_TableNames[dataID] ) then
DEFAULT_CHAT_FRAME:AddMessage(RED..AL["AtlasLoot Error!"].." "..WHITE..dataID..AL[" not listed in loot table registry, please report this message to the AtlasLoot forums at http://www.atlasloot.net"]);
return false;
end
local dataSource = AtlasLoot_TableNames[dataID][2];
if ( AtlasLoot_Data[dataSource] ) then
if ( AtlasLoot_Data[dataSource][dataID] ) then
return true;
end
end
end
end
--[[
AtlasLoot_ShowQuickLooks(button)
button: Identity of the button pressed to trigger the function
Shows the GUI for setting Quicklooks
]]
function AtlasLoot_ShowQuickLooks(button)
local Hewdrop = AceLibrary("Hewdrop-2.0");
if ( Hewdrop:IsOpen(button) ) then
Hewdrop:Close(1);
else
local setOptions = function()
Hewdrop:AddLine(
"text", AL["QuickLook"].." 1",
"tooltipTitle", AL["QuickLook"].." 1",
"tooltipText", AL["Assign this loot table\n to QuickLook"].." 1",
"func", function()
AtlasLootCharDB["QuickLooks"][1] = {AtlasLootItemsFrame.refresh[1], AtlasLootItemsFrame.refresh[2], AtlasLootItemsFrame.refresh[3]};
AtlasLoot_RefreshQuickLookButtons();
Hewdrop:Close(1);
end
);
Hewdrop:AddLine(
"text", AL["QuickLook"].." 2",
"tooltipTitle", AL["QuickLook"].." 2",
"tooltipText", AL["Assign this loot table\n to QuickLook"].." 2",
"func", function()
AtlasLootCharDB["QuickLooks"][2] = {AtlasLootItemsFrame.refresh[1], AtlasLootItemsFrame.refresh[2], AtlasLootItemsFrame.refresh[3]};
AtlasLoot_RefreshQuickLookButtons();
Hewdrop:Close(1);
end
);
Hewdrop:AddLine(
"text", AL["QuickLook"].." 3",
"tooltipTitle", AL["QuickLook"].." 3",
"tooltipText", AL["Assign this loot table\n to QuickLook"].." 3",
"func", function()
AtlasLootCharDB["QuickLooks"][3] = {AtlasLootItemsFrame.refresh[1], AtlasLootItemsFrame.refresh[2], AtlasLootItemsFrame.refresh[3]};
AtlasLoot_RefreshQuickLookButtons();
Hewdrop:Close(1);
end
);
Hewdrop:AddLine(
"text", AL["QuickLook"].." 4",
"tooltipTitle", AL["QuickLook"].." 4",
"tooltipText", AL["Assign this loot table\n to QuickLook"].." 4",
"func", function()
AtlasLootCharDB["QuickLooks"][4] = {AtlasLootItemsFrame.refresh[1], AtlasLootItemsFrame.refresh[2], AtlasLootItemsFrame.refresh[3]};
AtlasLoot_RefreshQuickLookButtons();
Hewdrop:Close(1);
end
);
end;
Hewdrop:Open(button,
'point', function(parent)
return "BOTTOMLEFT", "BOTTOMRIGHT";
end,
"children", setOptions
);
end
end
--[[
AtlasLoot_RefreshQuickLookButtons()
Enables/disables the quicklook buttons depending on what is assigned
]]
function AtlasLoot_RefreshQuickLookButtons()
for i = 1, 4 do
if ( not AtlasLootCharDB["QuickLooks"][i] or not AtlasLootCharDB["QuickLooks"][i][1] ) then
_G["AtlasLootPanel_Preset"..i]:Disable();
_G["AtlasLootDefaultFrame_Preset"..i]:Disable();
else
_G["AtlasLootPanel_Preset"..i]:Enable();
_G["AtlasLootDefaultFrame_Preset"..i]:Enable();
end
end
end
--[[
AtlasLoot_ClearQuickLookButton()
Clears a quicklook button.
]]
function AtlasLoot_ClearQuickLookButton(button)
if ( not button ) then return end
AtlasLootCharDB["QuickLooks"][button] = nil
AtlasLoot_RefreshQuickLookButtons()
DEFAULT_CHAT_FRAME:AddMessage(BLUE..AL["AtlasLoot"]..": "..WHITE..AL["QuickLook"].." "..button.." "..AL["has been reset!"]);
end
--[[
AtlasLoot_ShowBossLoot(dataID, boss, pFrame):
dataID - Name of the loot table
boss - Text string to be used as the title for the loot page
pFrame - Data structure describing how and where to anchor the item frame (more details, see the function AtlasLoot_SetItemInfoFrame)
This is the intended API for external mods to use for displaying loot pages.
This function figures out where the loot table is stored, then sends the relevant info to AtlasLoot_ShowItemsFrame
]]
function AtlasLoot_ShowBossLoot(dataID, boss)
-- local tableavailable = AtlasLoot_IsLootTableAvailable(dataID);
-- if ( tableavailable ) then
AtlasLootItemsFrame:Hide();
-- If the loot table is already being displayed, it is hidden and the current table selection cancelled
if ( dataID == AtlasLootItemsFrame.externalBoss and AtlasLootItemsFrame:GetParent() ~= AtlasFrame and AtlasLootItemsFrame:GetParent() ~= AtlasLootDefaultFrame ) then
AtlasLootItemsFrame.externalBoss = nil;
else
-- Use the original WoW instance data by default
local dataSource = AtlasLoot_TableNames[dataID][2];
-- Set selected table and call AtlasLoot_ShowItemsFrame
AtlasLootItemsFrame.externalBoss = dataID;
AtlasLoot_ShowItemsFrame(dataID, dataSource, boss);
end
-- end
end
function AtlasLootOptions_SetupSlider(text, mymin, mymax, step)
_G[this:GetName().."Text"]:SetText(text.." ("..this:GetValue()..")");
this:SetMinMaxValues(mymin, mymax);
_G[this:GetName().."Low"]:SetText(mymin);
_G[this:GetName().."High"]:SetText(mymax);
this:SetValueStep(step);
end
--[[
AtlasLootMinimapButton_OnClick:
Function to show/hide AtlasLoot when click on minimap button.
]]
function AtlasLootMinimapButton_OnClick(arg1)
if ( arg1 == "LeftButton" ) then
AtlasLoot_Toggle();
end
end
--[[
AtlasLootMinimapButton_Init:
Show/hide minimap button.
]]
function AtlasLootMinimapButton_Init()
if ( AtlasLootCharDB.MinimapButton == true ) then
AtlasLootMinimapButtonFrame:Show();
else
AtlasLootMinimapButtonFrame:Hide();
end
end
--[[
AtlasLootMinimapButton_OnEnter:
Show tooltip when mouse is over minimap button.
]]
function AtlasLootMinimapButton_OnEnter()
GameTooltip:SetOwner(this, "ANCHOR_LEFT");
GameTooltip:SetText(AL["AtlasLoot Enhanced"]);
GameTooltipTextLeft1:SetTextColor(1, 1, 1);
GameTooltip:AddLine(AL["Left-click to open AtlasLoot.\nMiddle-click for AtlasLoot options.\nRight-click and drag to move this button."]);
GameTooltip:Show();
end
--[[
AtlasLootButton_UpdatePosition:
Function to move the minimap button around the minimap.
]]
function AtlasLootMinimapButton_UpdatePosition()
AtlasLootMinimapButtonFrame:SetPoint(
"TOPLEFT",
"Minimap",
"TOPLEFT",
54 - (AtlasLootCharDB.MinimapButtonRadius * cos(AtlasLootCharDB.MinimapButtonPosition)),
(AtlasLootCharDB.MinimapButtonRadius * sin(AtlasLootCharDB.MinimapButtonPosition)) - 55
);
AtlasLootOptions_Init()
end
local function around(num, idp)
local mult = 10 ^ (idp or 0);
return math.floor(num * mult + 0.5) / mult;
end
function AtlasLootOptions_UpdateSlider(text)
_G[this:GetName().."Text"]:SetText(text.." ("..around(this:GetValue(),2)..")");
end
function AtlasLootOptions_ResetPosition()
AtlasLootCharDB.MinimapButtonPosition = 315;
AtlasLootCharDB.MinimapButtonRadius = 78;
AtlasLootMinimapButton_UpdatePosition();
DEFAULT_CHAT_FRAME:AddMessage(BLUE..AL["AtlasLoot"]..": "..RED..AL["Minimap button has been reset!"]);
end
function AtlasLootOptions_DefaultSettings()
-- AtlasLootCharDB.SafeLinks = false;
-- AtlasLootCharDB.AllLinks = true;
AtlasLootCharDB.DefaultTT = true;
AtlasLootCharDB.LootlinkTT = false;
AtlasLootCharDB.ItemSyncTT = false;
AtlasLootCharDB.ShowSource = true;
AtlasLootCharDB.EquipCompare = false;
AtlasLootCharDB.Opaque = false;
AtlasLootCharDB.ItemIDs = false;
-- AtlasLootCharDB.ItemSpam = true;
AtlasLootCharDB.MinimapButton = true;
AtlasLootCharDB.HidePanel = false;
-- AtlasLootCharDB.AutoQuery = false;
AtlasLootCharDB.PartialMatching = true;
AtlasLootCharDB.LastBoss = "DUNGEONSMENU1";
AtlasLootCharDB.LastBossText = AL["Dungeons & Raids"];
AtlasLootDefaultFrame:ClearAllPoints();
AtlasLootDefaultFrame:SetPoint("TOP", "UIParent", "TOP", 0, -30);
AtlasLootOptionsFrame:ClearAllPoints();
AtlasLootOptionsFrame:SetPoint("CENTER", "UIParent", "CENTER", 0, 100);
AtlasLootCharDB["QuickLooks"] = {};
AtlasLootCharDB["WishList"] = {};
AtlasLoot_RefreshQuickLookButtons();
AtlasLootOptions_Init();
DEFAULT_CHAT_FRAME:AddMessage(BLUE..AL["AtlasLoot"]..": "..RED..AL["Default settings applied!"]);
end
--[[
AtlasLootButton_BeingDragged:
Function to move the minimap button around the minimap.
]]
function AtlasLootMinimapButton_BeingDragged()
local xpos,ypos = GetCursorPosition()
local xmin,ymin = Minimap:GetLeft(), Minimap:GetBottom()
xpos = xmin-xpos/UIParent:GetScale()+70
ypos = ypos/UIParent:GetScale()-ymin-70
AtlasLootMinimapButton_SetPosition(math.deg(math.atan2(ypos,xpos)));
end
--[[
AtlasLootButton_SetPosition:
Function to save the position of the minimap button.
]]
function AtlasLootMinimapButton_SetPosition(v)
if ( v < 0 ) then
v = v + 360;
end
AtlasLootCharDB.MinimapButtonPosition = v;
AtlasLootMinimapButton_UpdatePosition();
end
--------------------------------------------------------------------------------
-- Item OnEnter
-- Called when a loot item is moused over
--------------------------------------------------------------------------------
local stringArgs = {}
local messageShown = false
function AtlasLootItem_OnEnter()
local isItem, isEnchant, isSpell;
local buttonID = this:GetID()
AtlasLootTooltip:ClearLines();
for i = 1, 30, 1 do
if ( _G["AtlasLootTooltipTextRight"..i] ) then
_G["AtlasLootTooltipTextRight"..i]:SetText("");
end
end
if ( not ( this.itemID and this.itemID ~= 0 ) ) then
return
end
if ( string.sub(this.itemID, 1, 1) == "s" ) then
isItem = false;
isEnchant = false;
isSpell = true;
elseif ( string.sub(this.itemID, 1, 1) == "e" ) then
isItem = false;
isEnchant = true;
isSpell = false;
else
isItem = true;
isEnchant = false;
isSpell = false;
end
if ( isItem ) then
local name, link, quality = GetItemInfo(this.itemID)
local _, _, _, color = GetItemQualityColor(quality or 1)
-- local color = strsub(_G["AtlasLootItem_"..buttonID.."_Name"]:GetText(), 3, 10);
-- local name = strsub(_G["AtlasLootItem_"..buttonID.."_Name"]:GetText(), 11);
-- Lootlink tooltips
if ( AtlasLootCharDB.LootlinkTT ) then
-- If we have seen the item, use the game tooltip to minimise same name item problems
if ( name ) then
AtlasLootTooltip:SetOwner(this, "ANCHOR_RIGHT", -(this:GetWidth() / 2), 24);
AtlasLootTooltip:SetHyperlink("item:"..this.itemID..":0:0:0");
if ( AtlasLootCharDB.ItemIDs ) then
AtlasLootTooltip:AddLine(AL["ItemID:"].." "..this.itemID);
end
if ( this.droprate ) then
AtlasLootTooltip:AddLine(AL["Drop Rate: "]..this.droprate, 1, 1, 0);
end
AtlasLootTooltip:Show();
if ( LootLink_AddItem ) then
LootLink_AddItem(name, this.itemID..":0:0:0", color);
end
else
AtlasLootTooltip:SetOwner(this, "ANCHOR_RIGHT", -(this:GetWidth() / 2), 24);
if ( LootLink_Database and LootLink_Database[this.itemID] ) then
LootLink_SetTooltip(AtlasLootTooltip, LootLink_Database[this.itemID][1], 1);
else
LootLink_SetTooltip(AtlasLootTooltip, name, 1);
end
if ( AtlasLootCharDB.ItemIDs ) then
AtlasLootTooltip:AddLine(AL["ItemID:"].." "..this.itemID);
end
if ( this.droprate ) then
AtlasLootTooltip:AddLine(AL["Drop Rate: "]..this.droprate, 1, 1, 0, 1);
end
AtlasLootTooltip:Show();
end
-- Item Sync tooltips
elseif ( AtlasLootCharDB.ItemSyncTT ) then
ItemSync:ButtonEnter();
if ( AtlasLootCharDB.ItemIDs ) then
GameTooltip:AddLine(AL["ItemID:"].." "..this.itemID);
end
if ( this.droprate ) then
GameTooltip:AddLine(AL["Drop Rate: "]..this.droprate, 1, 1, 0);
end
GameTooltip:Show();
-- Default game tooltips
else
AtlasLootTooltip:SetOwner(this, "ANCHOR_RIGHT", -(this:GetWidth() / 2), 24);
if ( GetItemInfo(this.itemID) ) then
AtlasLootTooltip:SetHyperlink("item:"..this.itemID..":0:0:0");
else
AtlasLootTooltip:SetText(AL["Retrieving item information"], RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
end
if ( AtlasLootCharDB.ItemIDs ) then
AtlasLootTooltip:AddLine(AL["ItemID:"].." "..this.itemID);
end
if ( this.droprate ) then
AtlasLootTooltip:AddLine(AL["Drop Rate: "]..this.droprate, 1, 1, 0);
end
AtlasLootTooltip:Show();
end
elseif ( isEnchant ) then
local spellID = tonumber(string.sub(this.itemID, 2));
AtlasLootTooltip:SetOwner(this, "ANCHOR_NONE");
AtlasLootTooltip:SetPoint("BOTTOMLEFT", this, "TOPRIGHT", -(this:GetWidth() / 2), 24)
AtlasLootTooltip:ClearLines();
if ( SetAutoloot == nil or (SUPERWOW_VERSION and (tonumber(SUPERWOW_VERSION)) >= 1.2) ) then
AtlasLootTooltip:SetHyperlink("enchant:"..spellID)
else
AtlasLootTooltip:SetHyperlink("spell:"..spellID);
if ( not messageShown ) then
DEFAULT_CHAT_FRAME:AddMessage(BLUE..AL["AtlasLoot"]..": "..WHITE.."Old version of SuperWoW detected, please download the latest version from https://github.com/balakethelock/SuperWoW/releases/tag/Release")
messageShown = true
end
end
local _, _, longCooldown = strfind(AtlasLootTooltipTextRight2:GetText() or "", gsub(SPELL_RECAST_TIME_MIN, "%%%.3g", "(.+)"))
if ( longCooldown and strfind(longCooldown, "e%+") ) then
longCooldown = tonumber(longCooldown) / 60 / 24
if ( longCooldown > 1 ) then
longCooldown = format(AL.DAYS_COOLDOWN, longCooldown)
else
longCooldown = format(AL.DAYS_COOLDOWN_1, longCooldown)
end
AtlasLootTooltipTextRight2:SetText(longCooldown)
end
if ( AtlasLootCharDB.ItemIDs ) then
AtlasLootTooltip:AddLine(AL["SpellID:"].." "..spellID);
end
AtlasLootTooltip:Show();
local item = tonumber(GetSpellInfoAtlasLootDB["enchants"][spellID]["item"])
local extra = GetSpellInfoAtlasLootDB["enchants"][spellID]["extra"]
if ( not ( item and item ~= 0 ) ) then
return
end
AtlasLootTooltip2:SetOwner(this, "ANCHOR_NONE");
AtlasLootTooltip2:SetPoint("TOPLEFT", AtlasLootTooltip, "BOTTOMLEFT", 0, 0)
AtlasLootTooltip2:ClearLines();
if ( not GetItemInfo(item) ) then
AtlasLootTooltip2:SetText(AL["Retrieving item information"], RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
else
AtlasLootTooltip2:SetHyperlink("item:"..item);
if ( extra ) then
AtlasLootTooltip2:AddLine(extra, 1, 1, 1, 1);
end
end
if ( AtlasLootCharDB.ItemIDs ) then
AtlasLootTooltip2:AddLine(AL["ItemID:"].." "..item);
end
AtlasLootTooltip2:Show();
-- Reposition if tooltips overlap
local bottom = AtlasLootTooltip:GetBottom()
local top = AtlasLootTooltip2:GetTop()
if ( top and bottom and bottom < top ) then
AtlasLootTooltip2:ClearAllPoints()
AtlasLootTooltip2:SetPoint("TOPLEFT", this, "TOPRIGHT", -(this:GetWidth() / 2), 24)
AtlasLootTooltip:ClearAllPoints()
AtlasLootTooltip:SetPoint("BOTTOMLEFT", AtlasLootTooltip2, "TOPLEFT", 0, 0)
end
elseif ( isSpell ) then
local spellID = tonumber(string.sub(this.itemID, 2));
AtlasLootTooltip:SetOwner(this, "ANCHOR_NONE");
AtlasLootTooltip:SetPoint("BOTTOMLEFT", this, "TOPRIGHT", -(this:GetWidth() / 2), 24)
AtlasLootTooltip:ClearLines();
if ( SpellInfo ) then
AtlasLootTooltip:SetHyperlink("enchant:"..spellID)
local _, _, longCooldown = strfind(AtlasLootTooltipTextRight2:GetText() or "", gsub(SPELL_RECAST_TIME_MIN, "%%%.3g", "(.+)"))
if ( longCooldown and strfind(longCooldown, "e%+") ) then
longCooldown = tonumber(longCooldown) / 60 / 24
if ( longCooldown > 1 ) then
longCooldown = format(AL.DAYS_COOLDOWN, longCooldown)
else
longCooldown = format(AL.DAYS_COOLDOWN_1, longCooldown)
end
AtlasLootTooltipTextRight2:SetText(longCooldown)
end
else
local name = GetSpellInfoAtlasLootDB["craftspells"][spellID]["name"]
local castTime = GetSpellInfoAtlasLootDB["craftspells"][spellID]["castTime"]
local cooldown = GetSpellInfoAtlasLootDB["craftspells"][spellID]["cooldown"]
local tools = GetSpellInfoAtlasLootDB["craftspells"][spellID]["tools"]
local reagents = GetSpellInfoAtlasLootDB["craftspells"][spellID]["reagents"]
local text = GetSpellInfoAtlasLootDB["craftspells"][spellID]["text"]
AtlasLootTooltip:SetText(name, 1, 1, 1, 1, false)
if ( castTime < 60 ) then
castTime = format(SPELL_CAST_TIME_SEC, castTime)
else
castTime = format(SPELL_CAST_TIME_MIN, castTime / 60)
end
if ( cooldown ) then
if ( cooldown < 86400 ) then
if ( cooldown < 60 ) then
cooldown = format(SPELL_RECAST_TIME_SEC, cooldown)
else
cooldown = format(SPELL_RECAST_TIME_MIN, cooldown / 60)
end
elseif ( cooldown / 60 / 60 / 24 == 1 ) then
cooldown = format(AL.DAYS_COOLDOWN_1, cooldown / 60 / 60 / 24)
else
cooldown = format(AL.DAYS_COOLDOWN, cooldown / 60 / 60 / 24)
end
AtlasLootTooltip:AddDoubleLine(castTime, cooldown, 1, 1, 1, 1, 1, 1)
else
AtlasLootTooltip:AddLine(castTime, 1, 1, 1)
end
if ( type(tools) == "table" ) then
for i = getn(stringArgs), 1, -1 do
tremove(stringArgs, i)
end
for j = 1, getn(tools) do
if ( AtlasLoot_CacheItem(tools[j]) == false ) then
AtlasLootItemsFrame.refreshTime = refreshTimeout
AtlasLootItemsFrame.queue[tools[j]] = true
end
tinsert(stringArgs, (GetItemInfo(tools[j]) or ""))
tinsert(stringArgs, AtlasLoot_CheckBagsForItems(tools[j]))
end
AtlasLootTooltip:AddLine(SPELL_TOTEMS..BuildColoredListString(unpack(stringArgs)), 1, 1, 1, false)
end
if ( type(reagents) == "table" ) then
for i = getn(stringArgs), 1, -1 do
tremove(stringArgs, i)
end
for j = 1, getn(reagents) do
if ( reagents[j][2] and reagents[j][2] > 1 ) then
if ( AtlasLoot_CacheItem(reagents[j][1]) == false ) then
AtlasLootItemsFrame.refreshTime = refreshTimeout
AtlasLootItemsFrame.queue[reagents[j][1]] = true
end
tinsert(stringArgs, ((GetItemInfo(reagents[j][1])) or "").." ("..reagents[j][2]..")")
else
tinsert(stringArgs, ((GetItemInfo(reagents[j][1])) or ""))
end
tinsert(stringArgs, AtlasLoot_CheckBagsForItems(reagents[j][1], reagents[j][2]))
end
AtlasLootTooltip:AddLine(SPELL_REAGENTS..BuildColoredListString(unpack(stringArgs)), 1, 1, 1, true)
end
if ( text ) then
AtlasLootTooltip:AddLine(text, 1, 0.82, 0, true)
end
end
if ( AtlasLootCharDB.ItemIDs ) then
AtlasLootTooltip:AddLine(AL["SpellID:"].." "..spellID);
end
AtlasLootTooltip:Show();
local craftItem = tonumber(GetSpellInfoAtlasLootDB["craftspells"][spellID]["craftItem"])
local extra = GetSpellInfoAtlasLootDB["craftspells"][spellID]["extra"]
if ( not ( craftItem and craftItem ~= 0 ) ) then
return
end
AtlasLootTooltip2:SetOwner(this, "ANCHOR_NONE");
AtlasLootTooltip2:SetPoint("TOPLEFT", AtlasLootTooltip, "BOTTOMLEFT", 0, 0)
AtlasLootTooltip2:ClearLines();
if ( not GetItemInfo(craftItem) ) then
AtlasLootTooltip2:SetText(AL["Retrieving item information"], RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
else
AtlasLootTooltip2:SetHyperlink("item:"..craftItem);
if ( extra ) then
AtlasLootTooltip2:AddLine(extra, 1, 1, 1, 1);
end
end
if ( AtlasLootCharDB.ItemIDs ) then
AtlasLootTooltip2:AddLine(AL["ItemID:"].." "..craftItem);
end
AtlasLootTooltip2:Show();
-- Reposition if tooltips overlap
local bottom = AtlasLootTooltip:GetBottom()
local top = AtlasLootTooltip2:GetTop()
if ( bottom and top and bottom < top ) then
AtlasLootTooltip2:ClearAllPoints()
AtlasLootTooltip2:SetPoint("TOPLEFT", this, "TOPRIGHT", -(this:GetWidth() / 2), 24)
AtlasLootTooltip:ClearAllPoints()
AtlasLootTooltip:SetPoint("BOTTOMLEFT", AtlasLootTooltip2, "TOPLEFT", 0, 0)
end
end
end
--------------------------------------------------------------------------------
-- Item OnLeave
-- Called when the mouse cursor leaves a loot item
--------------------------------------------------------------------------------
function AtlasLootItem_OnLeave()
AtlasLootTooltip:Hide();
AtlasLootTooltip2:Hide();
GameTooltip:Hide();
ShoppingTooltip1:Hide();
ShoppingTooltip2:Hide();
end
--------------------------------------------------------------------------------
-- Item OnClick
-- Called when a loot item is clicked on
--------------------------------------------------------------------------------
function AtlasLootItem_OnClick()
local isItem, isEnchant, isSpell;
local name = _G["AtlasLootItem_"..this:GetID().."_Name"]:GetText();
local _, _, color = strfind(name, "(|cff%x%x%x%x%x%x)");
color = color or NORMAL_FONT_COLOR_CODE
name = gsub(name, "|cff%x%x%x%x%x%x", "")
name = gsub(name, "|r", "")
local id = this:GetID();
local _, _, texture = strfind(_G["AtlasLootItem_"..this:GetID().."_Icon"]:GetTexture() or "", ".+\\(.+)$")
texture = texture or "INV_Misc_QuestionMark"
local dataID = AtlasLootItemsFrame.refresh[1]
local dataSource = AtlasLootItemsFrame.refresh[2]
local bossName = AtlasLootItemsFrame.refresh[3]
if ( string.sub(this.itemID, 1, 1) == "s" ) then
isItem = false;
isEnchant = false;
isSpell = true;
elseif ( string.sub(this.itemID, 1, 1) == "e" ) then
isItem = false;
isEnchant = true;
isSpell = false;
else
isItem = true;
isEnchant = false;
isSpell = false;
end
if ( isItem ) then
local itemName, itemLink = GetItemInfo(this.itemID);
-- If shift-clicked, link in the chat window
if ( itemName and IsShiftKeyDown() and this.itemID ~= 0 ) then
if ( WIM_EditBoxInFocus ) then
WIM_EditBoxInFocus:Insert(color.."|Hitem:"..this.itemID..":0:0:0|h["..itemName.."]|h|r");
elseif ( ChatFrameEditBox:IsVisible() ) then
ChatFrameEditBox:Insert(color.."|Hitem:"..this.itemID..":0:0:0|h["..itemName.."]|h|r");
else
AtlasLoot_SayItemReagents(this.itemID, color, itemName);
end
-- If control-clicked, use the dressing room
elseif ( IsControlKeyDown() and itemLink ) then
DressUpItemLink(itemLink);
elseif ( IsAltKeyDown() and this.itemID ~= 0 ) then
if ( dataID == "WishList" ) then
AtlasLoot_DeleteFromWishList(this.itemID);
elseif ( dataID == "SearchResult" ) then
AtlasLoot_AddToWishlist(AtlasLoot:GetOriginalDataFromSearchResult(this.itemID));
else
AtlasLoot_AddToWishlist(this.itemID, texture, this.itemIDName, this.itemIDExtra, dataID.."|"..dataSource);
end
elseif ( (dataID == "SearchResult" or dataID == "WishList") and this.sourcePage ) then
local _, _, dataID, dataSource = strfind(this.sourcePage, "(.+)|(.+)");
if ( dataID and dataSource --[[and AtlasLoot_IsLootTableAvailable(dataID)]] ) then
AtlasLoot_ShowItemsFrame(dataID, dataSource, AtlasLoot_TableNames[dataID][1]);
end
elseif ( this.container ) then
AtlasLoot_ShowContainerFrame()
end
elseif ( isEnchant ) then
if ( IsShiftKeyDown() ) then
AtlasLoot_SayItemReagents(this.itemID, color, name)
elseif ( IsAltKeyDown() and this.itemID ~= 0 ) then
if ( dataID == "WishList" ) then
AtlasLoot_DeleteFromWishList(this.itemID);
elseif ( dataID == "SearchResult" ) then
AtlasLoot_AddToWishlist(AtlasLoot:GetOriginalDataFromSearchResult(this.itemID));
else
AtlasLoot_AddToWishlist(this.itemID, texture, this.itemIDName, this.itemIDExtra, dataID.."|"..dataSource);
end
elseif ( IsControlKeyDown() and this.dressingroomID ) then
DressUpItemLink("item:"..this.dressingroomID..":0:0:0");
elseif ( (dataID == "SearchResult" or dataID == "WishList") and this.sourcePage ) then
local _, _, dataID, dataSource = strfind(this.sourcePage, "(.+)|(.+)");
if ( dataID and dataSource --[[and AtlasLoot_IsLootTableAvailable(dataID)]] ) then
AtlasLoot_ShowItemsFrame(dataID, dataSource, bossName);
end
end
elseif ( isSpell ) then
if ( IsShiftKeyDown() ) then
local spellID = tonumber(string.sub(this.itemID, 2))
local craftitem = tonumber(GetSpellInfoAtlasLootDB["craftspells"][spellID]["craftItem"])
local craftname = GetItemInfo(craftitem or 0)
if ( WIM_EditBoxInFocus ) then
if ( craftitem and craftitem ~= 0 and craftname ) then
WIM_EditBoxInFocus:Insert(color.."|Hitem:"..craftitem..":0:0:0|h["..craftname.."]|h|r");
else
WIM_EditBoxInFocus:Insert(color.."|Henchant:"..spellID.."|h["..name.."]|h|r");
end
elseif ( ChatFrameEditBox:IsVisible() ) then
if ( craftitem and craftitem ~= 0 and craftname ) then
ChatFrameEditBox:Insert(color.."|Hitem:"..craftitem..":0:0:0|h["..craftname.."]|h|r");
else
ChatFrameEditBox:Insert(color.."|Henchant:"..spellID.."|h["..name.."]|h|r");
end
else
AtlasLoot_SayItemReagents(this.itemID, color, name)
end
elseif ( IsAltKeyDown() and this.itemID ~= 0 ) then
if ( dataID == "WishList" ) then
AtlasLoot_DeleteFromWishList(this.itemID);
elseif ( dataID == "SearchResult" ) then
AtlasLoot_AddToWishlist(AtlasLoot:GetOriginalDataFromSearchResult(this.itemID));
else
AtlasLoot_AddToWishlist(this.itemID, texture, this.itemIDName, this.itemIDExtra, dataID.."|"..dataSource);
end
elseif ( IsControlKeyDown() and this.dressingroomID ) then
DressUpItemLink("item:"..this.dressingroomID..":0:0:0");
elseif ( (dataID == "SearchResult" or dataID == "WishList") and this.sourcePage ) then
local _, _, dataID, dataSource = strfind(this.sourcePage, "(.+)|(.+)");
if ( dataID and dataSource --[[and AtlasLoot_IsLootTableAvailable(dataID)]] ) then
AtlasLoot_ShowItemsFrame(dataID, dataSource, bossName);
end
end
end
end
-- retun true if item is cached, false if argument is a valid link or id, but its not cahced yet, nil otherwise
function AtlasLoot_CacheItem(linkOrID)
if ( not linkOrID or linkOrID == 0 ) then
return nil
end
if ( tonumber(linkOrID )) then
if GetItemInfo(linkOrID) then
return true
else
AtlasLootCacheTooltip:SetHyperlink("item:"..linkOrID)
return false
end
else
if ( type(linkOrID) ~= "string" ) then
return nil
end
local _, _, item = strfind(linkOrID, "(item:%d+:%d+:%d+:%d+)")
if ( item ) then
if ( GetItemInfo(item) ) then
return true
else
AtlasLootCacheTooltip:SetHyperlink(item)
return false
end
end
end
end
local containerItemFrames = {}
local lastSelectedButton
function AtlasLoot_ShowContainerFrame()
local containerTable = this.container
if ( not containerTable ) then
return
end
if ( this ~= lastSelectedButton ) then
AtlasLootItemsFrameContainer:Show()
lastSelectedButton = this
elseif ( AtlasLootItemsFrameContainer:IsVisible() ) then
AtlasLootItemsFrameContainer:Hide()
lastSelectedButton = nil
return
end
if ( not AtlasLootItemsFrameContainer:IsVisible() and lastSelectedButton == this ) then
AtlasLootItemsFrameContainer:Show()
end
for i = 1, getn(containerItemFrames) do
_G["AtlasLootContainerItem"..i]:Hide()
end
local row = 0
local col = 0
local buttonIndex = 1
local maxCols = 1
for i = 1, getn(containerTable) do
col = 0
for j = 1, getn(containerTable[i]) do
if ( not containerItemFrames[buttonIndex] ) then
containerItemFrames[buttonIndex] = CreateFrame("Button", "AtlasLootContainerItem"..buttonIndex, AtlasLootItemsFrameContainer, "AtlasLootContainerItemTemplate")
end
local itemButton = _G["AtlasLootContainerItem"..buttonIndex]
local itemID = containerTable[i][j][1]
AtlasLoot_CacheItem(itemID)
itemButton.extraInfo = containerTable[i][j][2]
itemButton.dressingroomID = itemID
local _, _, quality, _, _, _, _, _, tex = GetItemInfo(itemID)
local icon = _G["AtlasLootContainerItem"..buttonIndex.."Icon"]
local r, g, b = 1, 1, 1
if ( quality ) then
r, g, b = GetItemQualityColor(quality)
end
if ( not tex ) then
tex = "Interface\\Icons\\INV_Misc_QuestionMark"
end
itemButton:SetPoint("TOPLEFT", AtlasLootItemsFrameContainer, (col * 35) + 5, -(row * 35) - 5)
itemButton:SetBackdropBorderColor(r, g, b)
itemButton:SetID(itemID)
itemButton:Show()
icon:SetTexture(tex)
col = col + 1
if ( col > maxCols ) then
maxCols = col
end
buttonIndex = buttonIndex + 1
end
row = row + 1
end
AtlasLootItemsFrameContainer:SetPoint("TOPLEFT", this , "BOTTOMLEFT", -2, 2)
AtlasLootItemsFrameContainer:SetWidth(16 + (maxCols * 35))
AtlasLootItemsFrameContainer:SetHeight(16 + (row * 35))
end
function AtlasLoot_ContainerItem_OnEnter()
local itemID = this:GetID()
if ( not itemID ) then
return
end
AtlasLootTooltip:SetOwner(this, "ANCHOR_RIGHT", -(this:GetWidth() / 4), -(this:GetHeight() / 4))
AtlasLootTooltip:SetHyperlink("item:"..tostring(itemID))
AtlasLootTooltip.itemID = itemID
local numLines = AtlasLootTooltip:NumLines()
if ( AtlasLootCharDB.ItemIDs ) then
if ( numLines and numLines > 0 ) then
local lastLine = _G["AtlasLootTooltipTextLeft"..numLines]
if ( lastLine:GetText() ) then
lastLine:SetText(lastLine:GetText().."\n\n"..DEFAULT..AL["ItemID:"].." "..itemID)
end
end
end
AtlasLootTooltip:Show()
local icon = _G[this:GetName().."Icon"]
if ( icon:GetTexture() == "Interface\\Icons\\INV_Misc_QuestionMark" ) then
local _, _, quality, _, _, _, _, _, tex = GetItemInfo(itemID)
if ( tex and quality ) then
local r, g, b = GetItemQualityColor(quality)
icon:SetTexture(tex)
this:SetBackdropBorderColor(r, g, b)
end
end
end
function AtlasLoot_ContainerItem_OnLeave()
AtlasLootTooltip:Hide()
AtlasLootTooltip.itemID = nil
end
function AtlasLoot_ContainerItem_OnClick(arg1)
local itemID = this:GetID()
local name, link, quality, _, _, _, _, _, tex = GetItemInfo(itemID or 0)
if ( not name ) then
return
end
local _, _, _, color = GetItemQualityColor(quality)
tex = string.gsub(tex, "Interface\\Icons\\", "")
local extra = this.extraInfo
local lootpage, dataSource
if ( lastSelectedButton ) then
lootpage = lastSelectedButton.lootpage
dataSource = lastSelectedButton.dataSource
end
if ( IsShiftKeyDown() and arg1 == "LeftButton" ) then
if ( WIM_EditBoxInFocus ) then
WIM_EditBoxInFocus:Insert(color.."|Hitem:"..itemID..":0:0:0|h["..name.."]|h|r");
elseif ( ChatFrameEditBox:IsVisible() ) then
ChatFrameEditBox:Insert(color.."|Hitem:"..itemID..":0:0:0|h["..name.."]|h|r");
end
elseif ( IsControlKeyDown() and link ) then
DressUpItemLink(link);
elseif ( IsAltKeyDown() and itemID ~= 0 ) then
if ( lootpage and dataSource ) then
AtlasLoot_AddToWishlist(itemID, tex, name, extra, lootpage.."|"..dataSource)
elseif ( AtlasLootItemsFrame.refresh ) then
local dataID = AtlasLootItemsFrame.refresh[1]
local dataSource = AtlasLootItemsFrame.refresh[2]
if ( dataID == "WishList" ) then
AtlasLoot_DeleteFromWishList(this.itemID);
elseif ( dataID == "SearchResult" ) then
AtlasLoot_AddToWishlist(AtlasLoot:GetOriginalDataFromSearchResult(itemID));
else
AtlasLoot_AddToWishlist(itemID, tex, name, extra, dataID.."|"..dataSource);
end
end
end
end
--[[
AtlasLoot_QueryLootPage()
Querys all valid items on the current loot page.
]]
function AtlasLoot_QueryLootPage()
for i = 1, 30 do
local button = _G["AtlasLootItem_"..i];
local queryitem = button.itemID;
if ( (queryitem) and (queryitem ~= "") and (queryitem ~= 0) and
(string.sub(queryitem, 1, 1) ~= "s") and (string.sub(queryitem, 1, 1) ~= "e") ) then
if ( not GetItemInfo(queryitem) ) then
AtlasLootCacheTooltip:SetHyperlink("item:"..queryitem..":0:0:0");
end
end
end
end
local function idFromLink(itemlink)
if ( itemlink ) then
local _,_,id = string.find(itemlink, "|Hitem:([^:]+)%:")
return tonumber(id)
end
return nil
end
function AtlasLoot_CheckBagsForItems(id, qty)
if ( not id ) then DEFAULT_CHAT_FRAME:AddMessage("AtlasLoot_CheckBagsForItems: no ID specified!") return end
if ( not qty ) then qty = 1 end
local itemsfound = 0;
local itemName = GetItemInfo(id);
if ( not itemName ) then return nil end
for i = 0, NUM_BAG_FRAMES do
for j = 1, GetContainerNumSlots(i) do
local itemLink = GetContainerItemLink(i, j)
if ( itemLink and idFromLink(itemLink) == tonumber(id) ) then
local _, stackCount = GetContainerItemInfo(i, j)
itemsfound = itemsfound + stackCount
end
end
end
if ( itemsfound < qty ) then
return nil
else
return 1
end
end
function AtlasLoot_SayItemReagents(id, color, name, safe)
if ( not id ) then return end
local chatline = "";
local itemCount = 0;
name = gsub(name, "|cff%x%x%x%x%x%x", "")
name = gsub(name, "|r", "")
color = color or NORMAL_FONT_COLOR_CODE
local tListActivity = {}
local tCount = 0
if ( WIM_IconItems and WIM_Icon_SortByActivity ) then
for key in pairs(WIM_IconItems) do
table.insert(tListActivity, key)
tCount = tCount + 1
end
table.sort(tListActivity, WIM_Icon_SortByActivity)
end
local channel, chatnumber
if ( tListActivity[1] and WIM_Windows and WIM_Windows[tListActivity[1]].is_visible ) then
channel = "WHISPER";
chatnumber = tListActivity[1];
else
channel = ChatFrameEditBox.chatType;
if ( channel == "WHISPER" ) then
chatnumber = ChatFrameEditBox.tellTarget
elseif ( channel == "CHANNEL" ) then
chatnumber = ChatFrameEditBox.channelTarget
end
end
if ( string.sub(id, 1, 1) == "s" ) then
local spellID = tonumber(string.sub(id, 2))
local craftItem = tonumber(GetSpellInfoAtlasLootDB["craftspells"][spellID]["craftItem"])
if ( craftItem and craftItem ~= 0 ) then
local craftnumber = "";
local qtyMin = GetSpellInfoAtlasLootDB["craftspells"][spellID]["craftQuantityMin"];
local qtyMax = GetSpellInfoAtlasLootDB["craftspells"][spellID]["craftQuantityMax"];
if ( qtyMin ) then
if ( qtyMax ) then
craftnumber = craftnumber..qtyMin.. "-"..qtyMax.."x"
else
craftnumber = craftnumber..qtyMin.."x"
end
end
SendChatMessage(AL["To craft "]..craftnumber..AtlasLoot_GetChatLink(craftItem)..AL[" the following reagents are needed:"], channel, nil, chatnumber);
local reagents = GetSpellInfoAtlasLootDB["craftspells"][spellID]["reagents"]
if ( type(reagents) == "table" ) then
for j = 1, table.getn(reagents) do
local tempnumber = reagents[j][2]
if ( not tempnumber or tempnumber == nil or tempnumber == "" ) then
tempnumber = 1;
end
chatline = chatline..tempnumber.."x"..AtlasLoot_GetChatLink(reagents[j][1]).." ";
itemCount = itemCount + 1;
if ( itemCount == 4 ) then
SendChatMessage(chatline, channel, nil, chatnumber);
chatline = "";
itemCount = 0;
end
end
end
if ( itemCount > 0 ) then
SendChatMessage(chatline, channel, nil, chatnumber);
end
else
local reagents = GetSpellInfoAtlasLootDB["craftspells"][spellID]["reagents"]
SendChatMessage(AL["To cast "]..NORMAL_FONT_COLOR_CODE.."|Henchant:"..spellID.."|h["..name.."]|h|r"..AL[" the following items are needed:"], channel, nil, chatnumber);
if ( type(reagents) == "table" ) then
for j = 1, table.getn(reagents) do
local tempnumber = reagents[j][2]
if ( not tempnumber or tempnumber == nil or tempnumber == "" ) then
tempnumber = 1;
end
chatline = chatline..tempnumber.."x"..AtlasLoot_GetChatLink(reagents[j][1]).." ";
itemCount = itemCount + 1;
if ( itemCount == 4 ) then
SendChatMessage(chatline, channel, nil, chatnumber);
chatline = "";
itemCount = 0;
end
end
end
if ( itemCount > 0 ) then
SendChatMessage(chatline, channel, nil, chatnumber);
end
end
elseif ( string.sub(id, 1, 1) == "e" ) then
local spellID = tonumber(string.sub(id, 2))
local item = tonumber(GetSpellInfoAtlasLootDB["enchants"][spellID]["item"])
if ( tListActivity[1] and WIM_Windows[tListActivity[1]].is_visible ) then
if ( not item ) then
SendChatMessage(NORMAL_FONT_COLOR_CODE.."|Henchant:"..spellID.."|h["..name.."]|h|r", channel, nil, chatnumber);
else
SendChatMessage(AL["To craft "]..AtlasLoot_GetChatLink(item)..AL[" you need this: "]..NORMAL_FONT_COLOR_CODE.."|Henchant:"..spellID.."|h["..name.."]|h|r", channel, nil, chatnumber);
end
elseif ( ChatFrameEditBox:IsVisible() ) then
if ( not item ) then
ChatFrameEditBox:Insert(NORMAL_FONT_COLOR_CODE.."|Henchant:"..spellID.."|h["..name.."]|h|r", channel, nil, chatnumber);
else
ChatFrameEditBox:Insert(AL["To craft "]..AtlasLoot_GetChatLink(item)..AL[" you need this: "]..NORMAL_FONT_COLOR_CODE.."|Henchant:"..spellID.."|h["..name.."]|h|r", channel, nil, chatnumber);
end
else
if ( not item ) then
SendChatMessage(color.."|Henchant:"..spellID.."|h["..name.."]|h|r", channel, nil, chatnumber);
else
SendChatMessage(AL["To craft "]..AtlasLoot_GetChatLink(item)..AL[" you need this: "]..NORMAL_FONT_COLOR_CODE.."|Henchant:"..spellID.."|h["..name.."]|h|r", channel, nil, chatnumber);
end
end
else
if ( safe ) then
SendChatMessage("["..name.."]", channel, nil, chatnumber);
else
SendChatMessage(color.."|Hitem:"..id..":0:0:0|h["..name.."]|h|r", channel, nil, chatnumber);
end
end
end
function AtlasLoot_GetChatLink(id)
local itemName, itemLink, quality = GetItemInfo(tonumber(id))
local _, _, _, color = GetItemQualityColor(quality)
return color.."|H"..itemLink.."|h["..itemName.."]|h|r"
end
function AtlasLoot_QuickLook_OnClick(id)
if ( IsAltKeyDown() ) then
AtlasLoot_ClearQuickLookButton(id)
return
end
if ( this:GetParent() == AtlasLootPanel ) then
if ( AtlasLootPanel:GetParent() == AtlasFrame ) then
AtlasLoot_AnchorPoint = Anchor_Atlas
elseif ( AtlasLootPanel:GetParent() == AlphaMapAlphaMapFrame ) then
AtlasLoot_AnchorPoint = Anchor_AlphaMap
end
else
AtlasLoot_AnchorPoint = Anchor_Default
end
AtlasLoot_ShowItemsFrame(AtlasLootCharDB["QuickLooks"][id][1], AtlasLootCharDB["QuickLooks"][id][2], AtlasLootCharDB["QuickLooks"][id][3]);
end
function AtlasLoot_QuickLook_OnShow(id)
this:SetText(AL["QuickLook"].." "..id)
this:SetFrameLevel(this:GetParent():GetFrameLevel() + 1)
if ( not AtlasLootCharDB["QuickLooks"][id] or not AtlasLootCharDB["QuickLooks"][id][1] ) then
this:Disable()
end
end
function AtlasLoot_QuickLook_OnEnter(id)
if ( this:IsEnabled() ) then
GameTooltip:ClearLines()
GameTooltip:SetOwner(this, "ANCHOR_RIGHT", -(this:GetWidth() / 2), 5)
GameTooltip:AddLine(WHITE..AtlasLootCharDB["QuickLooks"][id][3].."|r")
GameTooltip:AddLine(AL["ALT+Click to clear"])
GameTooltip:Show()
end
end