vanilla-wow-addons – Rev 1
?pathlinks?
--Atlas, an instance map browser
--Author: Dan Gilbert
--Email: loglow@gmail.com
--AIM: dan5981
ATLAS_VERSION = "1.8.1";
ATLAS_DATE = "August 22, 2006";
--myAddOns data goes here
AtlasDetails = {
name = "Atlas",
version = ATLAS_VERSION,
releaseDate = ATLAS_DATE,
author = "Dan Gilbert",
email = "loglow@gmail.com",
website = "http://www.atlasmod.com/",
optionsframe = "AtlasOptionsFrame",
category = MYADDONS_CATEGORY_MAP
};
local Atlas_Vars_Loaded = nil;
ATLAS_DROPDOWN_LIST = {};
ATLAS_DROPDOWN_LIST_BG = {};
ATLAS_DROPDOWN_LIST_FP = {};
ATLAS_DROPDOWN_LIST_DL = {};
ATLAS_DROPDOWN_LIST_RE = {};
local DefaultAtlasOptions = {
["AtlasVersion"] = ATLAS_VERSION;
["AtlasZone"] = 1;
["AtlasAlpha"] = 1.0;
["AtlasLocked"] = false;
["AtlasMapName"] = true;
["AtlasAutoSelect"] = false;
["AtlasButtonPosition"] = 268;
["AtlasButtonShown"] = true;
["AtlasReplaceWorldMap"] = false;
["AtlasRightClick"] = false;
["AtlasType"] = 1;
["AtlasAcronyms"] = true;
};
function Atlas_FreshOptions()
AtlasOptions = CloneTable(DefaultAtlasOptions);
end
--Code by Grayhoof (SCT)
function CloneTable(t) -- return a copy of the table t
local new = {}; -- create a new table
local i, v = next(t, nil); -- i is an index of t, v = t[i]
while i do
if type(v)=="table" then
v=CloneTable(v);
end
new[i] = v;
i, v = next(t, i); -- get next index
end
return new;
end
--Called when the Atlas frame is first loaded
--We CANNOT assume that data in other files is available yet!
function Atlas_OnLoad()
--Register the Atlas frame for the following events
this:RegisterEvent("ADDON_LOADED");
this:RegisterEvent("VARIABLES_LOADED");
--Allows Atlas to be closed with the Escape key
tinsert(UISpecialFrames, "AtlasFrame");
--Dragging involves some special registration
AtlasFrame:RegisterForDrag("LeftButton");
--Setting up slash commands involves referencing some strage auto-generated variables
SLASH_ATLAS1 = ATLAS_SLASH;
SlashCmdList["ATLAS"] = function(msg)
Atlas_SlashCommand(msg);
end
end
--Removal of articles in map names (for proper alphabetic sorting)
--For example: "The Deadmines" will become "Deadmines"
--Thus it will be sorted under D and not under T
local function Atlas_SanitizeName(text)
text = string.lower(text);
if (AtlasSortIgnore) then
for _,v in AtlasSortIgnore do
local match = string.gfind(text, v)();
if (match) and ((string.len(text) - string.len(match)) <= 4) then
return match;
end
end
end
return text;
end
--Comparator function for alphabetic sorting of maps
local function Atlas_SortZonesAlpha(a, b)
local aa = Atlas_SanitizeName(AtlasText[a].ZoneName);
local bb = Atlas_SanitizeName(AtlasText[b].ZoneName);
return aa < bb;
end
--Comparator function for alphabetic sorting of BG maps
local function Atlas_SortZonesAlphaBG(a, b)
local aa = Atlas_SanitizeName(AtlasBG[a].ZoneName);
local bb = Atlas_SanitizeName(AtlasBG[b].ZoneName);
return aa < bb;
end
--Comparator function for alphabetic sorting of FP maps
local function Atlas_SortZonesAlphaFP(a, b)
local aa = Atlas_SanitizeName(AtlasFP[a].ZoneName);
local bb = Atlas_SanitizeName(AtlasFP[b].ZoneName);
return aa < bb;
end
--Comparator function for alphabetic sorting of DL maps
local function Atlas_SortZonesAlphaDL(a, b)
local aa = Atlas_SanitizeName(AtlasDL[a].ZoneName);
local bb = Atlas_SanitizeName(AtlasDL[b].ZoneName);
return aa < bb;
end
--Comparator function for alphabetic sorting of RE maps
local function Atlas_SortZonesAlphaRE(a, b)
local aa = Atlas_SanitizeName(AtlasRE[a].ZoneName);
local bb = Atlas_SanitizeName(AtlasRE[b].ZoneName);
return aa < bb;
end
--These are the REAL level range values!
--Overrides the values that may be found in the localization files
function Atlas_UpdateLevelRanges()
AtlasText.BlackfathomDeeps.LevelRange = "24-32";
AtlasText.BlackrockSpireLower.LevelRange = "55-60";
AtlasText.BlackrockSpireUpper.LevelRange = "55-60";
AtlasText.BlackrockDepths.LevelRange = "52-60";
AtlasText.ShadowfangKeep.LevelRange = "22-30";
AtlasText.ScarletMonastery.LevelRange = "34-45";
AtlasText.MoltenCore.LevelRange = "60+";
AtlasText.TheSunkenTemple.LevelRange = "50-60";
AtlasText.WailingCaverns.LevelRange = "17-24";
AtlasText.TheStockade.LevelRange = "24-32";
AtlasText.TheDeadmines.LevelRange = "17-26";
AtlasText.DireMaulNorth.LevelRange = "56-60";
AtlasText.DireMaulEast.LevelRange = "56-60";
AtlasText.DireMaulWest.LevelRange = "56-60";
AtlasText.Gnomeregan.LevelRange = "29-38";
AtlasText.RazorfenDowns.LevelRange = "37-46";
AtlasText.RazorfenKraul.LevelRange = "29-38";
AtlasText.Maraudon.LevelRange = "46-55";
AtlasText.OnyxiasLair.LevelRange = "60+";
AtlasText.BlackwingLair.LevelRange = "60+";
AtlasText.RagefireChasm.LevelRange = "13-18";
AtlasText.Scholomance.LevelRange = "58-60";
AtlasText.Stratholme.LevelRange = "58-60";
AtlasText.Uldaman.LevelRange = "41-51";
AtlasText.ZulFarrak.LevelRange = "44-54";
AtlasText.ZulGurub.LevelRange = "60+";
AtlasText.TheTempleofAhnQiraj.LevelRange = "60+";
AtlasText.TheRuinsofAhnQiraj.LevelRange = "60+";
AtlasText.Naxxramas.LevelRange = "60+";
AtlasBG.AlteracValleyNorth.LevelRange = "51-60";
AtlasBG.AlteracValleySouth.LevelRange = "51-60";
AtlasBG.ArathiBasin.LevelRange = "20-60";
AtlasBG.WarsongGulch.LevelRange = "10-60";
AtlasFP.FPAllianceEast.LevelRange = "---";
AtlasFP.FPAllianceWest.LevelRange = "---";
AtlasFP.FPHordeEast.LevelRange = "---";
AtlasFP.FPHordeWest.LevelRange = "---";
AtlasDL.DLEast.LevelRange = "---";
AtlasDL.DLWest.LevelRange = "---";
AtlasRE.Azuregos.LevelRange = "60+";
AtlasRE.FourDragons.LevelRange = "60+";
AtlasRE.Kazzak.LevelRange = "60+";
end
--These are the REAL player limit values!
--Overrides the values that may be found in the localization files
function Atlas_UpdatePlayerLimits()
AtlasText.BlackfathomDeeps.PlayerLimit = "10";
AtlasText.BlackrockSpireLower.PlayerLimit = "10";
AtlasText.BlackrockSpireUpper.PlayerLimit = "10";
AtlasText.BlackrockDepths.PlayerLimit = "5";
AtlasText.ShadowfangKeep.PlayerLimit = "10";
AtlasText.ScarletMonastery.PlayerLimit = "10";
AtlasText.MoltenCore.PlayerLimit = "40";
AtlasText.TheSunkenTemple.PlayerLimit = "10";
AtlasText.WailingCaverns.PlayerLimit = "10";
AtlasText.TheStockade.PlayerLimit = "10";
AtlasText.TheDeadmines.PlayerLimit = "10";
AtlasText.DireMaulNorth.PlayerLimit = "5";
AtlasText.DireMaulEast.PlayerLimit = "5";
AtlasText.DireMaulWest.PlayerLimit = "5";
AtlasText.Gnomeregan.PlayerLimit = "10";
AtlasText.RazorfenDowns.PlayerLimit = "10";
AtlasText.RazorfenKraul.PlayerLimit = "10";
AtlasText.Maraudon.PlayerLimit = "10";
AtlasText.OnyxiasLair.PlayerLimit = "40";
AtlasText.BlackwingLair.PlayerLimit = "40";
AtlasText.RagefireChasm.PlayerLimit = "10";
AtlasText.Scholomance.PlayerLimit = "5";
AtlasText.Stratholme.PlayerLimit = "5";
AtlasText.Uldaman.PlayerLimit = "10";
AtlasText.ZulFarrak.PlayerLimit = "10";
AtlasText.ZulGurub.PlayerLimit = "20";
AtlasText.TheTempleofAhnQiraj.PlayerLimit = "40";
AtlasText.TheRuinsofAhnQiraj.PlayerLimit = "20";
AtlasText.Naxxramas.PlayerLimit = "40";
AtlasBG.AlteracValleyNorth.PlayerLimit = "40";
AtlasBG.AlteracValleySouth.PlayerLimit = "40";
AtlasBG.ArathiBasin.PlayerLimit = "15";
AtlasBG.WarsongGulch.PlayerLimit = "10";
AtlasFP.FPAllianceEast.PlayerLimit = "---";
AtlasFP.FPAllianceWest.PlayerLimit = "---";
AtlasFP.FPHordeEast.PlayerLimit = "---";
AtlasFP.FPHordeWest.PlayerLimit = "---";
AtlasDL.DLEast.PlayerLimit = "---";
AtlasDL.DLWest.PlayerLimit = "---";
AtlasRE.Azuregos.PlayerLimit = "40";
AtlasRE.FourDragons.PlayerLimit = "40";
AtlasRE.Kazzak.PlayerLimit = "40";
end
--Main Atlas event handler
function Atlas_OnEvent()
if (event == "ADDON_LOADED") then
if (strlower(arg1) == "atlas") then
Atlas_Vars_Loaded = 1;
Atlas_Init();
end
elseif (event == "VARIABLES_LOADED") then
if (not Atlas_Vars_Loaded) then
Atlas_Vars_Loaded = 1;
Atlas_Init();
end
end
end
--Initializes everything relating to saved variables and data in other lua files
--This should be called ONLY when we're sure that all other files have been loaded
function Atlas_Init()
if ( AtlasOptions == nil or AtlasOptions["AtlasVersion"] ~= ATLAS_VERSION) then
Atlas_FreshOptions();
end
--Take all the maps listed in the localization files and import them into the dropdown list structure
table.foreach(AtlasText, function(v)
table.insert(ATLAS_DROPDOWN_LIST, v)
end);
table.foreach(AtlasBG, function(v)
table.insert(ATLAS_DROPDOWN_LIST_BG, v)
end);
table.foreach(AtlasFP, function(v)
table.insert(ATLAS_DROPDOWN_LIST_FP, v)
end);
table.foreach(AtlasDL, function(v)
table.insert(ATLAS_DROPDOWN_LIST_DL, v)
end);
table.foreach(AtlasRE, function(v)
table.insert(ATLAS_DROPDOWN_LIST_RE, v)
end);
--Update the level ranges and player limits
--Overrides the values in the localization files because I'm too lazy to change them all
--It's also nice to have all the these figures come from only one place
Atlas_UpdateLevelRanges();
Atlas_UpdatePlayerLimits();
--Sort the lists of maps alphabetically
table.sort(ATLAS_DROPDOWN_LIST, Atlas_SortZonesAlpha);
table.sort(ATLAS_DROPDOWN_LIST_BG, Atlas_SortZonesAlphaBG);
table.sort(ATLAS_DROPDOWN_LIST_FP, Atlas_SortZonesAlphaFP);
table.sort(ATLAS_DROPDOWN_LIST_DL, Atlas_SortZonesAlphaDL);
table.sort(ATLAS_DROPDOWN_LIST_RE, Atlas_SortZonesAlphaRE);
--Now that saved variables have been loaded, update everything accordingly
Atlas_Refresh();
AtlasOptions_Init();
Atlas_UpdateLock();
AtlasButton_UpdatePosition();
Atlas_UpdateAlpha();
--myAddOns support
if(myAddOnsFrame_Register) then
myAddOnsFrame_Register(AtlasDetails);
end
--Cosmos integration
if(EarthFeature_AddButton) then
EarthFeature_AddButton(
{
id = ATLAS_TITLE;
name = ATLAS_TITLE;
subtext = ATLAS_SUBTITLE;
tooltip = ATLAS_DESC;
icon = "Interface\\AddOns\\Atlas\\Images\\AtlasIcon";
callback = Atlas_Toggle;
test = nil;
}
);
elseif(Cosmos_RegisterButton) then
Cosmos_RegisterButton(
ATLAS_TITLE,
ATLAS_SUBTITLE,
ATLAS_DESC,
"Interface\\AddOns\\Atlas\\Images\\AtlasIcon",
Atlas_Toggle
);
end
--CTMod integration
if(CT_RegisterMod) then
CT_RegisterMod(
ATLAS_TITLE,
ATLAS_SUBTITLE,
5,
"Interface\\AddOns\\Atlas\\Images\\AtlasIcon",
ATLAS_DESC,
"switch",
"",
Atlas_Toggle
);
end
end
--Simple function to toggle the Atlas frame's lock status and update it's appearance
function Atlas_ToggleLock()
if(AtlasOptions.AtlasLocked) then
AtlasOptions.AtlasLocked = false;
Atlas_UpdateLock();
else
AtlasOptions.AtlasLocked = true;
Atlas_UpdateLock();
end
end
--Updates the appearance of the lock button based on the status of AtlasLocked
function Atlas_UpdateLock()
if(AtlasOptions.AtlasLocked) then
AtlasLockNorm:SetTexture("Interface\\AddOns\\Atlas\\Images\\LockButton-Locked-Up");
AtlasLockPush:SetTexture("Interface\\AddOns\\Atlas\\Images\\LockButton-Locked-Down");
else
AtlasLockNorm:SetTexture("Interface\\AddOns\\Atlas\\Images\\LockButton-Unlocked-Up");
AtlasLockPush:SetTexture("Interface\\AddOns\\Atlas\\Images\\LockButton-Unlocked-Down");
end
end
--Begin moving the Atlas frame if it's unlocked
function Atlas_StartMoving()
if(not AtlasOptions.AtlasLocked) then
AtlasFrame:StartMoving();
end
end
--Parses slash commands
--If an unrecognized command is given, toggle Atlas
function Atlas_SlashCommand(msg)
if(msg == ATLAS_SLASH_OPTIONS) then
AtlasOptions_Toggle();
else
Atlas_Toggle();
end
end
--Sets the transparency of the Atlas frame based on AtlasAlpha
function Atlas_UpdateAlpha()
AtlasFrame:SetAlpha(AtlasOptions.AtlasAlpha);
end
--Simple function to toggle the visibility of the Atlas frame
function Atlas_Toggle()
if(AtlasFrame:IsVisible()) then
HideUIPanel(AtlasFrame);
else
ShowUIPanel(AtlasFrame);
end
end
--Refreshes the Atlas frame, usually because a new map needs to be displayed
--The zoneID variable represents the internal name used for each map
--Also responsible for updating all the text when a map is changed
function Atlas_Refresh()
local zoneID;
local textSource;
--Just in case AtlasType hasn't been initialized
--Added in response to a possible error
if ( AtlasOptions.AtlasType == nil ) then
AtlasOptions.AtlasType = 1;
end
if ( AtlasOptions.AtlasType == 1 ) then
zoneID = ATLAS_DROPDOWN_LIST[AtlasOptions.AtlasZone];
textSource = AtlasText;
elseif ( AtlasOptions.AtlasType == 2 ) then
zoneID = ATLAS_DROPDOWN_LIST_BG[AtlasOptions.AtlasZone];
textSource = AtlasBG;
elseif ( AtlasOptions.AtlasType == 3 ) then
zoneID = ATLAS_DROPDOWN_LIST_FP[AtlasOptions.AtlasZone];
textSource = AtlasFP;
elseif ( AtlasOptions.AtlasType == 4 ) then
zoneID = ATLAS_DROPDOWN_LIST_DL[AtlasOptions.AtlasZone];
textSource = AtlasDL;
elseif ( AtlasOptions.AtlasType == 5 ) then
zoneID = ATLAS_DROPDOWN_LIST_RE[AtlasOptions.AtlasZone];
textSource = AtlasRE;
end
AtlasMap:ClearAllPoints();
AtlasMap:SetWidth(512);
AtlasMap:SetHeight(512);
AtlasMap:SetPoint("TOPLEFT", "AtlasFrame", "TOPLEFT", 18, -84);
AtlasMap:SetTexture("Interface\\AddOns\\Atlas\\Images\\"..zoneID);
local ZoneNameText = textSource[zoneID]["ZoneName"];
if ( AtlasOptions.AtlasAcronyms and textSource[zoneID]["Acronym"] ~= nil) then
local _RED = "|cffcc6666";
ZoneNameText = ZoneNameText.._RED.." ["..textSource[zoneID]["Acronym"].."]";
end
AtlasText_ZoneName:SetText(ZoneNameText);
AtlasText_Location:SetText(ATLAS_STRING_LOCATION..": "..textSource[zoneID]["Location"]);
AtlasText_LevelRange:SetText(ATLAS_STRING_LEVELRANGE..": "..textSource[zoneID]["LevelRange"]);
AtlasText_PlayerLimit:SetText(ATLAS_STRING_PLAYERLIMIT..": "..textSource[zoneID]["PlayerLimit"]);
for i = 1, 27, 1 do
getglobal("AtlasText_"..i):SetText(textSource[zoneID][i]);
end
end
--Function used to initialize the map type dropdown menu
--Cycle through Atlas_MapTypes to populate the dropdown
function AtlasFrameDropDownType_Initialize()
local info;
for i = 1, getn(Atlas_MapTypes), 1 do
info = {
text = Atlas_MapTypes[i];
func = AtlasFrameDropDownType_OnClick;
};
UIDropDownMenu_AddButton(info);
end
end
--Called whenever the map type dropdown menu is shown
function AtlasFrameDropDownType_OnShow()
UIDropDownMenu_Initialize(AtlasFrameDropDownType, AtlasFrameDropDownType_Initialize);
UIDropDownMenu_SetSelectedID(AtlasFrameDropDownType, AtlasOptions.AtlasType);
UIDropDownMenu_SetWidth(175, AtlasFrameDropDownType);
end
--Called whenever an item in the map type dropdown menu is clicked
--Sets the main dropdown menu contents to reflect the category of map selected
function AtlasFrameDropDownType_OnClick()
i = this:GetID();
UIDropDownMenu_SetSelectedID(AtlasFrameDropDownType, i);
AtlasOptions.AtlasType = i;
AtlasOptions.AtlasZone = 1;
AtlasFrameDropDown_OnShow();
Atlas_Refresh();
end
--Function used to initialize the main dropdown menu
--Looks at the status of AtlasType to determine how to populate the list
function AtlasFrameDropDown_Initialize()
if ( AtlasOptions.AtlasType == 1 ) then
AtlasFrameDropDown_Populate(AtlasText, ATLAS_DROPDOWN_LIST);
elseif ( AtlasOptions.AtlasType == 2 ) then
AtlasFrameDropDown_Populate(AtlasBG, ATLAS_DROPDOWN_LIST_BG);
elseif ( AtlasOptions.AtlasType == 3 ) then
AtlasFrameDropDown_Populate(AtlasFP, ATLAS_DROPDOWN_LIST_FP);
elseif ( AtlasOptions.AtlasType == 4 ) then
AtlasFrameDropDown_Populate(AtlasDL, ATLAS_DROPDOWN_LIST_DL);
elseif ( AtlasOptions.AtlasType == 5 ) then
AtlasFrameDropDown_Populate(AtlasRE, ATLAS_DROPDOWN_LIST_RE);
end
end
--Populates the main dropdown menu based on the arguments given
--mapType is the name used in the localization files for the category of map
--dropList is the (hopefully) sorted list made from one of those categories
function AtlasFrameDropDown_Populate(mapType, dropList)
local info;
for i = 1, getn(dropList), 1 do
info = {
text = mapType[dropList[i]]["ZoneName"];
func = AtlasFrameDropDown_OnClick;
};
UIDropDownMenu_AddButton(info);
end
end
--Called whenever the main dropdown menu is shown
function AtlasFrameDropDown_OnShow()
UIDropDownMenu_Initialize(AtlasFrameDropDown, AtlasFrameDropDown_Initialize);
UIDropDownMenu_SetSelectedID(AtlasFrameDropDown, AtlasOptions.AtlasZone);
UIDropDownMenu_SetWidth(175, AtlasFrameDropDown);
end
--Called whenever an item in the main dropdown menu is clicked
--Sets the newly selected map as current and refreshes the frame
function AtlasFrameDropDown_OnClick()
i = this:GetID();
UIDropDownMenu_SetSelectedID(AtlasFrameDropDown, i);
AtlasOptions.AtlasZone = i;
Atlas_Refresh();
end
--Modifies the value of GetRealZoneText to account for some naming conventions
--Always use this function instead of GetRealZoneText within Atlas
function Atlas_GetFixedZoneText()
local currentZone = GetRealZoneText();
if (AtlasZoneSubstitutions[currentZone]) then
return AtlasZoneSubstitutions[currentZone];
end
return currentZone;
end
--Checks the player's current location against all Atlas maps
--If a match is found display that map right away
function Atlas_AutoSelect()
local currentZone = Atlas_GetFixedZoneText();
local currentMap = AtlasText[ATLAS_DROPDOWN_LIST[AtlasOptions.AtlasZone]]["ZoneName"];
if(currentZone ~= currentMap) then
for i = 1, getn(ATLAS_DROPDOWN_LIST), 1 do
local mapName = AtlasText[ATLAS_DROPDOWN_LIST[i]]["ZoneName"];
if(currentZone == mapName) then
AtlasOptions.AtlasType = 1;
AtlasOptions.AtlasZone = i;
UIDropDownMenu_SetSelectedID(AtlasFrameDropDown, i);
Atlas_Refresh();
end
end
end
end
--Called whenever the Atlas frame is displayed
function Atlas_OnShow()
if(AtlasOptions.AtlasAutoSelect) then
Atlas_AutoSelect();
end
end
--Checks to see if the World Map should be replaced by Atlas or not
--Is the feature turned on? Is the player in an instance?
function Atlas_ReplaceWorldMap()
if(AtlasOptions.AtlasReplaceWorldMap) then
local currentZone = Atlas_GetFixedZoneText();
for i = 1, getn(ATLAS_DROPDOWN_LIST), 1 do
local mapName = AtlasText[ATLAS_DROPDOWN_LIST[i]]["ZoneName"];
if(currentZone == mapName) then
return true;
end
end
end
return false;
end
--Code provided by Morac
--Replaces the default ToggleWorldMap function
function ToggleWorldMap()
if ( WorldMapFrame:IsVisible() ) then
HideUIPanel(WorldMapFrame);
else
if(Atlas_ReplaceWorldMap()) then
Atlas_Toggle();
else
--removed due to error in 1.12 (8/22/06)
--SetupWorldMapScale(WorldMapFrame);
ShowUIPanel(WorldMapFrame);
end
end
end
--Code provided by tyroney
--Bugfix code by Cold
--Runs when the Atlas frame is clicked on
--RightButton closes Atlas and open the World Map if the RightClick option is turned on
function Atlas_OnClick()
if ( arg1 == "RightButton" ) then
if (AtlasOptions.AtlasRightClick) then
local OldAtlasOptReplWMap = AtlasOptions.AtlasReplaceWorldMap;
AtlasOptions.AtlasReplaceWorldMap = false;
Atlas_Toggle();
ToggleWorldMap();
AtlasOptions.AtlasReplaceWorldMap = OldAtlasOptReplWMap;
end
end
end