Files
coa-atlasloot/AtlasLoot/Core/AtlasLoot.lua
T
higurush 6ab66f9fec Prevent AtlasLoot from breaking on non-existant loot table
When a loot table does not exists, and AtlasLoot tries to fetch it, the whole thing breaks. This change will prevent that and also writes out for the client on which table is missing, for example: "AtlasLoot Error! KaraAttumenHEROIC not listed in loot table registry, please report this message to the AtlasLoot forums at http://www.atlasloot.net/"
2021-06-05 16:16:32 +02:00

1440 lines
55 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)
]]
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,
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",
};
-- 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();
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
--Iterate through each item object and set its properties
for i = 1, 30, 1 do
--Check for a valid object (that it exists, and that it has a name)
if(dataSource[dataID][i] ~= nil and dataSource[dataID][i][4] ~= "") then
if string.sub(dataSource[dataID][i][2], 1, 1) == "s" then
isItem = false;
else
isItem = true;
end
if isItem then
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 = dataSource[dataID][i][2];
itemButton.iteminfo.icontexture = GetItemIcon(dataSource[dataID][i][2]);
itemButton.storeID = dataSource[dataID][i][2];
itemButton.dressingroomID = dataSource[dataID][i][2];
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();
-- 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
AtlasLoot_BossName:SetText(AtlasLoot_TableNames[dataID][1]);
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 http://www.atlasloot.net"]);
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.03 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
GameTooltip:SetHyperlink("item:"..queryitem..":0:0:0:0:0:0:0");
GameTooltip: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