Files
coa-atlasloot/AtlasLoot/Core/AtlasLoot.lua
T
2021-09-20 18:51:44 -04:00

1673 lines
64 KiB
Lua

--[[
Atlasloot Enhanced
Author Daviesh / Reworked by Deim of PrimalWoW / Reworked again for Ascension
Loot browser associating loot with instance bosses
Can be integrated with Atlas (http://www.atlasmod.com)
Functions:
AtlasLoot_OnEvent(event)
AtlasLoot_ShowMenu()
AtlasLoot_OnVariablesLoaded()
AtlasLoot_SlashCommand(msg)
AtlasLootOptions_Toggle()
AtlasLoot_OnLoad()
AtlasLootBoss_OnClick()
AtlasLoot_ShowItemsFrame()
AtlasLoot_GenerateAtlasMenu(dataID, pFrame)
AtlasLoot_SetupForAtlas()
AtlasLootOptions_ItemAutoQuery()
AtlasLoot_SetItemInfoFrame()
AtlasLootItemsFrame_OnCloseButton()
AtlasLootMenuItem_OnClick()
AtlasLoot_NavButton_OnClick()
AtlasLoot_HeroicModeToggle()
AtlasLoot_IsLootTableAvailable(dataID)
AtlasLoot_GetLODModule(dataSource)
AtlasLoot_LoadAllModules()
AtlasLoot_ShowQuickLooks(button)
AtlasLoot_RefreshQuickLookButtons()
AtlasLoot_AddTooltip(frameb, tooltiptext)
AL_FindId(name, difficulty)
]]
AtlasLoot = LibStub("AceAddon-3.0"):NewAddon("AtlasLoot");
--Instance required libraries
local BabbleBoss = AtlasLoot_GetLocaleLibBabble("LibBabble-Boss-3.0")
local AL = LibStub("AceLocale-3.0"):GetLocale("AtlasLoot");
--Establish version number and compatible version of Atlas
local VERSION_MAJOR = "5";
local VERSION_MINOR = "11";
local VERSION_BOSSES = "04";
ATLASLOOT_VERSION = "|cffFF8400AtlasLoot Ascension Edition|r";
--Now allows for multiple compatible Atlas versions. Always put the newest first
ATLASLOOT_CURRENT_ATLAS = {"1.17.1", "1.17.0"};
ATLASLOOT_PREVIEW_ATLAS = {"1.17.3", "1.17.2"};
ATLASLOOT_POSITION = AL["Position:"];
ATLASLOOT_DEBUGMESSAGES = false;
ATLASLOOT_FILTER_ENABLE = false;
--Standard indent to line text up with Atlas text
ATLASLOOT_INDENT = " ";
--Make the Dewdrop menu in the standalone loot browser accessible here
AtlasLoot_Dewdrop = AceLibrary("Dewdrop-2.0");
AtlasLoot_DewdropSubMenu = AceLibrary("Dewdrop-2.0");
--Variable to cap debug spam
ATLASLOOT_DEBUGSHOWN = false;
-- 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";
--Establish number of boss lines in the Atlas frame for scrolling
local ATLAS_LOOT_BOSS_LINES = 25;
--Flag so that error messages do not spam
local ATLASLOOT_POPUPSHOWN = false;
--Set the default anchor for the loot frame to the Atlas frame
AtlasLoot_AnchorFrame = AtlasFrame;
--Variables to hold hooked Atlas functions
Hooked_Atlas_Refresh = nil;
Hooked_Atlas_OnShow = nil;
Hooked_AtlasScrollBar_Update = nil;
AtlasLootCharDB={};
local AtlasLootDBDefaults = {
profile = {
SavedTooltips = {},
SafeLinks = true,
DefaultTT = true,
LootlinkTT = false,
ItemSyncTT = false,
EquipCompare = false,
ItemAutoQuery = false,
Opaque = false,
ItemIDs = false,
ItemSpam = false,
MinimapButton = false,
FuBarAttached = true,
FuBarText = true,
FuBarIcon = true,
HidePanel = false,
LastBoss = "EmptyTable",
HeroicMode = false,
BigraidHeroic = false,
Bigraid = false,
AtlasLootVersion = "1",
AtlasNaggedVersion = "",
FuBarPosition = 1,
MythicPlussTier = 1,
AutoQuery = false,
LoadAllLoDStartup = false,
PartialMatching = true,
LootBrowserStyle = 1,
CraftingLink = 1,
MinimapButtonAngle = 240,
MinimapButtonRadius = 75,
LootBrowserScale = 1.0,
SearchOn = {
All = true,
},
AtlasType = "Release";
}
}
AtlasLoot_MenuList = {
"PVPSET",
"PVP70RepSET",
"ARENASET",
"ARENA2SET",
"ARENA3SET",
"ARENA4SET",
};
AtlasLoot_Difficulty = {
["Dungeon"] = {"Bloodforged", "Normal", "Heroic", "Mythic", "Mythic 1", "Mythic 2","Mythic 3","Mythic 4","Mythic 5", "Mythic 6","Mythic 7","Mythic 8","Mythic 9", "Mythic 10",};
["ExDungeon"] = {"Bloodforged", "Normal/Heroic", ":D", "Mythic", "Mythic 1", "Mythic 2","Mythic 3","Mythic 4","Mythic 5", "Mythic 6","Mythic 7","Mythic 8","Mythic 9", "Mythic 10",};
["Raid"] = {"Bloodforged", "Normal Flex", "Heroic Flex", "Ascended",};
["Crafting"] = {"Uncommon", "Rare", "Epic"};
--Enums
Bloodforged = 1;
Normal = 2;
Heroic = 3;
Mythic = 4;
Ascended = 4;
MythicPlus = {5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
--Helper Enums to Set min and max difficulties
MIN_DIF = 18;
MAX_DIF = 19;
}
--AtlasLoot_Difficulty was too long to write for enum reasons
AL_Dif = AtlasLoot_Difficulty;
-- 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
};
--Popup Box for an old version of Atlas
StaticPopupDialogs["ATLASLOOT_OLD_ATLAS"] = {
text = AL["It has been detected that your version of Atlas does not match the version that Atlasloot is tuned for ("]..ATLASLOOT_CURRENT_ATLAS[1].."/"..ATLASLOOT_PREVIEW_ATLAS[1]..AL["). Depending on changes, there may be the occasional error, so please visit http://www.atlasmod.com as soon as possible to update."],
button1 = AL["OK"],
OnAccept = function()
DEFAULT_CHAT_FRAME:AddMessage(BLUE..AL["AtlasLoot"]..": "..RED..AL["Incompatible Atlas Detected"]);
end,
timeout = 0,
whileDead = 1,
hideOnEscape = 1
};
--[[
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(event)
--Addons all loaded
if(event == "VARIABLES_LOADED") then
AtlasLoot_OnVariablesLoaded();
--Taint errors
elseif(event == "PLAYER_ENTERING_WORLD") then
AtlasLootOptions_MinimapToggle();
AtlasLootOptions_MinimapToggle();
elseif(arg1 == "AtlasLoot") then
--Junk command to suppress taint message
local i=3;
end
end
--[[
AtlasLoot_ShowMenu:
Legacy function used in Cosmos integration to open the loot browser
]]
function AtlasLoot_ShowMenu()
AtlasLootDefaultFrame:Show();
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()
local AtlasCheck = false;
AtlasLoot.db = LibStub("AceDB-3.0"):New("AtlasLootDB");
AtlasLoot.db:RegisterDefaults(AtlasLootDBDefaults);
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
AtlasLoot.db.profile.LastBoss = "EmptyTable";
if AtlasLoot_TableNames then
AtlasLoot_TableNames["EmptyTable"] = { AL["Select a Loot Table..."], "Menu" };
AtlasLoot_TableNames["EmptyInstance"] = { "AtlasLoot", "AtlasLootFallback" };
AtlasLoot_TableNames["AtlasLootFallback"] = { "AtlasLoot", "AtlasLootFallback" };
end
if AtlasLoot_Data then
AtlasLoot_Data["EmptyTable"] = {};
end
--Figure out if it is a compatible Atlas version
for i=1,#ATLASLOOT_CURRENT_ATLAS do
if ATLAS_VERSION == ATLASLOOT_CURRENT_ATLAS[i] then
AtlasCheck = true;
AtlasLoot.db.profile.AtlasType = "Release";
end
end
for i=1,#ATLASLOOT_PREVIEW_ATLAS do
if ATLAS_VERSION == ATLASLOOT_PREVIEW_ATLAS[i] then
AtlasCheck = true;
AtlasLoot.db.profile.AtlasType = "Preview";
end
end
if AtlasCheck == false then
AtlasLoot.db.profile.AtlasType = "Unknown";
end
--Add the loot browser to the special frames tables to enable closing wih the ESC key
tinsert(UISpecialFrames, "AtlasLootDefaultFrame");
--Set up options frame
AtlasLootOptions_OnLoad();
AtlasLoot_CreateOptionsInfoTooltips();
--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
Hooked_Atlas_Refresh = Atlas_Refresh;
Atlas_Refresh = AtlasLoot_Refresh;
Hooked_Atlas_OnShow = Atlas_OnShow;
Atlas_OnShow = AtlasLoot_Atlas_OnShow;
--Instead of hooking, replace the scrollbar driver function
Hooked_AtlasScrollBar_Update = AtlasScrollBar_Update;
AtlasScrollBar_Update = AtlasLoot_AtlasScrollBar_Update;
if( not AtlasLoot.db.profile.LootBrowserStyle ) then
AtlasLoot.db.profile.LootBrowserStyle = 1;
end
--Set visual style for the loot browser
if( not AtlasLoot.db.profile.CraftingLink ) then
AtlasLoot.db.profile.CraftingLink = 1;
end
if( AtlasLoot.db.profile.LootBrowserStyle == 1 ) then
AtlasLoot_SetNewStyle("new");
else
AtlasLoot_SetNewStyle("old");
end
--Disable options that don't have the supporting mods
if( not LootLink_SetTooltip and (AtlasLoot.db.profile.LootlinkTT == true)) then
AtlasLoot.db.profile.LootlinkTT = false;
AtlasLoot.db.profile.DefaultTT = true;
end
if( not ItemSync and (AtlasLoot.db.profile.ItemSyncTT == true)) then
AtlasLoot.db.profile.ItemSyncTT = false;
AtlasLoot.db.profile.DefaultTT = true;
end
--If using an opaque items frame, change the alpha value of the backing texture
if (AtlasLoot.db.profile.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 ( Hooked_Atlas_Refresh ) then
AtlasLoot_SetupForAtlas();
--If a first time user, set up options
if( (AtlasLoot.db.profile.AtlasLootVersion == nil) or (tonumber(AtlasLoot.db.profile.AtlasLootVersion) < 40500)) then
AtlasLoot.db.profile.SafeLinks = true;
AtlasLoot.db.profile.AllLinks = false;
AtlasLoot.db.profile.AtlasLootVersion = VERSION_MAJOR..VERSION_MINOR..VERSION_BOSSES;
StaticPopup_Show ("ATLASLOOT_SETUP");
end
--If not the expected Atlas version, nag the user once
if( AtlasLoot.db.profile.AtlasType == "Unknown" and AtlasLoot.db.profile.AtlasNaggedVersion ~= ATLAS_VERSION ) then
StaticPopup_Show ("ATLASLOOT_OLD_ATLAS");
AtlasLoot.db.profile.AtlasNaggedVersion = ATLAS_VERSION;
end
if AtlasLoot.db.profile.AtlasType == "Preview" then
AtlasLootBossButtons = AtlasLootNewBossButtons;
end
Hooked_Atlas_Refresh();
else
--If we are not using Atlas, keep the items frame out of the way
AtlasLootItemsFrame:Hide();
end
--Check and migrate old WishList entry format to the newer one
if(((AtlasLootCharDB.AtlasLootVersion == nil) or (tonumber(AtlasLootCharDB.AtlasLootVersion) < 40301)) and AtlasLootCharDB and AtlasLootCharDB["WishList"] and #AtlasLootCharDB["WishList"]~=0) then
--Check if we really need to do a migration since it will load all modules
--We also create a helper table here which store IDs that need to search for
local idsToSearch = {};
for i = 1, #AtlasLootCharDB["WishList"] do
if (AtlasLootCharDB["WishList"][i][1] > 0 and not AtlasLootCharDB["WishList"][i][5]) then
tinsert(idsToSearch, i, AtlasLootCharDB["WishList"][i][1]);
end
end
if #idsToSearch > 0 then
--Let's do this
AtlasLoot_LoadAllModules();
for _, dataSource in ipairs(AtlasLoot_SearchTables) do
if AtlasLoot_Data[dataSource] then
for dataID, lootTable in pairs(AtlasLoot_Data[dataSource]) do
for _, entry in ipairs(lootTable) do
for k, v in pairs(idsToSearch) do
if(entry[1] == v)then
AtlasLootCharDB["WishList"][k][5] = dataID.."|"..dataSource;
break;
end
end
end
end
end
end
end
AtlasLootCharDB.AtlasLootVersion = VERSION_MAJOR..VERSION_MINOR..VERSION_BOSSES;
end
if((AtlasLootCharDB.AtlasLootVersion == nil) or (tonumber(AtlasLootCharDB.AtlasLootVersion) < 40301)) then
AtlasLootCharDB.AtlasLootVersion = VERSION_MAJOR..VERSION_MINOR..VERSION_BOSSES;
AtlasLootCharDB.AutoQuery = false;
AtlasLootOptions_Init();
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_DewdropRegister();
--If EquipCompare is available, use it
if((EquipCompare_RegisterTooltip) and (AtlasLoot.db.profile.EquipCompare == true)) then
EquipCompare_RegisterTooltip(AtlasLootTooltip);
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(AL["Choose Table ..."]);
AtlasLootDefaultFrame_SelectedTable:SetText("");
AtlasLootDefaultFrame_SelectedCategory:Show();
AtlasLootDefaultFrame_SelectedTable:Show();
AtlasLootDefaultFrame_SubMenu:Disable();
if (AtlasLoot.db.profile.LoadAllLoDStartup == true) then
AtlasLoot_LoadAllModules();
else
collectgarbage("collect");
end
panel = getglobal("AtlasLootOptionsFrame");
panel.name=AL["AtlasLoot"];
InterfaceOptions_AddCategory(panel);
--Filter and wishlist options menus creates as part of the next 2 commands
AtlasLoot_CreateFilterOptions();
AtlasLoot_CreateWishlistOptions();
panel = getglobal("AtlasLootHelpFrame");
panel.name=AL["Help"];
panel.parent=AL["AtlasLoot"];
InterfaceOptions_AddCategory(panel);
if LibStub:GetLibrary("LibAboutPanel", true) then
LibStub("LibAboutPanel").new(AL["AtlasLoot"], "AtlasLoot");
end
AtlasLoot_UpdateLootBrowserScale();
AtlasLoot.db.profile.Bigraid = false
AtlasLoot.db.profile.BigraidHeroic = false
AtlasLoot.db.profile.HeroicMode = false
end
function AtlasLoot_Reset(data)
AtlasLootDefaultFrame:Hide();
if AtlasFrame then
AtlasFrame:Hide();
end
if data == "frames" then
AtlasLoot.db.profile.LastBoss = "EmptyTable";
AtlasLootDefaultFrame:ClearAllPoints();
AtlasLootDefaultFrame:SetPoint("CENTER", "UIParent", "CENTER", 0, 0);
if AtlasLootFu then
AtlasLootFu.db.profile.minimapPosition = 200;
AtlasLootFu:Hide();
AtlasLootFu:Show();
end
AtlasLoot.db.profile.LootBrowserScale = 1.0;
AtlasLoot_UpdateLootBrowserScale();
elseif data == "quicklooks" then
AtlasLoot.db.profile.LastBoss = "EmptyTable";
AtlasLootCharDB["QuickLooks"] = {};
AtlasLoot_RefreshQuickLookButtons();
elseif data == "wishlist" then
AtlasLoot.db.profile.LastBoss = "EmptyTable";
AtlasLootCharDB["WishList"] = {};
AtlasLootCharDB["SearchResult"] = {};
AtlasLootCharDB.LastSearchedText = "";
elseif data == "all" then
AtlasLoot.db.profile.LastBoss = "EmptyTable";
AtlasLootDefaultFrame:ClearAllPoints();
AtlasLootDefaultFrame:SetPoint("CENTER", "UIParent", "CENTER", 0, 0);
if AtlasLootFu then
AtlasLootFu.db.profile.minimapPosition = 200;
AtlasLootFu:Hide();
AtlasLootFu:Show();
end
AtlasLoot.db.profile.LootBrowserScale = 1.0;
AtlasLoot_UpdateLootBrowserScale();
AtlasLootCharDB["QuickLooks"] = {};
AtlasLoot_RefreshQuickLookButtons();
AtlasLootCharDB["WishList"] = {};
AtlasLootCharDB["SearchResult"] = {};
AtlasLootCharDB.LastSearchedText = "";
end
DEFAULT_CHAT_FRAME:AddMessage(BLUE..AL["AtlasLoot"]..": "..RED..AL["Reset complete!"]);
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
AtlasLoot_Reset("frames");
elseif msg == AL["options"] then
AtlasLootOptions_Toggle();
else
AtlasLootDefaultFrame:Show();
end
end
--[[
AtlasLootOptions_Toggle:
Toggle on/off the options window
]]
function AtlasLootOptions_Toggle()
if InterfaceOptionsFrame_OpenToCategory then
InterfaceOptionsFrame_OpenToCategory(AL["AtlasLoot"]);
else
InterfaceOptionsFrame_OpenToFrame(AL["AtlasLoot"]);
end
InterfaceOptionsFrame:SetFrameStrata("DIALOG");
if(AtlasLoot.db.profile.DefaultTT == true) then
AtlasLootOptions_DefaultTTToggle();
elseif(AtlasLoot.db.profile.LootlinkTT == true) then
AtlasLootOptions_LootlinkTTToggle();
elseif(AtlasLoot.db.profile.ItemSyncTT == true) then
AtlasLootOptions_ItemSyncTTToggle();
end
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("VARIABLES_LOADED");
this:RegisterEvent("ADDON_ACTION_FORBIDDEN");
this:RegisterEvent("ADDON_ACTION_BLOCKED");
--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
end
--[[
AtlasLoot_GetLoottableHeroic:
Set up checks to see if we have a heroic loot table or not.
Returns: HeroicCheck, HeroicdataID, NonHeroicdataID, BigraidCheck, BigraiddataID, SmallraiddataID, heroname
]]
function AtlasLoot_GetLoottableHeroic(dataID)
local NormalID, HeroicID, Normal25ID, Heroic25ID = nil,nil,nil,nil
local dataSource = AtlasLoot_Data
local englishFaction = UnitFactionGroup("player")
-- remove all Heroic etc infos from the dataID**
dataID = gsub(dataID, "_H", "") -- Horde
dataID = gsub(dataID, "_A", "") -- Alliance
dataID = gsub(dataID, "HEROIC", "") -- Hero Table (10)
dataID = gsub(dataID, "25Man", "") -- 25 Man Table
dataID = gsub(dataID, "25ManHEROIC", "") -- Heroic Table (25)
-- dataID from normal <return>
-- Check tables if Heroic etc exists
if dataSource[dataID] or dataSource[dataID.."_H"] or dataSource[dataID.."_A"] then
NormalID = dataID
if englishFaction == "Horde" and dataSource[NormalID.."_H"] then
NormalID = NormalID.."_H"
elseif englishFaction ~= "Horde" and dataSource[NormalID.."_A"] then
NormalID = NormalID.."_A"
end
end
if dataSource[dataID.."HEROIC"] or dataSource[dataID.."HEROIC".."_H"] or dataSource[dataID.."HEROIC".."_A"] then
HeroicID = dataID.."HEROIC"
if englishFaction == "Horde" and dataSource[HeroicID.."_H"] then
HeroicID = HeroicID.."_H"
elseif englishFaction ~= "Horde" and dataSource[HeroicID.."_A"] then
HeroicID = HeroicID.."_A"
end
end
if dataSource[dataID.."25Man"] or dataSource[dataID.."25Man".."_H"] or dataSource[dataID.."25Man".."_A"] then
Normal25ID = dataID.."25Man"
if englishFaction == "Horde" and dataSource[Normal25ID.."_H"] then
Normal25ID = Normal25ID.."_H"
elseif englishFaction ~= "Horde" and dataSource[Normal25ID.."_A"] then
Normal25ID = Normal25ID.."_A"
end
end
if dataSource[dataID.."25ManHEROIC"] or dataSource[dataID.."25ManHEROIC".."_H"] or dataSource[dataID.."25ManHEROIC".."_A"] then
Heroic25ID = dataID.."25ManHEROIC"
if englishFaction == "Horde" and dataSource[Heroic25ID.."_H"] then
Heroic25ID = Heroic25ID.."_H"
elseif englishFaction ~= "Horde" and dataSource[Heroic25ID.."_A"] then
Heroic25ID = Heroic25ID.."_A"
end
end
return NormalID, HeroicID, Normal25ID, Heroic25ID
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, pFrame)
--Set up local variables needed for GetItemInfo, etc
local itemName, itemLink, itemQuality, itemLevel, itemType, itemSubType, itemCount, itemEquipLoc, itemTexture, itemColor;
local iconFrame, nameFrame, extraFrame, itemButton;
local text, extra;
local wlPage, wlPageMax = 1, 1;
local isItem;
local spellName, spellIcon;
--If the loot table name has not been passed, throw up a debugging statement
if dataID==nil then
DEFAULT_CHAT_FRAME:AddMessage("No dataID!");
return;
end
--Get AtlasQuest out of the way
if (AtlasQuestInsideFrame) then
HideUIPanel(AtlasQuestInsideFrame);
end
--Hide the toggle to switch between heroic and normal loot tables, we will only show it if required
AtlasLootItemsFrame_Heroic:Hide();
AtlasLoot10Man25ManSwitch:Hide();
--Ditch the Quicklook selector
AtlasLoot_QuickLooks:Hide();
AtlasLootQuickLooksButton:Hide();
-- Hide the Filter Check-Box
AtlasLootFilterCheck:Hide();
--Hide the Difficulty selector will show if needed
AtlasLootMythicButton:Hide();
AtlasLoot_DifficultySelect:Hide();
dataSource_backup = dataSource;
if dataID == "SearchResult" or dataID == "WishList" then
dataSource = {};
-- Match the page number to display
wlPage = tonumber(dataSource_backup:match("%d+$"));
-- 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;
end
--Set up checks to see if we have a heroic loot table or not
local NormalID, HeroicID, Normal25ID, Heroic25ID = AtlasLoot_GetLoottableHeroic(dataID)
if AtlasLoot.db.profile.HeroicMode and HeroicID then
dataID = HeroicID
elseif AtlasLoot.db.profile.Bigraid and Normal25ID then
dataID = Normal25ID
elseif AtlasLoot.db.profile.BigraidHeroic and Heroic25ID then
dataID = Heroic25ID
else
if not NormalID then
if Normal25ID and not AtlasLoot.db.profile.HeroicMode then
dataID = Normal25ID
AtlasLoot.db.profile.Bigraid = true
AtlasLoot.db.profile.BigraidHeroic = false
AtlasLoot.db.profile.HeroicMode = false
elseif HeroicID then
dataID = HeroicID
AtlasLoot.db.profile.Bigraid = false
AtlasLoot.db.profile.BigraidHeroic = false
AtlasLoot.db.profile.HeroicMode = true
elseif Heroic25ID then
dataID = Heroic25ID
AtlasLoot.db.profile.Bigraid = false
AtlasLoot.db.profile.BigraidHeroic = true
AtlasLoot.db.profile.HeroicMode = false
end
else
dataID = NormalID
end
end
--Hide UI objects so that only needed ones are shown
for i = 1, 30, 1 do
getglobal("AtlasLootItem_"..i.."_Unsafe"):Hide();
getglobal("AtlasLootMenuItem_"..i):Hide();
getglobal("AtlasLootItem_"..i):Hide();
getglobal("AtlasLootItem_"..i).itemID = 0;
getglobal("AtlasLootItem_"..i).spellitemID = 0;
end
if AtlasLoot_TableNames[dataID] ~= nil and AtlasLoot_TableNames[dataID][2] == "Menu" then
AtlasLoot_GenerateAtlasMenu(dataID, pFrame);
return;
end
-- Create the loottable
if (dataID == "SearchResult") or (dataID == "WishList") or (AtlasLoot_IsLootTableAvailable(dataID)) then
--Check to see if loaded table is different Difficulty then options set
local dif = false;
if(dataSource[dataID].Dif ~= nil or dataSource[dataID].Type ~= nil) then
--Just incase dif isnt set but a type is this will create and set Dif to normal for future use
if(dataSource[dataID].Dif == nil) then dataSource[dataID].Dif = 2 end
if dataSource[dataID].Type ~= nil then
--Raid tables only have 4 Difficulties, this helps set it if previous selection was possibly dungeon
if dataSource[dataID].Type == "Raid" then SetDifficultyTier(math.min(AtlasLoot_Difficulty.Ascended, GetDifficultyTier()));
--Expansion dungeons show both normal and heroic loot on same page/setting
--so if its set to Heroic(3) lets change it back to Normal(2)
elseif dataSource[dataID].Type == "ExDungeon" then if GetDifficultyTier() == AtlasLoot_Difficulty.Heroic then SetDifficultyTier(AtlasLoot_Difficulty.Normal) end
end
end
dif = not (dataSource[dataID].Dif == GetDifficultyTier());
if dif then
--Set this page to the new Difficulty
dataSource[dataID].Dif = GetDifficultyTier();
end
end
--Iterate through each item object and set its properties
for i = 1, 30, 1 do
--Check to see if item should show for this difficulty
local toShow = true;
if(dataSource[dataID][i] ~= nil and dataSource[dataID][i][AL_Dif.MIN_DIF] ~= nil) then
if(dataSource[dataID][i][AL_Dif.MIN_DIF] ~= "" and dataSource[dataID][i][AL_Dif.MIN_DIF] > GetDifficultyTier()) then toShow = false end end
--Check for a valid object (that it exists, and that it has a name)
if(dataSource[dataID][i] ~= nil and dataSource[dataID][i][4] ~= "" and toShow) then
if string.sub(dataSource[dataID][i][2], 1, 1) == "s" then
isItem = false;
else
isItem = true;
end
if isItem then
--If difficulty has changed, find new id and set it.
if dif and dataSource[dataID][i][2] ~= 0 then
--Some items have an entry in the Difficulty table but are not in the game
--To deal with this items will need to have variable [AL_Dif.MAX_DIF] set to their max difficulty, this seems to usually be AL_Dif.Normal or AL_Dif.Mythic
if dataSource[dataID][i][AL_Dif.MAX_DIF] ~= nil and dataSource[dataID][i][AL_Dif.MAX_DIF] ~= "" then
dataSource[dataID][i][2] = AL_FindId(string.sub(dataSource[dataID][i][4], 5), math.min(dataSource[dataID].Dif, dataSource[dataID][i][AL_Dif.MAX_DIF])) or dataSource[dataID][i][2];
else
dataSource[dataID][i][2] = AL_FindId(string.sub(dataSource[dataID][i][4], 5), dataSource[dataID].Dif) or dataSource[dataID][i][2]; --No need for negatives anymore :D
end
end
itemName, itemLink, itemQuality, itemLevel, itemMinLevel, itemType, itemSubType, itemCount, itemEquipLoc, itemTexture = GetItemInfo(dataSource[dataID][i][2]);
--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(GetItemInfo(dataSource[dataID][i][2])) then
_, _, _, itemColor = GetItemQualityColor(itemQuality);
text = itemColor..itemName;
else
if(GetItemInfo(dataSource[dataID][i][2])) then
_, _, _, itemColor = GetItemQualityColor(itemQuality);
text = itemColor..itemName;
else
--If the item is not in cache, use the saved value and process it
text = dataSource[dataID][i][4];
text = AtlasLoot_FixText(text);
end
end
else
spellName, _, spellIcon, _, _, _, _, _, _ = GetSpellInfo(string.sub(dataSource[dataID][i][2], 2));
if spellName then
text = AtlasLoot_FixText(string.sub(dataSource[dataID][i][4], 1, 4)..spellName);
else
text = dataSource[dataID][i][4];
text = AtlasLoot_FixText(text);
end
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, pFrame};
if dataID ~= "FilterList" then
AtlasLootItemsFrame.refreshOri = {dataID, dataSource_backup, boss, pFrame}
end
--Insert the item description
if dataSource[dataID][i][6] and dataSource[dataID][i][6] ~= "" then
extra = dataSource[dataID][i][6];
elseif dataSource[dataID][i][5] then
extra = dataSource[dataID][i][5];
else
extra = "";
end
extra = AtlasLoot_FixText(extra);
--Use shortcuts for easier reference to parts of the item button
itemButton = getglobal("AtlasLootItem_"..dataSource[dataID][i][1]);
iconFrame = getglobal("AtlasLootItem_"..dataSource[dataID][i][1].."_Icon");
nameFrame = getglobal("AtlasLootItem_"..dataSource[dataID][i][1].."_Name");
extraFrame = getglobal("AtlasLootItem_"..dataSource[dataID][i][1].."_Extra");
--If there is no data on the texture an item should have, show a big red question mark
if dataSource[dataID][i][3] == "?" then
iconFrame:SetTexture("Interface\\Icons\\INV_Misc_QuestionMark");
elseif dataSource[dataID][i][3] == "" then
iconFrame:SetTexture(GetItemIcon(dataSource[dataID][i][2]));
elseif (not isItem) and (spellIcon) then
if tonumber(dataSource[dataID][i][3]) then
iconFrame:SetTexture(GetItemIcon(tonumber(dataSource[dataID][i][3])));
elseif dataSource[dataID][i][3] == "" then
iconFrame:SetTexture(spellIcon);
elseif type(dataSource[dataID][i][3]) == "string" then
iconFrame:SetTexture("Interface\\Icons\\"..dataSource[dataID][i][3]);
else
iconFrame:SetTexture(spellIcon);
end
else
--else show the texture
iconFrame:SetTexture("Interface\\Icons\\"..dataSource[dataID][i][3]);
end
itemButton.itemTexture = dataSource[dataID][i][3];
if iconFrame:GetTexture() == nil then
iconFrame:SetTexture("Interface\\Icons\\INV_Misc_QuestionMark");
end
itemButton.name = text;
itemButton.extra = extra;
--Highlight items in the wishlist
if dataSource[dataID][i][2] ~= "" and dataSource[dataID][i][2] ~= 0 and dataID ~= "WishList" and AtlasLootWishList["Options"][UnitName("player")]["Mark"] == true then
local xitemexistwish, itemwishicons = AtlasLoot_WishListCheck(dataSource[dataID][i][2], true)
if xitemexistwish then
text = itemwishicons.." "..text;
end
end
--Set the name and description of the item
nameFrame:SetText(text);
extraFrame:SetText(extra);
extraFrame:Show();
--For convenience, we store information about the objects in the objects so that it can be easily accessed later
if((string.sub(dataSource[dataID][i][2], 1, 1) == "s") and (AtlasLoot.db.profile.CraftingLink ~= 1) and (tonumber(dataSource[dataID][i][3]))) then
itemButton.itemID = dataSource[dataID][i][3];
itemButton.spellitemID = dataSource[dataID][i][3];
else
itemButton.itemID = dataSource[dataID][i][2];
if tonumber(dataSource[dataID][i][3]) then
itemButton.spellitemID = dataSource[dataID][i][3];
else
itemButton.spellitemID = 0;
end
end
itemButton.iteminfo = {};
if isItem then
itemButton.iteminfo.idcore = itemId;
itemButton.iteminfo.icontexture = GetItemIcon(itemId);
itemButton.storeID = itemId;
itemButton.dressingroomID = itemId;
else
itemButton.iteminfo.idcore = dataSource[dataID][i][3];
itemButton.iteminfo.icontexture = GetItemIcon(dataSource[dataID][i][3]);
itemButton.storeID = dataSource[dataID][i][3];
itemButton.dressingroomID = dataSource[dataID][i][3];
end
if dataSource[dataID][i][5] then
itemButton.desc = dataSource[dataID][i][5];
else
itemButton.desc = nil;
end
if dataSource[dataID][i][6] then
itemButton.price = dataSource[dataID][i][6];
else
itemButton.price = nil;
end
if dataSource[dataID][i][7] and dataSource[dataID][i][7] ~= "" then
itemButton.droprate = dataSource[dataID][i][7];
else
itemButton.droprate = nil;
end
if (dataID == "SearchResult" or dataID == "WishList") and dataSource[dataID][i][8] then
itemButton.sourcePage = dataSource[dataID][i][8];
end
itemButton.i = 1;
itemButton:Show();
if dataSource[dataID][i][2] == 0 then getglobal("AtlasLootItem_"..i.."_Unsafe"):Hide(); end
end
end
AtlasLootItemsFrame.refresh = {dataID, dataSource_backup, boss, pFrame};
if dataID ~= "FilterList" then
AtlasLootItemsFrame.refreshOri = {dataID, dataSource_backup, boss, pFrame}
end
--If the item is not in cache, querying the server may cause a disconnect
--Show a red box around the item to indicate this to the user
--((dataSource[dataID][i][2] ~= 0) and (not GetItemInfo(dataSource[dataID][i][2]))
for i = 1, 30, 1 do
itemID = getglobal("AtlasLootItem_"..i).itemID;
if itemID and itemID ~= 0 and (string.sub(itemID, 1, 1) ~= "s") then
if GetItemInfo(itemID) then
getglobal("AtlasLootItem_"..i.."_Unsafe"):Hide();
else
getglobal("AtlasLootItem_"..i.."_Unsafe"):Show();
end
else
getglobal("AtlasLootItem_"..i.."_Unsafe"):Hide();
end
end
--This is a valid QuickLook, so show the UI objects
AtlasLoot_QuickLooks:Show();
AtlasLootQuickLooksButton:Show();
--Check if difficulties exist, if so show difficulty select buttons
if (dataID ~= "SearchResult" and AtlasLoot_Data[dataID].Dif ~= nil) then
AtlasLootMythicButton.difficulty_type = AtlasLoot_Data[dataID].Type or "Dungeon"
AtlasLootMythicButton:Show();
AtlasLoot_DifficultySelect:Show();
end
if (dataID == "SearchResult" and dataSource[dataID].Dif ~= nil) then
AtlasLootMythicButton.difficulty_type = dataSource[dataID].Type or "Dungeon"
AtlasLootMythicButton:Show();
AtlasLoot_DifficultySelect:Show();
end
-- Show the Filter Check-Box
if dataID ~= "WishList" and dataID ~= "SearchResult" and dataSource_backup ~= "AtlasLootCrafting" then
AtlasLootFilterCheck:Show();
end
--Decide whether to show the Heroic mode toggle
--Checks if a heroic version of the loot table is available.
NormalID, HeroicID, Normal25ID, Heroic25ID = AtlasLoot_GetLoottableHeroic(AtlasLootItemsFrame.refreshOri[1])
if AtlasLoot.db.profile.Bigraid and Normal25ID and NormalID then
AtlasLoot10Man25ManSwitch:SetText(AL["Show Normal Loot"])
AtlasLoot10Man25ManSwitch.lootpage = NormalID
AtlasLoot10Man25ManSwitch:Show()
elseif AtlasLoot.db.profile.BigraidHeroic and Heroic25ID and HeroicID then
AtlasLoot10Man25ManSwitch:SetText(AL["Show Normal Loot"])
AtlasLoot10Man25ManSwitch.lootpage = HeroicID
AtlasLoot10Man25ManSwitch:Show()
elseif AtlasLoot.db.profile.HeroicMode and HeroicID and Heroic25ID then
AtlasLoot10Man25ManSwitch:SetText(AL["Show Heroic/Ascended Loot"]);
AtlasLoot10Man25ManSwitch.lootpage = Heroic25ID
AtlasLoot10Man25ManSwitch:Show();
elseif not AtlasLoot.db.profile.Bigraid and NormalID and Normal25ID then
AtlasLoot10Man25ManSwitch:SetText(AL["Show Heroic/Ascended Loot"]);
AtlasLoot10Man25ManSwitch.lootpage = Normal25ID;
AtlasLoot10Man25ManSwitch:Show();
end
-- Heroic check
if AtlasLoot.db.profile.Bigraid and Normal25ID and Heroic25ID then
AtlasLootItemsFrame_Heroic:Show()
AtlasLootItemsFrame_Heroic:SetChecked(false)
AtlasLootItemsFrame_Heroic:Enable()
elseif AtlasLoot.db.profile.BigraidHeroic and Heroic25ID then
AtlasLoot10Man25ManSwitch:SetText(AL["Show Normal Loot"])
AtlasLootItemsFrame_Heroic:Show()
AtlasLootItemsFrame_Heroic:SetChecked(true)
if Normal25ID then
AtlasLootItemsFrame_Heroic:Enable()
else
AtlasLootItemsFrame_Heroic:Disable()
end
elseif AtlasLoot.db.profile.HeroicMode and HeroicID then
AtlasLootItemsFrame_Heroic:Show()
AtlasLootItemsFrame_Heroic:SetChecked(true)
AtlasLootItemsFrame_Heroic:Enable()
if NormalID then
AtlasLootItemsFrame_Heroic:Enable()
else
AtlasLootItemsFrame_Heroic:Disable()
end
elseif NormalID and HeroicID then
AtlasLootItemsFrame_Heroic:Show()
AtlasLootItemsFrame_Heroic:SetChecked(false)
AtlasLootItemsFrame_Heroic:Enable()
end
--Hide navigation buttons by default, only show what we need
getglobal("AtlasLootItemsFrame_BACK"):Hide();
getglobal("AtlasLootItemsFrame_NEXT"):Hide();
getglobal("AtlasLootItemsFrame_PREV"):Hide();
if dataID ~= "SearchResult" and dataID ~= "WishList" then
local affix = "";
if AtlasLoot_Data[dataID].Dif ~= nil then
local d = AtlasLoot_Data[dataID].Type or "Dungeon"
affix = " ("..AtlasLoot_Difficulty[d][GetDifficultyTier()]..")"
end
AtlasLoot_BossName:SetText(AtlasLoot_TableNames[dataID][1]..affix);
else
AtlasLoot_BossName:SetText(boss);
end
--Consult the button registry to determine what nav buttons are required
if dataID == "SearchResult" or dataID == "WishList" then
if wlPage < wlPageMax then
getglobal("AtlasLootItemsFrame_NEXT"):Show();
getglobal("AtlasLootItemsFrame_NEXT").lootpage = dataID.."Page"..(wlPage + 1);
end
if wlPage > 1 then
getglobal("AtlasLootItemsFrame_PREV"):Show();
getglobal("AtlasLootItemsFrame_PREV").lootpage = dataID.."Page"..(wlPage - 1);
end
else
local tablebase = dataSource[dataID];
if tablebase.Next then
getglobal("AtlasLootItemsFrame_NEXT"):Show();
getglobal("AtlasLootItemsFrame_NEXT").lootpage = tablebase.Next;
end
if tablebase.Prev then
getglobal("AtlasLootItemsFrame_PREV"):Show();
getglobal("AtlasLootItemsFrame_PREV").lootpage = tablebase.Prev;
end
if tablebase.Back then
getglobal("AtlasLootItemsFrame_BACK"):Show();
getglobal("AtlasLootItemsFrame_BACK").lootpage = tablebase.Back;
end
end
end
--For Alphamap and Atlas integration, show a 'close' button to hide the loot table and restore the map view
if (AtlasLootItemsFrame:GetParent() == AlphaMapAlphaMapFrame or AtlasLootItemsFrame:GetParent() == AtlasFrame) then
AtlasLootItemsFrame_CloseButton:Show();
else
AtlasLootItemsFrame_CloseButton:Hide();
end
--Anchor the item frame where it is supposed to be
AtlasLoot_SetItemInfoFrame(pFrame);
if ATLASLOOT_FILTER_ENABLE == true and dataID ~= "FilterList" then
AtlasLoot_HideNoUsableItems()
end
if AtlasLoot.db.profile.ItemAutoQuery then AtlasLoot_QueryLootPage(); end
end
--[[
AtlasLoot_GenerateAtlasMenu(dataID, pFrame)
dataID - Identifier of the loot table to show
pFrame - Where to anchor the menu
This function allows menus to be defined in essentially the same way as
normal loot tables
]]
function AtlasLoot_GenerateAtlasMenu(dataID, pFrame)
local extra;
local text;
local dataSource = AtlasLoot_Data;
--Hide UI objects so that only needed ones are shown
for i = 1, 30, 1 do
getglobal("AtlasLootItem_"..i.."_Unsafe"):Hide();
getglobal("AtlasLootMenuItem_"..i):Hide();
getglobal("AtlasLootItem_"..i):Hide();
end
for i = 1, 30, 1 do
--Check for a valid object (that it exists, and that it has a name)
if(AtlasLoot_Data[dataID][i] ~= nil and AtlasLoot_Data[dataID][i][4] ~= "") then
text = AtlasLoot_Data[dataID][i][4];
text = AtlasLoot_FixText(text);
--Store data about the state of the items frame to allow minor tweaks or a recall of the current loot page
AtlasLootItemsFrame.refresh = {dataID, "", "", pFrame};
--Insert the item description
if AtlasLoot_Data[dataID][i][5] then
extra = AtlasLoot_Data[dataID][i][5];
else
extra = "";
end
extra = AtlasLoot_FixText(extra);
--Use shortcuts for easier reference to parts of the item button
itemButton = getglobal("AtlasLootMenuItem_"..AtlasLoot_Data[dataID][i][1]);
iconFrame = getglobal("AtlasLootMenuItem_"..AtlasLoot_Data[dataID][i][1].."_Icon");
nameFrame = getglobal("AtlasLootMenuItem_"..AtlasLoot_Data[dataID][i][1].."_Name");
extraFrame = getglobal("AtlasLootMenuItem_"..AtlasLoot_Data[dataID][i][1].."_Extra");
--If there is no data on the texture an item should have, show a big red question mark
if AtlasLoot_Data[dataID][i][3] == "?" then
iconFrame:SetTexture("Interface\\Icons\\INV_Misc_QuestionMark");
else
iconFrame:SetTexture("Interface\\Icons\\"..AtlasLoot_Data[dataID][i][3]);
end
itemButton.itemTexture = AtlasLoot_Data[dataID][i][3];
if iconFrame:GetTexture() == nil then
iconFrame:SetTexture("Interface\\Icons\\INV_Misc_QuestionMark");
end
itemButton.name = text;
itemButton.extra = extra;
--Store where we want the menu button to link to
itemButton.lootpage = AtlasLoot_Data[dataID][i][2];
--Set the name and description of the item
nameFrame:SetText(text);
extraFrame:SetText(extra);
extraFrame:Show();
itemButton.i = 1;
itemButton:Show();
end
end
AtlasLoot_BossName:SetText(AtlasLoot_TableNames[dataID][1]);
--This is not a valid QuickLook, so hide the UI objects
AtlasLoot_QuickLooks:Hide();
AtlasLootQuickLooksButton:Hide();
AtlasLootFilterCheck:Hide();
AtlasLootItemsFrame_Heroic:Hide();
AtlasLoot10Man25ManSwitch:Hide();
BigraidCheck=string.sub(dataID, string.len(dataID)-4, string.len(dataID));
BigraiddataID=dataID.."25Man";
if BigraidCheck=="25Man" then
AtlasLoot10Man25ManSwitch:SetText(AL["Show Normal Loot"]);
AtlasLoot10Man25ManSwitch.lootpage = string.sub(dataID, 1, string.len(dataID)-5);
AtlasLoot10Man25ManSwitch:Show();
else
if dataSource[BigraiddataID] then
AtlasLoot10Man25ManSwitch:SetText(AL["Show Heroic/Ascended Loot"]);
AtlasLoot10Man25ManSwitch.lootpage = BigraiddataID;
AtlasLoot10Man25ManSwitch:Show();
end
end
--Hide navigation buttons by default, only show what we need
getglobal("AtlasLootItemsFrame_BACK"):Hide();
getglobal("AtlasLootItemsFrame_NEXT"):Hide();
getglobal("AtlasLootItemsFrame_PREV"):Hide();
local tablebase = AtlasLoot_Data[dataID];
if tablebase.Next then
getglobal("AtlasLootItemsFrame_NEXT"):Show();
getglobal("AtlasLootItemsFrame_NEXT").lootpage = tablebase.Next;
end
if tablebase.Prev then
getglobal("AtlasLootItemsFrame_PREV"):Show();
getglobal("AtlasLootItemsFrame_PREV").lootpage = tablebase.Prev;
end
if tablebase.Back then
getglobal("AtlasLootItemsFrame_BACK"):Show();
getglobal("AtlasLootItemsFrame_BACK").lootpage = tablebase.Back;
end
--For Alphamap and Atlas integration, show a 'close' button to hide the loot table and restore the map view
if (AtlasLootItemsFrame:GetParent() == AlphaMapAlphaMapFrame or AtlasLootItemsFrame:GetParent() == AtlasFrame) then
AtlasLootItemsFrame_CloseButton:Show();
else
AtlasLootItemsFrame_CloseButton:Hide();
end
--Anchor the item frame where it is supposed to be
AtlasLoot_SetItemInfoFrame(pFrame);
end
--[[
AtlasLoot_SetItemInfoFrame(pFrame):
pFrame - Data structure with anchor info. Format: {Anchor Point, Relative Frame, Relative Point, X Offset, Y Offset }
This function anchors the item frame where appropriate. The main Atlas frame can be passed instead of a custom pFrame.
If no pFrame is specified, the Atlas Frame is used if Atlas is installed.
]]
function AtlasLoot_SetItemInfoFrame(pFrame)
if ( pFrame ) then
--If a pFrame is specified, use it
if(pFrame==AtlasFrame and AtlasFrame) then
AtlasLootItemsFrame:ClearAllPoints();
AtlasLootItemsFrame:SetParent(AtlasFrame);
AtlasLootItemsFrame:SetPoint("TOPLEFT", "AtlasFrame", "TOPLEFT", 18, -84);
else
AtlasLootItemsFrame:ClearAllPoints();
AtlasLootItemsFrame:SetParent(pFrame[2]);
AtlasLootItemsFrame:ClearAllPoints();
AtlasLootItemsFrame:SetPoint(pFrame[1], pFrame[2], pFrame[3], pFrame[4], pFrame[5]);
end
elseif ( AtlasFrame ) then
--If no pFrame is specified and Atlas is installed, anchor in Atlas
AtlasLootItemsFrame:ClearAllPoints();
AtlasLootItemsFrame:SetParent(AtlasFrame);
AtlasLootItemsFrame:SetPoint("TOPLEFT", "AtlasFrame", "TOPLEFT", 18, -84);
else
--Last resort, dump the items frame in the middle of the screen
AtlasLootItemsFrame:ClearAllPoints();
AtlasLootItemsFrame:SetParent(UIParent);
AtlasLootItemsFrame:SetPoint("CENTER", "UIParent", "CENTER", 0, 0);
end
AtlasLootItemsFrame:Show();
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
if ATLAS_CUR_LINES then
for i=1,ATLAS_CUR_LINES do
if getglobal("AtlasBossLine"..i.."_Selected"):IsVisible() then
getglobal("AtlasBossLine"..i.."_Selected"):Hide();
getglobal("AtlasBossLine"..i.."_Loot"):Show();
end
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.lootpage ~= nil and this.lootpage ~= "" then
AtlasLoot_ShowBossLoot(this.lootpage, "", AtlasLoot_AnchorFrame);
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[4] then
if strsub(this.lootpage, 1, 16) == "SearchResultPage" then
AtlasLoot_ShowItemsFrame("SearchResult", this.lootpage, (AL["Search Result: %s"]):format(AtlasLootCharDB.LastSearchedText or ""), AtlasLootItemsFrame.refresh[4]);
elseif strsub(this.lootpage, 1, 12) == "WishListPage" then
AtlasLoot_ShowItemsFrame("WishList", this.lootpage, AL["Wishlist"], AtlasLootItemsFrame.refresh[4]);
else
AtlasLoot_ShowItemsFrame(this.lootpage, AtlasLootItemsFrame.refresh[2], "", AtlasLootItemsFrame.refresh[4]);
end
else
--Fallback for if the requested loot page is a menu and does not have a .refresh instance
AtlasLoot_ShowItemsFrame(this.lootpage, "", "", AtlasFrame);
end
end
--[[
AtlasLoot_HeroicModeToggle:
Switches between the heroic and normal versions of a loot page
]]
function AtlasLoot_HeroicModeToggle()
local Heroic
local dataID
if ATLASLOOT_FILTER_ENABLE then
dataID = AtlasLootItemsFrame.refreshOri[1]
else
dataID = AtlasLootItemsFrame.refresh[1]
end
local NormalID, HeroicID, Normal25ID, Heroic25ID = AtlasLoot_GetLoottableHeroic(dataID)
if AtlasLoot.db.profile.Bigraid and Heroic25ID then
AtlasLoot.db.profile.Bigraid = false
AtlasLoot.db.profile.BigraidHeroic = true
dataID = Heroic25ID
elseif AtlasLoot.db.profile.HeroicMode and NormalID then
AtlasLoot.db.profile.HeroicMode = false
dataID = NormalID
elseif AtlasLoot.db.profile.BigraidHeroic and Normal25ID then
AtlasLoot.db.profile.Bigraid = true
AtlasLoot.db.profile.BigraidHeroic = false
dataID = Normal25ID
else
AtlasLoot.db.profile.HeroicMode = true
AtlasLoot.db.profile.Bigraid = false
AtlasLoot.db.profile.BigraidHeroic = false
dataID = HeroicID
end
AtlasLoot_ShowItemsFrame(dataID, AtlasLootItemsFrame.refresh[2], "", AtlasLootItemsFrame.refresh[4]);
end
--[[
AtlasLoot_10Man25ManToggle:
Switches between the heroic and normal versions of a loot page
]]
function AtlasLoot_10Man25ManToggle()
local Lootpage = AtlasLoot10Man25ManSwitch.lootpage;
--Deal with loot filter issue
if ATLASLOOT_FILTER_ENABLE == true then
Lootpage = AtlasLootItemsFrame.refreshOri[1];
end
local NormalID, HeroicID, Normal25ID, Heroic25ID = AtlasLoot_GetLoottableHeroic(Lootpage)
if AtlasLoot.db.profile.Bigraid and Normal25ID then
AtlasLoot.db.profile.Bigraid = false
elseif AtlasLoot.db.profile.BigraidHeroic and Heroic25ID then
AtlasLoot.db.profile.BigraidHeroic = false
AtlasLoot.db.profile.HeroicMode = true
elseif AtlasLoot.db.profile.HeroicMode and HeroicID then
AtlasLoot.db.profile.HeroicMode = false
AtlasLoot.db.profile.BigraidHeroic = true
else
AtlasLoot.db.profile.Bigraid = true
AtlasLoot.db.profile.BigraidHeroic = false
AtlasLoot.db.profile.HeroicMode = false
end
if AtlasLootItemsFrame.refresh then
AtlasLoot_ShowItemsFrame(Lootpage, AtlasLootItemsFrame.refresh[2], "", AtlasLootItemsFrame.refresh[4]);
elseif AtlasLootDefaultFrame:IsVisible() then
AtlasLoot_ShowItemsFrame(Lootpage, AtlasLootItemsFrame.refresh[2], "", { "TOPLEFT", "AtlasLootDefaultFrame_LootBackground", "TOPLEFT", "2", "-2" });
else
AtlasLoot_ShowItemsFrame(Lootpage, AtlasLootItemsFrame.refresh[2], "", nil);
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)
local menu_check=false;
local moduleName=nil;
for k,v in pairs(AtlasLoot_MenuList) do
if v == 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 https://discord.gg/uYCE2X2FgA"]);
return false;
end
local dataSource = AtlasLoot_TableNames[dataID][2];
moduleName = AtlasLoot_GetLODModule(dataSource);
if AtlasLoot_Data[dataID] then
return true;
else
if moduleName then
if not IsAddOnLoaded(moduleName) then
loaded, reason=LoadAddOn(moduleName);
if not loaded then
if (reason == "MISSING") or (reason == "DISABLED") then
DEFAULT_CHAT_FRAME:AddMessage(GREEN..AL["AtlasLoot"]..": "..ORANGE..AtlasLoot_TableNames[dataID][1]..WHITE..AL[" is unavailable, the following load on demand module is required: "]..ORANGE..moduleName);
return false;
else
DEFAULT_CHAT_FRAME:AddMessage(RED..AL["AtlasLoot Error!"].." "..WHITE..AL["Status of the following module could not be determined: "]..ORANGE..moduleName);
return false;
end
end
end
if AtlasLoot_Data[dataID] then
if ATLASLOOT_DEBUGMESSAGES then
DEFAULT_CHAT_FRAME:AddMessage(GREEN..AL["AtlasLoot"]..": "..ORANGE..moduleName..WHITE.." "..AL["sucessfully loaded."]);
end
collectgarbage("collect");
return true;
else
DEFAULT_CHAT_FRAME:AddMessage(RED..AL["AtlasLoot Error!"].." "..ORANGE..AtlasLoot_TableNames[dataID][1]..WHITE..AL[" could not be accessed, the following module may be out of date: "]..ORANGE..moduleName);
return false;
end
else
DEFAULT_CHAT_FRAME:AddMessage(RED..AL["AtlasLoot Error!"].." "..ORANGE..AL["Loot module returned as nil!"]);
return false;
end
end
end
end
--[[
AtlasLoot_GetLODModule(dataSource)
Returns the name of the module that needs to be loaded
dataSource: Location of the loot table
]]
function AtlasLoot_GetLODModule(dataSource)
if (dataSource=="AtlasLootOriginalWoW") then
return "AtlasLoot_OriginalWoW";
elseif (dataSource=="AtlasLootBurningCrusade") then
return "AtlasLoot_BurningCrusade";
elseif (dataSource=="AtlasLootCrafting") then
return "AtlasLoot_Crafting";
elseif (dataSource=="AtlasLootWorldEvents") then
return "AtlasLoot_WorldEvents";
elseif (dataSource=="AtlasLootWotLK") then
return "AtlasLoot_WrathoftheLichKing";
end
end
--[[
AtlasLoot_LoadAllModules()
Used to load all available LoD modules
]]
function AtlasLoot_LoadAllModules()
local orig, bc, wotlk, craft, world;
orig, _ = LoadAddOn("AtlasLoot_OriginalWoW");
bc, _ = LoadAddOn("AtlasLoot_BurningCrusade");
craft, _ = LoadAddOn("AtlasLoot_Crafting");
world, _ = LoadAddOn("AtlasLoot_WorldEvents");
wotlk, _ = LoadAddOn("AtlasLoot_WrathoftheLichKing");
local flag=0;
if not orig then
LoadAddOn("AtlasLoot_OriginalWoW");
flag=1;
end
if not bc then
LoadAddOn("AtlasLoot_BurningCrusade");
flag=1;
end
if not craft then
LoadAddOn("AtlasLoot_Crafting");
flag=1;
end
if not world then
LoadAddOn("AtlasLoot_WorldEvents");
flag=1;
end
if not wotlk then
LoadAddOn("AtlasLoot_WrathoftheLichKing");
flag=1;
end
if flag == 1 then
if ATLASLOOT_DEBUGMESSAGES then
DEFAULT_CHAT_FRAME:AddMessage(GREEN..AL["AtlasLoot"]..": "..WHITE..AL["All Available Modules Loaded"]);
end
collectgarbage("collect");
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 dewdrop = AceLibrary("Dewdrop-2.0");
if dewdrop:IsOpen(button) then
dewdrop:Close(1);
else
local setOptions = function()
dewdrop: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.refreshOri[1], AtlasLootItemsFrame.refreshOri[2], AtlasLootItemsFrame.refreshOri[3], AtlasLootItemsFrame.refreshOri[4]};
AtlasLoot_RefreshQuickLookButtons();
dewdrop:Close(1);
end
);
dewdrop: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.refreshOri[1], AtlasLootItemsFrame.refreshOri[2], AtlasLootItemsFrame.refreshOri[3], AtlasLootItemsFrame.refreshOri[4]};
AtlasLoot_RefreshQuickLookButtons();
dewdrop:Close(1);
end
);
dewdrop: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.refreshOri[1], AtlasLootItemsFrame.refreshOri[2], AtlasLootItemsFrame.refreshOri[3], AtlasLootItemsFrame.refreshOri[4]};
AtlasLoot_RefreshQuickLookButtons();
dewdrop:Close(1);
end
);
dewdrop: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.refreshOri[1], AtlasLootItemsFrame.refreshOri[2], AtlasLootItemsFrame.refreshOri[3], AtlasLootItemsFrame.refreshOri[4]};
AtlasLoot_RefreshQuickLookButtons();
dewdrop:Close(1);
end
);
end;
dewdrop: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()
i=1;
while i<5 do
if ((not AtlasLootCharDB["QuickLooks"][i]) or (not AtlasLootCharDB["QuickLooks"][i][1])) or (AtlasLootCharDB["QuickLooks"][i][1]==nil) then
getglobal("AtlasLootPanel_Preset"..i):Disable();
getglobal("AtlasLootDefaultFrame_Preset"..i):Disable();
else
getglobal("AtlasLootPanel_Preset"..i):Enable();
getglobal("AtlasLootDefaultFrame_Preset"..i):Enable();
end
i=i+1;
end
end
--[[
AtlasLoot_QueryLootPage()
Querys all valid items on the current loot page.
]]
function AtlasLoot_QueryLootPage()
i=1;
local querytime = 0;
local now = 0;
while i<31 do
now = GetTime();
if now - querytime > 0.01 then
querytime = GetTime();
button = getglobal("AtlasLootItem_"..i);
queryitem = button.itemID;
if (queryitem) and (queryitem ~= nil) and (queryitem ~= "") and (queryitem ~= 0) and (string.sub(queryitem, 1, 1) ~= "s") then
AtlasLootTooltip:SetHyperlink("item:"..queryitem..":0:0:0:0:0:0:0");
AtlasLootTooltip:SetHyperlink("item:60"..queryitem..":0:0:0:0:0:0:0");
end
i=i+1;
end
end
end
--[[
AtlasLoot_AddTooltip(frameb, tooltiptext)
Adds explanatory tooltips to UI objects.
]]
function AtlasLoot_AddTooltip(frameb, tooltiptext)
if not tooltiptext or not frameb then return end
local frame = getglobal(frameb)
frame:SetScript("OnEnter", function()
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
GameTooltip:SetText(tooltiptext)
GameTooltip:Show()
end)
frame:SetScript("OnLeave", function() GameTooltip:Hide() end)
end
--[[
AtlasLoot_DifficultyDungeonSelect(button)
button: Identity of the button pressed to trigger the function
Shows the GUI for choosing Mythic Tier
]]
function AtlasLoot_ShowDifficultySelect(button, difficulty)
local dewdrop = AceLibrary("Dewdrop-2.0");
if dewdrop:IsOpen(button) then
dewdrop:Close(1);
else
local setOptions = function()
for t = 1, #AtlasLoot_Difficulty[difficulty], 1 do
if not (t == 3 and difficulty == "ExDungeon") then
dewdrop:AddLine(
"text", AtlasLoot_Difficulty[difficulty][t],
"tooltipTitle", AtlasLoot_Difficulty[difficulty][t],
"tooltipText", "Swap to Difficulty Level: "..AtlasLoot_Difficulty[difficulty][t],
"func", function()
SetDifficultyTier(t)
if AtlasLootItemsFrame:IsVisible() and AtlasLootItemsFrame.refresh then
AtlasLoot_ShowItemsFrame(AtlasLootItemsFrame.refresh[1], AtlasLootItemsFrame.refresh[2], AtlasLootItemsFrame.refresh[3], AtlasLootItemsFrame.refresh[4]);
end
dewdrop:Close(1);
end
);
end
end
end;
dewdrop:Open(button,
'point', function(parent)
return "TOPLEFT", "TOPRIGHT";
end,
"children", setOptions
);
end
end
function GetDifficultyTier()
return AtlasLoot.db.profile.MythicPlussTier
end
function SetDifficultyTier(difficulty)
AtlasLoot.db.profile.MythicPlussTier = difficulty;
end
--Mass Query Items
--Sorry if this looks messy might cleanup later
function QueryItems(instance, difficulty, expansion)
if instance == "help" then
print("Instance types are: \"Dungeon\", \"Raid\"");
print("Difficulty types are: AL_Dif.Bloodforged, AL_Dif.Normal, AL_Dif.Heroic, AL_Dif.Mythic, AL_Dif.MythicPlus[1-10]");
print("Expansion options are: \"classic\" and \"tbc\"");
print("Example: QueryItems(\"Dungeon\", AL_Dif.MythicPlus[6]) - This will query all classic dungeons Mythic+ 6 items");
print("Example: QueryItems(\"Dungeon\", AL_Dif.MythicPlus[6], \"tbc\") - This will query all tbc dungeons Mythic+ 6 items");
return
end
--Expansion select enums to make arguments easier to use
local ex_sel = {
["classic"] = AL["Classic Instances"];
["tbc"] = AL["BC Instances"];
}
--Setup ranges so we arent parsing unwanted instance pages
local range = {
["classic"] = {
["Raid"] = {2, 8},
["Dungeon"] = {10, 29}
},
["tbc"] = {
["Raid"] = {2, 10},
["Dungeon"] = {12, 27}
}
}
--Setup defualts if the arguments are not set or nil
if expansion == nil or ex_sel[expansion] == nil then expansion = "classic" end
if instance == nil then instance = "Dungeon" end
--TBC dungeon types are ExDungeon, i only want one argument type so we swap it here
if instance == "Dungeon" and expansion == "tbc" then instance = "ExDungeon" end
if difficulty == nil then difficulty = AL_Dif.Normal end
--We parse a drop down menu, they are setup weird so we have to check for expansion twice in the arry once as a number second as a Global Var
local _men = 1
if expansion == "tbc" then _men = 2 end;
if instance == "Raid" then difficulty = math.min(AL_Dif.Ascended, difficulty) end
for i = range[expansion][instance][1], range[expansion][instance][2] do
local inst = "";
--DireMaul is in an another drop down list so instead what we can do is utilize instance ids we won't be querying
if i == 14 and expansion == "classic" then inst = "DireMaulNorth" elseif i == 15 and expansion == "classic" then inst = "DireMaulEast" elseif i == 16 and expansion == "classic" then inst = "DireMaulWest"
else
inst = AtlasLoot_DewDropDown[_men][ex_sel[expansion]][i][1][2]
end
if (inst ~= nil and AtlasLoot_DewDropDown_SubTables[inst] ~= nil) then
for b = 1, #AtlasLoot_DewDropDown_SubTables[inst] do
local boss = AtlasLoot_DewDropDown_SubTables[inst][b][2];
if(AtlasLoot_Data[boss] ~= nil and AtlasLoot_Data[boss].Type ~= nil and AtlasLoot_Data[boss].Type == instance) then
print("Query for "..boss.." in instance "..inst.." started");
local n = 1;
local querytime = 0;
local now = 0;
while n < 31 do
now = GetTime();
if now - querytime > 0.01 then
querytime = GetTime();
if(AtlasLoot_Data[boss][n] ~= nil) then
local queryitem = AL_FindId(string.sub(AtlasLoot_Data[boss][n][4], 5), difficulty) or AtlasLoot_Data[boss][n][2];
if (queryitem) and (queryitem ~= nil) and (queryitem ~= "") and (queryitem ~= 0) and (string.sub(queryitem, 1, 1) ~= "s") then
AtlasLootTooltip:SetHyperlink("item:"..queryitem..":0:0:0:0:0:0:0");
end
end
n = n + 1;
end
end
print("Query for "..boss.." in instance "..inst.." finished");
end
end
elseif AtlasLoot_DewDropDown[_men][ex_sel[expansion]][i][1][3] == "Table" then
if(AtlasLoot_Data[inst] ~= nil and AtlasLoot_Data[inst].Type ~= nil and AtlasLoot_Data[inst].Type == instance) then
print("Query for "..inst.." in instance "..inst.." started");
local n = 1;
local querytime = 0;
local now = 0;
while n < 31 do
now = GetTime();
if now - querytime > 0.01 then
querytime = GetTime();
if(AtlasLoot_Data[inst][n] ~= nil) then
local queryitem = AL_FindId(string.sub(AtlasLoot_Data[inst][n][4], 5), difficulty) or AtlasLoot_Data[inst][n][2];
if (queryitem) and (queryitem ~= nil) and (queryitem ~= "") and (queryitem ~= 0) and (string.sub(queryitem, 1, 1) ~= "s") then
AtlasLootTooltip:SetHyperlink("item:"..queryitem..":0:0:0:0:0:0:0");
end
end
n = n + 1;
end
end
print("Query for "..inst.." in instance "..inst.." finished");
end
end
end
end