You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

13624 lines
384 KiB

--[[
Name: LibTourist-3.0
Revision: $Rev: 309 $
Author(s): Odica (owner), originally created by ckknight and Arrowmaster
Documentation: https://www.wowace.com/projects/libtourist-3-0/pages/api-reference
SVN: svn://svn.wowace.com/wow/libtourist-3-0/mainline/trunk
Description: A library to provide information about zones and instances.
License: MIT
]]
local MAJOR_VERSION = "LibTourist-3.0"
local MINOR_VERSION = 90000 + tonumber(("$Revision: 310 $"):match("(%d+)"))
if not LibStub then error(MAJOR_VERSION .. " requires LibStub") end
local C_Map = C_Map
local Tourist, oldLib = LibStub:NewLibrary(MAJOR_VERSION, MINOR_VERSION)
if not Tourist then
return
end
if oldLib then
oldLib = {}
for k, v in pairs(Tourist) do
Tourist[k] = nil
oldLib[k] = v
end
end
local MAX_PLAYER_LEVEL = MAX_PLAYER_LEVEL or GetMaxLevelForPlayerExpansion()
local HBD = LibStub("HereBeDragons-2.0")
function Tourist:GetHBD() return HBD end
--local Logger = LibStub("Logger")
local function trace(msg)
-- DEFAULT_CHAT_FRAME:AddMessage("[LT] "..tostring(msg))
-- Logger:LogLine("[LT] "..tostring(msg))
end
--trace("|r|cffff4422! -- Tourist:|r Warning: This is an alpha version with limited functionality." )
-- Localization tables
local BZ = {}
local BZR = {}
local playerLevel = UnitLevel("player")
local isAlliance, isHorde, isNeutral
do
local faction = UnitFactionGroup("player")
isAlliance = faction == "Alliance"
isHorde = faction == "Horde"
isNeutral = not isAlliance and not isHorde
end
local isWestern = GetLocale() == "enUS" or GetLocale() == "deDE" or GetLocale() == "frFR" or GetLocale() == "esES"
-- Continents
local Azeroth = "Azeroth"
local Kalimdor = "Kalimdor"
local Eastern_Kingdoms = "Eastern Kingdoms"
local Outland = "Outland"
local Northrend = "Northrend"
local The_Maelstrom = "The Maelstrom"
local Pandaria = "Pandaria"
local Draenor = "Draenor"
local Broken_Isles = "Broken Isles"
local Argus = "Argus"
local Zandalar = "Zandalar"
local Kul_Tiras = "Kul Tiras"
local The_Shadowlands = "The Shadowlands"
local Dragon_Isles = "Dragon Isles"
-- Expansions: use localized names provided by the game
local Classic = EXPANSION_NAME0
local The_Burning_Crusade = EXPANSION_NAME1
local Wrath_of_the_Lich_King = EXPANSION_NAME2
local Cataclysm = EXPANSION_NAME3
local Mists_of_Pandaria = EXPANSION_NAME4
local Warlords_of_Draenor = EXPANSION_NAME5
local Legion = EXPANSION_NAME6
local Battle_for_Azeroth = EXPANSION_NAME7
local Shadowlands = EXPANSION_NAME8
local DragonFlight = EXPANSION_NAME9
local expansionToIndex = {
[Classic] = 1,
[The_Burning_Crusade] = 2,
[Wrath_of_the_Lich_King] = 3,
[Cataclysm] = 4,
[Mists_of_Pandaria] = 5,
[Warlords_of_Draenor] = 6,
[Legion] = 7,
[Battle_for_Azeroth] = 8,
[Shadowlands] = 9,
[DragonFlight] = 10,
}
local chromieTimeToExpansion = {
[5] = Cataclysm,
[6] = The_Burning_Crusade,
[7] = Wrath_of_the_Lich_King,
[8] = Mists_of_Pandaria,
[9] = Warlords_of_Draenor,
[10] = Legion,
}
local X_Y_ZEPPELIN = "%s - %s Zeppelin"
local X_Y_BOAT = "%s - %s Boat"
local X_Y_PORTAL = "%s - %s Portal"
local X_Y_TELEPORT = "%s - %s Teleport"
local X_Y_WAYSTONE = "%s - %s Waystone"
local X_Y_FLIGHTPATH = "%s - %s Flight path" -- used for path connections between zones that can only be reached using the taxi service
if GetLocale() == "zhCN" then
X_Y_ZEPPELIN = "%s - %s 飞艇"
X_Y_BOAT = "%s - %s 船"
X_Y_PORTAL = "%s - %s 传送门"
X_Y_TELEPORT = "%s - %s 传送门"
X_Y_WAYSTONE = "%s - %s 路石"
X_Y_FLIGHTPATH = "%s - %s 飞行路径"
elseif GetLocale() == "zhTW" then
X_Y_ZEPPELIN = "%s - %s 飛艇"
X_Y_BOAT = "%s - %s 船"
X_Y_PORTAL = "%s - %s 傳送門"
X_Y_TELEPORT = "%s - %s 傳送門"
X_Y_WAYSTONE = "%s - %s 路石"
X_Y_FLIGHTPATH = "%s - %s 飛行路徑"
elseif GetLocale() == "frFR" then
X_Y_ZEPPELIN = "Zeppelin %s - %s"
X_Y_BOAT = "Bateau %s - %s"
X_Y_PORTAL = "Portail %s - %s"
X_Y_TELEPORT = "Téléport %s - %s"
X_Y_WAYSTONE = "Pierre de chemin %s - %s"
X_Y_FLIGHTPATH = "Trajectoire de vol %s - %s"
elseif GetLocale() == "koKR" then
X_Y_ZEPPELIN = "%s - %s 비행선"
X_Y_BOAT = "%s - %s 배"
X_Y_PORTAL = "%s - %s 차원문"
X_Y_TELEPORT = "%s - %s 차원문"
X_Y_WAYSTONE = "%s - %s 웨이 스톤"
X_Y_FLIGHTPATH = "%s - %s 비행 경로"
elseif GetLocale() == "deDE" then
X_Y_ZEPPELIN = "%s - %s Zeppelin"
X_Y_BOAT = "%s - %s Schiff"
X_Y_PORTAL = "%s - %s Portal"
X_Y_TELEPORT = "%s - %s Teleport"
X_Y_WAYSTONE = "%s - %s Wegstein"
X_Y_FLIGHTPATH = "%s - %s Flugbahn"
elseif GetLocale() == "esES" then
X_Y_ZEPPELIN = "%s - %s Zepelín"
X_Y_BOAT = "%s - %s Barco"
X_Y_PORTAL = "%s - %s Portal"
X_Y_TELEPORT = "%s - %s Teletransportador"
X_Y_WAYSTONE = "%s - %s Piedra de camino"
X_Y_FLIGHTPATH = "%s - %s Trayectoria de vuelo"
elseif GetLocale() == "esMX" then
X_Y_ZEPPELIN = "%s - %s Zepelín"
X_Y_BOAT = "%s - %s Barco"
X_Y_PORTAL = "%s - %s Portal"
X_Y_TELEPORT = "%s - %s Teletransportador"
X_Y_WAYSTONE = "%s - %s Piedra de camino"
X_Y_FLIGHTPATH = "%s - %s Trayectoria de vuelo"
elseif GetLocale() == "itIT" then
X_Y_ZEPPELIN = "%s - %s Zeppelin"
X_Y_BOAT = "%s - %s Barca"
X_Y_PORTAL = "%s - %s Portale"
X_Y_TELEPORT = "%s - %s Teletrasporto"
X_Y_WAYSTONE = "%s - %s Pietra del cammino"
X_Y_FLIGHTPATH = "%s - %s Percorso di volo"
elseif GetLocale() == "ptBR" then
X_Y_ZEPPELIN = "%s - %s Zepelim"
X_Y_BOAT = "%s - %s Barco"
X_Y_PORTAL = "%s - %s Portal"
X_Y_TELEPORT = "%s - %s Teleporte"
X_Y_WAYSTONE = "%s - %s Pedra caminho"
X_Y_FLIGHTPATH = "%s - %s Rota de Vôo"
end
local recZones = {}
local recInstances = {}
local lows = setmetatable({}, {__index = function() return 0 end})
local highs = setmetatable({}, getmetatable(lows))
local ct_lows = setmetatable({}, {__index = function() return 0 end}) -- Chromie Time lows (high is always 50)
local expansions = {}
local continents = {}
local instances = {}
local paths = {}
local flightnodes = {}
local types = {}
local groupSizes = {}
local groupMinSizes = {}
local groupMaxSizes = {}
local groupAltSizes = {}
local factions = {}
local yardWidths = {}
local yardHeights = {}
local yardXOffsets = {}
local yardYOffsets = {}
local continentScales = {}
local battlepet_lows = {}
local battlepet_highs = {}
local cost = {}
local textures = {}
local textures_rev = {}
local complexOfInstance = {}
local zoneComplexes = {}
local entrancePortals_zone = {}
local entrancePortals_x = {}
local entrancePortals_y = {}
local zoneMapIDtoContinentMapID = {}
--local zoneMapIDtoExpansionIndex = {}
local zoneMapIDs = {}
local mapZonesByContinentID = {}
local FlightnodeLookupTable = {}
local gatheringFlightnodes = false
local flightnodeDataGathered = false
local COSMIC_MAP_ID = 946
local THE_MAELSTROM_MAP_ID = 948
local DRAENOR_MAP_ID = 572
local BROKEN_ISLES_MAP_ID = 619
--------------------------------------------------------------------------------------------------------
-- Localization --
--------------------------------------------------------------------------------------------------------
local MapIdLookupTable = {
[1] = "Durotar",
[2] = "Burning Blade Coven",
[3] = "Tiragarde Keep",
[4] = "Tiragarde Keep",
[5] = "Skull Rock",
[6] = "Dustwind Cave",
[7] = "Mulgore",
[8] = "Palemane Rock",
[9] = "The Venture Co. Mine",
[10] = "Northern Barrens",
[11] = "Wailing Caverns",
[12] = "Kalimdor",
[13] = "Eastern Kingdoms",
[14] = "Arathi Highlands",
[15] = "Badlands",
[16] = "Uldaman",
[17] = "Blasted Lands",
[18] = "Tirisfal Glades",
[19] = "Scarlet Monastery Entrance",
[20] = "Keeper's Rest",
[21] = "Silverpine Forest",
[22] = "Western Plaguelands",
[23] = "Eastern Plaguelands",
[24] = "Light's Hope Chapel",
[25] = "Hillsbrad Foothills",
[26] = "The Hinterlands",
[27] = "Dun Morogh",
[28] = "Coldridge Pass",
[29] = "The Grizzled Den",
[30] = "New Tinkertown",
[31] = "Gol'Bolar Quarry",
[32] = "Searing Gorge",
[33] = "Blackrock Mountain",
[34] = "Blackrock Mountain",
[35] = "Blackrock Mountain",
[36] = "Burning Steppes",
[37] = "Elwynn Forest",
[38] = "Fargodeep Mine",
[39] = "Fargodeep Mine",
[40] = "Jasperlode Mine",
[41] = "Dalaran",
[42] = "Deadwind Pass",
[43] = "The Master's Cellar",
[44] = "The Master's Cellar",
[45] = "The Master's Cellar",
[46] = "Karazhan Catacombs",
[47] = "Duskwood",
[48] = "Loch Modan",
[49] = "Redridge Mountains",
[50] = "Northern Stranglethorn",
[51] = "Swamp of Sorrows",
[52] = "Westfall",
[53] = "Gold Coast Quarry",
[54] = "Jangolode Mine",
[55] = "The Deadmines",
[56] = "Wetlands",
[57] = "Teldrassil",
[58] = "Shadowthread Cave",
[59] = "Fel Rock",
[60] = "Ban'ethil Barrow Den",
[61] = "Ban'ethil Barrow Den",
[62] = "Darkshore",
[63] = "Ashenvale",
[64] = "Thousand Needles",
[65] = "Stonetalon Mountains",
[66] = "Desolace",
[67] = "Maraudon",
[68] = "Maraudon",
[69] = "Feralas",
[70] = "Dustwallow Marsh",
[71] = "Tanaris",
[72] = "The Noxious Lair",
[73] = "The Gaping Chasm",
[74] = "Caverns of Time",
[75] = "Caverns of Time",
[76] = "Azshara",
[77] = "Felwood",
[78] = "Un'Goro Crater",
[79] = "The Slithering Scar",
[80] = "Moonglade",
[81] = "Silithus",
[82] = "Twilight's Run",
[83] = "Winterspring",
[84] = "Stormwind City",
[85] = "Orgrimmar",
[86] = "Orgrimmar",
[87] = "Ironforge",
[88] = "Thunder Bluff",
[89] = "Darnassus",
[90] = "Undercity",
[91] = "Alterac Valley",
[92] = "Warsong Gulch",
[93] = "Arathi Basin",
[94] = "Eversong Woods",
[95] = "Ghostlands",
[96] = "Amani Catacombs",
[97] = "Azuremyst Isle",
[98] = "Tides' Hollow",
[99] = "Stillpine Hold",
[100] = "Hellfire Peninsula",
[101] = "Outland",
[102] = "Zangarmarsh",
[103] = "The Exodar",
[104] = "Shadowmoon Valley",
[105] = "Blade's Edge Mountains",
[106] = "Bloodmyst Isle",
[107] = "Nagrand",
[108] = "Terokkar Forest",
[109] = "Netherstorm",
[110] = "Silvermoon City",
[111] = "Shattrath City",
[112] = "Eye of the Storm",
[113] = "Northrend",
[114] = "Borean Tundra",
[115] = "Dragonblight",
[116] = "Grizzly Hills",
[117] = "Howling Fjord",
[118] = "Icecrown",
[119] = "Sholazar Basin",
[120] = "The Storm Peaks",
[121] = "Zul'Drak",
[122] = "Isle of Quel'Danas",
[123] = "Wintergrasp",
[124] = "Plaguelands: The Scarlet Enclave",
[125] = "Dalaran",
[126] = "Dalaran",
[127] = "Crystalsong Forest",
[128] = "Strand of the Ancients",
[129] = "The Nexus",
[130] = "The Culling of Stratholme",
[131] = "The Culling of Stratholme",
[132] = "Ahn'kahet: The Old Kingdom",
[133] = "Utgarde Keep",
[134] = "Utgarde Keep",
[135] = "Utgarde Keep",
[136] = "Utgarde Pinnacle",
[137] = "Utgarde Pinnacle",
[138] = "Halls of Lightning",
[139] = "Halls of Lightning",
[140] = "Halls of Stone",
[141] = "The Eye of Eternity",
[142] = "The Oculus",
[143] = "The Oculus",
[144] = "The Oculus",
[145] = "The Oculus",
[146] = "The Oculus",
[147] = "Ulduar",
[148] = "Ulduar",
[149] = "Ulduar",
[150] = "Ulduar",
[151] = "Ulduar",
[152] = "Ulduar",
[153] = "Gundrak",
[154] = "Gundrak",
[155] = "The Obsidian Sanctum",
[156] = "Vault of Archavon",
[157] = "Azjol-Nerub",
[158] = "Azjol-Nerub",
[159] = "Azjol-Nerub",
[160] = "Drak'Tharon Keep",
[161] = "Drak'Tharon Keep",
[162] = "Naxxramas",
[163] = "Naxxramas",
[164] = "Naxxramas",
[165] = "Naxxramas",
[166] = "Naxxramas",
[167] = "Naxxramas",
[168] = "The Violet Hold",
[169] = "Isle of Conquest",
[170] = "Hrothgar's Landing",
[171] = "Trial of the Champion",
[172] = "Trial of the Crusader",
[173] = "Trial of the Crusader",
[174] = "The Lost Isles",
[175] = "Kaja'mite Cavern",
[176] = "Volcanoth's Lair",
[177] = "Gallywix Labor Mine",
[178] = "Gallywix Labor Mine",
[179] = "Gilneas",
[180] = "Emberstone Mine",
[181] = "Greymane Manor",
[182] = "Greymane Manor",
[183] = "The Forge of Souls",
[184] = "Pit of Saron",
[185] = "Halls of Reflection",
[186] = "Icecrown Citadel",
[187] = "Icecrown Citadel",
[188] = "Icecrown Citadel",
[189] = "Icecrown Citadel",
[190] = "Icecrown Citadel",
[191] = "Icecrown Citadel",
[192] = "Icecrown Citadel",
[193] = "Icecrown Citadel",
[194] = "Kezan",
[195] = "Kaja'mine",
[196] = "Kaja'mine",
[197] = "Kaja'mine",
[198] = "Mount Hyjal",
[199] = "Southern Barrens",
[200] = "The Ruby Sanctum",
[201] = "Kelp'thar Forest",
[202] = "Gilneas City",
[203] = "Vashj'ir",
[204] = "Abyssal Depths",
[205] = "Shimmering Expanse",
[206] = "Twin Peaks",
[207] = "Deepholm",
[208] = "Twilight Depths",
[209] = "Twilight Depths",
[210] = "The Cape of Stranglethorn",
[213] = "Ragefire Chasm",
[217] = "Ruins of Gilneas",
[218] = "Ruins of Gilneas City",
[219] = "Zul'Farrak",
[220] = "The Temple of Atal'Hakkar",
[221] = "Blackfathom Deeps",
[222] = "Blackfathom Deeps",
[223] = "Blackfathom Deeps",
[224] = "Stranglethorn Vale",
[225] = "The Stockade",
[226] = "Gnomeregan",
[227] = "Gnomeregan",
[228] = "Gnomeregan",
[229] = "Gnomeregan",
[230] = "Uldaman",
[231] = "Uldaman",
[232] = "Molten Core",
[233] = "Zul'Gurub",
[234] = "Dire Maul",
[235] = "Dire Maul",
[236] = "Dire Maul",
[237] = "Dire Maul",
[238] = "Dire Maul",
[239] = "Dire Maul",
[240] = "Dire Maul",
[241] = "Twilight Highlands",
[242] = "Blackrock Depths",
[243] = "Blackrock Depths",
[244] = "Tol Barad",
[245] = "Tol Barad Peninsula",
[246] = "The Shattered Halls",
[247] = "Ruins of Ahn'Qiraj",
[248] = "Onyxia's Lair",
[249] = "Uldum",
[250] = "Blackrock Spire",
[251] = "Blackrock Spire",
[252] = "Blackrock Spire",
[253] = "Blackrock Spire",
[254] = "Blackrock Spire",
[255] = "Blackrock Spire",
[256] = "Auchenai Crypts",
[257] = "Auchenai Crypts",
[258] = "Sethekk Halls",
[259] = "Sethekk Halls",
[260] = "Shadow Labyrinth",
[261] = "The Blood Furnace",
[262] = "The Underbog",
[263] = "The Steamvault",
[264] = "The Steamvault",
[265] = "The Slave Pens",
[266] = "The Botanica",
[267] = "The Mechanar",
[268] = "The Mechanar",
[269] = "The Arcatraz",
[270] = "The Arcatraz",
[271] = "The Arcatraz",
[272] = "Mana-Tombs",
[273] = "The Black Morass",
[274] = "Old Hillsbrad Foothills",
[275] = "The Battle for Gilneas",
[276] = "The Maelstrom",
[277] = "Lost City of the Tol'vir",
[279] = "Wailing Caverns",
[280] = "Maraudon",
[281] = "Maraudon",
[282] = "Baradin Hold",
[283] = "Blackrock Caverns",
[284] = "Blackrock Caverns",
[285] = "Blackwing Descent",
[286] = "Blackwing Descent",
[287] = "Blackwing Lair",
[288] = "Blackwing Lair",
[289] = "Blackwing Lair",
[290] = "Blackwing Lair",
[291] = "The Deadmines",
[292] = "The Deadmines",
[293] = "Grim Batol",
[294] = "The Bastion of Twilight",
[295] = "The Bastion of Twilight",
[296] = "The Bastion of Twilight",
[297] = "Halls of Origination",
[298] = "Halls of Origination",
[299] = "Halls of Origination",
[300] = "Razorfen Downs",
[301] = "Razorfen Kraul",
[302] = "Scarlet Monastery",
[303] = "Scarlet Monastery",
[304] = "Scarlet Monastery",
[305] = "Scarlet Monastery",
[306] = "Legacy of Scholomance",
[307] = "Legacy of Scholomance",
[308] = "Legacy of Scholomance",
[309] = "Legacy of Scholomance",
[310] = "Shadowfang Keep",
[311] = "Shadowfang Keep",
[312] = "Shadowfang Keep",
[313] = "Shadowfang Keep",
[314] = "Shadowfang Keep",
[315] = "Shadowfang Keep",
[316] = "Shadowfang Keep",
[317] = "Stratholme",
[318] = "Stratholme",
[319] = "Ahn'Qiraj",
[320] = "Ahn'Qiraj",
[321] = "Ahn'Qiraj",
[322] = "Throne of the Tides",
[323] = "Throne of the Tides",
[324] = "The Stonecore",
[325] = "The Vortex Pinnacle",
[327] = "Ahn'Qiraj: The Fallen Kingdom",
[328] = "Throne of the Four Winds",
[329] = "Hyjal Summit",
[330] = "Gruul's Lair",
[331] = "Magtheridon's Lair",
[332] = "Serpentshrine Cavern",
[333] = "Zul'Aman",
[334] = "Tempest Keep",
[335] = "Sunwell Plateau",
[336] = "Sunwell Plateau",
[337] = "Zul'Gurub",
[338] = "Molten Front",
[339] = "Black Temple",
[340] = "Black Temple",
[341] = "Black Temple",
[342] = "Black Temple",
[343] = "Black Temple",
[344] = "Black Temple",
[345] = "Black Temple",
[346] = "Black Temple",
[347] = "Hellfire Ramparts",
[348] = "Magisters' Terrace",
[349] = "Magisters' Terrace",
[350] = "Karazhan",
[351] = "Karazhan",
[352] = "Karazhan",
[353] = "Karazhan",
[354] = "Karazhan",
[355] = "Karazhan",
[356] = "Karazhan",
[357] = "Karazhan",
[358] = "Karazhan",
[359] = "Karazhan",
[360] = "Karazhan",
[361] = "Karazhan",
[362] = "Karazhan",
[363] = "Karazhan",
[364] = "Karazhan",
[365] = "Karazhan",
[366] = "Karazhan",
[367] = "Firelands",
[368] = "Firelands",
[369] = "Firelands",
[370] = "The Nexus",
[371] = "The Jade Forest",
[372] = "Greenstone Quarry",
[373] = "Greenstone Quarry",
[374] = "The Widow's Wail",
[375] = "Oona Kagu",
[376] = "Valley of the Four Winds",
[377] = "Cavern of Endless Echoes",
[378] = "The Wandering Isle",
[379] = "Kun-Lai Summit",
[380] = "Howlingwind Cavern",
[381] = "Pranksters' Hollow",
[382] = "Knucklethump Hole",
[383] = "The Deeper",
[384] = "The Deeper",
[385] = "Tomb of Conquerors",
[386] = "Ruins of Korune",
[387] = "Ruins of Korune",
[388] = "Townlong Steppes",
[389] = "Niuzao Temple",
[390] = "Vale of Eternal Blossoms",
[391] = "Shrine of Two Moons",
[392] = "Shrine of Two Moons",
[393] = "Shrine of Seven Stars",
[394] = "Shrine of Seven Stars",
[395] = "Guo-Lai Halls",
[396] = "Guo-Lai Halls",
[397] = "Eye of the Storm",
[398] = "Well of Eternity",
[399] = "Hour of Twilight",
[400] = "Hour of Twilight",
[401] = "End Time",
[402] = "End Time",
[403] = "End Time",
[404] = "End Time",
[405] = "End Time",
[406] = "End Time",
[407] = "Darkmoon Island",
[408] = "Darkmoon Island",
[409] = "Dragon Soul",
[410] = "Dragon Soul",
[411] = "Dragon Soul",
[412] = "Dragon Soul",
[413] = "Dragon Soul",
[414] = "Dragon Soul",
[415] = "Dragon Soul",
[416] = "Dustwallow Marsh",
[417] = "Temple of Kotmogu",
[418] = "Krasarang Wilds",
[419] = "Ruins of Ogudei",
[420] = "Ruins of Ogudei",
[421] = "Ruins of Ogudei",
[422] = "Dread Wastes",
[423] = "Silvershard Mines",
[424] = "Pandaria",
[425] = "Northshire",
[426] = "Echo Ridge Mine",
[427] = "Coldridge Valley",
[428] = "Frostmane Hovel",
[429] = "Temple of the Jade Serpent",
[430] = "Temple of the Jade Serpent",
[431] = "Scarlet Halls",
[432] = "Scarlet Halls",
[433] = "The Veiled Stair",
[434] = "The Ancient Passage",
[435] = "Scarlet Monastery",
[436] = "Scarlet Monastery",
[437] = "Gate of the Setting Sun",
[438] = "Gate of the Setting Sun",
[439] = "Stormstout Brewery",
[440] = "Stormstout Brewery",
[441] = "Stormstout Brewery",
[442] = "Stormstout Brewery",
[443] = "Shado-Pan Monastery",
[444] = "Shado-Pan Monastery",
[445] = "Shado-Pan Monastery",
[446] = "Shado-Pan Monastery",
[447] = "A Brewing Storm",
[448] = "The Jade Forest",
[449] = "Temple of Kotmogu",
[450] = "Unga Ingoo",
[451] = "Assault on Zan'vess",
[452] = "Brewmoon Festival",
[453] = "Mogu'shan Palace",
[454] = "Mogu'shan Palace",
[455] = "Mogu'shan Palace",
[456] = "Terrace of Endless Spring",
[457] = "Siege of Niuzao Temple",
[458] = "Siege of Niuzao Temple",
[459] = "Siege of Niuzao Temple",
[460] = "Shadowglen",
[461] = "Valley of Trials",
[462] = "Camp Narache",
[463] = "Echo Isles",
[464] = "Spitescale Cavern",
[465] = "Deathknell",
[466] = "Night Web's Hollow",
[467] = "Sunstrider Isle",
[468] = "Ammen Vale",
[469] = "New Tinkertown",
[470] = "Frostmane Hold",
[471] = "Mogu'shan Vaults",
[472] = "Mogu'shan Vaults",
[473] = "Mogu'shan Vaults",
[474] = "Heart of Fear",
[475] = "Heart of Fear",
[476] = "Scholomance",
[477] = "Scholomance",
[478] = "Scholomance",
[479] = "Scholomance",
[480] = "Proving Grounds",
[481] = "Crypt of Forgotten Kings",
[482] = "Crypt of Forgotten Kings",
[483] = "Dustwallow Marsh",
[486] = "Krasarang Wilds",
[487] = "A Little Patience",
[488] = "Dagger in the Dark",
[489] = "Dagger in the Dark",
[490] = "Black Temple",
[491] = "Black Temple",
[492] = "Black Temple",
[493] = "Black Temple",
[494] = "Black Temple",
[495] = "Black Temple",
[496] = "Black Temple",
[497] = "Black Temple",
[498] = "Krasarang Wilds",
[499] = "Deeprun Tram",
[500] = "Deeprun Tram",
[501] = "Dalaran",
[502] = "Dalaran",
[503] = "Brawl'gar Arena",
[504] = "Isle of Thunder",
[505] = "Lightning Vein Mine",
[506] = "The Swollen Vault",
[507] = "Isle of Giants",
[508] = "Throne of Thunder",
[509] = "Throne of Thunder",
[510] = "Throne of Thunder",
[511] = "Throne of Thunder",
[512] = "Throne of Thunder",
[513] = "Throne of Thunder",
[514] = "Throne of Thunder",
[515] = "Throne of Thunder",
[516] = "Isle of Thunder",
[517] = "Lightning Vein Mine",
[518] = "Thunder King's Citadel",
[519] = "Deepwind Gorge",
[520] = "Vale of Eternal Blossoms",
[521] = "Vale of Eternal Blossoms",
[522] = "The Secrets of Ragefire",
[523] = "Dun Morogh",
[524] = "Battle on the High Seas",
[525] = "Frostfire Ridge",
[526] = "Turgall's Den",
[527] = "Turgall's Den",
[528] = "Turgall's Den",
[529] = "Turgall's Den",
[530] = "Grom'gar",
[531] = "Grulloc's Grotto",
[532] = "Grulloc's Grotto",
[533] = "Snowfall Alcove",
[534] = "Tanaan Jungle",
[535] = "Talador",
[536] = "Tomb of Lights",
[537] = "Tomb of Souls",
[538] = "The Breached Ossuary",
[539] = "Shadowmoon Valley",
[540] = "Bloodthorn Cave",
[541] = "Den of Secrets",
[542] = "Spires of Arak",
[543] = "Gorgrond",
[544] = "Moira's Reach",
[545] = "Moira's Reach",
[546] = "Fissure of Fury",
[547] = "Fissure of Fury",
[548] = "Cragplume Cauldron",
[549] = "Cragplume Cauldron",
[550] = "Nagrand",
[551] = "The Masters' Cavern",
[552] = "Stonecrag Gorge",
[553] = "Oshu'gun",
[554] = "Timeless Isle",
[555] = "Cavern of Lost Spirits",
[556] = "Siege of Orgrimmar",
[557] = "Siege of Orgrimmar",
[558] = "Siege of Orgrimmar",
[559] = "Siege of Orgrimmar",
[560] = "Siege of Orgrimmar",
[561] = "Siege of Orgrimmar",
[562] = "Siege of Orgrimmar",
[563] = "Siege of Orgrimmar",
[564] = "Siege of Orgrimmar",
[565] = "Siege of Orgrimmar",
[566] = "Siege of Orgrimmar",
[567] = "Siege of Orgrimmar",
[568] = "Siege of Orgrimmar",
[569] = "Siege of Orgrimmar",
[570] = "Siege of Orgrimmar",
[571] = "Celestial Tournament",
[572] = "Draenor",
[573] = "Bloodmaul Slag Mines",
[574] = "Shadowmoon Burial Grounds",
[575] = "Shadowmoon Burial Grounds",
[576] = "Shadowmoon Burial Grounds",
[577] = "Tanaan Jungle",
[578] = "Umbral Halls",
[579] = "Lunarfall Excavation",
[580] = "Lunarfall Excavation",
[581] = "Lunarfall Excavation",
[582] = "Lunarfall",
[585] = "Frostwall Mine",
[586] = "Frostwall Mine",
[587] = "Frostwall Mine",
[588] = "Ashran",
[589] = "Ashran Mine",
[590] = "Frostwall",
[593] = "Auchindoun",
[594] = "Shattrath City",
[595] = "Iron Docks",
[596] = "Blackrock Foundry",
[597] = "Blackrock Foundry",
[598] = "Blackrock Foundry",
[599] = "Blackrock Foundry",
[600] = "Blackrock Foundry",
[601] = "Skyreach",
[602] = "Skyreach",
[606] = "Grimrail Depot",
[607] = "Grimrail Depot",
[608] = "Grimrail Depot",
[609] = "Grimrail Depot",
[610] = "Highmaul",
[611] = "Highmaul",
[612] = "Highmaul",
[613] = "Highmaul",
[614] = "Highmaul",
[615] = "Highmaul",
[616] = "Upper Blackrock Spire",
[617] = "Upper Blackrock Spire",
[618] = "Upper Blackrock Spire",
[619] = "Broken Isles",
[620] = "The Everbloom",
[621] = "The Everbloom",
[622] = "Stormshield",
[623] = "Hillsbrad Foothills (Southshore vs. Tarren Mill)",
[624] = "Warspear",
[626] = "Dalaran",
[627] = "Dalaran",
[628] = "Dalaran",
[629] = "Dalaran",
[630] = "Azsuna",
[631] = "Nar'thalas Academy",
[632] = "Oceanus Cove",
[633] = "Temple of a Thousand Lights",
[634] = "Stormheim",
[635] = "Shield's Rest",
[636] = "Stormscale Cavern",
[637] = "Thorignir Refuge",
[638] = "Thorignir Refuge",
[639] = "Aggramar's Vault",
[640] = "Vault of Eyir",
[641] = "Val'sharah",
[642] = "Darkpens",
[643] = "Sleeper's Barrow",
[644] = "Sleeper's Barrow",
[645] = "Twisting Nether",
[646] = "Broken Shore",
[647] = "Acherus: The Ebon Hold",
[648] = "Acherus: The Ebon Hold",
[649] = "Helheim",
[650] = "Highmountain",
[651] = "Bitestone Enclave",
[652] = "Thunder Totem",
[653] = "Cave of the Blood Trial",
[654] = "Mucksnout Den",
[655] = "Lifespring Cavern",
[656] = "Lifespring Cavern",
[657] = "Path of Huln",
[658] = "Path of Huln",
[659] = "Stonedark Grotto",
[660] = "Feltotem Caverns",
[661] = "Hellfire Citadel",
[662] = "Hellfire Citadel",
[663] = "Hellfire Citadel",
[664] = "Hellfire Citadel",
[665] = "Hellfire Citadel",
[666] = "Hellfire Citadel",
[667] = "Hellfire Citadel",
[668] = "Hellfire Citadel",
[669] = "Hellfire Citadel",
[670] = "Hellfire Citadel",
[671] = "The Cove of Nashal",
[672] = "Mardum, the Shattered Abyss",
[673] = "Cryptic Hollow",
[674] = "Soul Engine",
[675] = "Soul Engine",
[676] = "Broken Shore",
[677] = "Vault of the Wardens",
[678] = "Vault of the Wardens",
[679] = "Vault of the Wardens",
[680] = "Suramar",
[681] = "The Arcway Vaults",
[682] = "Felsoul Hold",
[683] = "The Arcway Vaults",
[684] = "Shattered Locus",
[685] = "Shattered Locus",
[686] = "Elor'shan",
[687] = "Kel'balor",
[688] = "Ley Station Anora",
[689] = "Ley Station Moonfall",
[690] = "Ley Station Aethenar",
[691] = "Nyell's Workshop",
[692] = "Falanaar Arcway",
[693] = "Falanaar Arcway",
[694] = "Helmouth Shallows",
[695] = "Skyhold",
[696] = "Stormheim",
[697] = "Azshara",
[698] = "Icecrown Citadel",
[699] = "Icecrown Citadel",
[700] = "Icecrown Citadel",
[701] = "Icecrown Citadel",
[702] = "Netherlight Temple",
[703] = "Halls of Valor",
[704] = "Halls of Valor",
[705] = "Halls of Valor",
[706] = "Helmouth Cliffs",
[707] = "Helmouth Cliffs",
[708] = "Helmouth Cliffs",
[709] = "The Wandering Isle",
[710] = "Vault of the Wardens",
[711] = "Vault of the Wardens",
[712] = "Vault of the Wardens",
[713] = "Eye of Azshara",
[714] = "Niskara",
[715] = "Emerald Dreamway",
[716] = "Skywall",
[717] = "Dreadscar Rift",
[718] = "Dreadscar Rift",
[719] = "Mardum, the Shattered Abyss",
[720] = "Mardum, the Shattered Abyss",
[721] = "Mardum, the Shattered Abyss",
[723] = "The Violet Hold",
[725] = "The Maelstrom",
[726] = "The Maelstrom",
[728] = "Terrace of Endless Spring",
[729] = "Crumbling Depths",
[731] = "Neltharion's Lair",
[732] = "Violet Hold",
[733] = "Darkheart Thicket",
[734] = "Hall of the Guardian",
[735] = "Hall of the Guardian",
[736] = "The Beyond",
[737] = "The Vortex Pinnacle",
[738] = "Firelands",
[739] = "Trueshot Lodge",
[740] = "Shadowgore Citadel",
[741] = "Shadowgore Citadel",
[742] = "Abyssal Maw",
[743] = "Abyssal Maw",
[744] = "Ulduar",
[745] = "Ulduar",
[746] = "Ulduar",
[747] = "The Dreamgrove",
[748] = "Niskara",
[749] = "The Arcway",
[750] = "Thunder Totem",
[751] = "Black Rook Hold",
[752] = "Black Rook Hold",
[753] = "Black Rook Hold",
[754] = "Black Rook Hold",
[755] = "Black Rook Hold",
[756] = "Black Rook Hold",
[757] = "Ursoc's Lair",
[758] = "Gloaming Reef",
[759] = "Black Temple",
[760] = "Malorne's Nightmare",
[761] = "Court of Stars",
[762] = "Court of Stars",
[763] = "Court of Stars",
[764] = "The Nighthold",
[765] = "The Nighthold",
[766] = "The Nighthold",
[767] = "The Nighthold",
[768] = "The Nighthold",
[769] = "The Nighthold",
[770] = "The Nighthold",
[771] = "The Nighthold",
[772] = "The Nighthold",
[773] = "Tol Barad",
[774] = "Tol Barad",
[775] = "The Exodar",
[776] = "Azuremyst Isle",
[777] = "The Emerald Nightmare",
[778] = "The Emerald Nightmare",
[779] = "The Emerald Nightmare",
[780] = "The Emerald Nightmare",
[781] = "The Emerald Nightmare",
[782] = "The Emerald Nightmare",
[783] = "The Emerald Nightmare",
[784] = "The Emerald Nightmare",
[785] = "The Emerald Nightmare",
[786] = "The Emerald Nightmare",
[787] = "The Emerald Nightmare",
[788] = "The Emerald Nightmare",
[789] = "The Emerald Nightmare",
[790] = "Eye of Azshara",
[791] = "Temple of the Jade Serpent",
[792] = "Temple of the Jade Serpent",
[793] = "Black Rook Hold",
[794] = "Karazhan",
[795] = "Karazhan",
[796] = "Karazhan",
[797] = "Karazhan",
[798] = "The Arcway",
[799] = "The Oculus",
[800] = "The Oculus",
[801] = "The Oculus",
[802] = "The Oculus",
[803] = "The Oculus",
[804] = "Scarlet Monastery",
[805] = "Scarlet Monastery",
[806] = "Trial of Valor",
[807] = "Trial of Valor",
[808] = "Trial of Valor",
[809] = "Karazhan",
[810] = "Karazhan",
[811] = "Karazhan",
[812] = "Karazhan",
[813] = "Karazhan",
[814] = "Karazhan",
[815] = "Karazhan",
[816] = "Karazhan",
[817] = "Karazhan",
[818] = "Karazhan",
[819] = "Karazhan",
[820] = "Karazhan",
[821] = "Karazhan",
[822] = "Karazhan",
[823] = "Pit of Saron",
[824] = "Islands",
[825] = "Wailing Caverns",
[826] = "Cave of the Bloodtotem",
[827] = "Stratholme",
[828] = "The Eye of Eternity",
[829] = "Halls of Valor",
[830] = "Krokuun",
[831] = "The Vindicaar",
[832] = "The Vindicaar",
[833] = "Nath'raxas Spire",
[834] = "Coldridge Valley",
[835] = "The Deadmines",
[836] = "The Deadmines",
[837] = "Arathi Basin",
[838] = "Battle for Blackrock Mountain",
[839] = "The Maelstrom",
[840] = "Gnomeregan",
[841] = "Gnomeregan",
[842] = "Gnomeregan",
[843] = "Shado-Pan Showdown",
[844] = "Arathi Basin",
[845] = "Cathedral of Eternal Night",
[846] = "Cathedral of Eternal Night",
[847] = "Cathedral of Eternal Night",
[848] = "Cathedral of Eternal Night",
[849] = "Cathedral of Eternal Night",
[850] = "Tomb of Sargeras",
[851] = "Tomb of Sargeras",
[852] = "Tomb of Sargeras",
[853] = "Tomb of Sargeras",
[854] = "Tomb of Sargeras",
[855] = "Tomb of Sargeras",
[856] = "Tomb of Sargeras",
[857] = "Throne of the Four Winds",
[858] = "Assault on Broken Shore",
[859] = "Warsong Gulch",
[860] = "The Ruby Sanctum",
[861] = "Mardum, the Shattered Abyss",
[862] = "Zuldazar",
[863] = "Nazmir",
[864] = "Vol'dun",
[865] = "Stormheim",
[866] = "Stormheim",
[867] = "Azsuna",
[868] = "Val'sharah",
[869] = "Highmountain",
[870] = "Highmountain",
[871] = "The Lost Glacier",
[872] = "Stormstout Brewery",
[873] = "Stormstout Brewery",
[874] = "Stormstout Brewery",
[875] = "Zandalar",
[876] = "Kul Tiras",
[877] = "Fields of the Eternal Hunt",
[879] = "Mardum, the Shattered Abyss",
[880] = "Mardum, the Shattered Abyss",
[881] = "The Eye of Eternity",
[882] = "Eredath",
[883] = "The Vindicaar",
[884] = "The Vindicaar",
[885] = "Antoran Wastes",
[886] = "The Vindicaar",
[887] = "The Vindicaar",
[888] = "Hall of Communion",
[889] = "Arcatraz",
[890] = "Arcatraz",
[891] = "Azuremyst Isle",
[892] = "Azuremyst Isle",
[893] = "Azuremyst Isle",
[894] = "Azuremyst Isle",
[895] = "Tiragarde Sound",
[896] = "Drustvar",
[897] = "The Deaths of Chromie",
[898] = "The Deaths of Chromie",
[899] = "The Deaths of Chromie",
[900] = "The Deaths of Chromie",
[901] = "The Deaths of Chromie",
[902] = "The Deaths of Chromie",
[903] = "The Seat of the Triumvirate",
[904] = "Silithus Brawl",
[905] = "Argus",
[906] = "Arathi Highlands",
[907] = "Seething Shore",
[908] = "Ruins of Lordaeron",
[909] = "Antorus, the Burning Throne",
[910] = "Antorus, the Burning Throne",
[911] = "Antorus, the Burning Throne",
[912] = "Antorus, the Burning Throne",
[913] = "Antorus, the Burning Throne",
[914] = "Antorus, the Burning Throne",
[915] = "Antorus, the Burning Throne",
[916] = "Antorus, the Burning Throne",
[917] = "Antorus, the Burning Throne",
[918] = "Antorus, the Burning Throne",
[919] = "Antorus, the Burning Throne",
[920] = "Antorus, the Burning Throne",
[921] = "Invasion Point: Aurinor",
[922] = "Invasion Point: Bonich",
[923] = "Invasion Point: Cen'gar",
[924] = "Invasion Point: Naigtal",
[925] = "Invasion Point: Sangua",
[926] = "Invasion Point: Val",
[927] = "Greater Invasion Point: Pit Lord Vilemus",
[928] = "Greater Invasion Point: Mistress Alluradel",
[929] = "Greater Invasion Point: Matron Folnuna",
[930] = "Greater Invasion Point: Inquisitor Meto",
[931] = "Greater Invasion Point: Sotanathor",
[932] = "Greater Invasion Point: Occularus",
[933] = "Forge of Aeons",
[934] = "Atal'Dazar",
[935] = "Atal'Dazar",
[936] = "Freehold",
[938] = "Gilneas Island",
[939] = "Tropical Isle 8.0",
[940] = "The Vindicaar",
[941] = "The Vindicaar",
[942] = "Stormsong Valley",
[943] = "Arathi Highlands",
[946] = "Cosmic",
[947] = "Azeroth",
[948] = "The Maelstrom",
[971] = "Telogrus Rift",
[972] = "Telogrus Rift",
[973] = "The Sunwell",
[974] = "Tol Dagor",
[975] = "Tol Dagor",
[976] = "Tol Dagor",
[977] = "Tol Dagor",
[978] = "Tol Dagor",
[979] = "Tol Dagor",
[980] = "Tol Dagor",
[981] = "Un'gol Ruins",
[985] = "Eastern Kingdoms",
[986] = "Kalimdor",
[987] = "Outland",
[988] = "Northrend",
[989] = "Pandaria",
[990] = "Draenor",
[991] = "Zandalar",
[992] = "Kul Tiras",
[993] = "Broken Isles",
[994] = "Argus",
[997] = "Tirisfal Glades",
[998] = "Undercity",
[1004] = "Kings' Rest",
[1009] = "Atul'Aman",
[1010] = "The MOTHERLODE!!",
[1011] = "Zandalar",
[1012] = "Stormwind City",
[1013] = "The Stockade",
[1014] = "Kul Tiras",
[1015] = "Waycrest Manor",
[1016] = "Waycrest Manor",
[1017] = "Waycrest Manor",
[1018] = "Waycrest Manor",
[1021] = "Chamber of Heart",
[1022] = "Uncharted Island",
[1029] = "Waycrest Manor",
[1030] = "Greymane Manor",
[1031] = "Greymane Manor",
[1032] = "Skittering Hollow",
[1033] = "The Rotting Mire",
[1034] = "Verdant Wilds",
[1035] = "Molten Cay",
[1036] = "The Dread Chain",
[1037] = "Whispering Reef",
[1038] = "Temple of Sethraliss",
[1039] = "Shrine of the Storm",
[1040] = "Shrine of the Storm",
[1041] = "The Underrot",
[1042] = "The Underrot",
[1043] = "Temple of Sethraliss",
[1044] = "Arathi Highlands",
[1045] = "Thros, The Blighted Lands",
[1148] = "Uldir",
[1149] = "Uldir",
[1150] = "Uldir",
[1151] = "Uldir",
[1152] = "Uldir",
[1153] = "Uldir",
[1154] = "Uldir",
[1155] = "Uldir",
[1156] = "The Great Sea",
[1157] = "The Great Sea",
[1158] = "Arathi Highlands",
[1159] = "Blackrock Depths",
[1160] = "Blackrock Depths",
[1161] = "Boralus",
[1162] = "Siege of Boralus",
[1163] = "Dazar'alor",
[1164] = "Dazar'alor",
[1165] = "Dazar'alor",
[1166] = "Zanchul",
[1167] = "Zanchul",
[1169] = "Tol Dagor",
[1170] = "Gorgrond - Mag'har Scenario",
[1171] = "Gol Thovas",
[1172] = "Gol Thovas",
[1173] = "Rastakhan's Might",
[1174] = "Rastakhan's Might",
[1176] = "Breath Of Pa'ku",
[1177] = "Breath Of Pa'ku",
[1179] = "Abyssal Melody",
[1180] = "Abyssal Melody",
[1181] = "Zuldazar",
[1182] = "Saltstone Mine",
[1183] = "Thornheart",
[1184] = "Winterchill Mine",
[1185] = "Winterchill Mine",
[1186] = "Blackrock Depths",
[1187] = "Azsuna",
[1188] = "Val'sharah",
[1189] = "Highmountain",
[1190] = "Stormheim",
[1191] = "Suramar",
[1192] = "Broken Shore",
[1193] = "Zuldazar",
[1194] = "Nazmir",
[1195] = "Vol'dun",
[1196] = "Tiragarde Sound",
[1197] = "Drustvar",
[1198] = "Stormsong Valley",
[1203] = "Darkshore",
[1208] = "Eastern Kingdoms",
[1209] = "Kalimdor",
[1244] = "Arathi Highlands",
[1245] = "Badlands",
[1246] = "Blasted Lands",
[1247] = "Tirisfal Glades",
[1248] = "Silverpine Forest",
[1249] = "Western Plaguelands",
[1250] = "Eastern Plaguelands",
[1251] = "Hillsbrad Foothills",
[1252] = "The Hinterlands",
[1253] = "Dun Morogh",
[1254] = "Searing Gorge",
[1255] = "Burning Steppes",
[1256] = "Elwynn Forest",
[1257] = "Deadwind Pass",
[1258] = "Duskwood",
[1259] = "Loch Modan",
[1260] = "Redridge Mountains",
[1261] = "Swamp of Sorrows",
[1262] = "Westfall",
[1263] = "Wetlands",
[1264] = "Stormwind City",
[1265] = "Ironforge",
[1266] = "Undercity",
[1267] = "Eversong Woods",
[1268] = "Ghostlands",
[1269] = "Silvermoon City",
[1270] = "Isle of Quel'Danas",
[1271] = "Gilneas",
[1272] = "Vashj'ir",
[1273] = "Ruins of Gilneas",
[1274] = "Stranglethorn Vale",
[1275] = "Twilight Highlands",
[1276] = "Tol Barad",
[1277] = "Tol Barad Peninsula",
[1305] = "Durotar",
[1306] = "Mulgore",
[1307] = "Northern Barrens",
[1308] = "Teldrassil",
[1309] = "Darkshore",
[1310] = "Ashenvale",
[1311] = "Thousand Needles",
[1312] = "Stonetalon Mountains",
[1313] = "Desolace",
[1314] = "Feralas",
[1315] = "Dustwallow Marsh",
[1316] = "Tanaris",
[1317] = "Azshara",
[1318] = "Felwood",
[1319] = "Un'Goro Crater",
[1320] = "Moonglade",
[1321] = "Silithus",
[1322] = "Winterspring",
[1323] = "Thunder Bluff",
[1324] = "Darnassus",
[1325] = "Azuremyst Isle",
[1326] = "The Exodar",
[1327] = "Bloodmyst Isle",
[1328] = "Mount Hyjal",
[1329] = "Southern Barrens",
[1330] = "Uldum",
[1331] = "The Exodar",
[1332] = "Darkshore",
[1333] = "Darkshore",
[1334] = "Wintergrasp",
[1335] = "Cooking: Impossible",
[1336] = "Havenswood",
[1337] = "Jorundall",
[1338] = "Darkshore",
[1339] = "Warsong Gulch",
[1343] = "8.1 Darkshore Outdoor Final Phase",
[1345] = "Crucible of Storms",
[1346] = "Crucible of Storms",
[1347] = "Zandalari Treasury",
[1348] = "Zandalari Treasury",
[1349] = "Tol Dagor",
[1350] = "Tol Dagor",
[1351] = "Tol Dagor",
[1352] = "Battle of Dazar'alor",
[1353] = "Battle of Dazar'alor",
[1354] = "Battle of Dazar'alor",
[1355] = "Nazjatar",
[1356] = "Battle of Dazar'alor",
[1357] = "Battle of Dazar'alor",
[1358] = "Battle of Dazar'alor",
[1359] = "Icecrown Citadel",
[1360] = "Icecrown Citadel",
[1361] = "OldIronforge",
[1362] = "Shrine of the Storm",
[1363] = "Crucible of Storms",
[1364] = "Battle of Dazar'alor",
[1366] = "Arathi Basin",
[1367] = "Battle of Dazar'alor",
[1371] = "GnomereganA",
[1372] = "GnomereganB",
[1374] = "GnomereganD",
[1375] = "Halls of Stone",
[1379] = "8.3 Visions of N'Zoth - Prototype",
[1380] = "GnomereganC",
[1381] = "Uldir",
[1382] = "Uldir",
[1383] = "Arathi Basin",
[1384] = "Northrend",
[1396] = "Borean Tundra",
[1397] = "Dragonblight",
[1398] = "Grizzly Hills",
[1399] = "Howling Fjord",
[1400] = "Icecrown",
[1401] = "Sholazar Basin",
[1402] = "The Storm Peaks",
[1403] = "Zul'Drak",
[1404] = "Wintergrasp",
[1405] = "Crystalsong Forest",
[1406] = "Hrothgar's Landing",
[1407] = "Prison of Ink",
[1408] = "Ashran",
[1409] = "Exile's Reach",
[1462] = "Mechagon Island",
[1465] = "Scarlet Halls",
[1467] = "Outland",
[1468] = "The Dreamgrove",
[1469] = "Vision of Orgrimmar",
[1470] = "Vision of Stormwind",
[1471] = "Emerald Dreamway",
[1472] = "The Dragon's Spine",
[1473] = "Chamber of Heart",
[1474] = "The Maelstrom - Heart of Azeroth",
[1475] = "The Emerald Dream",
[1476] = "Twilight Highlands",
[1478] = "Ashran",
[1479] = "Baine Rescue",
[1490] = "Mechagon",
[1491] = "Mechagon",
[1493] = "Mechagon",
[1494] = "Mechagon",
[1497] = "Mechagon",
[1499] = "",
[1500] = "",
[1501] = "Crestfall",
[1502] = "Snowblossom Village",
[1504] = "Nazjatar",
[1505] = "Stratholme",
[1512] = "The Eternal Palace",
[1513] = "The Eternal Palace",
[1514] = "The Eternal Palace",
[1515] = "The Eternal Palace",
[1516] = "The Eternal Palace",
[1517] = "The Eternal Palace",
[1518] = "The Eternal Palace",
[1519] = "The Eternal Palace",
[1520] = "The Eternal Palace",
[1521] = "Karazhan Catacombs",
[1522] = "Crumbling Cavern",
[1523] = "Solesa Naksu [DNT]",
[1524] = "",
[1525] = "Revendreth",
[1527] = "Uldum",
[1528] = "Nazjatar",
[1530] = "Vale of Eternal Blossoms",
[1531] = "Crapopolis",
[1532] = "Crapopolis",
[1533] = "Bastion",
[1534] = "Orgrimmar",
[1535] = "Durotar",
[1536] = "Maldraxxus",
[1537] = "Alterac Valley",
[1538] = "Blackwing Descent",
[1539] = "Blackwing Descent",
[1540] = "Halls of Origination",
[1541] = "Halls of Origination",
[1542] = "Halls of Origination",
[1543] = "The Maw",
[1544] = "Mogu'shan Palace",
[1545] = "Mogu'shan Palace",
[1546] = "Mogu'shan Palace",
[1547] = "Mogu'shan Vaults",
[1548] = "Mogu'shan Vaults",
[1549] = "Mogu'shan Vaults",
[1550] = "The Shadowlands",
[1552] = "Caverns of Time",
[1553] = "Caverns of Time",
[1554] = "Serpentshrine Cavern",
[1555] = "Tempest Keep",
[1556] = "Hyjal Summit",
[1557] = "Naxxramas",
[1558] = "Icecrown Citadel",
[1559] = "The Bastion of Twilight",
[1560] = "Blackwing Lair",
[1561] = "Firelands",
[1563] = "Trial of the Crusader",
[1565] = "Ardenweald",
[1569] = "Bastion",
[1570] = "Vale of Eternal Blossoms",
[1571] = "Uldum",
[1573] = "Mechagon City",
[1574] = "Mechagon City",
[1576] = "Deepwind Gorge",
[1577] = "Gilneas City",
[1578] = "Blackrock Depths",
[1579] = "Pools Of Power",
[1580] = "Ny'alotha",
[1581] = "Ny'alotha",
[1582] = "Ny'alotha",
[1590] = "Ny'alotha",
[1591] = "Ny'alotha",
[1592] = "Ny'alotha",
[1593] = "Ny'alotha",
[1594] = "Ny'alotha",
[1595] = "Ny'alotha",
[1596] = "Ny'alotha",
[1597] = "Ny'alotha",
[1600] = "Vault of Y'Shaarj",
[1602] = "Icecrown Citadel",
[1603] = "Ardenweald",
[1604] = "Chamber Of Heart",
[1609] = "Darkmaul Citadel",
[1610] = "Darkmaul Citadel",
[1611] = "Dark Citadel",
[1614] = "JT_New_A",
[1615] = "TG10_Floor [Deprecated]",
[1616] = "TG11_Floor [Deprecated]",
[1617] = "TG12_Floor [Deprecated]",
[1618] = "Torghast",
[1619] = "Torghast",
[1620] = "Torghast",
[1621] = "Torghast",
[1623] = "Torghast",
[1624] = "Torghast",
[1627] = "Torghast",
[1628] = "Torghast",
[1629] = "Torghast",
[1630] = "Torghast",
[1631] = "Torghast",
[1632] = "Torghast",
[1635] = "Torghast",
[1636] = "Torghast",
[1641] = "Torghast",
[1642] = "Val'sharah",
[1643] = "Ardenweald",
[1644] = "Ember Court",
[1645] = "Torghast",
[1647] = "The Shadowlands",
[1648] = "The Maw",
[1649] = "Etheric Vault", -- "MAL_Micro_A",
[1650] = "Sightless Hold", -- "MAL_Micro_B",
[1651] = "Molten Forge", -- "MAL_Micro_C",
[1652] = "Vault of Souls", -- "MAL_Micro_D",
[1656] = "Torghast - Map Floor 10 [Deprecated]",
[1658] = "Alpha_TG_R02",
[1659] = "Alpha_TG_R03",
[1660] = "Alpha_TG_R04",
[1661] = "Alpha_TG_R05",
[1662] = "Queen's Conservatory",
[1663] = "Halls of Atonement",
[1664] = "Halls of Atonement",
[1665] = "Halls of Atonement",
[1666] = "The Necrotic Wake",
[1667] = "The Necrotic Wake",
[1668] = "The Necrotic Wake",
[1669] = "Mists of Tirna Scithe",
[1670] = "Oribos",
[1671] = "Oribos",
[1672] = "Oribos",
[1673] = "Oribos",
[1674] = "Plaguefall",
[1675] = "Sanguine Depths",
[1676] = "Sanguine Depths",
[1677] = "De Other Side",
[1678] = "De Other Side",
[1679] = "De Other Side",
[1680] = "De Other Side",
[1681] = "Icecrown Citadel",
[1682] = "Icecrown Citadel",
[1683] = "Theater of Pain",
[1684] = "Theater of Pain",
[1685] = "Theater of Pain",
[1686] = "Theater of Pain",
[1687] = "Theater of Pain",
[1688] = "Revendreth",
[1689] = "Maldraxxus",
[1690] = "Aspirant's Quarters", -- "Bastion_Micro_A",
[1691] = "Shattered Grove",
[1692] = "Spires Of Ascension",
[1693] = "Spires Of Ascension",
[1694] = "Spires Of Ascension",
[1695] = "Spires Of Ascension",
[1697] = "Plaguefall",
[1698] = "Seat of the Primus",
[1699] = "Sinfall",
[1700] = "Sinfall",
[1701] = "Heart of the Forest",
[1702] = "Heart of the Forest",
[1703] = "Heart of the Forest",
[1705] = "Torghast - Entrance",
[1707] = "Elysian Hold",
[1708] = "Elysian Hold",
[1709] = "Ardenweald",
[1711] = "Ascension Coliseum",
[1712] = "Torghast",
[1713] = "Path of Wisdom", -- "Bastion_Micro_C",
[1714] = "Third Chamber of Kalliope", -- "Bastion_Micro_B",
[1715] = "Vestibule Of Eternity",
[1716] = "Torghast - Map Floor 22",
[1717] = "Chill's Reach",
[1720] = "Covenant_Ard_Torghast",
[1721] = "Torghast",
[1724] = "Vortrexxis", -- "Necropolis_Vortrexxis",
[1725] = "Necropolis_Zerekriss",
[1726] = "The North Sea",
[1727] = "The North Sea",
[1728] = "The Runecarver",
[1734] = "Revendreth",
[1735] = "Castle Nathria",
[1736] = "Torghast",
[1738] = "Revendreth",
[1739] = "Ardenweald",
[1740] = "Ardenweald",
[1741] = "Maldraxxus",
[1742] = "Revendreth",
[1744] = "Castle Nathria",
[1745] = "Castle Nathria",
[1746] = "Castle Nathria",
[1747] = "Castle Nathria",
[1748] = "Castle Nathria",
[1749] = "Torghast",
[1750] = "Castle Nathria",
[1751] = "Torghast",
[1752] = "Torghast",
[1753] = "Torghast",
[1754] = "Torghast",
[1755] = "Castle Nathria",
[1756] = "Torghast",
[1757] = "Torghast",
[1758] = "Torghast",
[1759] = "Torghast",
[1760] = "Torghast",
[1761] = "Torghast",
[1762] = "Torghast, Tower of the Damned",
[1763] = "Torghast",
[1764] = "Torghast",
[1765] = "Torghast",
[1766] = "Torghast",
[1767] = "Torghast",
[1768] = "Torghast",
[1769] = "Torghast",
[1770] = "Torghast",
[1771] = "Torghast",
[1772] = "Torghast",
[1773] = "Torghast",
[1774] = "Torghast",
[1775] = "Torghast",
[1776] = "Torghast",
[1777] = "Torghast",
[1778] = "Torghast",
[1779] = "Torghast",
[1780] = "Torghast",
[1781] = "Torghast",
[1782] = "Torghast",
[1783] = "Torghast",
[1784] = "Torghast",
[1785] = "Torghast",
[1786] = "Torghast",
[1787] = "Torghast",
[1788] = "Torghast",
[1789] = "Torghast",
[1791] = "Torghast",
[1792] = "Torghast",
[1793] = "Torghast",
[1794] = "Torghast",
[1795] = "Torghast",
[1796] = "Torghast",
[1797] = "Torghast",
[1798] = "Torghast",
[1799] = "Torghast",
[1800] = "Torghast",
[1801] = "Torghast",
[1802] = "Torghast",
[1803] = "Torghast",
[1804] = "Torghast",
[1805] = "Torghast",
[1806] = "Torghast",
[1807] = "Torghast",
[1808] = "Torghast",
[1809] = "Torghast",
[1810] = "Torghast",
[1811] = "Torghast",
[1812] = "Torghast",
[1813] = "Bastion",
[1814] = "Maldraxxus",
[1816] = "Claw's Edge", -- "Ardenweald_Micro_A",
[1818] = "Tirna Vaal", -- "Ardenweald_Micro_C",
[1819] = "Fungal Terminus", -- "Ardenweald_Mushroom_A",
[1820] = "Pit of Anguish", -- "Maw_Micro_PitOfAnguish_A",
[1821] = "Pit of Anguish", -- "Maw_Micro_PitOfAnguish_B",
[1822] = "Extractor's Sanatorium", -- "Maw_Micro_Tremaculum",
[1823] = "Altar of Domination", -- "Maw_Micro_Domination",
[1824] = "Matriarch's Den", -- "Ardenweald_Micro_D",
[1825] = "The Root Cellar", -- "Ardenweald_Mushroom_B",
[1826] = "The Root Cellar", -- "Ardenweald_Mushroom_C",
[1827] = "The Root Cellar", -- "Ardenweald_Mushroom_D",
[1828] = "Ardenweald_Mushroom_E",
[1829] = "Ardenweald_Micro_B",
[1833] = "Torghast",
[1834] = "Torghast - Map Floor 24",
[1835] = "Torghast - Map Floor 25",
[1836] = "Torghast - Map Floor 26",
[1837] = "Torghast - Map Floor 27",
[1838] = "Torghast - Map Floor 41",
[1839] = "Torghast - Map Floor 28",
[1840] = "Torghast - Map Floor 40",
[1841] = "Torghast - Map Floor 39",
[1842] = "Torghast - Map Floor 29",
[1843] = "Torghast - Map Floor 38",
[1844] = "Torghast - Map Floor 32",
[1845] = "Torghast - Map Floor 31",
[1846] = "Torghast - Map Floor 33",
[1847] = "Torghast - Map Floor 34",
[1848] = "Torghast - Map Floor 14",
[1849] = "Torghast - Map Floor 16",
[1850] = "Torghast - Map Floor 18",
[1851] = "Torghast - Map Floor 42",
[1852] = "Torghast - Map Floor 44",
[1853] = "Torghast - Map Floor 46",
[1854] = "Torghast - Map Floor 48",
[1855] = "Torghast - Map Floor 49",
[1856] = "Torghast - Map Floor 50",
[1857] = "Torghast - Map Floor 51",
[1858] = "Torghast - Map Floor 52",
[1859] = "Torghast - Map Floor 53",
[1860] = "Torghast - Map Floor 54",
[1861] = "Torghast - Map Floor 57",
[1862] = "Torghast - Map Floor 59",
[1863] = "Torghast - Map Floor 61",
[1864] = "Torghast - Map Floor 63",
[1865] = "Torghast - Map Floor 64",
[1866] = "Torghast - Map Floor 65",
[1867] = "Torghast - Map Floor 66",
[1868] = "Torghast - Map Floor 67",
[1869] = "Torghast - Map Floor 68",
[1870] = "Torghast - Map Floor 69",
[1871] = "Torghast - Map Floor 70",
[1872] = "Torghast - Map Floor 71",
[1873] = "Torghast - Map Floor 74",
[1874] = "Torghast - Map Floor 75",
[1875] = "Torghast - Map Floor 76",
[1876] = "Torghast - Map Floor 77",
[1877] = "Torghast - Map Floor 78",
[1878] = "Torghast - Map Floor 80",
[1879] = "Torghast - Map Floor 81",
[1880] = "Torghast - Map Floor 83",
[1881] = "Torghast - Map Floor 84",
[1882] = "Torghast - Map Floor 86",
[1883] = "Torghast - Map Floor 87",
[1884] = "Torghast - Map Floor 88",
[1885] = "Torghast - Map Floor 89",
[1886] = "Torghast - Map Floor 92",
[1887] = "Torghast - Map Floor 93",
[1888] = "Torghast - Map Floor 94",
[1889] = "Torghast - Map Floor 95",
[1890] = "Torghast - Map Floor 97",
[1891] = "Torghast - Map Floor 98",
[1892] = "Torghast - Map Floor 99",
[1893] = "Torghast - Map Floor 100",
[1894] = "Torghast - Map Floor 23",
[1895] = "Torghast - Map Floor 35",
[1896] = "Torghast - Map Floor 56",
[1897] = "Torghast - Map Floor 62",
[1898] = "Torghast - Map Floor 82",
[1899] = "Torghast - Map Floor 101",
[1900] = "Torghast - Map Floor 58",
[1901] = "Torghast - Map Floor 73",
[1902] = "Torghast - Map Floor 79",
[1903] = "Torghast - Map Floor 85",
[1904] = "Torghast - Map Floor 90",
[1905] = "Torghast - Map Floor 96",
[1907] = "Torghast - Map Floor 102",
[1908] = "Torghast - Map Floor 60",
[1909] = "Torghast - Map Floor 21",
[1910] = "Torghast - Map Floor 91",
[1911] = "Torghast - Entrance",
[1912] = "The Runecarver",
[1913] = "Torghast",
[1914] = "Torghast",
[1917] = "De Other Side",
[1920] = "Torghast",
[1921] = "Torghast",
[1922] = "Draenor",
[1923] = "Pandaria",
[1958] = "Firelands",
[1959] = "Firelands",
[1960] = "The Maw",
[1961] = "Korthia",
[1962] = "Torghast",
[1963] = "Torghast",
[1964] = "Torghast",
[1965] = "Torghast",
[1966] = "Torghast",
[1967] = "Torghast",
[1968] = "Torghast",
[1969] = "Torghast",
[1970] = "Zereth Mortis",
[1971] = "Skyhold",
[1974] = "Torghast",
[1975] = "Torghast",
[1976] = "Torghast",
[1977] = "Torghast",
[1978] = "Dragon Isles",
[1979] = "Torghast",
[1980] = "Torghast",
[1981] = "Torghast",
[1982] = "Torghast",
[1983] = "Torghast",
[1984] = "Torghast",
[1985] = "Torghast",
[1986] = "Torghast",
[1987] = "Torghast",
[1988] = "Torghast",
[1989] = "Tazavesh, the Veiled Market",
[1990] = "Tazavesh, the Veiled Market",
[1991] = "Tazavesh, the Veiled Market",
[1992] = "Tazavesh, the Veiled Market",
[1993] = "Tazavesh, the Veiled Market",
[1995] = "Tazavesh, the Veiled Market",
[1996] = "Tazavesh, the Veiled Market",
[1997] = "Tazavesh, the Veiled Market",
[1998] = "Sanctum of Domination",
[1999] = "Sanctum of Domination",
[2000] = "Sanctum of Domination",
[2001] = "Sanctum of Domination",
[2002] = "Sanctum of Domination",
[2003] = "Sanctum of Domination",
[2004] = "Sanctum of Domination",
[2005] = "Ardenweald",
[2006] = "Cavern of Contemplation",
[2007] = "Gromit Hollow",
[2008] = "Chamber of the Sigil",
[2009] = "TG106_Floor_MM",
[2010] = "Torghast",
[2011] = "Torghast",
[2012] = "Torghast",
[2016] = "Tazavesh, the Veiled Market",
[2017] = "Spires of Ascension",
[2018] = "Spires of Ascension",
[2019] = "Torghast",
[2022] = "The Waking Shores",
[2023] = "Ohn'ahran Plains",
[2024] = "The Azure Span",
[2025] = "Thaldraszus",
[2026] = "The Forbidden Reach",
[2027] = "Blooming Foundry",
[2028] = "Locrian Esper",
[2029] = "Gravid Repose",
[2030] = "Nexus of Actualization",
[2031] = "Crypts of the Eternal",
[2042] = "The Crucible",
[2046] = "Zereth Mortis",
[2047] = "Sepulcher of the First Ones",
[2048] = "Sepulcher of the First Ones",
[2049] = "Sepulcher of the First Ones",
[2050] = "Sepulcher of the First Ones",
[2051] = "Sepulcher of the First Ones",
[2052] = "Sepulcher of the First Ones",
[2055] = "Sepulcher of the First Ones",
[2057] = "Dragon Isles",
[2059] = "Resonant Peaks",
[2061] = "Sepulcher of the First Ones",
[2063] = "Dragon Isles",
[2066] = "Catalyst Wards",
[2070] = "Tirisfal Glades",
[2071] = "Uldaman: Legacy of Tyr",
[2072] = "Uldaman: Legacy of Tyr",
[2073] = "The Azure Vault", -- "ArcaneNaxus_A" yes, with typo
[2074] = "The Azure Vault", -- "ArcaneNexus_B"
[2075] = "The Azure Vault", -- "ArcaneNexus_C"
[2076] = "The Azure Vault", -- "ArcaneNexus_D"
[2077] = "The Azure Vault", -- "ArcaneNexus_E"
[2080] = "Neltharus", -- "Neltharus_A"
[2081] = "Neltharus", -- "Neltharus_B"
[2082] = "Halls Of Infusion", -- "HallsOfInfusion_A"
[2083] = "Halls Of Infusion", -- "HallsOfInfusion_B"
[2084] = "The Emerald Dreamway",
[2085] = "The Primalist Future",
[2088] = "Pandaren Revolution",
[2089] = "The Black Empire",
[2090] = "The Gnoll War",
[2091] = "War of the Shifting Sands",
[2092] = "Azmerloth",
[2093] = "The Nokhud Offensive",
[2094] = "Ruby Life Pools",
[2095] = "Ruby Life Pools",
[2096] = "Brackenhide Hollow",
[2097] = "Algeth'ar Academy",
[2098] = "Algeth'ar Academy",
[2099] = "Algeth'ar Academy",
[2100] = "The Siege Creche",
[2101] = "The Support Creche",
[2102] = "The War Creche",
[2106] = "Brackenhide Hollow",
[2107] = "The Forbidden Reach",
[2109] = "The War Creche",
[2110] = "The Support Creche",
[2111] = "The Siege Creche",
[2112] = "Valdrakken",
[2118] = "The Forbidden Reach",
[2119] = "Vault of the Incarnates", -- "PrimalistRaid_A"
[2120] = "Vault of the Incarnates", -- "PrimalistRaid_B"
[2121] = "Vault of the Incarnates", -- "PrimalistRaid_C"
[2122] = "Vault of the Incarnates", -- "PrimalistRaid_D"
[2123] = "Vault of the Incarnates", -- "PrimalistRaid_E"
[2124] = "Vault of the Incarnates", -- "PrimalistRaid_G"
[2125] = "Vault of the Incarnates", -- "PrimalistRaid_H"
[2126] = "Vault of the Incarnates", -- "PrimalistRaid_F"
[2127] = "The Waking Shores",
[2128] = "The Azure Span",
[2129] = "Ohn'ahran Plains",
[2130] = "Thaldraszus",
[2131] = "The Forbidden Reach",
[2132] = "The Azure Span",
[2133] = "Zaralek Cavern",
[2134] = "Valdrakken",
[2135] = "Valdrakken",
[2146] = "The Eastern Glades",
[2147] = "Azeroth",
[2149] = "Ohn'ahran Plains",
[2150] = "Dragonskull Island",
[2151] = "The Forbidden Reach",
[2154] = "Froststone Vault",
[2162] = "Alterac Valley",
[2165] = "The Throughway",
[2166] = "Aberrus, the Shadowed Crucible",
[2167] = "Aberrus, the Shadowed Crucible",
[2168] = "Aberrus, the Shadowed Crucible",
[2169] = "Aberrus, the Shadowed Crucible",
[2170] = "Aberrus, the Shadowed Crucible",
[2171] = "Aberrus, the Shadowed Crucible",
[2172] = "Aberrus, the Shadowed Crucible",
[2173] = "Aberrus, the Shadowed Crucible",
[2174] = "Aberrus, the Shadowed Crucible",
[2175] = "Zaralek Cavern",
[2176] = "The Maelstrom",
[2183] = "The Azure Vault",
[2184] = "Zaralek Cavern",
[2190] = "Sanctum of Chronology",
[2191] = "Millennia's Threshold",
[2192] = "Locus of Eternity",
[2193] = "Spoke of Endless Winter",
[2194] = "Crossroads of Fate",
[2195] = "Infinite Conflux",
[2196] = "Twisting Approach",
[2197] = "Immemorial Battlefield",
[2198] = "Dawn of the Infinite",
[2199] = "Tyrhold Reservoir",
[2200] = "Emerald Dream",
[2201] = "Azq'roth",
[2202] = "Azewrath",
[2203] = "Azmourne",
[2204] = "Azmerloth",
[2205] = "Ulderoth",
[2206] = "A.Z.E.R.O.T.H.",
[2207] = "The Warlands",
[2211] = "Aberrus, the Shadowed Crucible",
[2220] = "The Nighthold",
[2221] = "The Nighthold",
[2228] = "The Black Empire",
[2230] = "Halls Of Valor",
[2231] = "Halls Of Valor",
[2232] = "Amirdrassil",
[2233] = "Amirdrassil",
[2234] = "Amirdrassil",
[2235] = "Amirdrassil",
[2236] = "Amirdrassil",
[2237] = "Amirdrassil",
[2238] = "Amirdrassil",
[2239] = "Amirdrassil",
[2240] = "Amirdrassil",
[2241] = "Emerald Dream",
[2244] = "Amirdrassil",
[2252] = "Dragon Isles",
[2253] = "Sor'theril Barrow Den",
[2254] = "Barrows of Reverie",
[2257] = "Arathi Highlands",
[2262] = "Traitor's Rest",
[2266] = "Millenia's Threshold",
[2268] = "Amirdrassil",
}
-- These zones are known in LibTourist's zones collection but are not returned by C_Map.GetMapInfo.
-- The IDs are the areaIDs as used by C_Map.GetAreaInfo. Technically, these IDs are only used to
-- map different non-English translations to the English ones, within this table.
local zoneTranslation = {
enUS = {
-- Complexes
[4406] = "The Ring of Valor",
[3905] = "Coilfang Reservoir",
[3893] = "Ring of Observance",
[4024] = "Coldarra",
-- Transports
[72] = "The Dark Portal",
-- Dungeons
[5914] = "Dire Maul - East",
[5913] = "Dire Maul - North",
[5915] = "Dire Maul - West",
[8443] = "Return to Karazhan",
[12837] = "Spires of Ascension",
-- Raids
[14643] = "Amirdrassil, the Dream's Hope",
-- Arenas
[3698] = "Nagrand Arena", -- was 559
[3702] = "Blade's Edge Arena", -- was 562
[4378] = "Dalaran Arena",
[6732] = "The Tiger's Peak",
[9279] = "Hook Point",
[9992] = "Mugambala",
[10497] = "The Robodrome",
[14083] = "Enigma Crucible",
-- Other
[3508] = "Amani Pass",
[3979] = "The Frozen Sea",
},
deDE = {
-- Complexes
[4406] = "Der Ring der Ehre",
[3905] = "Der Echsenkessel",
[3893] = "Ring der Beobachtung",
[4024] = "Kaltarra",
-- Transports
[72] = "Das Dunkle Portal",
-- Dungeons
[5914] = "Düsterbruch - Ost",
[5913] = "Düsterbruch - Nord",
[5915] = "Düsterbruch - West",
[8443] = "Rückkehr nach Karazhan",
[12837] = "Spitzen des Aufstiegs",
-- Raids
[14643] = "Amirdrassil, Hoffnung des Traums",
-- Arenas
[3698] = "Arena von Nagrand",
[3702] = "Arena des Schergrats",
[4378] = "Arena von Dalaran",
[6732] = "Der Tigergipfel",
[9279] = "Das Hakenkap",
[9992] = "Mugambala",
[10497] = "Das Robodrom",
[14083] = "Enigmatiegel",
-- Other
[3508] = "Amanipass",
[3979] = "Die Gefrorene See",
},
esES = {
-- Complexes
[4406] = "El Círculo del Valor",
[3905] = "Reserva Colmillo Torcido",
[3893] = "Círculo de la Observancia",
[4024] = "Gelidar",
-- Transports
[72] = "El Portal Oscuro",
-- Dungeons
[5914] = "La Masacre: Este",
[5913] = "La Masacre: Norte",
[5915] = "La Masacre: Oeste",
[8443] = "Regreso a Karazhan",
[12837] = "Agujas de Ascensión",
-- Raids
[14643] = "Amirdrassil, la Esperanza del Sueño",
-- Arenas
[3698] = "Arena de Nagrand",
[3702] = "Arena Filospada",
[4378] = "Arena de Dalaran",
[6732] = "La Cima del Tigre",
[9279] = "Puntagarfio",
[9992] = "Mugambala",
[10497] = "Robotódromo",
[14083] = "Crisol Enigma",
-- Other
[3508] = "Paso de Amani",
[3979] = "El Mar Gélido",
},
esMX = {
-- Complexes
[4406] = "El Círculo del Valor",
[3905] = "Reserva Colmillo Torcido",
[3893] = "Círculo de la Observancia",
[4024] = "Gelidar",
-- Transports
[72] = "El Portal Oscuro",
-- Dungeons
[5914] = "La Masacre: Este",
[5913] = "La Masacre: Norte",
[5915] = "La Masacre: Oeste",
[8443] = "Regreso a Karazhan",
[12837] = "Torres de Ascensión",
-- Raids
[14643] = "Amirdrassil, la Esperanza del Sueño",
-- Arenas
[3698] = "Arena de Nagrand",
[3702] = "Arena Filospada",
[4378] = "Arena de Dalaran",
[6732] = "La Cima del Tigre",
[9279] = "Punta Garfio",
[9992] = "Mugambala",
[10497] = "El Robódromo",
[14083] = "Crisol Enigmático",
-- Other
[3508] = "Paso de Amani",
[3979] = "El Mar Gélido",
},
frFR = {
-- Complexes
[4406] = "L’arène des Valeureux",
[3905] = "Réservoir de Glissecroc",
[3893] = "Cercle d’observance",
[4024] = "Frimarra",
-- Transports
[72] = "La porte des Ténèbres",
-- Dungeons
[5914] = "Haches-Tripes - Est",
[5913] = "Haches-Tripes - Nord",
[5915] = "Haches-Tripes - Ouest",
[8443] = "Retour à Karazhan",
[12837] = "Flèches de l’Ascension",
-- Raids
[14643] = "Amirdrassil, l’Espoir du Rêve",
-- Arenas
[3698] = "Arène de Nagrand",
[3702] = "Arène des Tranchantes",
[4378] = "Arène de Dalaran",
[6732] = "Le croc du Tigre",
[9279] = "Pointe du Crochet",
[9992] = "Mugambala",
[10497] = "Le Robodrome",
[14083] = "Creuset des Énigmes",
-- Other
[3508] = "Passage des Amani",
[3979] = "La mer Gelée",
},
itIT = {
-- Complexes
[4406] = "Arena del Valore",
[3905] = "Bacino degli Spiraguzza",
[3893] = "Anello dell'Osservanza",
[4024] = "Ibernia",
-- Transports
[72] = "Portale Oscuro",
-- Dungeons
[5914] = "Maglio Infausto - Est",
[5913] = "Maglio Infausto - Nord",
[5915] = "Maglio Infausto - Ovest",
[8443] = "Ritorno a Karazhan",
[12837] = "Guglie dell'Ascensione",
-- Raids
[14643] = "Amirdrassil, Speranza del Sogno",
-- Arenas
[3698] = "Arena di Nagrand",
[3702] = "Arena di Spinaguzza",
[4378] = "Arena di Dalaran",
[6732] = "Picco della Tigre",
[9279] = "Presidio della Pesca",
[9992] = "Mugambala",
[10497] = "Robodromo",
[14083] = "Crogiolo dell'Enigma",
-- Other
[3508] = "Passo degli Amani",
[3979] = "Mare Ghiacciato",
},
koKR = {
-- Complexes
[4406] = "용맹의 투기장",
[3905] = "갈퀴송곳니 저수지",
[3893] = "규율의 광장",
[4024] = "콜다라",
-- Transports
[72] = "어둠의 문",
-- Dungeons
[5914] = "혈투의 전장 - 동쪽",
[5913] = "혈투의 전장 - 북쪽",
[5915] = "혈투의 전장 - 서쪽",
[8443] = "다시 찾은 카라잔",
[12837] = "승천의 첨탑",
-- Raids
[14643] = "꿈의 희망 아미드랏실",
-- Arenas
[3698] = "나그란드 투기장",
[3702] = "칼날 산맥 투기장",
[4378] = "달라란 투기장",
[6732] = "범의 봉우리",
[9279] = "갈고리 시장",
[9992] = "무감발라",
[10497] = "로봇 전투장",
[14083] = "수수께끼 도가니",
-- Other
[3508] = "아마니 고개",
[3979] = "얼어붙은 바다",
},
ptBR = {
-- Complexes
[4406] = "Ringue dos Valorosos",
[3905] = "Reservatório Presacurva",
[3893] = "Círculo da Obediência",
[4024] = "Gelarra",
-- Transports
[72] = "Portal Negro",
-- Dungeons
[5914] = "Gládio Cruel – Leste",
[5913] = "Gládio Cruel – Norte",
[5915] = "Gládio Cruel – Oeste",
[8443] = "Retorno a Karazhan",
[12837] = "Torres da Ascensão",
-- Raids
[14643] = "Amirdrassil, a Esperança Onírica", -- TODO: Translate
-- Arenas
[3698] = "Arena de Nagrand",
[3702] = "Arena da Lâmina Afiada",
[4378] = "Arena de Dalaran",
[6732] = "O Pico do Tigre",
[9279] = "Ponta do Gancho",
[9992] = "Mugambala",
[10497] = "Robódromo",
[14083] = "Crisol do Enigma",
-- Other
[3508] = "Desfiladeiro Amani",
[3979] = "Mar Congelado",
},
zhCN = {
-- Complexes
[4406] = "勇气竞技场",
[3905] = "盘牙水库",
[3893] = "仪式广场",
[4024] = "考达拉",
-- Transports
[72] = "黑暗之门",
-- Dungeons
[5914] = "厄运之槌 - 东",
[5913] = "厄运之槌 - 北",
[5915] = "厄运之槌 - 西",
[8443] = "重返卡拉赞",
[12837] = "晋升高塔",
-- Raids
[14643] = "阿梅达希尔,梦境之愿",
-- Arenas
[3698] = "纳格兰竞技场",
[3702] = "刀锋山竞技场",
[4378] = "达拉然竞技场",
[6732] = "虎踞峰",
[9279] = "锚角港",
[9992] = "穆贾巴拉",
[10497] = "机械天穹",
[14083] = "迷阵竞技场",
-- Other
[3508] = "阿曼尼小径",
[3979] = "冰冻之海",
},
zhTW = {
-- Complexes
[4406] = "勇武競技場",
[3905] = "盤牙蓄湖",
[3893] = "儀式競技場",
[4024] = "凜懼島",
-- Transports
[72] = "黑暗之門",
-- Dungeons
[5914] = "厄運之槌 - 東方",
[5913] = "厄運之槌 - 北方",
[5915] = "厄運之槌 - 西方",
[8443] = "重返卡拉贊",
[12837] = "晉升之巔",
-- Raids
[14643] = "『夢境希望』埃達希爾",
-- Arenas
[3698] = "納葛蘭競技場",
[3702] = "劍刃競技場",
[4378] = "達拉然競技場",
[6732] = "猛虎峰",
[9279] = "勾角地",
[9992] = "穆干巴拉",
[10497] = "超爆機械鬥場",
[14083] = "神秘之爐",
-- Other
[3508] = "阿曼尼小徑",
[3979] = "冰凍之海",
},
}
-- WoW 10.0.0:
-- For some instance maps, C_Map.GetMapInfo does not return a localized name but some kind of tag which is the same
-- for all languages. So, we need to supply our own localizations, taken from the 'AreaTable' table.
local mapInfoLocalizedNameErrata = {
enUS = {
["ArcaneNaxus_A"] = "The Azure Vault", -- mind the typo in the tag name
["ArcaneNexus_B"] = "The Azure Vault",
["ArcaneNexus_C"] = "The Azure Vault",
["ArcaneNexus_D"] = "The Azure Vault",
["ArcaneNexus_E"] = "The Azure Vault",
["Neltharus_A"] = "Neltharus",
["Neltharus_B"] = "Neltharus",
["HallsOfInfusion_A"] = "Halls Of Infusion",
["HallsOfInfusion_B"] = "Halls Of Infusion",
["PrimalistRaid_A"] = "Vault of the Incarnates",
["PrimalistRaid_B"] = "Vault of the Incarnates",
["PrimalistRaid_C"] = "Vault of the Incarnates",
["PrimalistRaid_D"] = "Vault of the Incarnates",
["PrimalistRaid_E"] = "Vault of the Incarnates",
["PrimalistRaid_F"] = "Vault of the Incarnates",
["PrimalistRaid_G"] = "Vault of the Incarnates",
["PrimalistRaid_H"] = "Vault of the Incarnates",
},
deDE = {
["ArcaneNaxus_A"] = "Das Azurblaue Gewölbe", -- mind the typo in the tag name
["ArcaneNexus_B"] = "Das Azurblaue Gewölbe",
["ArcaneNexus_C"] = "Das Azurblaue Gewölbe",
["ArcaneNexus_D"] = "Das Azurblaue Gewölbe",
["ArcaneNexus_E"] = "Das Azurblaue Gewölbe",
["Neltharus_A"] = "Neltharus",
["Neltharus_B"] = "Neltharus",
["HallsOfInfusion_A"] = "Hallen der Infusion",
["HallsOfInfusion_B"] = "Hallen der Infusion",
["PrimalistRaid_A"] = "Gewölbe der Inkarnationen",
["PrimalistRaid_B"] = "Gewölbe der Inkarnationen",
["PrimalistRaid_C"] = "Gewölbe der Inkarnationen",
["PrimalistRaid_D"] = "Gewölbe der Inkarnationen",
["PrimalistRaid_E"] = "Gewölbe der Inkarnationen",
["PrimalistRaid_F"] = "Gewölbe der Inkarnationen",
["PrimalistRaid_G"] = "Gewölbe der Inkarnationen",
["PrimalistRaid_H"] = "Gewölbe der Inkarnationen",
},
esES = {
["ArcaneNaxus_A"] = "Cámara Azur", -- mind the typo in the tag name
["ArcaneNexus_B"] = "Cámara Azur",
["ArcaneNexus_C"] = "Cámara Azur",
["ArcaneNexus_D"] = "Cámara Azur",
["ArcaneNexus_E"] = "Cámara Azur",
["Neltharus_A"] = "Neltharus",
["Neltharus_B"] = "Neltharus",
["HallsOfInfusion_A"] = "Salas de Infusión",
["HallsOfInfusion_B"] = "Salas de Infusión",
["PrimalistRaid_A"] = "Cámara de las Encarnaciones",
["PrimalistRaid_B"] = "Cámara de las Encarnaciones",
["PrimalistRaid_C"] = "Cámara de las Encarnaciones",
["PrimalistRaid_D"] = "Cámara de las Encarnaciones",
["PrimalistRaid_E"] = "Cámara de las Encarnaciones",
["PrimalistRaid_F"] = "Cámara de las Encarnaciones",
["PrimalistRaid_G"] = "Cámara de las Encarnaciones",
["PrimalistRaid_H"] = "Cámara de las Encarnaciones",
},
esMX = {
["ArcaneNaxus_A"] = "La Bóveda Azur", -- mind the typo in the tag name
["ArcaneNexus_B"] = "La Bóveda Azur",
["ArcaneNexus_C"] = "La Bóveda Azur",
["ArcaneNexus_D"] = "La Bóveda Azur",
["ArcaneNexus_E"] = "La Bóveda Azur",
["Neltharus_A"] = "Neltharus",
["Neltharus_B"] = "Neltharus",
["HallsOfInfusion_A"] = "Salas de Infusión",
["HallsOfInfusion_B"] = "Salas de Infusión",
["PrimalistRaid_A"] = "Bóveda de las Encarnaciones",
["PrimalistRaid_B"] = "Bóveda de las Encarnaciones",
["PrimalistRaid_C"] = "Bóveda de las Encarnaciones",
["PrimalistRaid_D"] = "Bóveda de las Encarnaciones",
["PrimalistRaid_E"] = "Bóveda de las Encarnaciones",
["PrimalistRaid_F"] = "Bóveda de las Encarnaciones",
["PrimalistRaid_G"] = "Bóveda de las Encarnaciones",
["PrimalistRaid_H"] = "Bóveda de las Encarnaciones",
},
frFR = {
["ArcaneNaxus_A"] = "Caveau d’Azur", -- mind the typo in the tag name
["ArcaneNexus_B"] = "Caveau d’Azur",
["ArcaneNexus_C"] = "Caveau d’Azur",
["ArcaneNexus_D"] = "Caveau d’Azur",
["ArcaneNexus_E"] = "Caveau d’Azur",
["Neltharus_A"] = "Neltharus",
["Neltharus_B"] = "Neltharus",
["HallsOfInfusion_A"] = "Salles de l’Imprégnation",
["HallsOfInfusion_B"] = "Salles de l’Imprégnation",
["PrimalistRaid_A"] = "Caveau des Incarnations",
["PrimalistRaid_B"] = "Caveau des Incarnations",
["PrimalistRaid_C"] = "Caveau des Incarnations",
["PrimalistRaid_D"] = "Caveau des Incarnations",
["PrimalistRaid_E"] = "Caveau des Incarnations",
["PrimalistRaid_F"] = "Caveau des Incarnations",
["PrimalistRaid_G"] = "Caveau des Incarnations",
["PrimalistRaid_H"] = "Caveau des Incarnations",
},
itIT = {
["ArcaneNaxus_A"] = "Cripta Azzurra", -- mind the typo in the tag name
["ArcaneNexus_B"] = "Cripta Azzurra",
["ArcaneNexus_C"] = "Cripta Azzurra",
["ArcaneNexus_D"] = "Cripta Azzurra",
["ArcaneNexus_E"] = "Cripta Azzurra",
["Neltharus_A"] = "Neltharus",
["Neltharus_B"] = "Neltharus",
["HallsOfInfusion_A"] = "Sale dell'Infusione",
["HallsOfInfusion_B"] = "Sale dell'Infusione",
["PrimalistRaid_A"] = "Segrete delle Incarnazioni",
["PrimalistRaid_B"] = "Segrete delle Incarnazioni",
["PrimalistRaid_C"] = "Segrete delle Incarnazioni",
["PrimalistRaid_D"] = "Segrete delle Incarnazioni",
["PrimalistRaid_E"] = "Segrete delle Incarnazioni",
["PrimalistRaid_F"] = "Segrete delle Incarnazioni",
["PrimalistRaid_G"] = "Segrete delle Incarnazioni",
["PrimalistRaid_H"] = "Segrete delle Incarnazioni",
},
koKR = {
["ArcaneNaxus_A"] = "하늘빛 보관소", -- mind the typo in the tag name
["ArcaneNexus_B"] = "하늘빛 보관소",
["ArcaneNexus_C"] = "하늘빛 보관소",
["ArcaneNexus_D"] = "하늘빛 보관소",
["ArcaneNexus_E"] = "하늘빛 보관소",
["Neltharus_A"] = "넬타루스",
["Neltharus_B"] = "넬타루스",
["HallsOfInfusion_A"] = "주입의 전당",
["HallsOfInfusion_B"] = "주입의 전당",
["PrimalistRaid_A"] = "현신의 금고",
["PrimalistRaid_B"] = "현신의 금고",
["PrimalistRaid_C"] = "현신의 금고",
["PrimalistRaid_D"] = "현신의 금고",
["PrimalistRaid_E"] = "현신의 금고",
["PrimalistRaid_F"] = "현신의 금고",
["PrimalistRaid_G"] = "현신의 금고",
["PrimalistRaid_H"] = "현신의 금고",
},
ptBR = {
["ArcaneNaxus_A"] = "Câmara Lazúli", -- mind the typo in the tag name
["ArcaneNexus_B"] = "Câmara Lazúli",
["ArcaneNexus_C"] = "Câmara Lazúli",
["ArcaneNexus_D"] = "Câmara Lazúli",
["ArcaneNexus_E"] = "Câmara Lazúli",
["Neltharus_A"] = "Neltharus",
["Neltharus_B"] = "Neltharus",
["HallsOfInfusion_A"] = "Salões da Infusão",
["HallsOfInfusion_B"] = "Salões da Infusão",
["PrimalistRaid_A"] = "Câmara dos Encarnados",
["PrimalistRaid_B"] = "Câmara dos Encarnados",
["PrimalistRaid_C"] = "Câmara dos Encarnados",
["PrimalistRaid_D"] = "Câmara dos Encarnados",
["PrimalistRaid_E"] = "Câmara dos Encarnados",
["PrimalistRaid_F"] = "Câmara dos Encarnados",
["PrimalistRaid_G"] = "Câmara dos Encarnados",
["PrimalistRaid_H"] = "Câmara dos Encarnados",
},
zhCN = {
["ArcaneNaxus_A"] = "碧蓝魔馆", -- mind the typo in the tag name
["ArcaneNexus_B"] = "碧蓝魔馆",
["ArcaneNexus_C"] = "碧蓝魔馆",
["ArcaneNexus_D"] = "碧蓝魔馆",
["ArcaneNexus_E"] = "碧蓝魔馆",
["Neltharus_A"] = "奈萨鲁斯",
["Neltharus_B"] = "奈萨鲁斯",
["HallsOfInfusion_A"] = "注能大厅",
["HallsOfInfusion_B"] = "注能大厅",
["PrimalistRaid_A"] = "化身巨龙牢窟",
["PrimalistRaid_B"] = "化身巨龙牢窟",
["PrimalistRaid_C"] = "化身巨龙牢窟",
["PrimalistRaid_D"] = "化身巨龙牢窟",
["PrimalistRaid_E"] = "化身巨龙牢窟",
["PrimalistRaid_F"] = "化身巨龙牢窟",
["PrimalistRaid_G"] = "化身巨龙牢窟",
["PrimalistRaid_H"] = "化身巨龙牢窟",
},
zhTW = {
["ArcaneNaxus_A"] = "蒼藍密庫", -- mind the typo in the tag name
["ArcaneNexus_B"] = "蒼藍密庫",
["ArcaneNexus_C"] = "蒼藍密庫",
["ArcaneNexus_D"] = "蒼藍密庫",
["ArcaneNexus_E"] = "蒼藍密庫",
["Neltharus_A"] = "奈薩魯斯堡",
["Neltharus_B"] = "奈薩魯斯堡",
["HallsOfInfusion_A"] = "灌注迴廊",
["HallsOfInfusion_B"] = "灌注迴廊",
["PrimalistRaid_A"] = "洪荒化身牢獄",
["PrimalistRaid_B"] = "洪荒化身牢獄",
["PrimalistRaid_C"] = "洪荒化身牢獄",
["PrimalistRaid_D"] = "洪荒化身牢獄",
["PrimalistRaid_E"] = "洪荒化身牢獄",
["PrimalistRaid_F"] = "洪荒化身牢獄",
["PrimalistRaid_G"] = "洪荒化身牢獄",
["PrimalistRaid_H"] = "洪荒化身牢獄",
},
}
-- =========================================================================
-- Skill info, by expansion.
-- Base skill IDs
local FISHING_SKILL = 356
local HERBALISM_SKILL = 182
local MINING_SKILL = 186
local SKINNING_SKILL = 393
-- Variant Skill IDs, by expansion
local expansionSkillLineIDs = {
[1] = { -- Classic (Kalimdor and Eastern Kingdoms)
[FISHING_SKILL] = 2592,
[HERBALISM_SKILL] = 2556,
[MINING_SKILL] = 2572,
[SKINNING_SKILL] = 2564,
},
[2] = { -- Burning Crusade (Outland)
[FISHING_SKILL] = 2591,
[HERBALISM_SKILL] = 2555,
[MINING_SKILL] = 2571,
[SKINNING_SKILL] = 2563,
},
[3] = { -- Wrath of the Lich King (Northrend)
[FISHING_SKILL] = 2590,
[HERBALISM_SKILL] = 2554,
[MINING_SKILL] = 2570,
[SKINNING_SKILL] = 2562,
},
[4] = { -- Cataclysm
[FISHING_SKILL] = 2589,
[HERBALISM_SKILL] = 2553,
[MINING_SKILL] = 2569,
[SKINNING_SKILL] = 2561,
},
[5] = { -- Mists of Pandaria (Pandaria)
[FISHING_SKILL] = 2588,
[HERBALISM_SKILL] = 2552,
[MINING_SKILL] = 2568,
[SKINNING_SKILL] = 2560,
},
[6] = { -- Warlords of Draenor (Draenor)
[FISHING_SKILL] = 2587,
[HERBALISM_SKILL] = 2551,
[MINING_SKILL] = 2567,
[SKINNING_SKILL] = 2559,
},
[7] = { -- Legion (Broken Isles)
[FISHING_SKILL] = 2586,
[HERBALISM_SKILL] = 2550,
[MINING_SKILL] = 2566,
[SKINNING_SKILL] = 2558,
},
[8] = { -- Battle for Azeroth (Kul Tiras and Zandalar)
[FISHING_SKILL] = 2585,
[HERBALISM_SKILL] = 2549,
[MINING_SKILL] = 2565,
[SKINNING_SKILL] = 2557,
},
[9] = { -- Shadowlands
[FISHING_SKILL] = 2754,
[HERBALISM_SKILL] = 2760,
[MINING_SKILL] = 2761,
[SKINNING_SKILL] = 2762,
},
[10] = { -- DragonFlight (Dragon Isles)
[FISHING_SKILL] = 2826,
[HERBALISM_SKILL] = 2832,
[MINING_SKILL] = 2833,
[SKINNING_SKILL] = 2834,
},
}
-- 9.0.1: New function using new expansion lookup
local function GetExpansionIndex(zone)
local expansionIndex = nil
if zone then
local zoneName = Tourist:GetMapNameByIDAlt(zone) or zone
if zoneName then
local expansion = expansions[zoneName]
if expansion then
expansionIndex = expansionToIndex[expansion]
end
end
end
return expansionIndex
end
local function GetSkillInfo(skillID, zone)
local professionName, skillLevel, maxSkillLevel, skillModifier, parentProfessionID
local mapId = Tourist:GetZoneMapID(zone) or zone
local expansionIndex = GetExpansionIndex(mapId)
if expansionIndex then
local continentSkills = expansionSkillLineIDs[expansionIndex]
if continentSkills then
local skillLineID = continentSkills[skillID]
local professionInfo = C_TradeSkillUI.GetProfessionInfoBySkillLineID(skillLineID)
if professionInfo then
professionName = professionInfo.professionName
skillLevel = professionInfo.skillLevel
maxSkillLevel = professionInfo.maxSkillLevel
skillModifier = professionInfo.skillModifier
parentProfessionID = professionInfo.parentProfessionID
-- trace("professionName = "..tostring(professionName))
-- trace("skillLevel = "..tostring(skillLevel))
-- trace("maxSkillLevel = "..tostring(maxSkillLevel))
-- trace("skillModifier = "..tostring(skillModifier))
-- trace("parentProfessionID = "..tostring(parentProfessionID))
else
-- trace("No info for skillLineID "..tostring(skillLineID).." (skill "..tostring(skillID)..")")
end
end
end
return professionName or "", skillLevel or 0, maxSkillLevel or 0, skillModifier or 0, parentProfessionID
end
function Tourist:GetFishingSkillInfo(zone)
return GetSkillInfo(FISHING_SKILL, zone)
end
function Tourist:GetHerbalismSkillInfo(zone)
return GetSkillInfo(HERBALISM_SKILL, zone)
end
function Tourist:GetMiningSkillInfo(zone)
return GetSkillInfo(MINING_SKILL, zone)
end
function Tourist:GetSkinningSkillInfo(zone)
return GetSkillInfo(SKINNING_SKILL, zone)
end
-- ---- Profession Skill API initialization -------
local function ProfessionSkillLevelIsMissing(index)
if not index then return false end -- Not learned
local name, icon, skillLevel, maxSkillLevel, numAbilities, spelloffset, skillLineID = GetProfessionInfo(index)
local professionInfo = C_TradeSkillUI.GetProfessionInfoBySkillLineID(skillLineID)
return (skillLevel > 0 and professionInfo.skillLevel == 0) or not professionInfo
end
local function ProfessionPanelShouldBeOpened()
local prof1, prof2, archaeology, fishing, cooking = GetProfessions()
local openPanel = true
local useProfessionButton
trace("p1 = "..tostring(prof1)..", p2 = "..tostring(prof2)..", co = "..tostring(cooking)..", fi = "..tostring(fishing)..", ar = "..tostring(archaeology))
-- Look for proof of missing skill levels
if ProfessionSkillLevelIsMissing(prof1) == false then
if ProfessionSkillLevelIsMissing(prof2) == false then
if ProfessionSkillLevelIsMissing(cooking) == false then
if ProfessionSkillLevelIsMissing(fishing) == false then
if ProfessionSkillLevelIsMissing(archaeology) == false then
-- All OK -or- no professions learned
openPanel = false
end
end
end
end
end
local buttonName
-- Always test for button name. Button name being nil means no professions were found,
-- which can be one of two reasons for openPanel to be false.
if prof1 then
buttonName = "PrimaryProfession1SpellButtonBottom"
elseif prof2 then
buttonName = "PrimaryProfession2SpellButtonBottom"
elseif archaeology then
buttonName = "SecondaryProfession3SpellButtonRight"
elseif fishing then
buttonName = "SecondaryProfession2SpellButtonRight"
elseif cooking then
buttonName = "SecondaryProfession1SpellButtonRight"
else
buttonName = nil
end
return openPanel, buttonName
end
-- parameters
local psiInterval = .15
local psiDelay = 10 -- cycles
local psiMaxCycles = psiDelay + 20
local psiRetryMax = 3
-- variables
local psiTicker
local psiPhase = 0
local psiElapsed = 0
local psiCycle = 0
local psiButtonName
local psiRetryCount = 0
local function ProfessionSkillInit()
-- Thanks to billtopia for his contribution
psiElapsed = psiElapsed + psiInterval
psiCycle = psiCycle + 1
if psiCycle < psiDelay then
-- Wait...
return
end
if psiCycle == psiMaxCycles - 1 then
-- Timeout -> go to 5
trace(tostring(psiElapsed).." sec: ProfessionSkillInit TIMEOUT at phase "..tostring(psiPhase))
psiPhase = 5
else
trace(tostring(psiElapsed).." sec: ProfessionSkillInit Phase "..tostring(psiPhase))
end
if psiPhase == 0 then
-- Check if the panel should be opened
local openPanel, buttonName = ProfessionPanelShouldBeOpened()
if openPanel == true then
-- Reason found to open the panel -> continue
psiButtonName = buttonName
psiPhase = 1
else
if buttonName then
-- At least one profession found, data present -> exit
psiPhase = 6
else
-- No professions or no data returned by GetProfessionInfo? -> try again to be sure
psiRetryCount = psiRetryCount + 1
if psiRetryCount > psiRetryMax then
-- Probably no professions -> exit
psiPhase = 6
end
end
end
trace("openPanel = "..tostring(openPanel)..", button = "..tostring(buttonName))
elseif psiPhase == 1 then
-- Mute sounds
MuteSoundFile(567440) -- sound/interface/iabilitiesopena.ogg
MuteSoundFile(567496) -- sound/interface/iabilitiesclosea.ogg
MuteSoundFile(567507) -- sound/interface/ucharactersheetopen.ogg
MuteSoundFile(567433) -- sound/interface/ucharactersheetclose.ogg
psiPhase = 2
elseif psiPhase == 2 then
-- Open Spellbook
ToggleSpellBook("professions")
psiPhase = 3
elseif psiPhase == 3 then
-- Open a profession panel, use button selected in phase 0
local professionButton = _G[psiButtonName]
if professionButton then
professionButton:Click()
end
SpellBookFrameCloseButton:Click()
psiPhase = 4
elseif psiPhase == 4 then
-- Close profession panel or spellbook
if SkilletFrameCloseButton then
SkilletFrameCloseButton:Click()
psiPhase = 5
elseif ProfessionsFrame then
ProfessionsFrame.CloseButton:Click()
psiPhase = 5
end
elseif psiPhase == 5 then
-- Unmute sounds
UnmuteSoundFile(567440)
UnmuteSoundFile(567496)
UnmuteSoundFile(567507)
UnmuteSoundFile(567433)
psiPhase = 6
elseif psiPhase == 6 then
-- Exit
psiTicker:Cancel()
-- Reset
psiPhase = 0 -- This allows restarting this procedure. Change to -1 if restarting should be prohibited.
psiRetryCount = 0
psiElapsed = 0
psiCycle = 0
psiButtonName = nil
end
end
local function InitializeProfessionSkills()
psiTicker = C_Timer.NewTicker(psiInterval, ProfessionSkillInit, psiMaxCycles)
end
function Tourist:InitializeProfessionSkills()
trace("Initializing profession skills...")
InitializeProfessionSkills()
end
-- =========================================================================
local function CreateLocalizedZoneNameLookups()
local uiMapID
local mapInfo
local localizedZoneName
local englishZoneName
local localizedErrata = mapInfoLocalizedNameErrata[GAME_LOCALE]
if not localizedErrata then
localizedErrata = mapInfoLocalizedNameErrata["enUS"]
end
local skip = {
[2026] = true, -- The Forbidden Reach Deprecated
}
-- 8.0: Use the C_Map API
-- Note: the loop below is not very sexy but makes sure missing entries in MapIdLookupTable are reported.
-- It is executed only once, upon initialization.
for uiMapID = 1, 10000, 1 do
if not skip[uiMapID] then
mapInfo = C_Map.GetMapInfo(uiMapID)
if mapInfo then
localizedZoneName = mapInfo.name
if uiMapID == 2026 or uiMapID == 2107 or uiMapID == 2118 or uiMapID == 2131 or uiMapID == 2151 then
trace(tostring(uiMapID).." = '"..tostring(localizedZoneName).."'")
end
if localizedErrata[localizedZoneName] then
localizedZoneName = localizedErrata[localizedZoneName]
end
englishZoneName = MapIdLookupTable[uiMapID]
if englishZoneName then
-- Add combination of English and localized name to lookup tables
if not BZ[englishZoneName] then
BZ[englishZoneName] = localizedZoneName
end
if not BZR[localizedZoneName] then
BZR[localizedZoneName] = englishZoneName
end
else
-- Not in lookup
trace("|r|cffff4422! -- Tourist:|r English name not found in lookup for uiMapID "..tostring(uiMapID).." ("..tostring(localizedZoneName)..")" )
end
end
else
trace("CreateLocalizedZoneNameLookups skipped uiMapID "..tostring(uiMapID))
end
end
-- Load from zoneTranslation
local GAME_LOCALE = GetLocale()
local translations = zoneTranslation[GAME_LOCALE]
if not translations then
translations = zoneTranslation["enUS"]
end
for key, localizedZoneName in pairs(translations) do
local englishName = zoneTranslation["enUS"][key]
if not BZ[englishName] then
BZ[englishName] = localizedZoneName
end
if not BZR[localizedZoneName] then
BZR[localizedZoneName] = englishName
end
end
end
local function AddDuplicatesToLocalizedLookup()
BZ[Tourist:GetUniqueEnglishZoneNameForLookup("The Maelstrom", THE_MAELSTROM_MAP_ID)] = Tourist:GetUniqueZoneNameForLookup("The Maelstrom", THE_MAELSTROM_MAP_ID)
BZR[Tourist:GetUniqueZoneNameForLookup("The Maelstrom", THE_MAELSTROM_MAP_ID)] = Tourist:GetUniqueEnglishZoneNameForLookup("The Maelstrom", THE_MAELSTROM_MAP_ID)
BZ[Tourist:GetUniqueEnglishZoneNameForLookup("Nagrand", DRAENOR_MAP_ID)] = Tourist:GetUniqueZoneNameForLookup("Nagrand", DRAENOR_MAP_ID)
BZR[Tourist:GetUniqueZoneNameForLookup("Nagrand", DRAENOR_MAP_ID)] = Tourist:GetUniqueEnglishZoneNameForLookup("Nagrand", DRAENOR_MAP_ID)
BZ[Tourist:GetUniqueEnglishZoneNameForLookup("Shadowmoon Valley", DRAENOR_MAP_ID)] = Tourist:GetUniqueZoneNameForLookup("Shadowmoon Valley", DRAENOR_MAP_ID)
BZR[Tourist:GetUniqueZoneNameForLookup("Shadowmoon Valley", DRAENOR_MAP_ID)] = Tourist:GetUniqueEnglishZoneNameForLookup("Shadowmoon Valley", DRAENOR_MAP_ID)
BZ[Tourist:GetUniqueEnglishZoneNameForLookup("Hellfire Citadel", DRAENOR_MAP_ID)] = Tourist:GetUniqueZoneNameForLookup("Hellfire Citadel", DRAENOR_MAP_ID)
BZR[Tourist:GetUniqueZoneNameForLookup("Hellfire Citadel", DRAENOR_MAP_ID)] = Tourist:GetUniqueEnglishZoneNameForLookup("Hellfire Citadel", DRAENOR_MAP_ID)
BZ[Tourist:GetUniqueEnglishZoneNameForLookup("Dalaran", BROKEN_ISLES_MAP_ID)] = Tourist:GetUniqueZoneNameForLookup("Dalaran", BROKEN_ISLES_MAP_ID)
BZR[Tourist:GetUniqueZoneNameForLookup("Dalaran", BROKEN_ISLES_MAP_ID)] = Tourist:GetUniqueEnglishZoneNameForLookup("Dalaran", BROKEN_ISLES_MAP_ID)
end
local function tablelength(T)
local count = 0
for _ in pairs(T) do count = count + 1 end
return count
end
local function GetFlightnodeFaction(faction)
if faction == 0 then
return "Neutral"
end
if faction == 1 then
return "Horde"
end
if faction == 2 then
return "Alliance"
else
return tostring(faction)
end
end
--[[
GatherFlightnodeData is called just in time, right before first use, because when LibTourist is being loaded at player logon,
not all flightpoints are available yet through the C_TaxiMap interface.
The FlightnodeLookupTable, which is built during initialization using the hardcoded relationships between zones and nodes,
contains the flightnode IDs but no values yet. GatherFlightnodeData fills the lookup as much as possible with MapTaxiNodeInfo
structures retrieved from the C_TaxiMap interface.
structure TaxiMap.MapTaxiNodeInfo
number nodeID -- unique node ID
table position -- position of the node on the Flight Master's map
string name -- node name as displayed in game, includes zone name (mostly)
string atlasName -- atlas object type, includes faction
Enum.FlightPathFaction faction -- 0 = Neutral, 1 = Horde, 2 = Alliance
(optional) string textureKitPrefix -- no clue what this is for
string factionName -- added by LibTourist
]]--
local flightNodeIgnoreList = {
[2712] = "Immortal Hearth",
[2714] = "Genesis Cradle Beta",
[2713] = "Genesis Cradle Alpha",
[2757] = "Genesis Cradle Omega",
[2731] = "Domination's Grasp",
[2715] = "Ephemeral Plains Alpha",
[2716] = "Ephemeral Plains Omega",
[2860] = "Aberrus Upper Platform" -- 10.1 UG - Campaign - Ch6 - Aberrus Upper Platform (SMART) (Neutral)
}
local function GatherFlightnodeData()
local zMapID, zName, nodes, numNodes
local count = 0
local errCount = 0
if gatheringFlightnodes == true then return end
gatheringFlightnodes = true
local missingNodes = {}
trace("GatherFlightnodeData...")
-- Add node objects from the C_TaxiMap interface to the lookup
for zMapID = 1, 10000, 1 do
nodes = C_TaxiMap.GetTaxiNodesForMap(zMapID)
if nodes ~= nil then
numNodes = tablelength(nodes)
if numNodes > 0 then
for i, node in ipairs(nodes) do
if not FlightnodeLookupTable[node.nodeID] then
if not missingNodes[node.nodeID] and not flightNodeIgnoreList[node.nodeID] then
trace("|r|cffff4422! -- Tourist: Missing flightnode: ["..tostring(node.nodeID).."] = true, -- "..tostring(node.name).." ("..tostring(GetFlightnodeFaction(node.faction))..")")
errCount = errCount + 1
missingNodes[node.nodeID] = node.name
end
else
if FlightnodeLookupTable[node.nodeID] == true then
count = count + 1
-- Add faction name
node["factionName"] = GetFlightnodeFaction(node.faction)
-- Store node object in lookup
FlightnodeLookupTable[node.nodeID] = node
end
end
end
end
end
end
-- Add hardcoded node-to-zone relations to FlightnodeLookupTable
local nodesToUpdate = {}
for zone in Tourist:IterateZones() do
for node in Tourist:IterateZoneFlightnodes(zone) do
if FlightnodeLookupTable[node.nodeID] then
if not nodesToUpdate[node.nodeID] then
nodesToUpdate[node.nodeID] = {}
end
nodesToUpdate[node.nodeID][zone] = true
else
trace("|r|cffff4422! -- Tourist: Missing flightnode in lookup: "..tostring(node.nodeID).." = "..tostring(node.name))
errCount = errCount + 1
end
end
end
for k, v in pairs(nodesToUpdate) do
FlightnodeLookupTable[k]["zones"] = v
end
trace("Tourist: Found "..tostring(count).." of "..tostring(tablelength(FlightnodeLookupTable)).." known flight nodes; "..tostring(errCount).." unknown nodes.")
flightnodeDataGathered = true
gatheringFlightnodes = false
end
-- Refreshes the values of the FlightnodeLookupTable
function Tourist:RefreshFlightNodeData()
-- Reset lookup
for k, v in pairs(FlightnodeLookupTable) do
FlightnodeLookupTable[k] = true
end
-- Re-gather data
GatherFlightnodeData()
end
-- Returns the lookup table with all flightnodes. Key = node ID.
-- Value is a node struct(see C_Taximap.MapTaxiNodeInfo) if the node could be found by GatherFlightnodeData.
-- If the node was not returned by C_Taximap, value is true.
function Tourist:GetFlightnodeLookupTable()
if flightnodeDataGathered == false then
GatherFlightnodeData()
end
return FlightnodeLookupTable
end
-- Returns a C_Taximap.MapTaxiNodeInfo (with some extra attributes) for the specified nodeID, if available
function Tourist:GetFlightnode(nodeID)
local node = Tourist:GetFlightnodeLookupTable()[nodeID]
if node == true then
return nil
else
return node
end
end
-- This function replaces the abandoned LibBabble-Zone library and returns a lookup table
-- containing all zone names (including continents, instances etcetera) where the English
-- zone name is the key and the localized zone name is the value.
function Tourist:GetLookupTable()
return BZ
end
-- This function replaces the abandoned LibBabble-Zone library and returns a lookup table
-- containing all zone names (including continents, instances etcetera) where the localized
-- zone name is the key and the English zone name is the value.
function Tourist:GetReverseLookupTable()
return BZR
end
-- Returns the lookup table with all uiMapIDs as key and the English zone name as value.
function Tourist:GetMapIDLookupTable()
return MapIdLookupTable
end
-- HELPER AND LOOKUP FUNCTIONS -------------------------------------------------------------
local function PLAYER_LEVEL_UP(self, level)
playerLevel = UnitLevel("player")
for k in pairs(recZones) do
recZones[k] = nil
end
for k in pairs(recInstances) do
recInstances[k] = nil
end
for k in pairs(cost) do
cost[k] = nil
end
for zone in pairs(lows) do
if not self:IsHostile(zone) then
local low, high, scaled = self:GetLevel(zone)
if scaled then
low = scaled
high = scaled
end
local zoneType = self:GetType(zone)
if zoneType == "Zone" or zoneType == "PvP Zone" and low and high then
if low <= playerLevel and playerLevel <= high then
recZones[zone] = true
end
elseif zoneType == "Battleground" and low and high then
local playerLevel = playerLevel
if low <= playerLevel and playerLevel <= high then
recInstances[zone] = true
end
elseif zoneType == "Instance" and low and high then
if low <= playerLevel and playerLevel <= high then
recInstances[zone] = true
end
end
end
end
end
-- Public alternative for GetMapContinents, removes the map IDs that were added to its output in WoW 6.0
-- Note: GetMapContinents has been removed entirely in 8.0
-- 8.0.1: returns uiMapID as key
function Tourist:GetMapContinentsAlt()
local continents = C_Map.GetMapChildrenInfo(COSMIC_MAP_ID, Enum.UIMapType.Continent, true)
local retValue = {}
for i, continentInfo in ipairs(continents) do
--trace("Continent "..tostring(i)..": "..continentInfo.mapID..": ".. continentInfo.name)
retValue[continentInfo.mapID] = continentInfo.name
end
return retValue
end
-- Public Alternative for GetMapZones because GetMapZones does NOT return all zones (as of 6.0.2),
-- making its output useless as input for SetMapZoom.
-- Note: GetMapZones has been removed entirely in 8.0, just as SetMapZoom
-- NOTE: This method does not convert duplicate zone names for lookup in LibTourist,
-- use GetUniqueZoneNameForLookup for that.
-- 8.0.1: returns uiMapID as key
function Tourist:GetMapZonesAlt(continentID)
if mapZonesByContinentID[continentID] then
-- Get from cache
return mapZonesByContinentID[continentID]
else
local mapZones = {}
local recursive = (continentID ~= 947) -- 947 = Azeroth, parent for Nazjatar zone -> get Nazjatar only and not all zones of the Azeroth continents
local mapChildrenInfo = { C_Map.GetMapChildrenInfo(continentID, Enum.UIMapType.Zone, recursive) }
for key, zones in pairs(mapChildrenInfo) do -- don't know what this extra table is for
for zoneIndex, zone in pairs(zones) do
-- Get the localized zone name
mapZones[zone.mapID] = zone.name
end
end
-- Add to cache
mapZonesByContinentID[continentID] = mapZones
return mapZones
end
end
-- Public alternative for GetMapNameByID (which was removed in 8.0.1),
-- returns a unique localized zone name to be used to lookup data in LibTourist
function Tourist:GetMapNameByIDAlt(uiMapID)
if tonumber(uiMapID) == nil then
return nil
end
local mapInfo = C_Map.GetMapInfo(uiMapID)
if mapInfo then
local zoneName = mapInfo.name
local continentMapID = Tourist:GetContinentMapID(uiMapID)
--trace("ContinentMap ID for "..tostring(zoneName).." ("..tostring(uiMapID)..") is "..tostring(continentMapID))
if uiMapID == THE_MAELSTROM_MAP_ID then
-- Exception for The Maelstrom continent because GetUniqueZoneNameForLookup excpects the zone name and not the continent name
return zoneName
else
return Tourist:GetUniqueZoneNameForLookup(zoneName, continentMapID)
end
else
return nil
end
end
-- Returns the uiMapID of the Continent for the given uiMapID
function Tourist:GetContinentMapID(uiMapID)
-- First, check the cache, built during initialisation based on the zones returned by GetMapZonesAlt
local continentMapID = zoneMapIDtoContinentMapID[uiMapID]
if continentMapID then
-- Done
return continentMapID
end
-- Not in cache, look for the continent, searching up through the map hierarchy.
-- Add the results to the cache to speed up future queries.
local mapInfo = C_Map.GetMapInfo(uiMapID)
if not mapInfo or mapInfo.mapType == 0 or mapInfo.mapType == 1 then
-- No data or Cosmic map or World map
zoneMapIDtoContinentMapID[uiMapID] = nil
return nil
end
if mapInfo.mapType == 2 then
-- Map is a Continent map
zoneMapIDtoContinentMapID[uiMapID] = mapInfo.mapID
return mapInfo.mapID
end
local parentMapInfo = C_Map.GetMapInfo(mapInfo.parentMapID)
if not parentMapInfo then
-- No parent -> no continent ID
zoneMapIDtoContinentMapID[uiMapID] = nil
return nil
else
if parentMapInfo.mapType == 2 then
-- Found the continent
zoneMapIDtoContinentMapID[uiMapID] = parentMapInfo.mapID
return parentMapInfo.mapID
else
-- Parent is not the Continent -> Search up one level
return Tourist:GetContinentMapID(parentMapInfo.mapID)
end
end
end
-- Returns a unique localized zone name to be used to lookup data in LibTourist,
-- based on a localized or English zone name
function Tourist:GetUniqueZoneNameForLookup(zoneName, continentMapID)
if continentMapID == THE_MAELSTROM_MAP_ID then -- The Maelstrom
if zoneName == BZ["The Maelstrom"] or zoneName == "The Maelstrom" then
zoneName = BZ["The Maelstrom"].." ("..ZONE..")"
end
end
if continentMapID == DRAENOR_MAP_ID then -- Draenor
if zoneName == BZ["Nagrand"] or zoneName == "Nagrand" then
zoneName = BZ["Nagrand"].." ("..BZ["Draenor"]..")"
end
if zoneName == BZ["Shadowmoon Valley"] or zoneName == "Shadowmoon Valley" then
zoneName = BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")"
end
if zoneName == BZ["Hellfire Citadel"] or zoneName == "Hellfire Citadel" then
zoneName = BZ["Hellfire Citadel"].." ("..BZ["Draenor"]..")"
end
end
if continentMapID == BROKEN_ISLES_MAP_ID then -- Broken Isles
if zoneName == BZ["Dalaran"] or zoneName == "Dalaran" then
zoneName = BZ["Dalaran"].." ("..BZ["Broken Isles"]..")"
end
end
return zoneName
end
-- Returns a unique English zone name to be used to lookup data in LibTourist,
-- based on a localized or English zone name
function Tourist:GetUniqueEnglishZoneNameForLookup(zoneName, continentMapID)
if continentMapID == THE_MAELSTROM_MAP_ID then -- The Maelstrom
if zoneName == BZ["The Maelstrom"] or zoneName == "The Maelstrom" then
zoneName = "The Maelstrom (Zone)"
end
end
if continentMapID == DRAENOR_MAP_ID then -- Draenor
if zoneName == BZ["Nagrand"] or zoneName == "Nagrand" then
zoneName = "Nagrand (Draenor)"
end
if zoneName == BZ["Shadowmoon Valley"] or zoneName == "Shadowmoon Valley" then
zoneName = "Shadowmoon Valley (Draenor)"
end
if zoneName == BZ["Hellfire Citadel"] or zoneName == "Hellfire Citadel" then
zoneName = "Hellfire Citadel (Draenor)"
end
end
if continentMapID == BROKEN_ISLES_MAP_ID then -- Broken Isles
if zoneName == BZ["Dalaran"] or zoneName == "Dalaran" then
zoneName = "Dalaran (Broken Isles)"
end
end
return zoneName
end
-- Returns the minimum and maximum battle pet levels for the given zone, if the zone is known
-- and contains battle pets (otherwise returns nil)
function Tourist:GetBattlePetLevel(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return battlepet_lows[zone], battlepet_highs[zone]
end
-- WoW patch 7.3.5: most zones now scale - within their level range - to the player's level
function Tourist:GetScaledZoneLevel(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local playerLvl = playerLevel
if playerLvl <= lows[zone] then
return lows[zone]
elseif playerLvl >= highs[zone] then
return highs[zone]
else
return playerLvl
end
end
-- Formats the minimum and maximum player level for the given zone as "[min]-[max]".
-- Returns one number if min and max are equal.
-- Returns an empty string if no player levels are applicable (like in Cities).
-- If zone is a zone or an instance, the string will be formatted like "[scaled] ([min]-[max])", i.e. "47 (40-60)".
function Tourist:GetLevelString(zone)
local lo, hi, scaled = Tourist:GetLevel(zone)
if lo and hi then
if scaled then
if lo == hi then
return tostring(scaled).." ("..tostring(lo)..")"
else
return tostring(scaled).." ("..tostring(lo).."-"..tostring(hi)..")"
end
else
if lo == hi then
return tostring(lo)
else
return tostring(lo).."-"..tostring(hi)
end
end
else
return tostring(lo or hi or "")
end
end
-- Formats the minimum and maximum battle pet level for the given zone as "min-max".
-- Returns one number if min and max are equal. Returns an empty string if no battle pet levels are available.
function Tourist:GetBattlePetLevelString(zone)
local lo, hi = Tourist:GetBattlePetLevel(zone)
if lo and hi then
if lo == hi then
return tostring(lo)
else
return tostring(lo).."-"..tostring(hi)
end
else
return tostring(lo or hi or "")
end
end
function Tourist:GetChomieTimeActiveExpansion()
-- ChromieTimeExpansionInfo
-- id number
-- name string
-- description string
-- mapAtlas string
-- previewAtlas string
-- completed boolean
-- alreadyOn boolean
local expansion = nil
local info = nil
local ct_expansions = C_ChromieTime.GetChromieTimeExpansionOptions()
for i, ct_expansionInfo in ipairs(ct_expansions) do
--trace("CT Expansion "..tostring(ct_expansionInfo.id)..": "..tostring(ct_expansionInfo.name)..": "..tostring(ct_expansionInfo.alreadyOn))
if ct_expansionInfo.alreadyOn == true then
info = ct_expansionInfo
break
end
end
if info ~= nil then
expansion = chromieTimeToExpansion[info.id] or UNKNOWN
end
return expansion, info
end
-- Returns the minimum and maximum level for the given zone, instance or battleground.
-- If zone is a zone or an instance, a third value is returned: the scaled zone level.
-- This is the level 'presented' to the player when inside the zone. It's calculated by GetScaledZoneLevel.
function Tourist:GetLevel(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
if types[zone] == "Battleground" then
-- Note: Not all BG's start at level 5, but all BG's support players up to MAX_PLAYER_LEVEL.
local playerLvl = playerLevel
if playerLvl <= lows[zone] then
-- Player is too low level to enter the BG -> return the lowest available bracket
-- by assuming the player is at the min level required for the BG.
playerLvl = lows[zone]
end
-- Find the most suitable bracket. Shadowlands assumption: still 5-level brackets
if playerLvl >= MAX_PLAYER_LEVEL then
return MAX_PLAYER_LEVEL, MAX_PLAYER_LEVEL, nil
elseif playerLvl >= 65 then
return 65, 69, nil
elseif playerLvl >= 60 then
return 60, 65, nil
elseif playerLvl >= 55 then
return 55, 59, nil
elseif playerLvl >= 50 then
return 50, 54, nil
elseif playerLvl >= 45 then
return 45, 49, nil
elseif playerLvl >= 40 then
return 40, 44, nil
elseif playerLvl >= 35 then
return 35, 39, nil
elseif playerLvl >= 30 then
return 30, 34, nil
elseif playerLvl >= 25 then
return 25, 29, nil
elseif playerLvl >= 20 then
return 20, 24, nil
elseif playerLvl >= 15 then
return 15, 19, nil
else
return 10, 14, nil
end
else
if types[zone] ~= "Arena" and types[zone] ~= "Complex" and types[zone] ~= "City" and types[zone] ~= "Continent" then
-- Zones and Instances (scaling):
local low = lows[zone]
local high = highs[zone]
-- Check for active Chromie Time for the zone's expansion
local expansion = Tourist:GetChomieTimeActiveExpansion()
if( expansion ~= nil) then
trace("Active Chromie Time Expansion = '"..tostring(expansion).."'")
if expansion == expansions[zone] then
high = 50
end
end
-- Get effective scaled zone level
local playerLvl = playerLevel
local scaled = 0
if playerLvl <= low then
scaled = low
elseif playerLvl >= high then
scaled = high
else
scaled = playerLvl
end
if scaled == low and scaled == high then scaled = nil end -- nothing to scale in a one-level bracket (like Suramar)
return low, high, scaled
else
-- Other zones
return lows[zone], highs[zone], nil
end
end
end
-- Returns an r, g and b value representing a color ranging from grey (too low) via
-- green, yellow and orange to red (too high), depending on the player's battle pet level
-- within the battle pet level range of the given zone.
function Tourist:GetBattlePetLevelColor(zone, petLevel)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local low, high = self:GetBattlePetLevel(zone)
return Tourist:CalculateLevelColor(low, high, petLevel)
end
-- Returns an r, g and b value representing a color ranging from grey (too low) via
-- green, yellow and orange to red (too high), by calling CalculateLevelColor with
-- the min and max level of the given zone and the current player level.
-- Note: if zone is a zone or an instance, the zone's scaled level (calculated
-- by GetScaledZoneLevel) is used instead of it's minimum and maximum level.
function Tourist:GetLevelColor(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local low, high, scaled = self:GetLevel(zone)
if types[zone] == "Battleground" then
if playerLevel < low then
-- player cannot enter the lowest bracket of the BG -> red
return 1, 0, 0
end
end
if scaled then
return Tourist:CalculateLevelColor(scaled, scaled, playerLevel)
else
return Tourist:CalculateLevelColor(low, high, playerLevel)
end
end
-- Returns an r, g and b value representing a color ranging from grey (too low) via
-- green, yellow and orange to red (too high) depending on the player level within
-- the given range. Returns white if no level is applicable, like in cities.
function Tourist:CalculateLevelColor(low, high, currentLevel)
local midBracket = (low + high) / 2
if low <= 0 and high <= 0 then
-- City or level unknown -> White
return 1, 1, 1
elseif currentLevel == low and currentLevel == high then
-- Exact match, one-level bracket -> Yellow
return 1, 1, 0
elseif currentLevel <= low - 3 then
-- Player is three or more levels short of Low -> Red
return 1, 0, 0
elseif currentLevel < low then
-- Player is two or less levels short of Low -> sliding scale between Red and Orange
-- Green component goes from 0 to 0.5
local greenComponent = (currentLevel - low + 3) / 6
return 1, greenComponent, 0
elseif currentLevel == low then
-- Player is at low, at least two-level bracket -> Orange
return 1, 0.5, 0
elseif currentLevel < midBracket then
-- Player is between low and the middle of the bracket -> sliding scale between Orange and Yellow
-- Green component goes from 0.5 to 1
local halfBracketSize = (high - low) / 2
local posInBracketHalf = currentLevel - low
local greenComponent = 0.5 + (posInBracketHalf / halfBracketSize) * 0.5
return 1, greenComponent, 0
elseif currentLevel == midBracket then
-- Player is at the middle of the bracket -> Yellow
return 1, 1, 0
elseif currentLevel < high then
-- Player is between the middle of the bracket and High -> sliding scale between Yellow and Green
-- Red component goes from 1 to 0
local halfBracketSize = (high - low) / 2
local posInBracketHalf = currentLevel - midBracket
local redComponent = 1 - (posInBracketHalf / halfBracketSize)
return redComponent, 1, 0
elseif currentLevel == high then
-- Player is at High, at least two-level bracket -> Green
return 0, 1, 0
elseif currentLevel < high + 3 then
-- Player is up to three levels above High -> sliding scale between Green and Gray
-- Red and Blue components go from 0 to 0.5
-- Green component goes from 1 to 0.5
local pos = (currentLevel - high) / 3
local redAndBlueComponent = pos * 0.5
local greenComponent = 1 - redAndBlueComponent
return redAndBlueComponent, greenComponent, redAndBlueComponent
else
-- Player is at High + 3 or above -> Gray
return 0.5, 0.5, 0.5
end
end
-- Returns an r, g and b value representing a color, depending on the given zone and the current character's faction.
function Tourist:GetFactionColor(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
if factions[zone] == "Sanctuary" then
-- Blue
return 0.41, 0.8, 0.94
elseif self:IsPvPZone(zone) then
-- Orange
return 1, 0.7, 0
elseif factions[zone] == (isHorde and "Alliance" or "Horde") then
-- Red
return 1, 0, 0
elseif factions[zone] == (isHorde and "Horde" or "Alliance") then
-- Green
return 0, 1, 0
else
-- Yellow
return 1, 1, 0
end
end
-- Returns an r, g and b value representing a color, depending on the given flight node faction and the current character's faction.
-- faction can be 0, 1, 2, "Neutral", "Horde" or "Alliance".
function Tourist:GetFlightnodeFactionColor(faction)
faction = GetFlightnodeFaction(faction)
if faction == (isHorde and "Alliance" or "Horde") then
-- Red (hostile)
return 1, 0, 0
elseif faction == (isHorde and "Horde" or "Alliance") then
-- Green (friendly)
return 0, 1, 0
else
-- Yellow (neutral or unknown)
return 1, 1, 0
end
end
-- Returns the width and height of a zone map in game yards. The height is always 2/3 of the width.
function Tourist:GetZoneYardSize(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return yardWidths[zone], yardHeights[zone]
end
-- Calculates a distance in game yards between point A and point B.
-- Points A and B can be in different zones but must be on the same continent.
function Tourist:GetYardDistance(zone1, x1, y1, zone2, x2, y2)
if tonumber(zone1) == nil then
-- Not a uiMapID, translate zone name to map ID
zone1 = Tourist:GetZoneMapID(zone1)
end
if tonumber(zone2) == nil then
-- Not a uiMapID, translate zone name to map ID
zone2 = Tourist:GetZoneMapID(zone2)
end
if zone1 and zone2 then
return HBD:GetZoneDistance(zone1, x1, y1, zone2, x2, y2)
else
return nil, nil, nil
end
end
-- This function is used to calculate the coordinates of a location in zone1, on the map of zone2.
-- The zones can be continents (including Azeroth).
-- The return value can be outside the 0 to 1 range.
function Tourist:TransposeZoneCoordinate(x, y, zone1, zone2)
if tonumber(zone1) == nil then
-- Not a uiMapID, translate zone name to map ID
zone1 = Tourist:GetZoneMapID(zone1)
end
if tonumber(zone2) == nil then
-- Not a uiMapID, translate zone name to map ID
zone2 = Tourist:GetZoneMapID(zone2)
end
return HBD:TranslateZoneCoordinates(x, y, zone1, zone2, true) -- True: allow < 0 and > 1
end
-- This function is used to find the actual zone a player is in, including coordinates for that zone, if the current map
-- is a map that contains the player position, but is not the map of the zone where the player really is.
-- Return values:
-- x, y = player position on the most suitable map
-- zone = the unique localized zone name of the most suitable map
-- uiMapID = ID of the most suitable map
function Tourist:GetBestZoneCoordinate()
local uiMapID = C_Map.GetBestMapForUnit("player")
if uiMapID then
local zone = Tourist:GetMapNameByIDAlt(uiMapID)
local pos = C_Map.GetPlayerMapPosition(uiMapID, "player")
if pos then
return pos.x, pos.y, zone, uiMapID
else
return nil, nil, zone, uiMapID
end
end
return nil, nil, nil, nil
end
local function GetBFAInstanceLow(instanceLow, instanceFaction)
if (isHorde and instanceFaction == "Horde") or (isHorde == false and instanceFaction == "Alliance") then
return instanceLow
else
-- 'Hostile' instances can be accessed at max BfA level (50)
return 50
end
end
local function GetSiegeOfBoralusEntrance()
if isHorde then
return { BZ["Tiragarde Sound"], 88.3, 51.0 }
else
return { BZ["Tiragarde Sound"], 72.5, 23.6 }
end
end
local function GetTheMotherlodeEntrance()
if isHorde then
return { BZ["Zuldazar"], 56.1, 59.9 }
else
return { BZ["Zuldazar"], 39.3, 71.4 }
end
end
local function retNil()
return nil
end
local function retOne(object, state)
if state == object then
return nil
else
return object
end
end
local function retNormal(t, position)
return (next(t, position))
end
local function round(num, digits)
-- banker's rounding
local mantissa = 10^digits
local norm = num*mantissa
norm = norm + 0.5
local norm_f = math.floor(norm)
if norm == norm_f and (norm_f % 2) ~= 0 then
return (norm_f-1)/mantissa
end
return norm_f/mantissa
end
local function mysort(a,b)
if not lows[a] then
return false
elseif not lows[b] then
return true
else
local aval, bval = groupSizes[a] or groupMaxSizes[a], groupSizes[b] or groupMaxSizes[b]
if aval and bval then
if aval ~= bval then
return aval < bval
end
end
aval, bval = lows[a], lows[b]
if aval ~= bval then
return aval < bval
end
aval, bval = highs[a], highs[b]
if aval ~= bval then
return aval < bval
end
return a < b
end
end
local t = {}
local function myiter(t)
local n = t.n
n = n + 1
local v = t[n]
if v then
t[n] = nil
t.n = n
return v
else
t.n = nil
end
end
local function flightnodesort(a, b)
return a.name < b.name
end
function Tourist:IterateZoneInstances(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local inst = instances[zone]
if not inst then
return retNil
elseif type(inst) == "table" then
for k in pairs(t) do
t[k] = nil
end
for k in pairs(inst) do
t[#t+1] = k
end
table.sort(t, mysort)
t.n = 0
return myiter, t, nil
else
return retOne, inst, nil
end
end
function Tourist:IterateZoneFlightnodes(zone)
if flightnodeDataGathered == false then
GatherFlightnodeData()
end
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local nodes = flightnodes[zone]
if not nodes then
-- No nodes
return retNil
elseif type(nodes) == "table" then
-- Table of node IDs. Check if they have been found by GatherFlightnodeData
-- If so, the value is a node object, otherwise the value is true
local foundNodes = {}
for id, _ in pairs(nodes) do
if FlightnodeLookupTable[id] ~= true then
-- FlightnodeLookupTable[id] is an object, use it as key for the iter code below
foundNodes[FlightnodeLookupTable[id]] = true
-- else
--trace("Skipped: "..tostring(id))
end
end
for k in pairs(t) do
t[k] = nil
end
for k in pairs(foundNodes) do
t[#t+1] = k
end
table.sort(t, flightnodesort)
t.n = 0
return myiter, t, nil
else
-- Single node ID. Check if it has been found by GatherFlightnodeData
if FlightnodeLookupTable[nodes] ~= true then
return retOne, FlightnodeLookupTable[nodes], nil
else
-- No data
return retNil
end
end
end
function Tourist:IterateZoneComplexes(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local compl = zoneComplexes[zone]
if not compl then
return retNil
elseif type(compl) == "table" then
for k in pairs(t) do
t[k] = nil
end
for k in pairs(compl) do
t[#t+1] = k
end
table.sort(t, mysort)
t.n = 0
return myiter, t, nil
else
return retOne, compl, nil
end
end
function Tourist:GetInstanceZone(instance)
instance = Tourist:GetMapNameByIDAlt(instance) or instance
for k, v in pairs(instances) do
if v then
if type(v) == "string" then
if v == instance then
return k
end
else -- table
for l in pairs(v) do
if l == instance then
return k
end
end
end
end
end
end
function Tourist:GetComplexZone(complex)
complex = Tourist:GetMapNameByIDAlt(complex) or complex
for k, v in pairs(zoneComplexes) do
if v then
if type(v) == "string" then
if v == complex then
return k
end
else -- table
for l in pairs(v) do
if l == complex then
return k
end
end
end
end
end
end
function Tourist:DoesZoneHaveInstances(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return not not instances[zone]
end
function Tourist:DoesZoneHaveFlightnodes(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return not not flightnodes[zone]
end
function Tourist:DoesZoneHaveComplexes(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return not not zoneComplexes[zone]
end
local zonesInstances
local function initZonesInstances()
if not zonesInstances then
zonesInstances = {}
for zone, v in pairs(lows) do
if types[zone] ~= "Transport" and types[zone] ~= "Portal" and types[zone] ~= "Flightpath" and types[zone] ~= "Continent" then
zonesInstances[zone] = true
end
end
end
initZonesInstances = nil -- Set function to nil so initialisation is done only once (and just in time)
end
function Tourist:IterateZonesAndInstances()
if initZonesInstances then
initZonesInstances()
end
return retNormal, zonesInstances, nil
end
local function zoneIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and (types[k] == "Instance" or types[k] == "Battleground" or types[k] == "Arena" or types[k] == "Complex") do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateZones()
if initZonesInstances then
initZonesInstances()
end
return zoneIter, nil, nil
end
local function instanceIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and (types[k] ~= "Instance" and types[k] ~= "Battleground" and types[k] ~= "Arena") do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateInstances()
if initZonesInstances then
initZonesInstances()
end
return instanceIter, nil, nil
end
local function bgIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and types[k] ~= "Battleground" do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateBattlegrounds()
if initZonesInstances then
initZonesInstances()
end
return bgIter, nil, nil
end
local function arIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and types[k] ~= "Arena" do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateArenas()
if initZonesInstances then
initZonesInstances()
end
return arIter, nil, nil
end
local function compIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and types[k] ~= "Complex" do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateComplexes()
if initZonesInstances then
initZonesInstances()
end
return compIter, nil, nil
end
local function pvpIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and types[k] ~= "PvP Zone" do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IteratePvPZones()
if initZonesInstances then
initZonesInstances()
end
return pvpIter, nil, nil
end
local function allianceIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and factions[k] ~= "Alliance" do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateAlliance()
if initZonesInstances then
initZonesInstances()
end
return allianceIter, nil, nil
end
local function hordeIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and factions[k] ~= "Horde" do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateHorde()
if initZonesInstances then
initZonesInstances()
end
return hordeIter, nil, nil
end
if isHorde then
Tourist.IterateFriendly = Tourist.IterateHorde
Tourist.IterateHostile = Tourist.IterateAlliance
else
Tourist.IterateFriendly = Tourist.IterateAlliance
Tourist.IterateHostile = Tourist.IterateHorde
end
local function sanctIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and factions[k] ~= "Sanctuary" do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateSanctuaries()
if initZonesInstances then
initZonesInstances()
end
return sanctIter, nil, nil
end
local function contestedIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and factions[k] do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateContested()
if initZonesInstances then
initZonesInstances()
end
return contestedIter, nil, nil
end
local function kalimdorIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and continents[k] ~= Kalimdor do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateKalimdor()
if initZonesInstances then
initZonesInstances()
end
return kalimdorIter, nil, nil
end
local function easternKingdomsIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and continents[k] ~= Eastern_Kingdoms do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateEasternKingdoms()
if initZonesInstances then
initZonesInstances()
end
return easternKingdomsIter, nil, nil
end
local function outlandIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and continents[k] ~= Outland do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateOutland()
if initZonesInstances then
initZonesInstances()
end
return outlandIter, nil, nil
end
local function northrendIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and continents[k] ~= Northrend do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateNorthrend()
if initZonesInstances then
initZonesInstances()
end
return northrendIter, nil, nil
end
local function theMaelstromIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and continents[k] ~= The_Maelstrom do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateTheMaelstrom()
if initZonesInstances then
initZonesInstances()
end
return theMaelstromIter, nil, nil
end
local function pandariaIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and continents[k] ~= Pandaria do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IteratePandaria()
if initZonesInstances then
initZonesInstances()
end
return pandariaIter, nil, nil
end
local function draenorIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and continents[k] ~= Draenor do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateDraenor()
if initZonesInstances then
initZonesInstances()
end
return draenorIter, nil, nil
end
local function brokenislesIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and continents[k] ~= Broken_Isles do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateBrokenIsles()
if initZonesInstances then
initZonesInstances()
end
return brokenislesIter, nil, nil
end
local function argusIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and continents[k] ~= Argus do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateArgus()
if initZonesInstances then
initZonesInstances()
end
return argusIter, nil, nil
end
local function zandalarIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and continents[k] ~= Zandalar do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateZandalar()
if initZonesInstances then
initZonesInstances()
end
return zandalarIter, nil, nil
end
local function kultirasIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and continents[k] ~= Kul_Tiras do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateKulTiras()
if initZonesInstances then
initZonesInstances()
end
return kultirasIter, nil, nil
end
local function theShadowlandsIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and continents[k] ~= The_Shadowlands do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateTheShadowlands()
if initZonesInstances then
initZonesInstances()
end
return theShadowlandsIter, nil, nil
end
local function dragonIslesIter(_, position)
local k = next(zonesInstances, position)
while k ~= nil and continents[k] ~= Dragon_Isles do
k = next(zonesInstances, k)
end
return k
end
function Tourist:IterateDragonIsles()
if initZonesInstances then
initZonesInstances()
end
return dragonIslesIter, nil, nil
end
function Tourist:IterateRecommendedZones()
return retNormal, recZones, nil
end
function Tourist:IterateRecommendedInstances()
return retNormal, recInstances, nil
end
function Tourist:HasRecommendedInstances()
return next(recInstances) ~= nil
end
function Tourist:IsInstance(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local t = types[zone]
return t == "Instance" or t == "Battleground" or t == "Arena"
end
function Tourist:IsZone(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local t = types[zone]
return t and t ~= "Instance" and t ~= "Battleground" and t ~= "Transport" and t ~= "Portal" and t ~= "Flightpath" and t ~= "Arena" and t ~= "Complex"
end
function Tourist:IsContinent(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local t = types[zone]
return t == "Continent"
end
function Tourist:GetComplex(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return complexOfInstance[zone]
end
function Tourist:GetExpansion(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return GetExpansionIndex(zone), expansions[zone] or UNKNOWN
end
function Tourist:GetType(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return types[zone] or "Zone"
end
function Tourist:IsZoneOrInstance(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local t = types[zone]
return t and t ~= "Transport" and t ~= "Portal" and t~= "Flightpath"
end
function Tourist:IsTransport(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local t = types[zone]
return t == "Transport" or t == "Portal" or t == "Flightpath"
end
function Tourist:IsComplex(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local t = types[zone]
return t == "Complex"
end
function Tourist:IsBattleground(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local t = types[zone]
return t == "Battleground"
end
function Tourist:IsArena(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local t = types[zone]
return t == "Arena"
end
function Tourist:IsPvPZone(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local t = types[zone]
return t == "PvP Zone"
end
function Tourist:IsCity(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local t = types[zone]
return t == "City"
end
function Tourist:IsAlliance(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return factions[zone] == "Alliance"
end
function Tourist:IsHorde(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return factions[zone] == "Horde"
end
if isHorde then
Tourist.IsFriendly = Tourist.IsHorde
Tourist.IsHostile = Tourist.IsAlliance
else
Tourist.IsFriendly = Tourist.IsAlliance
Tourist.IsHostile = Tourist.IsHorde
end
function Tourist:IsSanctuary(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return factions[zone] == "Sanctuary"
end
function Tourist:IsContested(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return not factions[zone]
end
function Tourist:GetContinent(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return BZ[continents[zone]] or UNKNOWN
end
function Tourist:IsInKalimdor(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return continents[zone] == Kalimdor
end
function Tourist:IsInEasternKingdoms(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return continents[zone] == Eastern_Kingdoms
end
function Tourist:IsInOutland(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return continents[zone] == Outland
end
function Tourist:IsInNorthrend(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return continents[zone] == Northrend
end
function Tourist:IsInTheMaelstrom(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return continents[zone] == The_Maelstrom
end
function Tourist:IsInPandaria(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return continents[zone] == Pandaria
end
function Tourist:IsInDraenor(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return continents[zone] == Draenor
end
function Tourist:IsInBrokenIsles(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return continents[zone] == Broken_Isles
end
function Tourist:IsInArgus(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return continents[zone] == Argus
end
function Tourist:IsInZandalar(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return continents[zone] == Zandalar
end
function Tourist:IsInKulTiras(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return continents[zone] == Kul_Tiras
end
function Tourist:IsInTheShadowlands(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return continents[zone] == The_Shadowlands
end
function Tourist:IsInDragonIsles(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return continents[zone] == Dragon_Isles
end
function Tourist:GetInstanceGroupSize(instance)
instance = Tourist:GetMapNameByIDAlt(instance) or instance
return groupSizes[instance] or groupMaxSizes[instance] or 0
end
function Tourist:GetInstanceGroupMinSize(instance)
instance = Tourist:GetMapNameByIDAlt(instance) or instance
return groupMinSizes[instance] or groupSizes[instance] or 0
end
function Tourist:GetInstanceGroupMaxSize(instance)
instance = Tourist:GetMapNameByIDAlt(instance) or instance
return groupMaxSizes[instance] or groupSizes[instance] or 0
end
function Tourist:GetInstanceGroupSizeString(instance, includeAltSize)
instance = Tourist:GetMapNameByIDAlt(instance) or instance
local retValue
if groupSizes[instance] then
-- Fixed size
retValue = tostring(groupSizes[instance])
elseif groupMinSizes[instance] and groupMaxSizes[instance] then
-- Variable size
if groupMinSizes[instance] == groupMaxSizes[instance] then
-- ...but equal
retValue = tostring(groupMinSizes[instance])
else
retValue = tostring(groupMinSizes[instance]).."-"..tostring(groupMaxSizes[instance])
end
else
-- No size known
return ""
end
if includeAltSize and groupAltSizes[instance] then
-- Add second size
retValue = retValue.." or "..tostring(groupAltSizes[instance])
end
return retValue
end
function Tourist:GetInstanceAltGroupSize(instance)
instance = Tourist:GetMapNameByIDAlt(instance) or instance
return groupAltSizes[instance] or 0
end
function Tourist:GetTexture(zone)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
return textures[zone]
end
function Tourist:GetZoneMapID(zone)
return zoneMapIDs[zone]
end
function Tourist:GetEntrancePortalLocation(instance)
instance = Tourist:GetMapNameByIDAlt(instance) or instance
local x, y = entrancePortals_x[instance], entrancePortals_y[instance]
if x then x = x/100 end
if y then y = y/100 end
return entrancePortals_zone[instance], x, y
end
local inf = math.huge
local stack = setmetatable({}, {__mode='k'})
local function iterator(S)
local position = S['#'] - 1
S['#'] = position
local x = S[position]
if not x then
for k in pairs(S) do
S[k] = nil
end
stack[S] = true
return nil
end
return x
end
setmetatable(cost, {
__index = function(self, vertex)
local price = 1
local allowInaccesible = false -- allow inacessible content (due to player level) and hostile portals, flightpaths (for testing)
-- Take player level into account, compared to zone minimum level
if lows[vertex] > playerLevel then
price = price * (1 + math.ceil((lows[vertex] - playerLevel) / 6))
end
if factions[vertex] == (isHorde and "Horde" or "Alliance") then
-- Friendly: 50% off
price = price / 2
if types[vertex] == "Flightpath" then
-- Flightpaths are preferably only to be used when there is no other connection available
price = price * 10
end
elseif factions[vertex] == (isHorde and "Alliance" or "Horde") then
-- Hostile
if types[vertex] == "Portal" or types[vertex] == "Flightpath" then
-- No go
if allowInaccesible then price = price * 1000 else price = inf end
else
if types[vertex] == "City" then
-- Very dangerous
price = price * 10
else
-- Less dangerous
price = price * 3
end
end
end
if types[vertex] == "Transport" then
-- Not sure why transports should be more expensive than road connections (to be tuned?)
price = price * 2
end
-- Avoid using connections to inaccessible continents
if (continents[vertex] == Outland
or continents[vertex] == Northrend
or continents[vertex] == Pandaria
or continents[vertex] == Draenor
or continents[vertex] == Broken_Isles
or continents[vertex] == Zandalar
or continents[vertex] == Kul_Tiras)
and playerLevel < 10 then
if allowInaccesible then price = price * 1000 else price = inf end
end
if continents[vertex] == The_Maelstrom and playerLevel < 30 then
if allowInaccesible then price = price * 1000 else price = inf end
end
if continents[vertex] == Argus and playerLevel < 45 then
if allowInaccesible then price = price * 1000 else price = inf end
end
if continents[vertex] == The_Shadowlands and playerLevel < 50 then
if allowInaccesible then price = price * 1000 else price = inf end
end
if continents[vertex] == Dragon_Isles and playerLevel < 60 then
if allowInaccesible then price = price * 1000 else price = inf end
end
self[vertex] = price
return price
end
})
-- This function tries to calculate the most optimal path between alpha and bravo
-- by foot or ground mount, that is, without using a flying mount or a taxi service (with a few exceptions).
-- The return value is an iteration that gives a travel advice in the form of a list
-- of zones, transports and portals to follow in order to get from alpha to bravo.
-- The function tries to avoid hostile zones by calculating a "price" for each possible
-- route. The price calculation takes zone level, faction and type into account.
-- See metatable above for the 'pricing' mechanism.
function Tourist:IteratePath(alpha, bravo)
alpha = Tourist:GetMapNameByIDAlt(alpha) or alpha -- departure zone
bravo = Tourist:GetMapNameByIDAlt(bravo) or bravo -- destination zone
if paths[alpha] == nil or paths[bravo] == nil then
-- departure zone and destination zone must both have at least one path
return retNil
end
local d = next(stack) or {}
stack[d] = nil
local Q = next(stack) or {}
stack[Q] = nil
local S = next(stack) or {}
stack[S] = nil
local pi = next(stack) or {}
stack[pi] = nil
local inStack = 0
for vertex, v in pairs(paths) do -- for each zone with at least one path
d[vertex] = inf -- add to price stack: d[<zone>] = price of the route to get to that zone from alpha, initially infinite
Q[vertex] = v -- add to zone stack: Q[<zone>] = <path collection>, contains all zones that have one or more paths
inStack = inStack + 1
end
d[alpha] = 0 -- price for departure zone = 0 (no costs to get there)
--trace("In stack: "..tostring(inStack).." zones.")
local count = 0
local inCollection = 0
while next(Q) do -- do this for each zone as long as there are zones present in the zone stack
count = count + 1
local u -- this will hold the zone name with the lowest price
local min = inf -- this will hold the lowest price that has been found while searching; initially infinite
for z in pairs(Q) do -- for each zone currently present in the zone stack
local value = d[z] -- get price for the route to get to that zone (see note below)
if value < min then -- compare to find the zone with the lowest price. If a lower price is found:
min = value -- remember lowest route price so far
u = z -- remember the zone with the lowest route price so far
end
end
--trace(tostring(count)..": u = "..tostring(u).." ("..tostring(min)..")")
if min == inf then
--trace("No path - EXIT")
return retNil -- no zone found for which a price has been determined -> exit and return nil (no path possible between alpha and bravo)
end
Q[u] = nil -- remove the zone that came up as cheapest from the stack so it won't be used twice
if u == bravo then
--trace("Destination found")
break -- we have reached our destination zone; stop searching by exiting the 'while next(Q)' loop
end
-- The very first cycle will result in the departure zone being the cheapest to go to. This zone has price 0, while all other zones are still
-- priced 'infinite' at this point. The departure zone will then be picked up for processing of its connections (paths).
--
-- Each zone that has been processed will be removed from the stack. The departure zone will therefore be the first zone to be removed.
-- Because every cycle the a zone with the lowest available price is processed, the remaining zones in the stack will always have an equal or
-- higher price (if not inifinite).
--
-- In subsequent cycles, prices will be calculated and set for other zones, causing them to be picked up for processing eventually in later cycles.
-- The price reflects the costs to reach that zone, originating from the departure zone.
--
-- Only zones will be priced, that have a connection with the zone that is being processed (starting with the departure zone).
-- Prices are only registered when they are lower than the registered price. When this happens the registered price is always 'infinite'.
-- Because the price of the route keeps increasing, prices are never updated once set. This ensures that the search always moves away from the
-- departure zone, like an oil stain.
--
-- At some point the destination zone will be priced too, if it comes up during the search.
--
-- When eventually the destination zone is picked as cheapest one left in the stack, this means that:
-- a) there is a route between departure and destination, because the destination zone has been priced
-- b) this route is made up out of the cheapest connections available
-- As a result, there is no need to continue the search because every other option would be more expensive.
-- process the path connections of the found zone
local adj = paths[u] -- get the path connections of the zone being processed (adj = adjecent?)
if type(adj) == "table" then -- multiple paths go from here
local d_u = d[u] -- current route price: the price of the route to get to the zone being processed
for v in pairs(adj) do -- for each path that goes from here
local c = d_u + cost[v] -- add the price of that path to the route price
--trace(" d["..tostring(u).."] + cost["..tostring(v).."]: "..tostring(d[u]).." + "..tostring(cost[v]).." = "..tostring(c))
-- to debug path errors in data
-- if v == nil or d[v] == nil or c == nil then
-- trace("v = "..tostring(v)..", d["..tostring(v).."] = "..tostring(d[v])..", c = "..tostring(c))
-- end
if d[v] > c then -- if the currently known price of this path (initialized at infinite at the beginning) is greater than the calculated price...
--trace(" * path to "..tostring(v)..": "..tostring(u).." -> "..tostring(v).." ("..tostring(c).." < "..tostring(d[v])..")")
d[v] = c -- - update the price of the path to that zone in the collection of prices
pi[v] = u -- - store or update how to get there: pi[<path zone name>] = <current zone name>
inCollection = inCollection + 1
else
--trace(" rejected: "..tostring(u).." -> "..tostring(v).." (because "..tostring(c).." >= "..tostring(d[v]).." (= price of "..tostring(v).."))")
end
end
elseif adj ~= false then -- one path goes from here
local c = d[u] + cost[adj] -- add the price of that path to the route price
--trace(" d["..tostring(u).."] + cost["..tostring(adj).."]: "..tostring(d[u]).." + "..tostring(cost[adj]).." = "..tostring(c))
if d[adj] > c then -- if the the calculated route price for this path is less than the currently known price (initialized at inf at the beginning) is greater than ...
--trace(" * path to "..tostring(adj)..": "..tostring(u).." -> "..tostring(adj).." ("..tostring(c).." < "..tostring(d[adj])..")")
d[adj] = c -- - update the price of the path to that zone in the collection of prices
pi[adj] = u -- - store or update how to get there: pi[<path zone name>] = <current zone name>
inCollection = inCollection + 1
else
--trace(" rejected: "..tostring(u).." -> "..tostring(adj).." (because "..tostring(c).." >= "..tostring(d[adj]).." (= price of "..tostring(adj).."))")
end
end
end
--trace("In collection: "..tostring(inCollection))
-- At this point, pi will contain a collection of all connections that have been priced, stored as: pi[<you should go here>] = <from here>
-- Amongst these are the connections that have to be used to create the cheapest route between departure and destination.
-- Next, the route will be extracted from the data in pi.
--
-- The loop below starts at the destination zone and works it way back to the departure zone, asking
-- "from which direction should I be coming when I arrive here?"
-- until there is no answer to that question, which will be the case for the departure zone. Technically, the departure zone
-- has not been priced and is therefore not present in the collection.
--
-- The resulting sequence is stored in S[<index>] = <zone name>
-- The sequence appears to be reversed, starting at the destination zone (not sure why that is)
local i = 1
local last = bravo
while last do
S[i] = last
--trace("S["..tostring(i).."] = "..tostring(S[i]))
i = i + 1
last = pi[last]
end
-- reset the helper stacks
for k in pairs(pi) do
pi[k] = nil
end
for k in pairs(Q) do
Q[k] = nil
end
for k in pairs(d) do
d[k] = nil
end
stack[pi] = true
stack[Q] = true
stack[d] = true
S['#'] = i -- set the stack size of S
return iterator, S -- return result
end
local function retIsZone(t, key)
while true do
key = next(t, key)
if not key then
return nil
end
if Tourist:IsZone(key) then
return key
end
end
end
-- This returns an iteration of zone connections (paths).
-- The second parameter determines whether other connections like transports and portals should be included
function Tourist:IterateBorderZones(zone, zonesOnly)
zone = Tourist:GetMapNameByIDAlt(zone) or zone
local path = paths[zone]
if not path then
return retNil
elseif type(path) == "table" then
return zonesOnly and retIsZone or retNormal, path
else
if zonesOnly and not Tourist:IsZone(path) then
return retNil
end
return retOne, path
end
end
--------------------------------------------------------------------------------------------------------
-- Main code --
--------------------------------------------------------------------------------------------------------
do
Tourist.frame = oldLib and oldLib.frame or CreateFrame("Frame", MAJOR_VERSION .. "Frame", UIParent)
Tourist.frame:UnregisterAllEvents()
Tourist.frame:RegisterEvent("PLAYER_LEVEL_UP")
Tourist.frame:RegisterEvent("PLAYER_ENTERING_WORLD")
Tourist.frame:SetScript("OnEvent", function(frame, event, ...)
PLAYER_LEVEL_UP(Tourist, ...)
end)
trace("Tourist: Initializing localized zone name lookups...")
CreateLocalizedZoneNameLookups()
AddDuplicatesToLocalizedLookup()
-- TRANSPORT DEFINITIONS ----------------------------------------------------------------
local transports = {}
-- Boats
transports["BOOTYBAY_RATCHET_BOAT"] = string.format(X_Y_BOAT, BZ["The Cape of Stranglethorn"], BZ["Northern Barrens"])
transports["RATCHET_BOOTYBAY_BOAT"] = string.format(X_Y_BOAT, BZ["Northern Barrens"], BZ["The Cape of Stranglethorn"])
transports["MENETHIL_HOWLINGFJORD_BOAT"] = string.format(X_Y_BOAT, BZ["Wetlands"], BZ["Howling Fjord"])
transports["HOWLINGFJORD_MENETHIL_BOAT"] = string.format(X_Y_BOAT, BZ["Howling Fjord"], BZ["Wetlands"])
transports["MENETHIL_THERAMORE_BOAT"] = string.format(X_Y_BOAT, BZ["Wetlands"], BZ["Dustwallow Marsh"])
transports["THERAMORE_MENETHIL_BOAT"] = string.format(X_Y_BOAT, BZ["Dustwallow Marsh"], BZ["Wetlands"])
transports["DRAGONBLIGHT_HOWLINGFJORD_BOAT"] = string.format(X_Y_BOAT, BZ["Dragonblight"], BZ["Howling Fjord"])
transports["HOWLINGFJORD_DRAGONBLIGHT_BOAT"] = string.format(X_Y_BOAT, BZ["Howling Fjord"], BZ["Dragonblight"])
transports["DRAGONBLIGHT_BOREANTUNDRA_BOAT"] = string.format(X_Y_BOAT, BZ["Dragonblight"], BZ["Borean Tundra"])
transports["BOREANTUNDRA_DRAGONBLIGHT_BOAT"] = string.format(X_Y_BOAT, BZ["Borean Tundra"], BZ["Dragonblight"])
transports["STORMWIND_BOREANTUNDRA_BOAT"] = string.format(X_Y_BOAT, BZ["Stormwind City"], BZ["Borean Tundra"])
transports["BOREANTUNDRA_STORMWIND_BOAT"] = string.format(X_Y_BOAT, BZ["Borean Tundra"], BZ["Stormwind City"])
-- transports["TELDRASSIL_AZUREMYST_BOAT"] = string.format(X_Y_BOAT, BZ["Teldrassil"], BZ["Azuremyst Isle"]) -- 8.0: portal
-- transports["TELDRASSIL_STORMWIND_BOAT"] = string.format(X_Y_BOAT, BZ["Teldrassil"], BZ["Stormwind City"]) -- 8.0: portal
transports["STORMWIND_TIRAGARDESOUND_BOAT"] = string.format(X_Y_BOAT, BZ["Stormwind City"], BZ["Tiragarde Sound"])
transports["TIRAGARDESOUND_STORMWIND_BOAT"] = string.format(X_Y_BOAT, BZ["Tiragarde Sound"], BZ["Stormwind City"])
transports["ECHOISLES_ZULDAZAR_BOAT"] = string.format(X_Y_BOAT, BZ["Echo Isles"], BZ["Zuldazar"])
transports["ZULDAZAR_ECHOISLES_BOAT"] = string.format(X_Y_BOAT, BZ["Zuldazar"], BZ["Echo Isles"])
transports["STORMWIND_WAKINGSHORES_BOAT"] = string.format(X_Y_BOAT, BZ["Stormwind City"], BZ["The Waking Shores"])
transports["WAKINGSHORES_STORMWIND_BOAT"] = string.format(X_Y_BOAT, BZ["The Waking Shores"], BZ["Stormwind City"])
-- Zeppelins
transports["ORGRIMMAR_STRANGLETHORN_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Orgrimmar"], BZ["Northern Stranglethorn"])
transports["STRANGLETHORN_ORGRIMMAR_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Northern Stranglethorn"], BZ["Orgrimmar"])
transports["ORGRIMMAR_THUNDERBLUFF_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Orgrimmar"], BZ["Thunder Bluff"])
transports["THUNDERBLUFF_ORGRIMMAR_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Thunder Bluff"], BZ["Orgrimmar"])
-- transports["ORGRIMMAR_UNDERCITY_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Orgrimmar"], BZ["Undercity"]) -- 8.0: portal
-- transports["UNDERCITY_GROMGOL_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Undercity"], BZ["Northern Stranglethorn"]) -- 8.0: portal
-- transports["UNDERCITY_HOWLINGFJORD_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Undercity"], BZ["Howling Fjord"]) -- 8.0: portal
transports["ORGRIMMAR_BOREANTUNDRA_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Orgrimmar"], BZ["Borean Tundra"])
transports["BOREANTUNDRA_ORGRIMMAR_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Borean Tundra"], BZ["Orgrimmar"])
transports["ORGRIMMAR_WAKINGSHORES_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Orgrimmar"], BZ["The Waking Shores"])
transports["WAKINGSHORES_ORGRIMMAR_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["The Waking Shores"], BZ["Orgrimmar"])
-- Teleports
transports["SILVERMOON_UNDERCITY_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Silvermoon City"], BZ["Undercity"])
transports["UNDERCITY_SILVERMOON_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Undercity"], BZ["Silvermoon City"])
transports["DALARAN_CRYSTALSONG_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Dalaran"], BZ["Crystalsong Forest"])
transports["CRYSTALSONG_DALARAN_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Crystalsong Forest"], BZ["Dalaran"])
-- Portals
transports["AZSUNA_DALARANBROKENISLES_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Azsuna"], BZ["Dalaran"].." ("..BZ["Broken Isles"]..")")
transports["AZSUNA_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Azsuna"], BZ["Orgrimmar"])
transports["AZSUNA_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Azsuna"], BZ["Stormwind City"])
transports["AZUREMYST_TELDRASSIL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Azuremyst Isle"], BZ["Teldrassil"]) -- 8.0: former boat
transports["BROKENSHORE_DALARANBROKENISLES_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Broken Shore"], BZ["Dalaran"].." ("..BZ["Broken Isles"]..")")
transports["COT_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Caverns of Time"], BZ["Orgrimmar"])
transports["COT_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Caverns of Time"], BZ["Stormwind City"])
transports["DALARAN_ICECROWN_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Dalaran"], BZ["Icecrown"])
transports["DALARAN_WINTERGRASP_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Dalaran"], BZ["Wintergrasp"])
transports["DALARAN_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Dalaran"], BZ["Orgrimmar"])
transports["DALARAN_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Dalaran"], BZ["Stormwind City"])
transports["DALARANBROKENISLES_AZSUNA_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Dalaran"].." ("..BZ["Broken Isles"]..")", BZ["Azsuna"])
transports["DALARANBROKENISLES_BROKENSHORE_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Dalaran"].." ("..BZ["Broken Isles"]..")", BZ["Broken Shore"])
transports["DALARANBROKENISLES_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Dalaran"].." ("..BZ["Broken Isles"]..")", BZ["Orgrimmar"])
transports["DALARANBROKENISLES_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Dalaran"].." ("..BZ["Broken Isles"]..")", BZ["Stormwind City"])
transports["DALARANBROKENISLES_VINDICAAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Dalaran"].." ("..BZ["Broken Isles"]..")", BZ["The Vindicaar"])
transports["DARKMOON_ELWYNNFOREST_PORTAL"] = string.format(X_Y_PORTAL, BZ["Darkmoon Island"], BZ["Elwynn Forest"])
transports["DARKMOON_MULGORE_PORTAL"] = string.format(X_Y_PORTAL, BZ["Darkmoon Island"], BZ["Mulgore"])
transports["DARNASSUS_TELDRASSIL_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Darnassus"], BZ["Teldrassil"])
transports["DARNASSUS_HELLFIRE_PORTAL"] = string.format(X_Y_PORTAL, BZ["Darnassus"], BZ["Hellfire Peninsula"])
transports["DARNASSUS_EXODAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Darnassus"], BZ["The Exodar"])
transports["DEEPHOLM_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Deepholm"], BZ["Orgrimmar"])
transports["DEEPHOLM_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Deepholm"], BZ["Stormwind City"])
transports["EASTERNPLAGUE_QUELDANAS_FLIGHTPATH"] = string.format(X_Y_PORTAL, BZ["Eastern Plaguelands"], BZ["Isle of Quel'Danas"])
transports["ELWYNNFOREST_DARKMOON_PORTAL"] = string.format(X_Y_PORTAL, BZ["Elwynn Forest"], BZ["Darkmoon Island"])
transports["EXODAR_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["The Exodar"], BZ["Stormwind City"])
transports["FROSTWALL_WARSPEAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Frostwall"], BZ["Warspear"])
transports["HELLFIRE_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Hellfire Peninsula"], BZ["Orgrimmar"])
transports["HELLFIRE_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Hellfire Peninsula"], BZ["Stormwind City"])
transports["HOWLINGFJORD_TIRISFAL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Howling Fjord"], BZ["Tirisfal Glades"]) -- 8.0: former zeppelin
transports["ICECROWN_DALARAN_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Icecrown"], BZ["Dalaran"])
transports["ISLEOFGIANTS_KUNLAISUMMIT_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Isle of Giants"], BZ["Kun-Lai Summit"])
transports["ISLEOFTHUNDER_TOWNLONGSTEPPES_PORTAL"] = string.format(X_Y_PORTAL, BZ["Isle of Thunder"], BZ["Townlong Steppes"])
transports["JADEFOREST_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["The Jade Forest"], BZ["Orgrimmar"])
transports["JADEFOREST_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["The Jade Forest"], BZ["Stormwind City"])
transports["JADEFOREST_TIMELESSISLE_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["The Jade Forest"], BZ["Timeless Isle"])
transports["KUNLAISUMMIT_ISLEOFGIANTS_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Kun-Lai Summit"], BZ["Isle of Giants"])
transports["LUNARFALL_STORMSHIELD_PORTAL"] = string.format(X_Y_PORTAL, BZ["Lunarfall"], BZ["Stormshield"])
transports["MECHAGON_TIRAGARDESOUND_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Mechagon Island"], BZ["Boralus"])
transports["MECHAGON_ZULDAZAR_BOAT"] = string.format(X_Y_BOAT, BZ["Mechagon Island"], BZ["Dazar'alor"])
transports["MOLTENFRONT_MOUNTHYJAL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Molten Front"], BZ["Mount Hyjal"])
transports["MOUNTHYJAL_MOLTENFRONT_PORTAL"] = string.format(X_Y_PORTAL, BZ["Mount Hyjal"], BZ["Molten Front"])
transports["MOUNTHYJAL_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Mount Hyjal"], BZ["Orgrimmar"])
transports["MOUNTHYJAL_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Mount Hyjal"], BZ["Stormwind City"])
transports["MULGORE_DARKMOON_PORTAL"] = string.format(X_Y_PORTAL, BZ["Mulgore"], BZ["Darkmoon Island"])
transports["NAZJATAR_TIRAGARDESOUND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Nazjatar"], BZ["Boralus"])
transports["NAZJATAR_ZULDAZAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Nazjatar"], BZ["Dazar'alor"])
transports["ORGRIMMAR_AZSUNA_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Azsuna"])
transports["ORGRIMMAR_COT_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Caverns of Time"])
transports["ORGRIMMAR_DALARAN_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Dalaran"])
transports["ORGRIMMAR_DEEPHOLM_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Deepholm"])
transports["ORGRIMMAR_JADEFOREST_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["The Jade Forest"])
transports["ORGRIMMAR_MOUNTHYJAL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Mount Hyjal"])
transports["ORGRIMMAR_SHATTRATH_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Shattrath City"])
transports["ORGRIMMAR_SILVERMOON_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Silvermoon City"])
transports["ORGRIMMAR_TOLBARAD_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Tol Barad Peninsula"])
transports["ORGRIMMAR_TWILIGHTHIGHLANDS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Twilight Highlands"])
transports["ORGRIMMAR_ULDUM_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Uldum"])
transports["ORGRIMMAR_TIRISFAL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Tirisfal Glades"]) -- 8.0: former zeppelin
transports["ORGRIMMAR_VASHJIR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Abyssal Depths"])
transports["ORGRIMMAR_WARSPEAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Warspear"])
transports["ORGRIMMAR_ZULDAZAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Dazar'alor"])
transports["QUELDANAS_EASTERNPLAGUE_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Isle of Quel'Danas"], BZ["Eastern Plaguelands"])
transports["QUELDANAS_SILVERMOON_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Isle of Quel'Danas"], BZ["Silvermoon City"])
transports["SEVENSTARS_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Shrine of Seven Stars"], BZ["Stormwind City"])
transports["SHATTRATH_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Shattrath City"], BZ["Orgrimmar"])
transports["SHATTRATH_QUELDANAS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Shattrath City"], BZ["Isle of Quel'Danas"])
transports["SHATTRATH_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Shattrath City"], BZ["Stormwind City"])
transports["SILITHUS_TIRAGARDESOUND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Silithus"], BZ["Boralus"])
transports["SILITHUS_ZULDAZAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Silithus"], BZ["Dazar'alor"])
transports["SILVERMOON_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Silvermoon City"], BZ["Orgrimmar"])
transports["SILVERMOON_QUELDANAS_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Silvermoon City"], BZ["Isle of Quel'Danas"])
transports["STORMSHIELD_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormshield"], BZ["Stormwind City"])
transports["STORMSHIELD_TANAANJUNGLE_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormshield"], BZ["Tanaan Jungle"])
transports["STORMWIND_AZSUNA_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Azsuna"])
transports["STORMWIND_COT_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Caverns of Time"])
transports["STORMWIND_DALARAN_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Dalaran"])
transports["STORMWIND_DEEPHOLM_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Deepholm"])
transports["STORMWIND_EXODAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["The Exodar"])
transports["STORMWIND_JADEFOREST_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["The Jade Forest"])
transports["STORMWIND_MOUNTHYJAL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Mount Hyjal"])
transports["STORMWIND_SHATTRATH_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Shattrath City"])
transports["STORMWIND_STORMSHIELD_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Stormshield"])
transports["STORMWIND_TELDRASSIL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Teldrassil"]) -- 8.0: former boat
transports["STORMWIND_TIRAGARDESOUND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Boralus"])
transports["STORMWIND_TOLBARAD_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Tol Barad Peninsula"])
transports["STORMWIND_TWILIGHTHIGHLANDS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Twilight Highlands"])
transports["STORMWIND_ULDUM_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Uldum"])
transports["STORMWIND_VASHJIR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Abyssal Depths"])
transports["STRANGLETHORN_TIRISFAL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Northern Stranglethorn"], BZ["Tirisfal Glades"]) -- 8.0: former zeppelin
transports["TANAANJUNGLE_STORMSHIELD_PORTAL"] = string.format(X_Y_PORTAL, BZ["Tanaan Jungle"], BZ["Stormshield"])
transports["TANAANJUNGLE_WARSPEAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Tanaan Jungle"], BZ["Warspear"])
transports["TELDRASSIL_AZUREMYST_PORTAL"] = string.format(X_Y_PORTAL, BZ["Teldrassil"], BZ["Azuremyst Isle"]) -- 8.0: former boat
transports["TELDRASSIL_DARNASSUS_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Teldrassil"], BZ["Darnassus"])
transports["TELDRASSIL_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Teldrassil"], BZ["Stormwind City"]) -- 8.0: former boat
transports["TIMELESSISLE_JADEFOREST_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Timeless Isle"], BZ["The Jade Forest"])
transports["TIRAGARDESOUND_EXODAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Boralus"], BZ["The Exodar"])
transports["TIRAGARDESOUND_IRONFORGE_PORTAL"] = string.format(X_Y_PORTAL, BZ["Boralus"], BZ["Ironforge"])
transports["TIRAGARDESOUND_NAZJATAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Boralus"], BZ["Nazjatar"])
transports["TIRAGARDESOUND_SILITHUS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Boralus"], BZ["Silithus"])
transports["TIRAGARDESOUND_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Boralus"], BZ["Stormwind City"])
transports["TIRAGARDESOUND_MECHAGON_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Boralus"], BZ["Mechagon Island"])
transports["TIRISFAL_HOWLINGFJORD_PORTAL"] = string.format(X_Y_PORTAL, BZ["Tirisfal Glades"], BZ["Howling Fjord"]) -- 8.0: former zeppelin
transports["TIRISFAL_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Tirisfal Glades"], BZ["Orgrimmar"]) -- 8.0: former zeppelin
transports["TIRISFAL_STRANGLETHORN_PORTAL"] = string.format(X_Y_PORTAL, BZ["Tirisfal Glades"], BZ["Northern Stranglethorn"]) -- 8.0: former zeppelin
transports["TOLBARAD_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Tol Barad Peninsula"], BZ["Orgrimmar"])
transports["TOLBARAD_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Tol Barad Peninsula"], BZ["Stormwind City"])
transports["TOWNLONGSTEPPES_ISLEOFTHUNDER_PORTAL"] = string.format(X_Y_PORTAL, BZ["Townlong Steppes"], BZ["Isle of Thunder"])
transports["TWILIGHTHIGHLANDS_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Twilight Highlands"], BZ["Orgrimmar"])
transports["TWILIGHTHIGHLANDS_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Twilight Highlands"], BZ["Stormwind City"])
transports["TWOMOONS_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Shrine of Two Moons"], BZ["Orgrimmar"])
transports["UNDERCITY_HELLFIRE_PORTAL"] = string.format(X_Y_PORTAL, BZ["Undercity"], BZ["Hellfire Peninsula"])
transports["VINDICAAR_DALARANBROKENISLES_PORTAL"] = string.format(X_Y_PORTAL, BZ["The Vindicaar"], BZ["Dalaran"].." ("..BZ["Broken Isles"]..")")
transports["WARSPEAR_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Warspear"], BZ["Orgrimmar"])
transports["WARSPEAR_TANAANJUNGLE_PORTAL"] = string.format(X_Y_PORTAL, BZ["Warspear"], BZ["Tanaan Jungle"])
transports["WINTERGRASP_DALARAN_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Wintergrasp"], BZ["Dalaran"])
transports["ZULDAZAR_NAZJATAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Dazar'alor"], BZ["Nazjatar"])
transports["ZULDAZAR_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Dazar'alor"], BZ["Orgrimmar"])
transports["ZULDAZAR_SILVERMOON_PORTAL"] = string.format(X_Y_PORTAL, BZ["Dazar'alor"], BZ["Silvermoon City"])
transports["ZULDAZAR_THUNDERBLUFF_PORTAL"] = string.format(X_Y_PORTAL, BZ["Dazar'alor"], BZ["Thunder Bluff"])
transports["ZULDAZAR_SILITHUS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Dazar'alor"], BZ["Silithus"])
transports["ZULDAZAR_MECHAGON_BOAT"] = string.format(X_Y_BOAT, BZ["Dazar'alor"], BZ["Mechagon Island"])
-- Vashj'ir
transports["IRONFORGE_KELPTHAR_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Ironforge"], BZ["Kelp'thar Forest"])
transports["KELPTHAR_IRONFORGE_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Kelp'thar Forest"], BZ["Ironforge"])
transports["UNDERCITY_KELPTHAR_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Undercity"], BZ["Kelp'thar Forest"])
transports["KELPTHAR_UNDERCITY_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Kelp'thar Forest"], BZ["Undercity"])
transports["SEARINGGORGE_KELPTHAR_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Searing Gorge"], BZ["Kelp'thar Forest"])
transports["KELPTHAR_SEARINGGORGE_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Kelp'thar Forest"], BZ["Searing Gorge"])
-- Shadowlands
transports["ORGRIMMAR_ORIBOS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Oribos"])
transports["ORIBOS_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Oribos"], BZ["Orgrimmar"])
transports["STORMWIND_ORIBOS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Oribos"])
transports["ORIBOS_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Oribos"], BZ["Stormwind City"])
transports["ORIBOS_MAW_PORTAL"] = string.format(X_Y_PORTAL, BZ["Oribos"], BZ["The Maw"])
transports["MAW_ORIBOS_WAYSTONE"] = string.format(X_Y_WAYSTONE, BZ["The Maw"], BZ["Oribos"])
transports["ORIBOS_KORTHIA_WAYSTONE"] = string.format(X_Y_WAYSTONE, BZ["Oribos"], BZ["Korthia"])
transports["KORTHIA_ORIBOS_WAYSTONE"] = string.format(X_Y_WAYSTONE, BZ["Korthia"], BZ["Oribos"])
transports["ORIBOS_BASTION_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Oribos"], BZ["Bastion"])
transports["BASTION_ORIBOS_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Bastion"], BZ["Oribos"])
transports["ORIBOS_MALDRAXXUS_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Oribos"], BZ["Maldraxxus"])
transports["MALDRAXXUS_ORIBOS_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Maldraxxus"], BZ["Oribos"])
transports["ORIBOS_ARDENWEALD_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Oribos"], BZ["Ardenweald"])
transports["ARDENWEALD_ORIBOS_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Ardenweald"], BZ["Oribos"])
transports["ORIBOS_REVENDRETH_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Oribos"], BZ["Revendreth"])
transports["REVENDRETH_ORIBOS_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Revendreth"], BZ["Oribos"])
transports["BASTION_ELYSIANHOLD_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Bastion"], BZ["Elysian Hold"])
transports["ELYSIANHOLD_BASTION_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Elysian Hold"], BZ["Bastion"])
transports["ORIBOS_TAZAVESH_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Oribos"], BZ["Tazavesh, the Veiled Market"])
transports["TAZAVESH_ORIBOS_FLIGHTPATH"] = string.format(X_Y_FLIGHTPATH, BZ["Tazavesh, the Veiled Market"], BZ["Oribos"])
transports["ORIBOS_ZERETHMORTIS_WAYSTONE"] = string.format(X_Y_WAYSTONE, BZ["Oribos"], BZ["Zereth Mortis"])
transports["ZERETHMORTIS_ORIBOS_WAYSTONE"] = string.format(X_Y_WAYSTONE, BZ["Zereth Mortis"], BZ["Oribos"])
-- Oribos 'Exotic Portals'
transports["ORIBOS_MECHANGON_PORTAL"] = string.format(X_Y_PORTAL, BZ["Oribos"], BZ["Mechagon Island"])
transports["ORIBOS_KARAZHAN_PORTAL"] = string.format(X_Y_PORTAL, BZ["Oribos"], BZ["Karazhan"]) -- Deadwind Pass
transports["ORIBOS_GORGROND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Oribos"], BZ["Gorgrond"]) -- Dreanor
-- Argus teleport connections
transports["VINDICAAR_KROKUUN_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["The Vindicaar"], BZ["Krokuun"])
transports["KROKUUN_VINDICAAR_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Krokuun"], BZ["The Vindicaar"])
transports["VINDICAAR_EREDATH_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["The Vindicaar"], BZ["Eredath"])
transports["EREDATH_VINDICAAR_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Eredath"], BZ["The Vindicaar"])
transports["VINDICAAR_ANTORANWASTES_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["The Vindicaar"], BZ["Antoran Wastes"])
transports["ANTORANWASTES_VINDICAAR_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Antoran Wastes"], BZ["The Vindicaar"])
transports["KROKUUN_EREDATH_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Krokuun"], BZ["Eredath"])
transports["EREDATH_KROKUUN_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Eredath"], BZ["Krokuun"])
transports["KROKUUN_ANTORANWASTES_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Krokuun"], BZ["Antoran Wastes"])
transports["ANTORANWASTES_KROKUUN_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Antoran Wastes"], BZ["Krokuun"])
transports["EREDATH_ANTORANWASTES_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Eredath"], BZ["Antoran Wastes"])
transports["ANTORANWASTES_EREDATH_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Antoran Wastes"], BZ["Eredath"])
-- Dragon Flight portals
transports["VALDRAKKEN_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Valdrakken"], BZ["Orgrimmar"])
transports["ORGRIMMAR_VALDRAKKEN_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Valdrakken"])
transports["VALDRAKKEN_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Valdrakken"], BZ["Stormwind City"])
transports["STORMWIND_VALDRAKKEN_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Valdrakken"])
transports["VALDRAKKEN_SHADOWMOONDRAENOR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Valdrakken"], BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")")
transports["VALDRAKKEN_DALARANBROKENISLES_PORTAL"] = string.format(X_Y_PORTAL, BZ["Valdrakken"], BZ["Dalaran"].." ("..BZ["Broken Isles"]..")")
transports["VALDRAKKEN_JADEFOREST_PORTAL"] = string.format(X_Y_PORTAL, BZ["Valdrakken"], BZ["The Jade Forest"])
transports["OHNAHRANPLAINS_EMERALDDREAM_PORTAL"] = string.format(X_Y_PORTAL, BZ["Ohn'ahran Plains"], BZ["Emerald Dream"])
transports["EMERALDDREAM_OHNAHRANPLAINS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Emerald Dream"], BZ["Ohn'ahran Plains"])
-- Amirdrassil (10.2.5)
transports["STORMWIND_AMIRDRASSIL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Amirdrassil"])
transports["AMIRDRASSIL_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Amirdrassil"], BZ["Stormwind City"])
transports["DARKSHORE_AMIRDRASSIL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Darkshore"], BZ["Amirdrassil"])
transports["AMIRDRASSIL_DARKSHORE_PORTAL"] = string.format(X_Y_PORTAL, BZ["Amirdrassil"], BZ["Darkshore"])
transports["MOUNTHYJAL_AMIRDRASSIL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Mount Hyjal"], BZ["Amirdrassil"])
transports["AMIRDRASSIL_MOUNTHYJAL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Amirdrassil"], BZ["Mount Hyjal"])
transports["VALSHARAH_AMIRDRASSIL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Val'sharah"], BZ["Amirdrassil"])
transports["AMIRDRASSIL_VALSHARAH_PORTAL"] = string.format(X_Y_PORTAL, BZ["Amirdrassil"], BZ["Val'sharah"])
transports["FERALAS_AMIRDRASSIL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Feralas"], BZ["Amirdrassil"])
transports["AMIRDRASSIL_FERALAS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Amirdrassil"], BZ["Feralas"])
local zones = {}
-- CONTINENTS ---------------------------------------------------------------
zones[BZ["Azeroth"]] = {
type = "Continent",
-- yards = 44531.82907938571,
yards = 33400.121,
x_offset = 0,
y_offset = 0,
continent = Azeroth,
}
zones[BZ["Eastern Kingdoms"]] = {
type = "Continent",
continent = Eastern_Kingdoms,
expansion = Classic,
}
zones[BZ["Kalimdor"]] = {
type = "Continent",
continent = Kalimdor,
expansion = Classic,
}
zones[BZ["Outland"]] = {
type = "Continent",
continent = Outland,
expansion = The_Burning_Crusade,
}
zones[BZ["Northrend"]] = {
type = "Continent",
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
}
zones[BZ["The Maelstrom"]] = {
type = "Continent",
continent = The_Maelstrom,
expansion = Cataclysm,
}
zones[BZ["Pandaria"]] = {
type = "Continent",
continent = Pandaria,
expansion = Mists_of_Pandaria,
}
zones[BZ["Draenor"]] = {
type = "Continent",
continent = Draenor,
expansion = Warlords_of_Draenor,
}
zones[BZ["Broken Isles"]] = {
type = "Continent",
continent = Broken_Isles,
expansion = Legion,
}
zones[BZ["Argus"]] = {
type = "Continent",
continent = Argus,
expansion = Legion,
}
zones[BZ["Zandalar"]] = {
type = "Continent",
continent = Zandalar,
faction = "Horde",
expansion = Battle_for_Azeroth,
}
zones[BZ["Kul Tiras"]] = {
type = "Continent",
continent = Kul_Tiras,
faction = "Alliance",
expansion = Battle_for_Azeroth,
}
zones[BZ["The Shadowlands"]] = {
type = "Continent",
continent = The_Shadowlands,
expansion = Shadowlands,
}
zones[BZ["Dragon Isles"]] = {
type = "Continent",
continent = Dragon_Isles,
expansion = DragonFlight,
}
-- TRANSPORTS ---------------------------------------------------------------
zones[transports["STORMWIND_BOREANTUNDRA_BOAT"]] = {
paths = {
[BZ["Borean Tundra"]] = true,
},
faction = "Alliance",
type = "Transport",
}
zones[transports["BOREANTUNDRA_STORMWIND_BOAT"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Transport",
}
zones[transports["ORGRIMMAR_BOREANTUNDRA_ZEPPELIN"]] = {
paths = {
[BZ["Borean Tundra"]] = true,
},
faction = "Horde",
type = "Transport",
}
zones[transports["BOREANTUNDRA_ORGRIMMAR_ZEPPELIN"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Transport",
}
zones[transports["STORMWIND_WAKINGSHORES_BOAT"]] = {
paths = {
[BZ["The Waking Shores"]] = true,
},
faction = "Alliance",
type = "Transport",
}
zones[transports["WAKINGSHORES_STORMWIND_BOAT"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Transport",
}
zones[transports["ORGRIMMAR_WAKINGSHORES_ZEPPELIN"]] = {
paths = {
[BZ["The Waking Shores"]] = true,
},
faction = "Horde",
type = "Transport",
}
zones[transports["WAKINGSHORES_ORGRIMMAR_ZEPPELIN"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Transport",
}
zones[transports["TIRISFAL_HOWLINGFJORD_PORTAL"]] = {
paths = {
[BZ["Howling Fjord"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["HOWLINGFJORD_TIRISFAL_PORTAL"]] = {
paths = {
[BZ["Tirisfal Glades"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ORGRIMMAR_SILVERMOON_PORTAL"]] = {
paths = {
[BZ["Silvermoon City"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ORGRIMMAR_SHATTRATH_PORTAL"]] = {
paths = {
[BZ["Silvermoon City"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ORGRIMMAR_DALARAN_PORTAL"]] = {
paths = {
[BZ["Dalaran"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ORGRIMMAR_COT_PORTAL"]] = {
paths = {
[BZ["Caverns of Time"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["COT_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ORGRIMMAR_AZSUNA_PORTAL"]] = {
paths = {
[BZ["Azsuna"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["AZSUNA_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ORGRIMMAR_ZULDAZAR_PORTAL"]] = {
paths = {
[BZ["Dazar'alor"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["HELLFIRE_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["UNDERCITY_HELLFIRE_PORTAL"]] = {
paths = {
[BZ["Hellfire Peninsula"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["STORMWIND_EXODAR_PORTAL"]] = {
paths = {
[BZ["The Exodar"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["STORMWIND_SHATTRATH_PORTAL"]] = {
paths = {
[BZ["Shattrath City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["STORMWIND_DALARAN_PORTAL"]] = {
paths = {
[BZ["Dalaran"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["STORMWIND_COT_PORTAL"]] = {
paths = {
[BZ["Caverns of Time"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["COT_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["STORMWIND_AZSUNA_PORTAL"]] = {
paths = {
[BZ["Azsuna"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["AZSUNA_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["HELLFIRE_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["DALARAN_STORMWIND_PORTAL"]] = {
paths = BZ["Stormwind City"],
faction = "Alliance",
type = "Portal",
}
zones[transports["DALARAN_ICECROWN_FLIGHTPATH"]] = {
paths = BZ["Icecrown"],
type = "Flightpath",
}
zones[transports["ICECROWN_DALARAN_FLIGHTPATH"]] = {
paths = BZ["Dalaran"],
type = "Flightpath",
}
zones[transports["DALARAN_WINTERGRASP_FLIGHTPATH"]] = {
paths = BZ["Wintergrasp"],
type = "Flightpath",
}
zones[transports["WINTERGRASP_DALARAN_FLIGHTPATH"]] = {
paths = BZ["Dalaran"],
type = "Flightpath",
}
zones[transports["DALARAN_ORGRIMMAR_PORTAL"]] = {
paths = BZ["Orgrimmar"],
faction = "Horde",
type = "Portal",
}
zones[transports["DARNASSUS_EXODAR_PORTAL"]] = {
paths = {
[BZ["The Exodar"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["DARNASSUS_HELLFIRE_PORTAL"]] = {
paths = {
[BZ["Hellfire Peninsula"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["EXODAR_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["MULGORE_DARKMOON_PORTAL"]] = {
paths = BZ["Darkmoon Island"],
faction = "Horde",
type = "Portal",
}
zones[transports["DARKMOON_MULGORE_PORTAL"]] = {
paths = BZ["Mulgore"],
faction = "Horde",
type = "Portal",
}
zones[transports["ELWYNNFOREST_DARKMOON_PORTAL"]] = {
paths = BZ["Darkmoon Island"],
faction = "Alliance",
type = "Portal",
}
zones[transports["DARKMOON_ELWYNNFOREST_PORTAL"]] = {
paths = BZ["Elwynn Forest"],
faction = "Alliance",
type = "Portal",
}
zones[transports["STORMWIND_TELDRASSIL_PORTAL"]] = {
paths = {
[BZ["Teldrassil"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["TELDRASSIL_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["DARNASSUS_TELDRASSIL_TELEPORT"]] = {
paths = {
[BZ["Teldrassil"]] = true,
},
type = "Portal",
}
zones[transports["TELDRASSIL_DARNASSUS_TELEPORT"]] = {
paths = {
[BZ["Darnassus"]] = true,
},
type = "Portal",
}
zones[transports["TELDRASSIL_AZUREMYST_PORTAL"]] = {
paths = {
[BZ["Azuremyst Isle"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["AZUREMYST_TELDRASSIL_PORTAL"]] = {
paths = {
[BZ["Teldrassil"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["BOOTYBAY_RATCHET_BOAT"]] = {
paths = {
[BZ["Northern Barrens"]] = true,
},
type = "Transport",
}
zones[transports["RATCHET_BOOTYBAY_BOAT"]] = {
paths = {
[BZ["The Cape of Stranglethorn"]] = true,
},
type = "Transport",
}
zones[transports["MENETHIL_HOWLINGFJORD_BOAT"]] = {
paths = {
[BZ["Howling Fjord"]] = true,
},
faction = "Alliance",
type = "Transport",
}
zones[transports["HOWLINGFJORD_MENETHIL_BOAT"]] = {
paths = {
[BZ["Wetlands"]] = true,
},
faction = "Alliance",
type = "Transport",
}
zones[transports["MENETHIL_THERAMORE_BOAT"]] = {
paths = {
[BZ["Dustwallow Marsh"]] = true,
},
faction = "Alliance",
type = "Transport",
}
zones[transports["THERAMORE_MENETHIL_BOAT"]] = {
paths = {
[BZ["Wetlands"]] = true,
},
faction = "Alliance",
type = "Transport",
}
zones[transports["ORGRIMMAR_STRANGLETHORN_ZEPPELIN"]] = {
paths = {
[BZ["Northern Stranglethorn"]] = true,
},
faction = "Horde",
type = "Transport",
}
zones[transports["STRANGLETHORN_ORGRIMMAR_ZEPPELIN"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Transport",
}
zones[transports["ORGRIMMAR_TIRISFAL_PORTAL"]] = {
paths = {
[BZ["Tirisfal Glades"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["TIRISFAL_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ORGRIMMAR_THUNDERBLUFF_ZEPPELIN"]] = {
paths = {
[BZ["Thunder Bluff"]] = true,
},
faction = "Horde",
type = "Transport",
}
zones[transports["THUNDERBLUFF_ORGRIMMAR_ZEPPELIN"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Transport",
}
zones[transports["EASTERNPLAGUE_QUELDANAS_FLIGHTPATH"]] = {
paths = BZ["Isle of Quel'Danas"],
faction = "Alliance",
type = "Flightpath",
}
zones[transports["QUELDANAS_EASTERNPLAGUE_FLIGHTPATH"]] = {
paths = BZ["Eastern Plaguelands"],
faction = "Alliance",
type = "Flightpath",
}
zones[transports["SILVERMOON_QUELDANAS_FLIGHTPATH"]] = {
paths = BZ["Isle of Quel'Danas"],
faction = "Horde",
type = "Flightpath",
}
zones[transports["QUELDANAS_SILVERMOON_FLIGHTPATH"]] = {
paths = BZ["Silvermoon City"],
faction = "Horde",
type = "Flightpath",
}
zones[transports["SHATTRATH_QUELDANAS_PORTAL"]] = {
paths = BZ["Isle of Quel'Danas"],
type = "Portal",
}
zones[transports["SHATTRATH_ORGRIMMAR_PORTAL"]] = {
paths = BZ["Orgrimmar"],
faction = "Horde",
type = "Portal",
}
zones[transports["SHATTRATH_STORMWIND_PORTAL"]] = {
paths = BZ["Stormwind City"],
faction = "Alliance",
type = "Portal",
}
zones[transports["DRAGONBLIGHT_BOREANTUNDRA_BOAT"]] = {
paths = {
[BZ["Borean Tundra"]] = true,
},
type = "Transport",
}
zones[transports["BOREANTUNDRA_DRAGONBLIGHT_BOAT"]] = {
paths = {
[BZ["Dragonblight"]] = true,
},
type = "Transport",
}
zones[transports["DRAGONBLIGHT_HOWLINGFJORD_BOAT"]] = {
paths = {
[BZ["Howling Fjord"]] = true,
},
type = "Transport",
}
zones[transports["HOWLINGFJORD_DRAGONBLIGHT_BOAT"]] = {
paths = {
[BZ["Dragonblight"]] = true,
},
type = "Transport",
}
zones[BZ["The Dark Portal"]] = {
paths = {
--[BZ["Blasted Lands"]] = true, -- closed
[BZ["Hellfire Peninsula"]] = true, -- past time (Zidormi)
},
type = "Portal",
}
zones[BZ["Deeprun Tram"]] = {
continent = Eastern_Kingdoms,
paths = {
[BZ["Stormwind City"]] = true,
[BZ["Ironforge"]] = true,
},
faction = "Alliance",
type = "Transport",
}
zones[transports["TIRISFAL_STRANGLETHORN_PORTAL"]] = {
paths = {
[BZ["Northern Stranglethorn"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["STRANGLETHORN_TIRISFAL_PORTAL"]] = {
paths = {
[BZ["Tirisfal Glades"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["SILVERMOON_UNDERCITY_TELEPORT"]] = {
paths = {
[BZ["Undercity"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["UNDERCITY_SILVERMOON_TELEPORT"]] = {
paths = {
[BZ["Silvermoon City"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["DALARAN_CRYSTALSONG_TELEPORT"]] = {
paths = {
[BZ["Crystalsong Forest"]] = true,
},
type = "Portal",
}
zones[transports["CRYSTALSONG_DALARAN_TELEPORT"]] = {
paths = {
[BZ["Dalaran"]] = true,
},
type = "Portal",
}
zones[transports["STORMWIND_TWILIGHTHIGHLANDS_PORTAL"]] = {
paths = {
[BZ["Twilight Highlands"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["TWILIGHTHIGHLANDS_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["STORMWIND_MOUNTHYJAL_PORTAL"]] = {
paths = {
[BZ["Mount Hyjal"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["MOUNTHYJAL_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["STORMWIND_DEEPHOLM_PORTAL"]] = {
paths = {
[BZ["Deepholm"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["DEEPHOLM_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["TOLBARAD_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["STORMWIND_ULDUM_PORTAL"]] = {
paths = {
[BZ["Uldum"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["STORMWIND_VASHJIR_PORTAL"]] = {
paths = {
[BZ["Abyssal Depths"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["STORMWIND_TOLBARAD_PORTAL"]] = {
paths = {
[BZ["Tol Barad Peninsula"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["ORGRIMMAR_TWILIGHTHIGHLANDS_PORTAL"]] = {
paths = {
[BZ["Twilight Highlands"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["TWILIGHTHIGHLANDS_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ORGRIMMAR_MOUNTHYJAL_PORTAL"]] = {
paths = {
[BZ["Mount Hyjal"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["MOUNTHYJAL_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ORGRIMMAR_DEEPHOLM_PORTAL"]] = {
paths = {
[BZ["Deepholm"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["DEEPHOLM_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["TOLBARAD_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ORGRIMMAR_ULDUM_PORTAL"]] = {
paths = {
[BZ["Uldum"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ORGRIMMAR_VASHJIR_PORTAL"]] = {
paths = {
[BZ["Abyssal Depths"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ORGRIMMAR_TOLBARAD_PORTAL"]] = {
paths = {
[BZ["Tol Barad Peninsula"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ORGRIMMAR_JADEFOREST_PORTAL"]] = {
paths = {
[BZ["The Jade Forest"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["JADEFOREST_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["STORMWIND_JADEFOREST_PORTAL"]] = {
paths = {
[BZ["The Jade Forest"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["JADEFOREST_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["JADEFOREST_TIMELESSISLE_FLIGHTPATH"]] = {
paths = {
[BZ["Timeless Isle"]] = true,
},
type = "Flightpath",
}
zones[transports["TIMELESSISLE_JADEFOREST_FLIGHTPATH"]] = {
paths = {
[BZ["The Jade Forest"]] = true,
},
type = "Flightpath",
}
zones[transports["KUNLAISUMMIT_ISLEOFGIANTS_FLIGHTPATH"]] = {
paths = {
[BZ["Isle of Giants"]] = true,
},
type = "Flightpath",
}
zones[transports["ISLEOFGIANTS_KUNLAISUMMIT_FLIGHTPATH"]] = {
paths = {
[BZ["Kun-Lai Summit"]] = true,
},
type = "Flightpath",
}
zones[transports["TOWNLONGSTEPPES_ISLEOFTHUNDER_PORTAL"]] = {
paths = {
[BZ["Isle of Thunder"]] = true,
},
type = "Portal",
}
zones[transports["ISLEOFTHUNDER_TOWNLONGSTEPPES_PORTAL"]] = {
paths = {
[BZ["Townlong Steppes"]] = true,
},
type = "Portal",
}
zones[transports["ORGRIMMAR_WARSPEAR_PORTAL"]] = {
paths = {
[BZ["Warspear"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["WARSPEAR_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["WARSPEAR_TANAANJUNGLE_PORTAL"]] = {
paths = {
[BZ["Tanaan Jungle"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["TANAANJUNGLE_WARSPEAR_PORTAL"]] = {
paths = {
[BZ["Warspear"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["STORMWIND_STORMSHIELD_PORTAL"]] = {
paths = {
[BZ["Stormshield"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["STORMSHIELD_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["STORMSHIELD_TANAANJUNGLE_PORTAL"]] = {
paths = {
[BZ["Tanaan Jungle"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["TANAANJUNGLE_STORMSHIELD_PORTAL"]] = {
paths = {
[BZ["Stormshield"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["LUNARFALL_STORMSHIELD_PORTAL"]] = {
paths = {
[BZ["Stormshield"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["FROSTWALL_WARSPEAR_PORTAL"]] = {
paths = {
[BZ["Warspear"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["TWOMOONS_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["SEVENSTARS_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["DALARANBROKENISLES_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["DALARANBROKENISLES_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["DALARANBROKENISLES_VINDICAAR_PORTAL"]] = {
paths = {
[BZ["The Vindicaar"]] = true,
},
type = "Portal",
}
zones[transports["VINDICAAR_DALARANBROKENISLES_PORTAL"]] = {
paths = {
[BZ["Dalaran"].." ("..BZ["Broken Isles"]..")"] = true,
},
type = "Portal",
}
zones[transports["VINDICAAR_KROKUUN_TELEPORT"]] = {
paths = {
[BZ["Krokuun"]] = true,
},
type = "Portal",
}
zones[transports["KROKUUN_VINDICAAR_TELEPORT"]] = {
paths = {
[BZ["The Vindicaar"]] = true,
},
type = "Portal",
}
zones[transports["VINDICAAR_EREDATH_TELEPORT"]] = {
paths = {
[BZ["Eredath"]] = true,
},
type = "Portal",
}
zones[transports["EREDATH_VINDICAAR_TELEPORT"]] = {
paths = {
[BZ["The Vindicaar"]] = true,
},
type = "Portal",
}
zones[transports["VINDICAAR_ANTORANWASTES_TELEPORT"]] = {
paths = {
[BZ["Antoran Wastes"]] = true,
},
type = "Portal",
}
zones[transports["ANTORANWASTES_VINDICAAR_TELEPORT"]] = {
paths = {
[BZ["The Vindicaar"]] = true,
},
type = "Portal",
}
zones[transports["KROKUUN_EREDATH_TELEPORT"]] = {
paths = {
[BZ["Eredath"]] = true,
},
type = "Portal",
}
zones[transports["EREDATH_KROKUUN_TELEPORT"]] = {
paths = {
[BZ["Krokuun"]] = true,
},
type = "Portal",
}
zones[transports["KROKUUN_ANTORANWASTES_TELEPORT"]] = {
paths = {
[BZ["Antoran Wastes"]] = true,
},
type = "Portal",
}
zones[transports["ANTORANWASTES_KROKUUN_TELEPORT"]] = {
paths = {
[BZ["Krokuun"]] = true,
},
type = "Portal",
}
zones[transports["EREDATH_ANTORANWASTES_TELEPORT"]] = {
paths = {
[BZ["Antoran Wastes"]] = true,
},
type = "Portal",
}
zones[transports["ANTORANWASTES_EREDATH_TELEPORT"]] = {
paths = {
[BZ["Eredath"]] = true,
},
type = "Portal",
}
zones[transports["DALARANBROKENISLES_BROKENSHORE_FLIGHTPATH"]] = {
paths = {
[BZ["Broken Shore"]] = true,
},
type = "Flightpath",
}
zones[transports["BROKENSHORE_DALARANBROKENISLES_FLIGHTPATH"]] = {
paths = {
[BZ["Dalaran"].." ("..BZ["Broken Isles"]..")"] = true,
},
type = "Flightpath",
}
zones[transports["DALARANBROKENISLES_AZSUNA_FLIGHTPATH"]] = {
paths = {
[BZ["Azsuna"]] = true,
},
type = "Flightpath",
}
zones[transports["AZSUNA_DALARANBROKENISLES_FLIGHTPATH"]] = {
paths = {
[BZ["Dalaran"].." ("..BZ["Broken Isles"]..")"] = true,
},
type = "Flightpath",
}
zones[transports["ECHOISLES_ZULDAZAR_BOAT"]] = {
paths = {
[BZ["Zuldazar"]] = true,
},
faction = "Horde",
type = "Transport",
}
zones[transports["ZULDAZAR_ECHOISLES_BOAT"]] = {
paths = {
[BZ["Echo Isles"]] = true,
},
faction = "Horde",
type = "Transport",
}
zones[transports["STORMWIND_TIRAGARDESOUND_BOAT"]] = {
paths = {
[BZ["Tiragarde Sound"]] = true,
},
faction = "Alliance",
type = "Transport",
}
zones[transports["TIRAGARDESOUND_STORMWIND_BOAT"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Transport",
}
zones[transports["STORMWIND_TIRAGARDESOUND_PORTAL"]] = {
paths = {
[BZ["Boralus"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["TIRAGARDESOUND_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["TIRAGARDESOUND_EXODAR_PORTAL"]] = {
paths = {
[BZ["The Exodar"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["TIRAGARDESOUND_IRONFORGE_PORTAL"]] = {
paths = {
[BZ["Ironforge"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["TIRAGARDESOUND_SILITHUS_PORTAL"]] = {
paths = {
[BZ["Silithus"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["SILITHUS_TIRAGARDESOUND_PORTAL"]] = {
paths = {
[BZ["Boralus"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["TIRAGARDESOUND_NAZJATAR_PORTAL"]] = {
paths = {
[BZ["Nazjatar"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["NAZJATAR_TIRAGARDESOUND_PORTAL"]] = {
paths = {
[BZ["Boralus"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["SILVERMOON_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ZULDAZAR_SILVERMOON_PORTAL"]] = {
paths = {
[BZ["Silvermoon City"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ZULDAZAR_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ZULDAZAR_THUNDERBLUFF_PORTAL"]] = {
paths = {
[BZ["Thunder Bluff"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ZULDAZAR_SILITHUS_PORTAL"]] = {
paths = {
[BZ["Silithus"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["SILITHUS_ZULDAZAR_PORTAL"]] = {
paths = {
[BZ["Dazar'alor"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ZULDAZAR_MECHAGON_BOAT"]] = {
paths = {
[BZ["Mechagon Island"]] = true,
},
faction = "Horde",
type = "Portal", -- is a boat, works like a portal
}
zones[transports["MECHAGON_ZULDAZAR_BOAT"]] = {
paths = {
[BZ["Dazar'alor"]] = true,
},
faction = "Horde",
type = "Portal", -- is a boat, works like a portal
}
zones[transports["MECHAGON_TIRAGARDESOUND_FLIGHTPATH"]] = {
paths = {
[BZ["Boralus"]] = true,
},
faction = "Alliance",
type = "Flightpath",
}
zones[transports["TIRAGARDESOUND_MECHAGON_FLIGHTPATH"]] = {
paths = {
[BZ["Mechagon Island"]] = true,
},
faction = "Alliance",
type = "Flightpath",
}
zones[transports["MOUNTHYJAL_MOLTENFRONT_PORTAL"]] = {
paths = {
[BZ["Molten Front"]] = true,
},
type = "Portal",
}
zones[transports["MOLTENFRONT_MOUNTHYJAL_PORTAL"]] = {
paths = {
[BZ["Mount Hyjal"]] = true,
},
type = "Portal",
}
-- Patch 8.2.0
zones[transports["ZULDAZAR_NAZJATAR_PORTAL"]] = {
paths = {
[BZ["Nazjatar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["NAZJATAR_ZULDAZAR_PORTAL"]] = {
paths = {
[BZ["Dazar'alor"]] = true,
},
faction = "Horde",
type = "Portal",
}
-- Shadowlands
zones[transports["ORGRIMMAR_ORIBOS_PORTAL"]] = {
paths = {
[BZ["Oribos"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["ORIBOS_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["STORMWIND_ORIBOS_PORTAL"]] = {
paths = {
[BZ["Oribos"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["ORIBOS_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["ORIBOS_MECHANGON_PORTAL"]] = {
paths = {
[BZ["Mechagon Island"]] = true,
},
type = "Portal",
}
zones[transports["ORIBOS_KARAZHAN_PORTAL"]] = {
paths = {
[BZ["Karazhan"]] = true,
},
type = "Portal",
}
zones[transports["ORIBOS_GORGROND_PORTAL"]] = {
paths = {
[BZ["Gorgrond"]] = true,
},
type = "Portal",
}
zones[transports["ORIBOS_MAW_PORTAL"]] = {
paths = {
[BZ["The Maw"]] = true,
},
type = "Portal",
}
zones[transports["MAW_ORIBOS_WAYSTONE"]] = {
paths = {
[BZ["Oribos"]] = true,
},
type = "Portal",
}
zones[transports["ORIBOS_KORTHIA_WAYSTONE"]] = {
paths = {
[BZ["Korthia"]] = true,
},
type = "Portal",
}
zones[transports["KORTHIA_ORIBOS_WAYSTONE"]] = {
paths = {
[BZ["Oribos"]] = true,
},
type = "Portal",
}
zones[transports["ORIBOS_BASTION_FLIGHTPATH"]] = {
paths = {
[BZ["Bastion"]] = true,
},
type = "Flightpath",
}
zones[transports["BASTION_ORIBOS_FLIGHTPATH"]] = {
paths = {
[BZ["Oribos"]] = true,
},
type = "Flightpath",
}
zones[transports["BASTION_ELYSIANHOLD_FLIGHTPATH"]] = {
paths = {
[BZ["Elysian Hold"]] = true,
},
type = "Flightpath",
}
zones[transports["ELYSIANHOLD_BASTION_FLIGHTPATH"]] = {
paths = {
[BZ["Bastion"]] = true,
},
type = "Flightpath",
}
zones[transports["ORIBOS_MALDRAXXUS_FLIGHTPATH"]] = {
paths = {
[BZ["Maldraxxus"]] = true,
},
type = "Flightpath",
}
zones[transports["MALDRAXXUS_ORIBOS_FLIGHTPATH"]] = {
paths = {
[BZ["Oribos"]] = true,
},
type = "Flightpath",
}
zones[transports["ORIBOS_ARDENWEALD_FLIGHTPATH"]] = {
paths = {
[BZ["Ardenweald"]] = true,
},
type = "Flightpath",
}
zones[transports["ARDENWEALD_ORIBOS_FLIGHTPATH"]] = {
paths = {
[BZ["Oribos"]] = true,
},
type = "Flightpath",
}
zones[transports["ORIBOS_REVENDRETH_FLIGHTPATH"]] = {
paths = {
[BZ["Revendreth"]] = true,
},
type = "Flightpath",
}
zones[transports["REVENDRETH_ORIBOS_FLIGHTPATH"]] = {
paths = {
[BZ["Oribos"]] = true,
},
type = "Flightpath",
}
zones[transports["ORIBOS_TAZAVESH_FLIGHTPATH"]] = {
paths = {
[BZ["Tazavesh, the Veiled Market"]] = true,
},
type = "Flightpath",
}
zones[transports["TAZAVESH_ORIBOS_FLIGHTPATH"]] = {
paths = {
[BZ["Oribos"]] = true,
},
type = "Flightpath",
}
zones[transports["ORIBOS_ZERETHMORTIS_WAYSTONE"]] = {
paths = {
[BZ["Zereth Mortis"]] = true,
},
type = "Portal",
}
zones[transports["ZERETHMORTIS_ORIBOS_WAYSTONE"]] = {
paths = {
[BZ["Oribos"]] = true,
},
type = "Portal",
}
zones[transports["IRONFORGE_KELPTHAR_FLIGHTPATH"]] = {
paths = {
[BZ["Kelp'thar Forest"]] = true,
},
faction = "Alliance",
type = "Flightpath",
}
zones[transports["KELPTHAR_IRONFORGE_FLIGHTPATH"]] = {
paths = {
[BZ["Ironforge"]] = true,
},
faction = "Alliance",
type = "Flightpath",
}
zones[transports["UNDERCITY_KELPTHAR_FLIGHTPATH"]] = {
paths = {
[BZ["Kelp'thar Forest"]] = true,
},
faction = "Horde",
type = "Flightpath",
}
zones[transports["KELPTHAR_UNDERCITY_FLIGHTPATH"]] = {
paths = {
[BZ["Undercity"]] = true,
},
faction = "Horde",
type = "Flightpath",
}
zones[transports["SEARINGGORGE_KELPTHAR_FLIGHTPATH"]] = {
paths = {
[BZ["Kelp'thar Forest"]] = true,
},
faction = "Horde",
type = "Flightpath",
}
zones[transports["KELPTHAR_SEARINGGORGE_FLIGHTPATH"]] = {
paths = {
[BZ["Searing Gorge"]] = true,
},
faction = "Horde",
type = "Flightpath",
}
-- Dragon Isles
zones[transports["ORGRIMMAR_VALDRAKKEN_PORTAL"]] = {
paths = {
[BZ["Valdrakken"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["VALDRAKKEN_ORGRIMMAR_PORTAL"]] = {
paths = {
[BZ["Orgrimmar"]] = true,
},
faction = "Horde",
type = "Portal",
}
zones[transports["STORMWIND_VALDRAKKEN_PORTAL"]] = {
paths = {
[BZ["Valdrakken"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["VALDRAKKEN_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["VALDRAKKEN_SHADOWMOONDRAENOR_PORTAL"]] = {
paths = {
[BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")"] = true,
},
type = "Portal",
}
zones[transports["VALDRAKKEN_DALARANBROKENISLES_PORTAL"]] = {
paths = {
[BZ["Dalaran"].." ("..BZ["Broken Isles"]..")"] = true,
},
type = "Portal",
}
zones[transports["VALDRAKKEN_JADEFOREST_PORTAL"]] = {
paths = {
[BZ["The Jade Forest"]] = true,
},
type = "Portal",
}
zones[transports["OHNAHRANPLAINS_EMERALDDREAM_PORTAL"]] = {
paths = {
[BZ["Emerald Dream"]] = true,
},
type = "Portal",
}
zones[transports["EMERALDDREAM_OHNAHRANPLAINS_PORTAL"]] = {
paths = {
[BZ["Ohn'ahran Plains"]] = true,
},
type = "Portal",
}
zones[transports["STORMWIND_AMIRDRASSIL_PORTAL"]] = {
paths = {
[BZ["Amirdrassil"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["AMIRDRASSIL_STORMWIND_PORTAL"]] = {
paths = {
[BZ["Stormwind City"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["DARKSHORE_AMIRDRASSIL_PORTAL"]] = {
paths = {
[BZ["Amirdrassil"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["AMIRDRASSIL_DARKSHORE_PORTAL"]] = {
paths = {
[BZ["Darkshore"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["MOUNTHYJAL_AMIRDRASSIL_PORTAL"]] = {
paths = {
[BZ["Amirdrassil"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["AMIRDRASSIL_MOUNTHYJAL_PORTAL"]] = {
paths = {
[BZ["Mount Hyjal"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["VALSHARAH_AMIRDRASSIL_PORTAL"]] = {
paths = {
[BZ["Amirdrassil"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["AMIRDRASSIL_VALSHARAH_PORTAL"]] = {
paths = {
[BZ["Val'sharah"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["FERALAS_AMIRDRASSIL_PORTAL"]] = {
paths = {
[BZ["Amirdrassil"]] = true,
},
faction = "Alliance",
type = "Portal",
}
zones[transports["AMIRDRASSIL_FERALAS_PORTAL"]] = {
paths = {
[BZ["Feralas"]] = true,
},
faction = "Alliance",
type = "Portal",
}
-- ZONES, INSTANCES AND COMPLEXES ---------------------------------------------------------
-- ===============ZONES=================
-- Eastern Kingdoms cities and zones --
zones[BZ["Stormwind City"]] = {
continent = Eastern_Kingdoms,
expansion = Classic,
instances = {
[BZ["The Stockade"]] = true,
-- [BZ["Bizmo's Brawlpub"]] = true,
},
paths = {
[BZ["Deeprun Tram"]] = true,
[BZ["The Stockade"]] = true,
[BZ["Elwynn Forest"]] = true,
[transports["STORMWIND_TELDRASSIL_PORTAL"]] = true,
[transports["STORMWIND_BOREANTUNDRA_BOAT"]] = true,
[transports["STORMWIND_TWILIGHTHIGHLANDS_PORTAL"]] = true,
[transports["STORMWIND_MOUNTHYJAL_PORTAL"]] = true,
[transports["STORMWIND_DEEPHOLM_PORTAL"]] = true,
[transports["STORMWIND_ULDUM_PORTAL"]] = true,
[transports["STORMWIND_VASHJIR_PORTAL"]] = true,
[transports["STORMWIND_TOLBARAD_PORTAL"]] = true,
[transports["STORMWIND_JADEFOREST_PORTAL"]] = true,
[transports["STORMWIND_TIRAGARDESOUND_BOAT"]] = true,
[transports["STORMWIND_TIRAGARDESOUND_PORTAL"]] = true,
[transports["STORMWIND_STORMSHIELD_PORTAL"]] = true,
[transports["STORMWIND_EXODAR_PORTAL"]] = true,
[transports["STORMWIND_SHATTRATH_PORTAL"]] = true,
[transports["STORMWIND_DALARAN_PORTAL"]] = true,
[transports["STORMWIND_COT_PORTAL"]] = true,
[transports["STORMWIND_AZSUNA_PORTAL"]] = true,
[transports["STORMWIND_ORIBOS_PORTAL"]] = true,
[transports["STORMWIND_VALDRAKKEN_PORTAL"]] = true,
[transports["STORMWIND_WAKINGSHORES_BOAT"]] = true,
[transports["STORMWIND_AMIRDRASSIL_PORTAL"]] = true,
},
flightnodes = {
[2] = true, -- Stormwind, Elwynn (A)
},
faction = "Alliance",
type = "City",
}
zones[BZ["Undercity"]] = {
continent = Eastern_Kingdoms,
expansion = Classic,
instances = BZ["Ruins of Lordaeron"],
paths = {
[BZ["Tirisfal Glades"]] = true,
[transports["UNDERCITY_SILVERMOON_TELEPORT"]] = true,
[transports["UNDERCITY_HELLFIRE_PORTAL"]] = true,
[transports["UNDERCITY_KELPTHAR_FLIGHTPATH"]] = true,
[BZ["Ruins of Lordaeron"]] = true,
},
flightnodes = {
[11] = true, -- Undercity, Tirisfal (H)
},
faction = "Horde",
type = "City",
}
zones[BZ["Ironforge"]] = {
continent = Eastern_Kingdoms,
expansion = Classic,
instances = BZ["Gnomeregan"],
paths = {
[BZ["Dun Morogh"]] = true,
[BZ["Deeprun Tram"]] = true,
[transports["IRONFORGE_KELPTHAR_FLIGHTPATH"]] = true,
},
flightnodes = {
[6] = true, -- Ironforge, Dun Morogh (A)
},
faction = "Alliance",
type = "City",
}
zones[BZ["Silvermoon City"]] = {
continent = Eastern_Kingdoms,
expansion = The_Burning_Crusade,
paths = {
[BZ["Eversong Woods"]] = true,
[transports["SILVERMOON_UNDERCITY_TELEPORT"]] = true,
[transports["SILVERMOON_ORGRIMMAR_PORTAL"]] = true,
[transports["SILVERMOON_QUELDANAS_FLIGHTPATH"]] = true,
},
flightnodes = {
[82] = true, -- Silvermoon City (H)
},
faction = "Horde",
type = "City",
}
-- Human starting zone
zones[BZ["Northshire"]] = {
low = 1,
high = 30,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = {
[BZ["Elwynn Forest"]] = true,
},
faction = "Alliance",
}
-- Blood Elf starting zone
zones[BZ["Sunstrider Isle"]] = {
low = 1,
high = 30,
continent = Eastern_Kingdoms,
expansion = The_Burning_Crusade,
paths = {
[BZ["Eversong Woods"]] = true,
},
faction = "Horde",
}
-- Undead starting zone
zones[BZ["Deathknell"]] = {
low = 1,
high = 30,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = {
[BZ["Tirisfal Glades"]] = true,
},
faction = "Horde",
}
-- Dwarven starting zone
zones[BZ["Coldridge Valley"]] = {
low = 1,
high = 10,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = {
[BZ["Dun Morogh"]] = true,
},
faction = "Alliance",
}
-- Gnome starting zone
zones[BZ["New Tinkertown"]] = {
low = 1,
high = 30,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = {
[BZ["Dun Morogh"]] = true,
},
faction = "Alliance",
}
zones[BZ["Dun Morogh"]] = {
low = 1,
high = 30,
ct_low = 1,
continent = Eastern_Kingdoms,
expansion = Classic,
instances = BZ["Gnomeregan"],
paths = {
[BZ["Wetlands"]] = true,
[BZ["Gnomeregan"]] = true,
[BZ["Ironforge"]] = true,
[BZ["Loch Modan"]] = true,
[BZ["Coldridge Valley"]] = true,
[BZ["New Tinkertown"]] = true,
},
flightnodes = {
[620] = true, -- Gol'Bolar Quarry, Dun Morogh (A)
[619] = true, -- Kharanos, Dun Morogh (A)
[6] = true, -- Ironforge, Dun Morogh (A)
},
faction = "Alliance",
}
zones[BZ["Elwynn Forest"]] = {
low = 1,
high = 30,
ct_low = 1,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = {
[BZ["Northshire"]] = true,
[BZ["Westfall"]] = true,
[BZ["Redridge Mountains"]] = true,
[BZ["Stormwind City"]] = true,
[BZ["Duskwood"]] = true,
[BZ["Burning Steppes"]] = true,
[transports["ELWYNNFOREST_DARKMOON_PORTAL"]] = true,
},
flightnodes = {
[2] = true, -- Stormwind, Elwynn (A)
[582] = true, -- Goldshire, Elwynn (A)
[589] = true, -- Eastvale Logging Camp, Elwynn (A)
},
faction = "Alliance",
}
zones[BZ["Eversong Woods"]] = {
low = 1,
high = 30,
ct_low = 1,
continent = Eastern_Kingdoms,
expansion = The_Burning_Crusade,
paths = {
[BZ["Silvermoon City"]] = true,
[BZ["Ghostlands"]] = true,
[BZ["Sunstrider Isle"]] = true,
},
flightnodes = {
[82] = true, -- Silvermoon City (H)
[631] = true, -- Falconwing Square, Eversong Woods (H)
[625] = true, -- Fairbreeze Village, Eversong Woods (H)
},
faction = "Horde",
}
-- Worgen starting zone
zones[BZ["Gilneas"]] = {
low = 1,
high = 20,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = {}, -- phased instance
faction = "Alliance",
}
zones[BZ["Gilneas City"]] = {
low = 1,
high = 20,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = {}, -- phased instance
faction = "Alliance",
}
zones[BZ["Ruins of Gilneas"]] = {
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = {
[BZ["Silverpine Forest"]] = true,
[BZ["Ruins of Gilneas City"]] = true,
},
flightnodes = {
[646] = true, -- Forsaken Forward Command, Gilneas (H)
},
}
zones[BZ["Ruins of Gilneas City"]] = {
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = {
[BZ["Silverpine Forest"]] = true,
[BZ["Ruins of Gilneas"]] = true,
},
}
zones[BZ["Tirisfal Glades"]] = {
low = 1,
high = 30,
ct_low = 1,
continent = Eastern_Kingdoms,
expansion = Classic,
instances = {
[BZ["Scarlet Monastery"]] = true,
[BZ["Scarlet Halls"]] = true,
},
paths = {
[BZ["Western Plaguelands"]] = true,
[BZ["Undercity"]] = true,
[BZ["Scarlet Monastery"]] = true,
[BZ["Scarlet Halls"]] = true,
[transports["TIRISFAL_STRANGLETHORN_PORTAL"]] = true,
[transports["TIRISFAL_ORGRIMMAR_PORTAL"]] = true,
[transports["TIRISFAL_HOWLINGFJORD_PORTAL"]] = true,
[BZ["Silverpine Forest"]] = true,
[BZ["Deathknell"]] = true,
},
flightnodes = {
[11] = true, -- Undercity, Tirisfal (H)
[384] = true, -- The Bulwark, Tirisfal (H)
[460] = true, -- Brill, Tirisfal Glades (H)
},
-- complexes = {
-- [BZ["Scarlet Monastery"]] = true, -- Duplicate name with instance (thanks, Blizz)
-- },
faction = "Horde",
}
zones[BZ["Westfall"]] = {
low = 5,
high = 30,
ct_low = 5,
continent = Eastern_Kingdoms,
expansion = Classic,
instances = BZ["The Deadmines"],
paths = {
[BZ["Duskwood"]] = true,
[BZ["Elwynn Forest"]] = true,
[BZ["The Deadmines"]] = true,
},
flightnodes = {
[584] = true, -- Furlbrow's Pumpkin Farm, Westfall (A)
[583] = true, -- Moonbrook, Westfall (A)
[4] = true, -- Sentinel Hill, Westfall (A)
},
faction = "Alliance",
}
zones[BZ["Ghostlands"]] = {
low = 1,
high = 30,
ct_low = 1,
continent = Eastern_Kingdoms,
expansion = The_Burning_Crusade,
instances = BZ["Zul'Aman"],
paths = {
[BZ["Eastern Plaguelands"]] = true,
[BZ["Zul'Aman"]] = true,
[BZ["Eversong Woods"]] = true,
},
flightnodes = {
[83] = true, -- Tranquillien, Ghostlands (H)
[205] = true, -- Zul'Aman, Ghostlands (N)
},
faction = "Horde",
}
zones[BZ["Loch Modan"]] = {
low = 5,
high = 30,
ct_low = 5,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = {
[BZ["Wetlands"]] = true,
[BZ["Badlands"]] = true,
[BZ["Dun Morogh"]] = true,
[BZ["Searing Gorge"]] = not isHorde and true or nil,
},
flightnodes = {
[555] = true, -- Farstrider Lodge, Loch Modan (A)
[8] = true, -- Thelsamar, Loch Modan (A)
},
faction = "Alliance",
}
zones[BZ["Silverpine Forest"]] = {
low = 5,
high = 30,
ct_low = 5,
continent = Eastern_Kingdoms,
expansion = Classic,
instances = BZ["Shadowfang Keep"],
paths = {
[BZ["Tirisfal Glades"]] = true,
[BZ["Hillsbrad Foothills"]] = true,
[BZ["Shadowfang Keep"]] = true,
[BZ["Ruins of Gilneas"]] = true,
},
flightnodes = {
[654] = true, -- The Forsaken Front, Silverpine Forest (H)
[10] = true, -- The Sepulcher, Silverpine Forest (H)
[645] = true, -- Forsaken High Command, Silverpine Forest (H)
[681] = true, -- Forsaken Rear Guard, Silverpine Forest (H)
},
faction = "Horde",
}
zones[BZ["Redridge Mountains"]] = {
low = 7,
high = 30,
ct_low = 7,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = {
[BZ["Burning Steppes"]] = true,
[BZ["Elwynn Forest"]] = true,
[BZ["Duskwood"]] = true,
[BZ["Swamp of Sorrows"]] = true,
},
flightnodes = {
[596] = true, -- Shalewind Canyon, Redridge (A)
[615] = true, -- Camp Everstill, Redridge (A)
[5] = true, -- Lakeshire, Redridge (A)
},
}
zones[BZ["Duskwood"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = {
[BZ["Redridge Mountains"]] = true,
[BZ["Northern Stranglethorn"]] = true,
[BZ["Westfall"]] = true,
[BZ["Deadwind Pass"]] = true,
[BZ["Elwynn Forest"]] = true,
},
flightnodes = {
[622] = true, -- Raven Hill, Duskwood (A)
[12] = true, -- Darkshire, Duskwood (A)
},
}
zones[BZ["Hillsbrad Foothills"]] = {
low = 7,
high = 30,
ct_low = 7,
continent = Eastern_Kingdoms,
expansion = Classic,
instances = BZ["Alterac Valley"],
paths = {
[BZ["Alterac Valley"]] = true,
[BZ["The Hinterlands"]] = true,
[BZ["Arathi Highlands"]] = true,
[BZ["Silverpine Forest"]] = true,
[BZ["Western Plaguelands"]] = true,
},
flightnodes = {
[670] = true, -- Strahnbrad, Alterac Mountains (H)
[13] = true, -- Tarren Mill, Hillsbrad (H)
[667] = true, -- Ruins of Southshore, Hillsbrad (H)
[669] = true, -- Eastpoint Tower, Hillsbrad (H)
[668] = true, -- Southpoint Gate, Hillsbrad (H)
},
faction = "Horde",
}
zones[BZ["Wetlands"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = {
[BZ["Arathi Highlands"]] = true,
[transports["MENETHIL_THERAMORE_BOAT"]] = true,
[transports["MENETHIL_HOWLINGFJORD_BOAT"]] = true,
[BZ["Dun Morogh"]] = true,
[BZ["Loch Modan"]] = true,
},
flightnodes = {
[551] = true, -- Whelgar's Retreat, Wetlands (A)
[553] = true, -- Dun Modr, Wetlands (A)
[552] = true, -- Greenwarden's Grove, Wetlands (A)
[554] = true, -- Slabchisel's Survey, Wetlands (A)
[7] = true, -- Menethil Harbor, Wetlands (A)
},
}
zones[BZ["Arathi Highlands"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Eastern_Kingdoms,
expansion = Classic,
instances = BZ["Arathi Basin"],
paths = {
[BZ["Wetlands"]] = true,
[BZ["Hillsbrad Foothills"]] = true,
[BZ["Arathi Basin"]] = true,
[BZ["The Hinterlands"]] = true,
},
flightnodes = {
[601] = true, -- Galen's Fall, Arathi (H)
[17] = true, -- Hammerfall, Arathi (H)
[16] = true, -- Refuge Pointe, Arathi (A)
},
}
zones[BZ["Stranglethorn Vale"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Eastern_Kingdoms,
expansion = Classic,
instances = BZ["Zul'Gurub"],
paths = {
[BZ["Duskwood"]] = true,
[BZ["Zul'Gurub"]] = true,
[transports["STRANGLETHORN_ORGRIMMAR_ZEPPELIN"]] = true,
[transports["STRANGLETHORN_TIRISFAL_PORTAL"]] = true,
[transports["BOOTYBAY_RATCHET_BOAT"]] = true,
},
flightnodes = {
[593] = true, -- Bambala, Stranglethorn (H)
[18] = true, -- Booty Bay, Stranglethorn (H)
[19] = true, -- Booty Bay, Stranglethorn (A)
[590] = true, -- Fort Livingston, Stranglethorn (A)
[592] = true, -- Hardwrench Hideaway, Stranglethorn (H)
[195] = true, -- Rebel Camp, Stranglethorn Vale (A)
[591] = true, -- Explorers' League Digsite, Stranglethorn (A)
[20] = true, -- Grom'gol, Stranglethorn (H)
},
}
zones[BZ["Northern Stranglethorn"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Eastern_Kingdoms,
expansion = Classic,
instances = BZ["Zul'Gurub"],
paths = {
[BZ["The Cape of Stranglethorn"]] = true,
[BZ["Duskwood"]] = true,
[BZ["Zul'Gurub"]] = true,
[transports["STRANGLETHORN_ORGRIMMAR_ZEPPELIN"]] = true,
[transports["TIRISFAL_STRANGLETHORN_PORTAL"]] = true,
},
flightnodes = {
[593] = true, -- Bambala, Stranglethorn (H)
[590] = true, -- Fort Livingston, Stranglethorn (A)
[195] = true, -- Rebel Camp, Stranglethorn Vale (A)
[20] = true, -- Grom'gol, Stranglethorn (H)
},
}
zones[BZ["The Cape of Stranglethorn"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = {
[transports["BOOTYBAY_RATCHET_BOAT"]] = true,
[BZ["Northern Stranglethorn"]] = true,
},
flightnodes = {
[18] = true, -- Booty Bay, Stranglethorn (H)
[19] = true, -- Booty Bay, Stranglethorn (A)
[592] = true, -- Hardwrench Hideaway, Stranglethorn (H)
[591] = true, -- Explorers' League Digsite, Stranglethorn (A)
},
}
zones[BZ["The Hinterlands"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = {
[BZ["Hillsbrad Foothills"]] = true,
[BZ["Western Plaguelands"]] = true,
[BZ["Arathi Highlands"]] = true,
},
flightnodes = {
[617] = true, -- Hiri'watha Research Station, The Hinterlands (H)
[43] = true, -- Aerie Peak, The Hinterlands (A)
[618] = true, -- Stormfeather Outpost, The Hinterlands (A)
[76] = true, -- Revantusk Village, The Hinterlands (H)
},
}
zones[BZ["Western Plaguelands"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Eastern_Kingdoms,
expansion = Classic,
instances = BZ["Scholomance"],
paths = {
[BZ["The Hinterlands"]] = true,
[BZ["Eastern Plaguelands"]] = true,
[BZ["Tirisfal Glades"]] = true,
[BZ["Scholomance"]] = true,
[BZ["Hillsbrad Foothills"]] = true,
},
flightnodes = {
[649] = true, -- Andorhal, Western Plaguelands (H)
[651] = true, -- The Menders' Stead, Western Plaguelands (N)
[650] = true, -- Andorhal, Western Plaguelands (A)
[66] = true, -- Chillwind Camp, Western Plaguelands (A)
[672] = true, -- Hearthglen, Western Plaguelands (N)
},
}
zones[BZ["Eastern Plaguelands"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Eastern_Kingdoms,
expansion = Classic,
instances = BZ["Stratholme"],
paths = {
[BZ["Western Plaguelands"]] = true,
[BZ["Stratholme"]] = true,
[BZ["Ghostlands"]] = true,
[transports["EASTERNPLAGUE_QUELDANAS_FLIGHTPATH"]] = true,
},
flightnodes = {
[383] = true, -- Thondroril River, Eastern Plaguelands (N)
[1862] = true, -- Acherus: The Ebon Hold (N)
[67] = true, -- Light's Hope Chapel, Eastern Plaguelands (A)
[86] = true, -- Eastwall Tower, Eastern Plaguelands (N)
[68] = true, -- Light's Hope Chapel, Eastern Plaguelands (H)
[630] = true, -- Light's Shield Tower, Eastern Plaguelands (N)
[85] = true, -- Northpass Tower, Eastern Plaguelands (N)
[87] = true, -- Crown Guard Tower, Eastern Plaguelands (N)
[84] = true, -- Plaguewood Tower, Eastern Plaguelands (N)
[315] = true, -- Acherus: The Ebon Hold (N)
},
type = "PvP Zone",
}
zones[BZ["Badlands"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Eastern_Kingdoms,
expansion = Classic,
instances = {
[BZ["Uldaman"]] = true,
[BZ["Uldaman: Legacy of Tyr"]] = true,
},
paths = {
[BZ["Uldaman"]] = true,
[BZ["Uldaman: Legacy of Tyr"]] = true,
[BZ["Searing Gorge"]] = true,
[BZ["Loch Modan"]] = true,
},
flightnodes = {
[635] = true, -- Fuselight, Badlands (N)
[632] = true, -- Bloodwatcher Point, Badlands (H)
[634] = true, -- Dragon's Mouth, Badlands (A)
[633] = true, -- Dustwind Dig, Badlands (A)
[21] = true, -- New Kargath, Badlands (H)
},
}
zones[BZ["Searing Gorge"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Eastern_Kingdoms,
expansion = Classic,
instances = {
[BZ["Blackrock Depths"]] = true,
[BZ["Blackrock Caverns"]] = true,
[BZ["Blackwing Lair"]] = true,
[BZ["Blackwing Descent"]] = true,
[BZ["Molten Core"]] = true,
[BZ["Blackrock Spire"]] = true,
[BZ["Upper Blackrock Spire"]] = true,
},
paths = {
[BZ["Blackrock Mountain"]] = true,
[BZ["Badlands"]] = true,
[BZ["Loch Modan"]] = not isHorde and true or nil,
[transports["SEARINGGORGE_KELPTHAR_FLIGHTPATH"]] = true,
},
flightnodes = {
[673] = true, -- Iron Summit, Searing Gorge (N)
[75] = true, -- Thorium Point, Searing Gorge (H)
[74] = true, -- Thorium Point, Searing Gorge (A)
},
complexes = {
[BZ["Blackrock Mountain"]] = true,
},
}
zones[BZ["Burning Steppes"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Eastern_Kingdoms,
expansion = Classic,
instances = {
[BZ["Blackrock Depths"]] = true,
[BZ["Blackrock Caverns"]] = true,
[BZ["Blackwing Lair"]] = true,
[BZ["Blackwing Descent"]] = true,
[BZ["Molten Core"]] = true,
[BZ["Blackrock Spire"]] = true,
[BZ["Upper Blackrock Spire"]] = true,
},
paths = {
[BZ["Blackrock Mountain"]] = true,
[BZ["Redridge Mountains"]] = true,
[BZ["Elwynn Forest"]] = true,
},
flightnodes = {
[70] = true, -- Flame Crest, Burning Steppes (H)
[676] = true, -- Chiselgrip, Burning Steppes (N)
[675] = true, -- Flamestar Post, Burning Steppes (N)
[71] = true, -- Morgan's Vigil, Burning Steppes (A)
},
complexes = {
[BZ["Blackrock Mountain"]] = true,
},
}
zones[BZ["Swamp of Sorrows"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Eastern_Kingdoms,
instances = BZ["The Temple of Atal'Hakkar"],
expansion = Classic,
paths = {
[BZ["Blasted Lands"]] = true,
[BZ["Deadwind Pass"]] = true,
[BZ["The Temple of Atal'Hakkar"]] = true,
[BZ["Redridge Mountains"]] = true,
},
flightnodes = {
[599] = true, -- Bogpaddle, Swamp of Sorrows (N)
[598] = true, -- Marshtide Watch, Swamp of Sorrows (A)
[600] = true, -- The Harborage, Swamp of Sorrows (A)
[56] = true, -- Stonard, Swamp of Sorrows (H)
},
}
zones[BZ["Blasted Lands"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = {
[BZ["The Dark Portal"]] = true,
[BZ["Swamp of Sorrows"]] = true,
},
flightnodes = {
[602] = true, -- Surwich, Blasted Lands (A)
[603] = true, -- Sunveil Excursion, Blasted Lands (H)
[604] = true, -- Dreadmaul Hold, Blasted Lands (H)
[45] = true, -- Nethergarde Keep, Blasted Lands (A)
[1537] = true, -- Shattered Landing, Blasted Lands (H)
[1538] = true, -- Shattered Beachhead, Blasted Lands (A)
},
}
zones[BZ["Deadwind Pass"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Eastern_Kingdoms,
expansion = Classic,
instances = {
[BZ["Karazhan"]] = true, -- BC raid
[BZ["Return to Karazhan"]] = true, -- Legion dungeon
},
paths = {
[BZ["Duskwood"]] = true,
[BZ["Swamp of Sorrows"]] = true,
[BZ["Karazhan"]] = true,
[BZ["Return to Karazhan"]] = true, -- Legion dungeon
},
}
-- DK starting zone
zones[BZ["Plaguelands: The Scarlet Enclave"]] = {
low = 8,
high = 30,
continent = Eastern_Kingdoms,
expansion = Wrath_of_the_Lich_King,
yards = 3162.5,
x_offset = 0,
y_offset = 0,
texture = "ScarletEnclave",
}
zones[BZ["Isle of Quel'Danas"]] = {
continent = Eastern_Kingdoms,
expansion = The_Burning_Crusade,
low = 25,
high = 30,
ct_low = 30,
paths = {
[BZ["Magisters' Terrace"]] = true,
[BZ["Sunwell Plateau"]] = true,
[transports["QUELDANAS_SILVERMOON_FLIGHTPATH"]] = true,
[transports["QUELDANAS_EASTERNPLAGUE_FLIGHTPATH"]] = true,
},
flightnodes = {
[213] = true, -- Shattered Sun Staging Area (N)
},
instances = {
[BZ["Magisters' Terrace"]] = true,
[BZ["Sunwell Plateau"]] = true,
},
}
zones[BZ["Vashj'ir"]] = {
low = 30,
high = 35,
ct_low = 30,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
instances = {
[BZ["Throne of the Tides"]] = true,
},
flightnodes = {
[522] = true, -- Silver Tide Hollow, Vashj'ir (N) S seahorse
[524] = true, -- Darkbreak Cove, Vashj'ir (A) A seahorse
[526] = true, -- Tenebrous Cavern, Vashj'ir (H) A seahorse
[605] = true, -- Voldrin's Hold, Vashj'ir (A) S seahorse
[611] = true, -- Voldrin's Hold, Vashj'ir (A) S
[606] = true, -- Sandy Beach, Vashj'ir (A) S
[607] = true, -- Sandy Beach, Vashj'ir (A) S seahorse
[608] = true, -- Sandy Beach, Vashj'ir (H) S
[609] = true, -- Sandy Beach, Vashj'ir (H) S seahorse
[610] = true, -- Stygian Bounty, Vashj'ir (H) S
[612] = true, -- Stygian Bounty, Vashj'ir (H) S seahorse
[521] = true, -- Smuggler's Scar, Vashj'ir (N) K seahorse
[523] = true, -- Tranquil Wash, Vashj'ir (A) S seahorse
[525] = true, -- Legion's Rest, Vashj'ir (H) S seahorse
},
}
zones[BZ["Kelp'thar Forest"]] = {
low = 30,
high = 35,
ct_low = 30,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = {
[transports["KELPTHAR_IRONFORGE_FLIGHTPATH"]] = true,
[transports["KELPTHAR_UNDERCITY_FLIGHTPATH"]] = true,
[transports["KELPTHAR_SEARINGGORGE_FLIGHTPATH"]] = true,
[BZ["Shimmering Expanse"]] = true,
},
flightnodes = {
[521] = true, -- Smuggler's Scar, Vashj'ir (N) seahorse
},
}
zones[BZ["Shimmering Expanse"]] = {
low = 30,
high = 35,
ct_low = 30,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = {
[BZ["Kelp'thar Forest"]] = true,
[BZ["Abyssal Depths"]] = true,
},
flightnodes = {
[522] = true, -- Silver Tide Hollow, Vashj'ir (N) seahorse
[605] = true, -- Voldrin's Hold, Vashj'ir (A) seahorse
[611] = true, -- Voldrin's Hold, Vashj'ir (A)
[606] = true, -- Sandy Beach, Vashj'ir (A)
[607] = true, -- Sandy Beach, Vashj'ir (A) seahorse
[608] = true, -- Sandy Beach, Vashj'ir (H)
[609] = true, -- Sandy Beach, Vashj'ir (H) seahorse
[610] = true, -- Stygian Bounty, Vashj'ir (H)
[612] = true, -- Stygian Bounty, Vashj'ir (H) seahorse
[523] = true, -- Tranquil Wash, Vashj'ir (A) seahorse
[525] = true, -- Legion's Rest, Vashj'ir (H) seahorse
},
}
zones[BZ["Abyssal Depths"]] = {
low = 30,
high = 35,
ct_low = 30,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
instances = {
[BZ["Throne of the Tides"]] = true,
},
paths = {
[BZ["Shimmering Expanse"]] = true,
[BZ["Throne of the Tides"]] = true,
},
flightnodes = {
[524] = true, -- Darkbreak Cove, Vashj'ir (A) seahorse
[526] = true, -- Tenebrous Cavern, Vashj'ir (H) seahorse
},
}
zones[BZ["Twilight Highlands"]] = {
low = 30,
high = 35,
ct_low = 30,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
instances = {
[BZ["Grim Batol"]] = true,
[BZ["The Bastion of Twilight"]] = true,
[BZ["Twin Peaks"]] = true,
},
paths = {
[BZ["Wetlands"]] = true,
[BZ["Grim Batol"]] = true,
[BZ["The Bastion of Twilight"]] = true,
[BZ["Twin Peaks"]] = true,
[transports["TWILIGHTHIGHLANDS_STORMWIND_PORTAL"]] = true,
[transports["TWILIGHTHIGHLANDS_ORGRIMMAR_PORTAL"]] = true,
},
flightnodes = {
[657] = true, -- The Gullet, Twilight Highlands (H)
[659] = true, -- Bloodgulch, Twilight Highlands (H)
[661] = true, -- Dragonmaw Port, Twilight Highlands (H)
[663] = true, -- Victor's Point, Twilight Highlands (A)
[665] = true, -- Thundermar, Twilight Highlands (A)
[656] = true, -- Crushblow, Twilight Highlands (H)
[658] = true, -- Vermillion Redoubt, Twilight Highlands (N)
[660] = true, -- The Krazzworks, Twilight Highlands (H)
[662] = true, -- Highbank, Twilight Highlands (A)
[664] = true, -- Firebeard's Patrol, Twilight Highlands (A)
[666] = true, -- Kirthaven, Twilight Highlands (A)
},
}
zones[BZ["Tol Barad"]] = {
low = 35,
high = 35,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
instances = {
[BZ["Baradin Hold"]] = true,
},
paths = {
[BZ["Tol Barad Peninsula"]] = true,
[BZ["Baradin Hold"]] = true,
},
type = "PvP Zone",
}
zones[BZ["Tol Barad Peninsula"]] = {
low = 30,
high = 35,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = {
[BZ["Tol Barad"]] = true,
[transports["TOLBARAD_ORGRIMMAR_PORTAL"]] = true,
[transports["TOLBARAD_STORMWIND_PORTAL"]] = true,
},
}
-- zones[BZ["Amani Pass"]] = {
-- continent = Eastern_Kingdoms,
-- }
-- Kalimdor cities and zones --
zones[BZ["Orgrimmar"]] = {
continent = Kalimdor,
expansion = Classic,
instances = {
[BZ["Ragefire Chasm"]] = true,
[BZ["Brawl'gar Arena"]] = true,
-- [BZ["The Ring of Valor"]] = true,
},
paths = {
[BZ["Durotar"]] = true,
[BZ["Ragefire Chasm"]] = true,
[BZ["Brawl'gar Arena"]] = true,
[BZ["Azshara"]] = true,
[transports["ORGRIMMAR_TIRISFAL_PORTAL"]] = true,
[transports["ORGRIMMAR_STRANGLETHORN_ZEPPELIN"]] = true,
[transports["ORGRIMMAR_BOREANTUNDRA_ZEPPELIN"]] = true,
[transports["ORGRIMMAR_THUNDERBLUFF_ZEPPELIN"]] = true,
[transports["ORGRIMMAR_TWILIGHTHIGHLANDS_PORTAL"]] = true,
[transports["ORGRIMMAR_MOUNTHYJAL_PORTAL"]] = true,
[transports["ORGRIMMAR_DEEPHOLM_PORTAL"]] = true,
[transports["ORGRIMMAR_ULDUM_PORTAL"]] = true,
[transports["ORGRIMMAR_VASHJIR_PORTAL"]] = true,
[transports["ORGRIMMAR_TOLBARAD_PORTAL"]] = true,
[transports["ORGRIMMAR_JADEFOREST_PORTAL"]] = true,
[transports["ORGRIMMAR_ZULDAZAR_PORTAL"]] = true,
[transports["ORGRIMMAR_WARSPEAR_PORTAL"]] = true,
[transports["ORGRIMMAR_SILVERMOON_PORTAL"]] = true,
[transports["ORGRIMMAR_SHATTRATH_PORTAL"]] = true,
[transports["ORGRIMMAR_DALARAN_PORTAL"]] = true,
[transports["ORGRIMMAR_AZSUNA_PORTAL"]] = true,
[transports["ORGRIMMAR_ORIBOS_PORTAL"]] = true,
[transports["ORGRIMMAR_COT_PORTAL"]] = true,
[transports["ORGRIMMAR_VALDRAKKEN_PORTAL"]] = true,
[transports["ORGRIMMAR_WAKINGSHORES_ZEPPELIN"]] = true,
},
flightnodes = {
[23] = true, -- Orgrimmar, Durotar (H)
},
faction = "Horde",
type = "City",
}
zones[BZ["Thunder Bluff"]] = {
continent = Kalimdor,
expansion = Classic,
paths = {
[BZ["Mulgore"]] = true,
[transports["THUNDERBLUFF_ORGRIMMAR_ZEPPELIN"]] = true,
},
flightnodes = {
[22] = true, -- Thunder Bluff, Mulgore (H)
},
faction = "Horde",
type = "City",
}
zones[BZ["The Exodar"]] = {
continent = Kalimdor,
expansion = The_Burning_Crusade,
paths = {
[BZ["Azuremyst Isle"]] = true,
[transports["EXODAR_STORMWIND_PORTAL"]] = true,
},
flightnodes = {
[94] = true, -- The Exodar (A)
},
faction = "Alliance",
type = "City",
}
zones[BZ["Darnassus"]] = {
continent = Kalimdor,
expansion = Classic,
paths = {
[transports["DARNASSUS_TELDRASSIL_TELEPORT"]] = true,
[transports["DARNASSUS_HELLFIRE_PORTAL"]] = true,
[transports["DARNASSUS_EXODAR_PORTAL"]] = true,
},
flightnodes = {
[457] = true, -- Darnassus, Teldrassil (A)
},
faction = "Alliance",
type = "City",
}
-- Draenei starting zone
zones[BZ["Ammen Vale"]] = {
low = 1,
high = 30,
continent = Kalimdor,
expansion = The_Burning_Crusade,
paths = {
[BZ["Azuremyst Isle"]] = true,
},
faction = "Alliance",
}
-- Troll starting zone
zones[BZ["Valley of Trials"]] = {
low = 1,
high = 30,
continent = Kalimdor,
expansion = Classic,
paths = {
[BZ["Durotar"]] = true,
},
faction = "Horde",
}
zones[BZ["Echo Isles"]] = {
low = 1,
high = 30,
continent = Kalimdor,
expansion = Classic,
paths = {
[BZ["Durotar"]] = true,
[transports["ECHOISLES_ZULDAZAR_BOAT"]] = true,
},
faction = "Horde",
}
-- Tauren starting zone
zones[BZ["Camp Narache"]] = {
low = 1,
high = 30,
continent = Kalimdor,
expansion = Classic,
paths = {
[BZ["Mulgore"]] = true,
},
faction = "Horde",
}
-- Night Elf starting zone
zones[BZ["Shadowglen"]] = {
low = 1,
high = 30,
continent = Kalimdor,
expansion = Classic,
paths = {
[BZ["Teldrassil"]] = true,
},
faction = "Alliance",
}
zones[BZ["Azuremyst Isle"]] = {
low = 1,
high = 30,
ct_low = 1,
continent = Kalimdor,
expansion = The_Burning_Crusade,
paths = {
[BZ["The Exodar"]] = true,
[BZ["Ammen Vale"]] = true,
[BZ["Bloodmyst Isle"]] = true,
[transports["AZUREMYST_TELDRASSIL_PORTAL"]] = true,
},
flightnodes = {
[94] = true, -- The Exodar (A)
[624] = true, -- Azure Watch, Azuremyst Isle (A)
},
faction = "Alliance",
}
zones[BZ["Durotar"]] = {
low = 1,
high = 30,
ct_low = 1,
continent = Kalimdor,
expansion = Classic,
instances = BZ["Ragefire Chasm"],
paths = {
[BZ["Northern Barrens"]] = true,
[BZ["Orgrimmar"]] = true,
[BZ["Valley of Trials"]] = true,
[BZ["Echo Isles"]] = true,
},
flightnodes = {
[536] = true, -- Sen'jin Village, Durotar (H)
[537] = true, -- Razor Hill, Durotar (H)
[23] = true, -- Orgrimmar, Durotar (H)
},
faction = "Horde",
}
zones[BZ["Mulgore"]] = {
low = 1,
high = 30,
ct_low = 1,
continent = Kalimdor,
expansion = Classic,
paths = {
[BZ["Camp Narache"]] = true,
[BZ["Thunder Bluff"]] = true,
[BZ["Southern Barrens"]] = true,
[transports["MULGORE_DARKMOON_PORTAL"]] = true,
},
flightnodes = {
[402] = true, -- Bloodhoof Village, Mulgore (H)
[22] = true, -- Thunder Bluff, Mulgore (H)
},
faction = "Horde",
}
zones[BZ["Teldrassil"]] = {
low = 1,
high = 30,
ct_low = 1,
continent = Kalimdor,
expansion = The_Burning_Crusade,
paths = {
[BZ["Shadowglen"]] = true,
[transports["TELDRASSIL_AZUREMYST_PORTAL"]] = true,
[transports["TELDRASSIL_STORMWIND_PORTAL"]] = true,
[transports["TELDRASSIL_DARNASSUS_TELEPORT"]] = true,
},
flightnodes = {
[27] = true, -- Rut'theran Village, Teldrassil (A)
[456] = true, -- Dolanaar, Teldrassil (A)
[457] = true, -- Darnassus, Teldrassil (A)
},
faction = "Alliance",
}
zones[BZ["Azshara"]] = {
low = 5,
high = 30,
ct_low = 5,
continent = Kalimdor,
expansion = Classic,
paths = {
[BZ["Ashenvale"]] = true,
[BZ["Orgrimmar"]] = true,
},
flightnodes = {
[683] = true, -- Valormok, Azshara (H)
[613] = true, -- Southern Rocketway, Azshara (H)
[44] = true, -- Bilgewater Harbor, Azshara (H)
[614] = true, -- Northern Rocketway, Azshara (H)
},
faction = "Horde",
}
zones[BZ["Bloodmyst Isle"]] = {
low = 1,
high = 30,
ct_low = 1,
continent = Kalimdor,
expansion = The_Burning_Crusade,
paths = BZ["Azuremyst Isle"],
flightnodes = {
[93] = true, -- Blood Watch, Bloodmyst Isle (A)
},
faction = "Alliance",
}
zones[BZ["Darkshore"]] = {
low = 5,
high = 30,
ct_low = 5,
continent = Kalimdor,
expansion = Classic,
paths = {
[BZ["Ashenvale"]] = true,
[transports["DARKSHORE_AMIRDRASSIL_PORTAL"]] = true,
},
flightnodes = {
[339] = true, -- Grove of the Ancients, Darkshore (A)
[26] = true, -- Lor'danel, Darkshore (A)
},
faction = "Alliance",
}
zones[BZ["Northern Barrens"]] = {
low = 5,
high = 30,
ct_low = 5,
continent = Kalimdor,
expansion = Classic,
instances = {
[BZ["Wailing Caverns"]] = true,
[BZ["Warsong Gulch"]] = isHorde and true or nil,
},
paths = {
[BZ["Southern Barrens"]] = true,
[BZ["Ashenvale"]] = true,
[BZ["Durotar"]] = true,
[BZ["Wailing Caverns"]] = true,
[transports["RATCHET_BOOTYBAY_BOAT"]] = true,
[BZ["Warsong Gulch"]] = isHorde and true or nil,
[BZ["Stonetalon Mountains"]] = true,
},
flightnodes = {
[458] = true, -- Nozzlepot's Outpost, Northern Barrens (H)
[80] = true, -- Ratchet, Northern Barrens (N)
[25] = true, -- The Crossroads, Northern Barrens (H)
},
faction = "Horde",
}
zones[BZ["Ashenvale"]] = {
low = 7,
high = 30,
ct_low = 7,
continent = Kalimdor,
expansion = Classic,
instances = {
[BZ["Blackfathom Deeps"]] = true,
[BZ["Warsong Gulch"]] = not isHorde and true or nil,
},
paths = {
[BZ["Azshara"]] = true,
[BZ["Northern Barrens"]] = true,
[BZ["Blackfathom Deeps"]] = true,
[BZ["Warsong Gulch"]] = not isHorde and true or nil,
[BZ["Felwood"]] = true,
[BZ["Darkshore"]] = true,
[BZ["Stonetalon Mountains"]] = true,
},
flightnodes = {
[61] = true, -- Splintertree Post, Ashenvale (H)
[351] = true, -- Stardust Spire, Ashenvale (A)
[338] = true, -- Blackfathom Camp, Ashenvale (A)
[28] = true, -- Astranaar, Ashenvale (A)
[356] = true, -- Silverwind Refuge, Ashenvale (H)
[58] = true, -- Zoram'gar Outpost, Ashenvale (H)
[167] = true, -- Forest Song, Ashenvale (A)
[354] = true, -- The Mor'Shan Ramparts, Ashenvale (H)
[350] = true, -- Hellscream's Watch, Ashenvale (H)
},
}
zones[BZ["Stonetalon Mountains"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Kalimdor,
expansion = Classic,
paths = {
[BZ["Desolace"]] = true,
[BZ["Northern Barrens"]] = true,
[BZ["Southern Barrens"]] = true,
[BZ["Ashenvale"]] = true,
},
flightnodes = {
[365] = true, -- Farwatcher's Glen, Stonetalon Mountains (A)
[33] = true, -- Thal'darah Overlook, Stonetalon Mountains (A)
[541] = true, -- Mirkfallon Post, Stonetalon Mountains (A)
[29] = true, -- Sun Rock Retreat, Stonetalon Mountains (H)
[360] = true, -- Cliffwalker Post, Stonetalon Mountains (H)
[540] = true, -- The Sludgewerks, Stonetalon Mountains (H)
[362] = true, -- Krom'gar Fortress, Stonetalon Mountains (H)
[363] = true, -- Malaka'jin, Stonetalon Mountains (H)
[364] = true, -- Northwatch Expedition Base Camp, Stonetalon Mountains (A)
[361] = true, -- Windshear Hold, Stonetalon Mountains (A)
},
}
zones[BZ["Desolace"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Kalimdor,
expansion = Classic,
instances = BZ["Maraudon"],
paths = {
[BZ["Feralas"]] = true,
[BZ["Stonetalon Mountains"]] = true,
[BZ["Maraudon"]] = true,
},
flightnodes = {
[367] = true, -- Thargad's Camp, Desolace (A)
[368] = true, -- Karnum's Glade, Desolace (N)
[369] = true, -- Thunk's Abode, Desolace (N)
[370] = true, -- Ethel Rethor, Desolace (N)
[38] = true, -- Shadowprey Village, Desolace (H)
[366] = true, -- Furien's Post, Desolace (H)
[37] = true, -- Nijel's Point, Desolace (A)
},
}
zones[BZ["Southern Barrens"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Kalimdor,
expansion = Classic,
instances = {
[BZ["Razorfen Kraul"]] = true,
},
paths = {
[BZ["Northern Barrens"]] = true,
[BZ["Thousand Needles"]] = true,
[BZ["Razorfen Kraul"]] = true,
[BZ["Dustwallow Marsh"]] = true,
[BZ["Stonetalon Mountains"]] = true,
[BZ["Mulgore"]] = true,
},
flightnodes = {
[388] = true, -- Northwatch Hold, Southern Barrens (A)
[389] = true, -- Fort Triumph, Southern Barrens (A)
[390] = true, -- Hunter's Hill, Southern Barrens (H)
[77] = true, -- Vendetta Point, Southern Barrens (H)
[387] = true, -- Honor's Stand, Southern Barrens (A)
[391] = true, -- Desolation Hold, Southern Barrens (H)
},
}
zones[BZ["Dustwallow Marsh"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Kalimdor,
expansion = Classic,
instances = BZ["Onyxia's Lair"],
paths = {
[BZ["Onyxia's Lair"]] = true,
[BZ["Southern Barrens"]] = true,
[BZ["Thousand Needles"]] = true,
[transports["THERAMORE_MENETHIL_BOAT"]] = true,
},
flightnodes = {
[55] = true, -- Brackenwall Village, Dustwallow Marsh (H)
[179] = true, -- Mudsprocket, Dustwallow Marsh (N)
[32] = true, -- Theramore, Dustwallow Marsh (A)
},
}
zones[BZ["Feralas"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Kalimdor,
expansion = Classic,
instances = {
[BZ["Dire Maul - East"]] = true,
[BZ["Dire Maul - North"]] = true,
[BZ["Dire Maul - West"]] = true,
},
paths = {
[BZ["Thousand Needles"]] = true,
[BZ["Desolace"]] = true,
[BZ["Dire Maul"]] = true,
[transports["FERALAS_AMIRDRASSIL_PORTAL"]] = true,
},
flightnodes = {
[565] = true, -- Dreamer's Rest, Feralas (A)
[567] = true, -- Tower of Estulan, Feralas (A)
[569] = true, -- Stonemaul Hold, Feralas (H)
[41] = true, -- Feathermoon, Feralas (A)
[568] = true, -- Camp Ataya, Feralas (H)
[42] = true, -- Camp Mojache, Feralas (H)
[31] = true, -- Shadebough, Feralas (A)
},
complexes = {
[BZ["Dire Maul"]] = true,
},
}
zones[BZ["Thousand Needles"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Kalimdor,
expansion = Classic,
instances = {
[BZ["Razorfen Downs"]] = true,
},
paths = {
[BZ["Feralas"]] = true,
[BZ["Southern Barrens"]] = true,
[BZ["Tanaris"]] = true,
[BZ["Dustwallow Marsh"]] = true,
[BZ["Razorfen Downs"]] = true,
},
flightnodes = {
[513] = true, -- Fizzle & Pozzik's Speedbarge, Thousand Needles (N)
[30] = true, -- Westreach Summit, Thousand Needles (H)
},
}
zones[BZ["Felwood"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Kalimdor,
expansion = Classic,
paths = {
[BZ["Winterspring"]] = true,
[BZ["Moonglade"]] = true,
[BZ["Ashenvale"]] = true,
},
flightnodes = {
[595] = true, -- Wildheart Point, Felwood (N)
[597] = true, -- Irontree Clearing, Felwood (H)
[166] = true, -- Emerald Sanctuary, Felwood (N)
[594] = true, -- Whisperwind Grove, Felwood (N)
[65] = true, -- Talonbranch Glade, Felwood (A)
},
}
zones[BZ["Tanaris"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Kalimdor,
expansion = Classic,
instances = {
[BZ["Zul'Farrak"]] = true,
[BZ["Old Hillsbrad Foothills"]] = true,
[BZ["The Black Morass"]] = true,
[BZ["Hyjal Summit"]] = true,
[BZ["The Culling of Stratholme"]] = true,
[BZ["End Time"]] = true,
[BZ["Hour of Twilight"]] = true,
[BZ["Well of Eternity"]] = true,
[BZ["Dragon Soul"]] = true,
},
paths = {
[BZ["Thousand Needles"]] = true,
[BZ["Un'Goro Crater"]] = true,
[BZ["Zul'Farrak"]] = true,
[BZ["Caverns of Time"]] = true,
[BZ["Uldum"]] = true,
},
flightnodes = {
[532] = true, -- Gunstan's Dig, Tanaris (A)
[39] = true, -- Gadgetzan, Tanaris (A)
[531] = true, -- Dawnrise Expedition, Tanaris (H)
[40] = true, -- Gadgetzan, Tanaris (H)
[539] = true, -- Bootlegger Outpost, Tanaris (N)
},
complexes = {
[BZ["Caverns of Time"]] = true,
},
}
zones[BZ["Un'Goro Crater"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Kalimdor,
expansion = Classic,
paths = {
[BZ["Silithus"]] = true,
[BZ["Tanaris"]] = true,
},
flightnodes = {
[79] = true, -- Marshal's Stand, Un'Goro Crater (N)
[386] = true, -- Mossy Pile, Un'Goro Crater (N)
},
}
zones[BZ["Winterspring"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Kalimdor,
expansion = Classic,
paths = {
[BZ["Felwood"]] = true,
[BZ["Moonglade"]] = true,
[BZ["Mount Hyjal"]] = true,
},
flightnodes = {
[53] = true, -- Everlook, Winterspring (H)
[52] = true, -- Everlook, Winterspring (A)
},
}
zones[BZ["Silithus"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Kalimdor,
expansion = Classic,
paths = {
[BZ["Un'Goro Crater"]] = true,
[BZ["Ahn'Qiraj: The Fallen Kingdom"]] = true,
[transports["SILITHUS_ZULDAZAR_PORTAL"]] = true,
[transports["SILITHUS_TIRAGARDESOUND_PORTAL"]] = true,
},
flightnodes = {
[73] = true, -- Cenarion Hold, Silithus (A)
[72] = true, -- Cenarion Hold, Silithus (H)
[2059] = true, -- Southwind Village, Silithus
},
instances = {
[BZ["Ahn'Qiraj"]] = true,
[BZ["Ruins of Ahn'Qiraj"]] = true,
},
complexes = {
[BZ["Ahn'Qiraj: The Fallen Kingdom"]] = true,
},
type = "PvP Zone",
}
zones[BZ["Moonglade"]] = {
continent = Kalimdor,
expansion = Classic,
low = 1,
high = 30,
ct_low = 1,
paths = {
[BZ["Felwood"]] = true,
[BZ["Winterspring"]] = true,
},
flightnodes = {
[49] = true, -- Moonglade (A)
[69] = true, -- Moonglade (H)
[62] = true, -- Nighthaven, Moonglade (A)
[63] = true, -- Nighthaven, Moonglade (H)
},
}
zones[BZ["Mount Hyjal"]] = {
low = 30,
high = 35,
ct_low = 30,
continent = Kalimdor,
expansion = Cataclysm,
paths = {
[BZ["Winterspring"]] = true,
[transports["MOUNTHYJAL_ORGRIMMAR_PORTAL"]] = true,
[transports["MOUNTHYJAL_STORMWIND_PORTAL"]] = true,
[transports["MOUNTHYJAL_MOLTENFRONT_PORTAL"]] = true,
[transports["MOUNTHYJAL_AMIRDRASSIL_PORTAL"]] = true,
[BZ["Firelands"]] = true,
},
flightnodes = {
[558] = true, -- Grove of Aessina, Hyjal (N)
[616] = true, -- Gates of Sothann, Hyjal (N)
[781] = true, -- Sanctuary of Malorne, Hyjal (N)
[559] = true, -- Nordrassil, Hyjal (N)
[557] = true, -- Shrine of Aviana, Hyjal (N)
},
instances = {
[BZ["Firelands"]] = true,
},
}
local function GetUldumMinLevel()
if playerLevel < 50 then return 30 else return 50 end
end
local function GetUldumMaxLevel()
if playerLevel < 50 then return 35 else return 50 end
end
local function GetUldumExpansion()
if playerLevel < 50 then return Cataclysm else return Battle_for_Azeroth end
end
local function GetUldumInstances()
if playerLevel < 50 then
return {
[BZ["Halls of Origination"]] = true,
[BZ["Lost City of the Tol'vir"]] = true,
[BZ["The Vortex Pinnacle"]] = true,
[BZ["Throne of the Four Winds"]] = true,
-- [BZ["Tol'Viron"]] = true, -- Arena
}
else
return {
[BZ["Halls of Origination"]] = true,
[BZ["Lost City of the Tol'vir"]] = true,
[BZ["The Vortex Pinnacle"]] = true,
[BZ["Throne of the Four Winds"]] = true,
[BZ["Ny'alotha"]] = true, -- Entrance can be either here or in Vale of Eternal Blossoms
-- [BZ["Tol'Viron"]] = true, -- Arena
}
end
end
-- UIMapID 249, AreaID 5034 (Cataclysm)
-- UIMapID 1527, AreaID 10833 (BfA, N'Zoth assault)
zones[BZ["Uldum"]] = {
low = GetUldumMinLevel(),
high = GetUldumMaxLevel(),
ct_low = 30,
continent = Kalimdor,
expansion = GetUldumExpansion(),
paths = {
[BZ["Tanaris"]] = true,
[BZ["Halls of Origination"]] = true,
[BZ["Lost City of the Tol'vir"]] = true,
[BZ["The Vortex Pinnacle"]] = true,
[BZ["Throne of the Four Winds"]] = true,
[BZ["Ny'alotha"]] = true, -- Entrance can be either here or in Vale of Eternal Blossoms
},
flightnodes = {
[653] = true, -- Oasis of Vir'sar, Uldum (N)
[652] = true, -- Ramkahen, Uldum (N)
[674] = true, -- Schnottz's Landing, Uldum (N)
},
instances = GetUldumInstances(),
}
-- UIMapID 1527, AreaID 10833 (BfA, N'Zoth assault)
-- zones[BZ["Uldum"]] = {
-- low = 50,
-- high = 50,
-- continent = Kalimdor,
-- expansion = Battle_for_Azeroth,
-- paths = {
-- [BZ["Tanaris"]] = true,
-- },
-- flightnodes = {
-- [653] = true, -- Oasis of Vir'sar, Uldum (N)
-- [652] = true, -- Ramkahen, Uldum (N)
-- [674] = true, -- Schnottz's Landing, Uldum (N)
-- },
-- instances = {
-- [BZ["Halls of Origination"]] = true,
-- [BZ["Lost City of the Tol'vir"]] = true,
-- [BZ["The Vortex Pinnacle"]] = true,
-- [BZ["Throne of the Four Winds"]] = true,
-- [BZ["Ny'alotha"]] = true, -- Entrance can be either here or in Vale of Eternal Blossoms
-- -- [BZ["Tol'Viron"]] = true, -- Arena
-- },
-- }
-- Daily quest zone
zones[BZ["Molten Front"]] = {
low = 32,
high = 35,
paths = {
[transports["MOLTENFRONT_MOUNTHYJAL_PORTAL"]] = true,
},
continent = Kalimdor,
expansion = Cataclysm,
}
-- Outland city and zones --
zones[BZ["Shattrath City"]] = {
continent = Outland,
expansion = The_Burning_Crusade,
paths = {
[BZ["Terokkar Forest"]] = true,
[BZ["Nagrand"]] = true,
[transports["SHATTRATH_QUELDANAS_PORTAL"]] = true,
[transports["SHATTRATH_STORMWIND_PORTAL"]] = true,
[transports["SHATTRATH_ORGRIMMAR_PORTAL"]] = true,
},
flightnodes = {
[128] = true, -- Shattrath, Terokkar Forest (N)
},
faction = "Sanctuary",
type = "City",
}
zones[BZ["Hellfire Peninsula"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Outland,
expansion = The_Burning_Crusade,
instances = {
[BZ["The Blood Furnace"]] = true,
[BZ["Hellfire Ramparts"]] = true,
[BZ["Magtheridon's Lair"]] = true,
[BZ["The Shattered Halls"]] = true,
},
paths = {
[BZ["Zangarmarsh"]] = true,
-- [BZ["The Dark Portal"]] = true, -- closed
[BZ["Terokkar Forest"]] = true,
[BZ["Hellfire Citadel"]] = true,
[transports["HELLFIRE_ORGRIMMAR_PORTAL"]] = true,
[transports["HELLFIRE_STORMWIND_PORTAL"]] = true,
},
flightnodes = {
[99] = true, -- Thrallmar, Hellfire Peninsula (H)
[101] = true, -- Temple of Telhamat, Hellfire Peninsula (A)
[141] = true, -- Spinebreaker Ridge, Hellfire Peninsula (H)
[100] = true, -- Honor Hold, Hellfire Peninsula (A)
[102] = true, -- Falcon Watch, Hellfire Peninsula (H)
[129] = true, -- Hellfire Peninsula, The Dark Portal (A)
[130] = true, -- Hellfire Peninsula, The Dark Portal (H)
},
complexes = {
[BZ["Hellfire Citadel"]] = true,
},
type = "PvP Zone",
}
zones[BZ["Zangarmarsh"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Outland,
expansion = The_Burning_Crusade,
instances = {
[BZ["The Underbog"]] = true,
[BZ["Serpentshrine Cavern"]] = true,
[BZ["The Steamvault"]] = true,
[BZ["The Slave Pens"]] = true,
},
paths = {
[BZ["Coilfang Reservoir"]] = true,
[BZ["Blade's Edge Mountains"]] = true,
[BZ["Terokkar Forest"]] = true,
[BZ["Nagrand"]] = true,
[BZ["Hellfire Peninsula"]] = true,
},
flightnodes = {
[118] = true, -- Zabra'jin, Zangarmarsh (H)
[164] = true, -- Orebor Harborage, Zangarmarsh (A)
[117] = true, -- Telredor, Zangarmarsh (A)
[151] = true, -- Swamprat Post, Zangarmarsh (H)
},
complexes = {
[BZ["Coilfang Reservoir"]] = true,
},
type = "PvP Zone",
}
zones[BZ["Terokkar Forest"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Outland,
expansion = The_Burning_Crusade,
instances = {
[BZ["Mana-Tombs"]] = true,
[BZ["Sethekk Halls"]] = true,
[BZ["Shadow Labyrinth"]] = true,
[BZ["Auchenai Crypts"]] = true,
},
paths = {
[BZ["Ring of Observance"]] = true,
[BZ["Shadowmoon Valley"]] = true,
[BZ["Zangarmarsh"]] = true,
[BZ["Shattrath City"]] = true,
[BZ["Hellfire Peninsula"]] = true,
[BZ["Nagrand"]] = true,
},
flightnodes = {
[127] = true, -- Stonebreaker Hold, Terokkar Forest (H)
[128] = true, -- Shattrath, Terokkar Forest (N)
[121] = true, -- Allerian Stronghold, Terokkar Forest (A)
},
complexes = {
[BZ["Ring of Observance"]] = true,
},
type = "PvP Zone",
}
zones[BZ["Nagrand"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Outland,
expansion = The_Burning_Crusade,
instances = {
[BZ["Nagrand Arena"]] = true,
},
paths = {
[BZ["Zangarmarsh"]] = true,
[BZ["Shattrath City"]] = true,
[BZ["Terokkar Forest"]] = true,
[BZ["Nagrand Arena"]] = true,
},
flightnodes = {
[120] = true, -- Garadar, Nagrand (H)
[119] = true, -- Telaar, Nagrand (A)
},
type = "PvP Zone",
}
zones[BZ["Blade's Edge Mountains"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Outland,
expansion = The_Burning_Crusade,
instances =
{
[BZ["Gruul's Lair"]] = true,
[BZ["Blade's Edge Arena"]] = true,
},
paths = {
[BZ["Netherstorm"]] = true,
[BZ["Zangarmarsh"]] = true,
[BZ["Gruul's Lair"]] = true,
[BZ["Blade's Edge Arena"]] = true,
},
flightnodes = {
[126] = true, -- Thunderlord Stronghold, Blade's Edge Mountains (H)
[163] = true, -- Mok'Nathal Village, Blade's Edge Mountains (H)
[160] = true, -- Evergrove, Blade's Edge Mountains (N)
[125] = true, -- Sylvanaar, Blade's Edge Mountains (A)
[156] = true, -- Toshley's Station, Blade's Edge Mountains (A)
},
}
zones[BZ["Netherstorm"]] = {
low = 25,
high = 30,
ct_low = 25,
continent = Outland,
expansion = The_Burning_Crusade,
instances = {
[BZ["The Mechanar"]] = true,
[BZ["The Botanica"]] = true,
[BZ["The Arcatraz"]] = true,
[BZ["Tempest Keep"]] = true, -- previously "The Eye"
[BZ["Eye of the Storm"]] = true,
},
paths = {
[BZ["The Mechanar"]] = true,
[BZ["The Botanica"]] = true,
[BZ["The Arcatraz"]] = true,
[BZ["Tempest Keep"]] = true, -- previously "The Eye"
[BZ["Eye of the Storm"]] = true,
[BZ["Blade's Edge Mountains"]] = true,
},
flightnodes = {
[150] = true, -- Cosmowrench, Netherstorm (N)
[122] = true, -- Area 52, Netherstorm (N)
[139] = true, -- The Stormspire, Netherstorm (N)
},
-- complexes = {
-- [BZ["Tempest Keep"]] = true,
-- },
}
zones[BZ["Shadowmoon Valley"]] = {
low = 25,
high = 30,
ct_low = 25,
continent = Outland,
expansion = The_Burning_Crusade,
instances = BZ["Black Temple"],
paths = {
[BZ["Terokkar Forest"]] = true,
[BZ["Black Temple"]] = true,
},
flightnodes = {
[124] = true, -- Wildhammer Stronghold, Shadowmoon Valley (A)
[140] = true, -- Altar of Sha'tar, Shadowmoon Valley (N)
[123] = true, -- Shadowmoon Village, Shadowmoon Valley (H)
[159] = true, -- Sanctum of the Stars, Shadowmoon Valley (N)
},
}
-- Northrend city and zones --
zones[BZ["Dalaran"]] = {
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = {
[transports["DALARAN_CRYSTALSONG_TELEPORT"]] = true,
[transports["DALARAN_STORMWIND_PORTAL"]] = true,
[transports["DALARAN_ORGRIMMAR_PORTAL"]] = true,
[transports["DALARAN_ICECROWN_FLIGHTPATH"]] = true,
[transports["DALARAN_WINTERGRASP_FLIGHTPATH"]] = true,
[BZ["The Violet Hold"]] = true,
[BZ["Dalaran Arena"]] = true,
},
flightnodes = {
[310] = true, -- Dalaran (N)
},
instances = {
[BZ["The Violet Hold"]] = true,
[BZ["Dalaran Arena"]] = true,
},
type = "City",
texture = "Dalaran",
faction = "Sanctuary",
}
zones[BZ["Borean Tundra"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = {
[BZ["Coldarra"]] = true,
[BZ["Dragonblight"]] = true,
[BZ["Sholazar Basin"]] = true,
[transports["BOREANTUNDRA_STORMWIND_BOAT"]] = true,
[transports["BOREANTUNDRA_ORGRIMMAR_ZEPPELIN"]] = true,
[transports["BOREANTUNDRA_DRAGONBLIGHT_BOAT"]] = true,
},
flightnodes = {
[245] = true, -- Valiance Keep, Borean Tundra (A)
[259] = true, -- Bor'gorok Outpost, Borean Tundra (H)
[246] = true, -- Fizzcrank Airstrip, Borean Tundra (A)
[258] = true, -- Taunka'le Village, Borean Tundra (H)
[226] = true, -- Transitus Shield, Coldarra (N)
[257] = true, -- Warsong Hold, Borean Tundra (H)
[289] = true, -- Amber Ledge, Borean Tundra (N)
[296] = true, -- Unu'pe, Borean Tundra (N)
},
instances = {
[BZ["The Nexus"]] = true,
[BZ["The Oculus"]] = true,
[BZ["The Eye of Eternity"]] = true,
},
complexes = {
[BZ["Coldarra"]] = true,
},
}
zones[BZ["Howling Fjord"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = {
[BZ["Grizzly Hills"]] = true,
[transports["HOWLINGFJORD_MENETHIL_BOAT"]] = true,
[transports["HOWLINGFJORD_TIRISFAL_PORTAL"]] = true,
[transports["HOWLINGFJORD_DRAGONBLIGHT_BOAT"]] = true,
[BZ["Utgarde Keep"]] = true,
[BZ["Utgarde Pinnacle"]] = true,
},
flightnodes = {
[248] = true, -- Apothecary Camp, Howling Fjord (H)
[191] = true, -- Vengeance Landing, Howling Fjord (H)
[190] = true, -- New Agamand, Howling Fjord (H)
[192] = true, -- Camp Winterhoof, Howling Fjord (H)
[184] = true, -- Fort Wildervar, Howling Fjord (A)
[295] = true, -- Kamagua, Howling Fjord (N)
[185] = true, -- Westguard Keep, Howling Fjord (A)
[183] = true, -- Valgarde Port, Howling Fjord (A)
},
instances = {
[BZ["Utgarde Keep"]] = true,
[BZ["Utgarde Pinnacle"]] = true,
},
}
zones[BZ["Dragonblight"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = {
[BZ["Borean Tundra"]] = true,
[BZ["Grizzly Hills"]] = true,
[BZ["Zul'Drak"]] = true,
[BZ["Crystalsong Forest"]] = true,
[transports["DRAGONBLIGHT_BOREANTUNDRA_BOAT"]] = true,
[transports["DRAGONBLIGHT_HOWLINGFJORD_BOAT"]] = true,
[BZ["Azjol-Nerub"]] = true,
[BZ["Ahn'kahet: The Old Kingdom"]] = true,
[BZ["Naxxramas"]] = true,
[BZ["The Obsidian Sanctum"]] = true,
[BZ["Strand of the Ancients"]] = true,
[BZ["The Ruby Sanctum"]] = true,
},
flightnodes = {
[252] = true, -- Wyrmrest Temple, Dragonblight (N)
[256] = true, -- Agmar's Hammer, Dragonblight (H)
[260] = true, -- Kor'kron Vanguard, Dragonblight (H)
[254] = true, -- Venomspite, Dragonblight (H)
[247] = true, -- Stars' Rest, Dragonblight (A)
[244] = true, -- Wintergarde Keep, Dragonblight (A)
[251] = true, -- Fordragon Hold, Dragonblight (A)
[294] = true, -- Moa'ki, Dragonblight (N)
},
instances = {
[BZ["Azjol-Nerub"]] = true,
[BZ["Ahn'kahet: The Old Kingdom"]] = true,
[BZ["Naxxramas"]] = true,
[BZ["The Obsidian Sanctum"]] = true,
[BZ["Strand of the Ancients"]] = true,
[BZ["The Ruby Sanctum"]] = true,
},
}
zones[BZ["Grizzly Hills"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = {
[BZ["Howling Fjord"]] = true,
[BZ["Dragonblight"]] = true,
[BZ["Zul'Drak"]] = true,
[BZ["Drak'Tharon Keep"]] = true,
},
flightnodes = {
[249] = true, -- Camp Oneqwah, Grizzly Hills (H)
[255] = true, -- Westfall Brigade, Grizzly Hills (A)
[250] = true, -- Conquest Hold, Grizzly Hills (H)
[253] = true, -- Amberpine Lodge, Grizzly Hills (A)
},
instances = BZ["Drak'Tharon Keep"],
}
zones[BZ["Zul'Drak"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = {
[BZ["Dragonblight"]] = true,
[BZ["Grizzly Hills"]] = true,
[BZ["Crystalsong Forest"]] = true,
[BZ["Gundrak"]] = true,
[BZ["Drak'Tharon Keep"]] = true,
},
flightnodes = {
[304] = true, -- The Argent Stand, Zul'Drak (N)
[305] = true, -- Ebon Watch, Zul'Drak (N)
[306] = true, -- Light's Breach, Zul'Drak (N)
[307] = true, -- Zim'Torga, Zul'Drak (N)
[331] = true, -- Gundrak, Zul'Drak (N)
},
instances = {
[BZ["Gundrak"]] = true,
[BZ["Drak'Tharon Keep"]] = true,
},
}
zones[BZ["Sholazar Basin"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Borean Tundra"],
flightnodes = {
[308] = true, -- River's Heart, Sholazar Basin (N)
[309] = true, -- Nesingwary Base Camp, Sholazar Basin (N)
},
}
zones[BZ["Icecrown"]] = {
low = 25,
high = 30,
ct_low = 25,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = {
[BZ["Trial of the Champion"]] = true,
[BZ["Trial of the Crusader"]] = true,
[BZ["The Forge of Souls"]] = true,
[BZ["Pit of Saron"]] = true,
[BZ["Halls of Reflection"]] = true,
[BZ["Icecrown Citadel"]] = true,
[BZ["Hrothgar's Landing"]] = true,
[transports["ICECROWN_DALARAN_FLIGHTPATH"]] = true,
},
flightnodes = {
[325] = true, -- Death's Rise, Icecrown (N)
[333] = true, -- The Shadow Vault, Icecrown (N)
[334] = true, -- The Argent Vanguard, Icecrown (N)
[335] = true, -- Crusaders' Pinnacle, Icecrown (N)
[340] = true, -- Argent Tournament Grounds, Icecrown (N)
},
instances = {
[BZ["Trial of the Champion"]] = true,
[BZ["Trial of the Crusader"]] = true,
[BZ["The Forge of Souls"]] = true,
[BZ["Pit of Saron"]] = true,
[BZ["Halls of Reflection"]] = true,
[BZ["Icecrown Citadel"]] = true,
[BZ["Isle of Conquest"]] = true,
},
}
zones[BZ["The Storm Peaks"]] = {
low = 25,
high = 30,
ct_low = 25,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = {
[BZ["Crystalsong Forest"]] = true,
[BZ["Halls of Stone"]] = true,
[BZ["Halls of Lightning"]] = true,
[BZ["Ulduar"]] = true,
},
flightnodes = {
[326] = true, -- Ulduar, The Storm Peaks (N)
[320] = true, -- K3, The Storm Peaks (N)
[321] = true, -- Frosthold, The Storm Peaks (A)
[322] = true, -- Dun Niffelem, The Storm Peaks (N)
[323] = true, -- Grom'arsh Crash-Site, The Storm Peaks (H)
[324] = true, -- Camp Tunka'lo, The Storm Peaks (H)
[327] = true, -- Bouldercrag's Refuge, The Storm Peaks (N)
},
instances = {
[BZ["Halls of Stone"]] = true,
[BZ["Halls of Lightning"]] = true,
[BZ["Ulduar"]] = true,
},
}
zones[BZ["Crystalsong Forest"]] = {
low = 25,
high = 30,
ct_low = 25,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = {
[transports["CRYSTALSONG_DALARAN_TELEPORT"]] = true,
[BZ["Dragonblight"]] = true,
[BZ["Zul'Drak"]] = true,
[BZ["The Storm Peaks"]] = true,
},
flightnodes = {
[336] = true, -- Windrunner's Overlook, Crystalsong Forest (A)
[310] = true, -- Dalaran (N)
[337] = true, -- Sunreaver's Command, Crystalsong Forest (H)
},
}
zones[BZ["Hrothgar's Landing"]] = {
low = 25,
high = 30,
paths = BZ["Icecrown"],
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
}
zones[BZ["Wintergrasp"]] = {
low = 25,
high = 30,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = {
[BZ["Vault of Archavon"]] = true,
[transports["WINTERGRASP_DALARAN_FLIGHTPATH"]] = true,
},
flightnodes = {
[303] = true, -- Valiance Landing Camp, Wintergrasp (A)
[332] = true, -- Warsong Camp, Wintergrasp (H)
},
instances = BZ["Vault of Archavon"],
type = "PvP Zone",
}
zones[BZ["The Frozen Sea"]] = {
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
}
-- The Maelstrom zones --
-- Goblin start zone
zones[BZ["Kezan"]] = {
low = 1,
high = 20,
continent = The_Maelstrom,
expansion = Cataclysm,
faction = "Horde",
}
-- Goblin start zone
zones[BZ["The Lost Isles"]] = {
low = 1,
high = 20,
continent = The_Maelstrom,
expansion = Cataclysm,
faction = "Horde",
}
zones[BZ["The Maelstrom"].." (zone)"] = {
low = 30,
high = 35,
continent = The_Maelstrom,
expansion = Cataclysm,
paths = {
},
faction = "Sanctuary",
}
zones[BZ["Deepholm"]] = {
low = 30,
high = 35,
continent = The_Maelstrom,
expansion = Cataclysm,
instances = {
[BZ["The Stonecore"]] = true,
},
paths = {
[BZ["The Stonecore"]] = true,
[transports["DEEPHOLM_ORGRIMMAR_PORTAL"]] = true,
[transports["DEEPHOLM_STORMWIND_PORTAL"]] = true,
},
}
zones[BZ["Darkmoon Island"]] = {
continent = The_Maelstrom,
expansion = Cataclysm,
paths = {
[transports["DARKMOON_MULGORE_PORTAL"]] = true,
[transports["DARKMOON_ELWYNNFOREST_PORTAL"]] = true,
},
}
-- Pandaria cities and zones --
zones[BZ["Shrine of Seven Stars"]] = {
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = {
[BZ["Vale of Eternal Blossoms"]] = true,
[transports["SEVENSTARS_STORMWIND_PORTAL"]] = true,
},
faction = "Alliance",
type = "City",
}
zones[BZ["Shrine of Two Moons"]] = {
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = {
[BZ["Vale of Eternal Blossoms"]] = true,
[transports["TWOMOONS_ORGRIMMAR_PORTAL"]] = true,
},
faction = "Horde",
type = "City",
}
-- Pandaren starting zone
zones[BZ["The Wandering Isle"]] = {
low = 1,
high = 20,
continent = Pandaria,
expansion = Mists_of_Pandaria,
-- faction = "Sanctuary", -- Not contested and not Alliance nor Horde -> no PvP -> sanctuary
}
zones[BZ["The Jade Forest"]] = {
low = 10,
high = 35,
ct_low = 10,
continent = Pandaria,
expansion = Mists_of_Pandaria,
instances = {
[BZ["Temple of the Jade Serpent"]] = true,
},
paths = {
[BZ["Temple of the Jade Serpent"]] = true,
[BZ["Valley of the Four Winds"]] = true,
[transports["JADEFOREST_TIMELESSISLE_FLIGHTPATH"]] = true,
[transports["JADEFOREST_ORGRIMMAR_PORTAL"]] = true,
[transports["JADEFOREST_STORMWIND_PORTAL"]] = true,
},
flightnodes = {
[968] = true, -- Jade Temple Grounds, Jade Forest (N)
[895] = true, -- Dawn's Blossom, Jade Forest (N)
[972] = true, -- Pearlfin Village, Jade Forest (A)
[967] = true, -- The Arboretum, Jade Forest (N)
[969] = true, -- Sri-La Village, Jade Forest (N)
[971] = true, -- Tian Monastery, Jade Forest (N)
[973] = true, -- Honeydew Village, Jade Forest (H)
[1080] = true, -- Serpent's Overlook, Jade Forest (N)
[894] = true, -- Grookin Hill, Jade Forest (H)
[966] = true, -- Paw'Don Village, Jade Forest (A)
[970] = true, -- Emperor's Omen, Jade Forest (N)
},
}
zones[BZ["Valley of the Four Winds"]] = {
low = 15,
high = 35,
ct_low = 15,
continent = Pandaria,
expansion = Mists_of_Pandaria,
instances = {
[BZ["Stormstout Brewery"]] = true,
[BZ["Deepwind Gorge"]] = true,
},
paths = {
[BZ["Stormstout Brewery"]] = true,
[BZ["The Jade Forest"]] = true,
[BZ["Krasarang Wilds"]] = true,
[BZ["The Veiled Stair"]] = true,
[BZ["Deepwind Gorge"]] = true,
},
flightnodes = {
[989] = true, -- Stoneplow, Valley of the Four Winds (N)
[985] = true, -- Halfhill, Valley of the Four Winds (N)
[984] = true, -- Pang's Stead, Valley of the Four Winds (N)
[1052] = true, -- Grassy Cline, Valley of the Four Winds (N)
},
}
zones[BZ["Krasarang Wilds"]] = {
low = 15,
high = 35,
ct_low = 15,
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = {
[BZ["Valley of the Four Winds"]] = true,
},
flightnodes = {
[1190] = true, -- Lion's Landing, Krasarang Wilds (A)
[991] = true, -- Sentinel Basecamp, Krasarang Wilds (A)
[993] = true, -- Marista, Krasarang Wilds (N)
[1195] = true, -- Domination Point, Krasarang Wilds (H)
[986] = true, -- Zhu's Watch, Krasarang Wilds (N)
[988] = true, -- The Incursion, Krasarang Wilds (A)
[990] = true, -- Dawnchaser Retreat, Krasarang Wilds (H)
[992] = true, -- Cradle of Chi-Ji, Krasarang Wilds (N)
[987] = true, -- Thunder Cleft, Krasarang Wilds (H)
},
}
zones[BZ["The Veiled Stair"]] = {
low = 30,
high = 35,
continent = Pandaria,
expansion = Mists_of_Pandaria,
instances = {
[BZ["Terrace of Endless Spring"]] = true,
},
paths = {
[BZ["Terrace of Endless Spring"]] = true,
[BZ["Valley of the Four Winds"]] = true,
[BZ["Kun-Lai Summit"]] = true,
},
flightnodes = {
[1029] = true, -- Tavern in the Mists, The Veiled Stair (N)
},
}
zones[BZ["Kun-Lai Summit"]] = {
low = 20,
high = 35,
ct_low = 20,
continent = Pandaria,
expansion = Mists_of_Pandaria,
instances = {
[BZ["Shado-Pan Monastery"]] = true,
[BZ["Mogu'shan Vaults"]] = true,
[BZ["The Tiger's Peak"]] = true,
},
paths = {
[BZ["Shado-Pan Monastery"]] = true,
[BZ["Mogu'shan Vaults"]] = true,
[BZ["The Tiger's Peak"]] = true,
[BZ["Vale of Eternal Blossoms"]] = true,
[BZ["The Veiled Stair"]] = true,
[BZ["Townlong Steppes"]] = true,
[transports["KUNLAISUMMIT_ISLEOFGIANTS_FLIGHTPATH"]] = true,
},
flightnodes = {
[1025] = true, -- Winter's Blossom, Kun-Lai Summit (N)
[1019] = true, -- Eastwind Rest, Kun-Lai Summit (H)
[1021] = true, -- Zouchin Village, Kun-Lai Summit (N)
[1023] = true, -- Kota Basecamp, Kun-Lai Summit (N)
[1117] = true, -- Serpent's Spine, Kun-Lai Summit (H)
[1020] = true, -- Westwind Rest, Kun-Lai Summit (A)
[1022] = true, -- One Keg, Kun-Lai Summit (N)
[1024] = true, -- Shado-Pan Fallback, Kun-Lai Summit (N)
[1017] = true, -- Binan Village, Kun-Lai Summit (N)
[1018] = true, -- Temple of the White Tiger, Kun-Lai Summit (N)
},
}
zones[BZ["Townlong Steppes"]] = {
low = 25,
high = 35,
ct_low = 25,
continent = Pandaria,
expansion = Mists_of_Pandaria,
instances = {
[BZ["Siege of Niuzao Temple"]] = true,
},
paths = {
[BZ["Siege of Niuzao Temple"]] = true,
[BZ["Dread Wastes"]] = true,
[BZ["Kun-Lai Summit"]] = true,
[transports["TOWNLONGSTEPPES_ISLEOFTHUNDER_PORTAL"]] = true,
},
flightnodes = {
[1053] = true, -- Longying Outpost, Townlong Steppes (N)
[1054] = true, -- Gao-Ran Battlefront, Townlong Steppes (N)
[1055] = true, -- Rensai's Watchpost, Townlong Steppes (N)
[1056] = true, -- Shado-Pan Garrison, Townlong Steppes (N)
},
}
zones[BZ["Dread Wastes"]] = {
low = 30,
high = 35,
ct_low = 30,
continent = Pandaria,
expansion = Mists_of_Pandaria,
instances = {
[BZ["Gate of the Setting Sun"]] = true,
[BZ["Heart of Fear"]] = true,
},
paths = {
[BZ["Gate of the Setting Sun"]] = true,
[BZ["Heart of Fear"]] = true,
[BZ["Townlong Steppes"]] = true
},
flightnodes = {
[1072] = true, -- The Sunset Brewgarden, Dread Wastes (N)
[1090] = true, -- The Briny Muck, Dread Wastes (N)
[1115] = true, -- The Lion's Redoubt, Dread Wastes (A)
[1070] = true, -- Klaxxi'vess, Dread Wastes (N)
[1071] = true, -- Soggy's Gamble, Dread Wastes (N)
},
}
local function GetValeOfEternalBlossomsMinLevel()
if playerLevel < 50 then return 30 else return 50 end
end
local function GetValeOfEternalBlossomsMaxLevel()
if playerLevel < 50 then return 35 else return 50 end
end
local function GetValeOfEternalBlossomsExpansion()
if playerLevel < 50 then return Mists_of_Pandaria else return Battle_for_Azeroth end
end
local function GetValeOfEternalBlossomsInstances()
if playerLevel < 50 then
return {
[BZ["Mogu'shan Palace"]] = true,
[BZ["Siege of Orgrimmar"]] = true,
}
else
return {
[BZ["Mogu'shan Palace"]] = true,
[BZ["Siege of Orgrimmar"]] = true,
[BZ["Ny'alotha"]] = true, -- Entrance can be either here or in Uldum
}
end
end
zones[BZ["Vale of Eternal Blossoms"]] = {
low = GetValeOfEternalBlossomsMinLevel(),
high = GetValeOfEternalBlossomsMaxLevel(),
ct_low = 30,
continent = Pandaria,
expansion = GetValeOfEternalBlossomsExpansion(),
instances = GetValeOfEternalBlossomsInstances(),
paths = {
[BZ["Mogu'shan Palace"]] = true,
[BZ["Kun-Lai Summit"]] = true,
[BZ["Siege of Orgrimmar"]] = true,
[BZ["Shrine of Two Moons"]] = true,
[BZ["Shrine of Seven Stars"]] = true,
[BZ["Ny'alotha"]] = true, -- Entrance can be either here or in Uldum
},
flightnodes = {
[1057] = true, -- Shrine of Seven Stars, Vale of Eternal Blossoms (A)
[1058] = true, -- Shrine of Two Moons, Vale of Eternal Blossoms (H)
[1073] = true, -- Serpent's Spine, Vale of Eternal Blossoms (N)
[2544] = true, -- Mistfall Village, Vale of Eternal Blossoms (N)
},
}
zones[BZ["Isle of Giants"]] = {
low = 35,
high = 35,
paths = {
[transports["ISLEOFGIANTS_KUNLAISUMMIT_FLIGHTPATH"]] = true,
},
continent = Pandaria,
expansion = Mists_of_Pandaria,
flightnodes = {
[1221] = true, -- Beeble's Wreck, Isle Of Giants (A)
[1222] = true, -- Bozzle's Wreck, Isle Of Giants (H)
},
}
zones[BZ["Isle of Thunder"]] = {
low = 32,
high = 35,
continent = Pandaria,
expansion = Mists_of_Pandaria,
instances = {
[BZ["Throne of Thunder"]] = true,
},
paths = {
[transports["ISLEOFTHUNDER_TOWNLONGSTEPPES_PORTAL"]] = true,
[BZ["Throne of Thunder"]] = true,
},
}
zones[BZ["Timeless Isle"]] = {
low = 30,
high = 35,
ct_low = 30,
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = {
[transports["TIMELESSISLE_JADEFOREST_FLIGHTPATH"]] = true,
},
flightnodes = {
[1293] = true, -- Tushui Landing, Timeless Isle (A)
[1294] = true, -- Huojin Landing, Timeless Isle (H)
},
}
-- Draenor cities, garrisons and zones --
zones[BZ["Warspear"]] = {
continent = Draenor,
expansion = Warlords_of_Draenor,
paths = {
[BZ["Ashran"]] = true,
[transports["WARSPEAR_ORGRIMMAR_PORTAL"]] = true,
[transports["WARSPEAR_TANAANJUNGLE_PORTAL"]] = true,
},
faction = "Horde",
type = "City",
}
zones[BZ["Stormshield"]] = {
continent = Draenor,
expansion = Warlords_of_Draenor,
paths = {
[BZ["Ashran"]] = true,
[transports["STORMSHIELD_STORMWIND_PORTAL"]] = true,
[transports["STORMSHIELD_TANAANJUNGLE_PORTAL"]] = true,
},
faction = "Alliance",
type = "City",
}
-- Alliance garrison
zones[BZ["Lunarfall"]] = {
low = 10,
high = 40,
ct_low = 10,
continent = Draenor,
expansion = Warlords_of_Draenor,
paths = {
[BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")"] = true,
[transports["LUNARFALL_STORMSHIELD_PORTAL"]] = true,
},
flightnodes = {
[1476] = true, -- Lunarfall (Alliance), Shadowmoon Valley (A)
},
faction = "Alliance",
yards = 683.334,
x_offset = 11696.5098,
y_offset = 9101.3333,
texture = "garrisonsmvalliance"
}
-- Horde garrison
zones[BZ["Frostwall"]] = {
low = 10,
high = 40,
ct_low = 10,
continent = Draenor,
expansion = Warlords_of_Draenor,
paths = {
[BZ["Frostfire Ridge"]] = true,
[transports["FROSTWALL_WARSPEAR_PORTAL"]] = true,
},
flightnodes = {
[1432] = true, -- Frostwall Garrison, Frostfire Ridge (H)
},
faction = "Horde",
yards = 702.08,
x_offset = 7356.9277,
y_offset = 5378.4173,
texture = "garrisonffhorde"
}
zones[BZ["Frostfire Ridge"]] = {
low = 10,
high = 40,
ct_low = 10,
continent = Draenor,
expansion = Warlords_of_Draenor,
instances = {
[BZ["Bloodmaul Slag Mines"]] = true,
},
paths = {
[BZ["Gorgrond"]] = true,
[BZ["Frostwall"]] = true,
[BZ["Bloodmaul Slag Mines"]] = true,
},
flightnodes = {
[1396] = true, -- Darkspear's Edge, Frostfire Ridge (H)
[1389] = true, -- Bloodmaul Slag Mines, Frostfire Ridge (N)
[1528] = true, -- Iron Siegeworks, Frostfire Ridge (A)
[1386] = true, -- Wor'gol, Frostfire Ridge (H)
[1390] = true, -- Stonefang Outpost, Frostfire Ridge (H)
[1559] = true, -- Wolf's Stand, Frostfire Ridge (H)
[1432] = true, -- Frostwall Garrison, Frostfire Ridge (H)
[1395] = true, -- Thunder Pass, Frostfire Ridge (H)
[1388] = true, -- Throm'Var, Frostfire Ridge (H)
[1387] = true, -- Bladespire Citadel, Frostfire Ridge (H)
},
}
zones[BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")"] = {
low = 10,
high = 40,
ct_low = 10,
continent = Draenor,
expansion = Warlords_of_Draenor,
instances = {
[BZ["Shadowmoon Burial Grounds"]] = true,
},
paths = {
[BZ["Talador"]] = true,
[BZ["Spires of Arak"]] = true,
[BZ["Tanaan Jungle"]] = true,
[BZ["Lunarfall"]] = true,
[BZ["Shadowmoon Burial Grounds"]] = true,
},
flightnodes = {
[1467] = true, -- The Draakorium, Shadowmoon Valley (A)
[1381] = true, -- Embaari Village, Shadowmoon Valley (A)
[1475] = true, -- Socrethar's Rise, Shadowmoon Valley (N)
[1569] = true, -- Akeeta's Hovel, Shadowmoon Valley (N)
[1468] = true, -- Elodor (Alliance), Shadowmoon Valley (A)
[1382] = true, -- Twilight Glade, Shadowmoon Valley (A)
[1476] = true, -- Lunarfall (Alliance), Shadowmoon Valley (A)
[1529] = true, -- Darktide Roost, Shadowmoon Valley (N)
[1383] = true, -- Path of the Light, Shadowmoon Valley (A)
[1567] = true, -- Temple of Karabor, Shadowmoon Valley (A)
[1556] = true, -- Tranquil Court, Shadowmoon Valley (A)
[1384] = true, -- Exile's Rise, Shadowmoon Valley (N)
},
}
zones[BZ["Gorgrond"]] = {
low = 15,
high = 40,
ct_low = 15,
continent = Draenor,
expansion = Warlords_of_Draenor,
instances = {
[BZ["Iron Docks"]] = true,
[BZ["Grimrail Depot"]] = true,
[BZ["The Everbloom"]] = true,
[BZ["Blackrock Foundry"]] = true,
},
paths = {
[BZ["Frostfire Ridge"]] = true,
[BZ["Talador"]] = true,
[BZ["Tanaan Jungle"]] = true,
[BZ["Iron Docks"]] = true,
[BZ["Grimrail Depot"]] = true,
[BZ["The Everbloom"]] = true,
[BZ["Blackrock Foundry"]] = true,
},
flightnodes = {
[1512] = true, -- Bastion Rise, Gorgrond (H)
[1580] = true, -- Everbloom Overlook, Gorgrond (N)
[1539] = true, -- Skysea Ridge, Gorgrond (N)
[1442] = true, -- Beastwatch, Gorgrond (H)
[1514] = true, -- Evermorn Springs, Gorgrond (H)
[1518] = true, -- Wildwood Wash, Gorgrond (A)
[1520] = true, -- Breaker's Crown, Gorgrond (N)
[1511] = true, -- Bastion Rise, Gorgrond (A)
[1524] = true, -- Iron Docks, Gorgrond (N)
[1519] = true, -- Highpass, Gorgrond (A)
[1523] = true, -- Deeproot, Gorgrond (A)
[1568] = true, -- Everbloom Wilds, Gorgrond (N)
},
}
zones[BZ["Talador"]] = {
low = 20,
high = 40,
ct_low = 20,
continent = Draenor,
expansion = Warlords_of_Draenor,
instances = {
[BZ["Auchindoun"]] = true,
},
paths = {
[BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")"] = true,
[BZ["Gorgrond"]] = true,
[BZ["Tanaan Jungle"]] = true,
[BZ["Spires of Arak"]] = true,
[BZ["Nagrand"].." ("..BZ["Draenor"]..")"] = true,
[BZ["Auchindoun"]] = true,
},
flightnodes = {
[1452] = true, -- Retribution Point, Talador (N)
[1441] = true, -- Frostwolf Overlook, Talador (H)
[1445] = true, -- Durotan's Grasp, Talador (H)
[1453] = true, -- Exarch's Refuge, Talador (A)
[1450] = true, -- Shattrath City, Talador (N)
[1454] = true, -- Exarch's Refuge, Talador (H)
[1443] = true, -- Vol'jin's Pride, Talador (H)
[1447] = true, -- Fort Wrynn (Alliance), Talador (A)
[1451] = true, -- Anchorite's Sojourn, Talador (A)
[1440] = true, -- Zangarra, Talador (N)
[1448] = true, -- Redemption Rise, Talador (A)
[1462] = true, -- Terokkar Refuge, Talador (N)
},
}
zones[BZ["Spires of Arak"]] = {
low = 30,
high = 40,
ct_low = 30,
continent = Draenor,
expansion = Warlords_of_Draenor,
instances = {
[BZ["Skyreach"]] = true,
[BZ["Blackrock Foundry"]] = true,
},
paths = {
[BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")"] = true,
[BZ["Talador"]] = true,
[BZ["Skyreach"]] = true,
[BZ["Blackrock Foundry"]] = true,
},
flightnodes = {
[1513] = true, -- Apexis Excavation, Spires of Arak (N)
[1510] = true, -- Pinchwhistle Gearworks, Spires of Arak (N)
[1493] = true, -- Southport, Spires of Arak (A)
[1515] = true, -- Crow's Crook, Spires of Arak (N)
[1487] = true, -- Axefall, Spires of Arak (H)
[1509] = true, -- Talon Watch, Spires of Arak (N)
[1508] = true, -- Veil Terokk, Spires of Arak (N)
},
}
zones[BZ["Nagrand"].." ("..BZ["Draenor"]..")"] = {
low = 35,
high = 40,
ct_low = 35,
continent = Draenor,
expansion = Warlords_of_Draenor,
instances = {
[BZ["Highmaul"]] = true,
[BZ["Blackrock Foundry"]] = true,
},
paths = {
[BZ["Talador"]] = true,
[BZ["Highmaul"]] = true,
[BZ["Blackrock Foundry"]] = true,
},
flightnodes = {
[1572] = true, -- Rilzit's Holdfast, Nagrand (N)
[1505] = true, -- Riverside Post, Nagrand (H)
[1573] = true, -- Nivek's Overlook, Nagrand (N)
[1502] = true, -- The Ring of Trials, Nagrand (N)
[1506] = true, -- Telaari Station, Nagrand (A)
[1574] = true, -- Joz's Rylaks, Nagrand (N)
[1503] = true, -- Throne of the Elements, Nagrand (N)
[1507] = true, -- Yrel's Watch, Nagrand (A)
[1504] = true, -- Wor'var, Nagrand (H)
},
}
zones[BZ["Tanaan Jungle"]] = {
low = 40,
high = 40,
ct_low = 40,
continent = Draenor,
expansion = Warlords_of_Draenor,
instances = {
[BZ["Hellfire Citadel"].." ("..BZ["Draenor"]..")"] = true,
},
paths = {
[BZ["Talador"]] = true,
[BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")"] = true,
[BZ["Gorgrond"]] = true,
[transports["TANAANJUNGLE_STORMSHIELD_PORTAL"]] = true,
[transports["TANAANJUNGLE_WARSPEAR_PORTAL"]] = true,
[BZ["Hellfire Citadel"].." ("..BZ["Draenor"]..")"] = true,
},
flightnodes = {
[1646] = true, -- Vault of the Earth, Tanaan Jungle (N)
[1643] = true, -- Aktar's Post, Tanaan Jungle (N)
[1647] = true, -- Malo's Lookout, Tanaan Jungle (N)
[1644] = true, -- The Iron Front, Tanaan Jungle (H)
[1620] = true, -- Lion's Watch, Tanaan Jungle (A)
[1645] = true, -- The Iron Front, Tanaan Jungle (A)
[1621] = true, -- Vol'mar, Tanaan Jungle (H)
[1648] = true, -- Sha'naari Refuge, Tanaan Jungle (N)
},
}
zones[BZ["Ashran"]] = {
low = 10,
high = 40,
continent = Draenor,
expansion = Warlords_of_Draenor,
type = "PvP Zone",
paths = {
[BZ["Warspear"]] = true,
[BZ["Stormshield"]] = true,
[transports["WARSPEAR_ORGRIMMAR_PORTAL"]] = true,
[transports["STORMSHIELD_STORMWIND_PORTAL"]] = true,
},
flightnodes = {
[1420] = true, -- Stormshield (Alliance), Ashran (A)
[1408] = true, -- Warspear, Ashran (H)
},
}
-- The Broken Isles cities and zones (Legion)
zones[BZ["Dalaran"].." ("..BZ["Broken Isles"]..")"] = {
continent = Broken_Isles,
expansion = Legion,
paths = {
[BZ["Violet Hold"]] = true,
[transports["DALARANBROKENISLES_STORMWIND_PORTAL"]] = true,
[transports["DALARANBROKENISLES_ORGRIMMAR_PORTAL"]] = true,
[transports["DALARANBROKENISLES_VINDICAAR_PORTAL"]] = true,
[transports["DALARANBROKENISLES_AZSUNA_FLIGHTPATH"]] = true,
[transports["DALARANBROKENISLES_BROKENSHORE_FLIGHTPATH"]] = true,
},
flightnodes = {
[1774] = true, -- Dalaran (N)
},
instances = {
[BZ["Violet Hold"]] = true,
},
faction = "Sanctuary",
type = "City",
}
zones[BZ["Thunder Totem"]] = {
continent = Broken_Isles,
expansion = Legion,
paths = {
[BZ["Highmountain"]] = true,
[BZ["Stormheim"]] = true,
},
flightnodes = {
[1719] = true, -- Thunder Totem, Highmountain (N)
},
faction = "Sanctuary",
type = "City",
}
zones[BZ["Azsuna"]] = {
low = 10,
high = 45,
ct_low = 10,
continent = Broken_Isles,
expansion = Legion,
instances = {
[BZ["Vault of the Wardens"]] = true,
[BZ["Eye of Azshara"]] = true,
},
paths = {
[BZ["Suramar"]] = true,
[BZ["Val'sharah"]] = true,
[transports["AZSUNA_STORMWIND_PORTAL"]] = true,
[transports["AZSUNA_ORGRIMMAR_PORTAL"]] = true,
[transports["AZSUNA_DALARANBROKENISLES_FLIGHTPATH"]] = true,
[BZ["Vault of the Wardens"]] = true,
[BZ["Eye of Azshara"]] = true,
},
flightnodes = {
[1861] = true, -- Illidari Perch, Azsuna (N)
[1633] = true, -- Shackle's Den, Azsuna (N)
[1622] = true, -- Illidari Stand, Azsuna (N)
[1615] = true, -- Challiane's Terrace, Azsuna (N)
[1859] = true, -- Felblaze Ingress, Azsuna (N)
[1837] = true, -- Wardens' Redoubt, Azsuna (N)
[1860] = true, -- Watchers' Aerie, Azsuna (N)
[1613] = true, -- Azurewing Repose, Azsuna (N)
[1870] = true, -- Eye of Azshara, Azsuna (N)
},
}
zones[BZ["Val'sharah"]] = {
low = 10,
high = 45,
ct_low = 10,
continent = Broken_Isles,
expansion = Legion,
instances = {
[BZ["Black Rook Hold"]] = true,
[BZ["Darkheart Thicket"]] = true,
[BZ["The Emerald Nightmare"]] = true,
-- [BZ["Ashamane's Fall"]] = true, -- Arena
-- [BZ["Black Rook Hold Arena"]] = true,
},
paths = {
[BZ["Suramar"]] = true,
[BZ["Azsuna"]] = true,
[BZ["Highmountain"]] = true,
[BZ["Black Rook Hold"]] = true,
[BZ["Darkheart Thicket"]] = true,
[BZ["The Emerald Nightmare"]] = true,
[transports["VALSHARAH_AMIRDRASSIL_PORTAL"]] = true,
},
flightnodes = {
[1713] = true, -- Bradensbrook, Val'sharah (N)
[1885] = true, -- Gloaming Reef, Val'sharah (N)
[1764] = true, -- Starsong Refuge, Val'sharah (N)
[1766] = true, -- Garden of the Moon, Val'sharah (N)
[1673] = true, -- Lorlathil, Val'sharah (N)
},
}
zones[BZ["Highmountain"]] = {
low = 10,
high = 45,
ct_low = 10,
continent = Broken_Isles,
expansion = Legion,
instances = {
[BZ["Neltharion's Lair"]] = true,
},
paths = {
[BZ["Suramar"]] = true,
[BZ["Stormheim"]] = true,
[BZ["Val'sharah"]] = true,
[BZ["Trueshot Lodge"]] = true,
[BZ["Thunder Totem"]] = true,
[BZ["Neltharion's Lair"]] = true,
},
flightnodes = {
[1767] = true, -- Nesingwary, Highmountain (N)
[1756] = true, -- Shipwreck Cove, Highmountain (N)
[1719] = true, -- Thunder Totem, Highmountain (N)
[1753] = true, -- Skyhorn, Highmountain (N)
[1761] = true, -- Prepfoot, Highmountain (N)
[1754] = true, -- The Witchwood, Highmountain (N)
[1758] = true, -- Obsidian Overlook, Highmountain (N)
[1777] = true, -- Sylvan Falls, Highmountain (N)
[1755] = true, -- Felbane Camp, Highmountain (N)
[1759] = true, -- Ironhorn Enclave, Highmountain (N)
[1778] = true, -- Stonehoof Watch, Highmountain (N)
},
}
zones[BZ["Stormheim"]] = {
low = 10,
high = 45,
ct_low = 10,
continent = Broken_Isles,
expansion = Legion,
instances = {
[BZ["Halls of Valor"]] = true,
[BZ["Helmouth Cliffs"]] = true,
},
paths = {
[BZ["Halls of Valor"]] = true,
[BZ["Helmouth Cliffs"]] = true,
[BZ["Suramar"]] = true,
[BZ["Highmountain"]] = true,
[BZ["Thunder Totem"]] = true,
},
flightnodes = {
[1857] = true, -- Stormtorn Foothills, Stormheim (N)
[1741] = true, -- Forsaken Foothold, Stormheim (H)
[1745] = true, -- Lorna's Watch, Stormheim (A)
[1738] = true, -- Cullen's Post, Stormheim (H)
[1742] = true, -- Valdisdall, Stormheim (N)
[1855] = true, -- Shield's Rest, Stormheim (N)
[1739] = true, -- Dreadwake's Landing, Stormheim (H)
[1863] = true, -- Hafr Fjall, Stormheim (N)
[1747] = true, -- Skyfire Triage Camp, Stormheim (A)
[1744] = true, -- Greywatch, Stormheim (A)
},
}
zones[BZ["Broken Shore"]] = {
low = 45,
high = 45,
ct_low = 45, -- ?
continent = Broken_Isles,
expansion = Legion,
paths = {
[BZ["Cathedral of Eternal Night"]] = true,
[transports["BROKENSHORE_DALARANBROKENISLES_FLIGHTPATH"]] = true,
},
instances = {
[BZ["Cathedral of Eternal Night"]] = true,
},
flightnodes = {
[1941] = true, -- Deliverance Point, Broken Shore (N)
[1942] = true, -- Aalgen Point, Broken Shore (N)
[1856] = true, -- Vengeance Point, Broken Shore (N)
[1906] = true, -- The Fel Hammer, Broken Shore (N), Demon Hunter Class Order Hall
},
}
zones[BZ["Suramar"]] = {
low = 45,
high = 45,
ct_low = 45,
continent = Broken_Isles,
expansion = Legion,
instances = {
[BZ["Court of Stars"]] = true,
[BZ["The Arcway"]] = true,
[BZ["The Nighthold"]] = true,
},
paths = {
[BZ["Azsuna"]] = true,
[BZ["Val'sharah"]] = true,
[BZ["Highmountain"]] = true,
[BZ["Stormheim"]] = true,
[BZ["Court of Stars"]] = true,
[BZ["The Arcway"]] = true,
[BZ["The Nighthold"]] = true,
},
flightnodes = {
[1879] = true, -- Crimson Thicket, Suramar (N)
[1880] = true, -- Irongrove Retreat, Suramar (N)
[1858] = true, -- Meredil, Suramar (N)
},
}
-- Hunter class hall. This map is reported by C_Map as a zone, unclear why
zones[BZ["Trueshot Lodge"]] = {
continent = Broken_Isles,
expansion = Legion,
paths = {
[BZ["Highmountain"]] = true,
},
faction = "Sanctuary",
}
-- Demon hunter starting zone, located in The Twisting Nether (between worlds)
zones[BZ["Mardum, the Shattered Abyss"]] = {
low = 8,
high = 45,
faction = "Sanctuary",
expansion = Legion,
}
-- Argus zones --
-- Ship, can be located in each of the Argus zones
zones[BZ["The Vindicaar"]] = {
low = 45,
high = 45,
ct_low = 45,
continent = Argus,
expansion = Legion,
paths = {
[transports["VINDICAAR_DALARANBROKENISLES_PORTAL"]] = true,
[transports["VINDICAAR_KROKUUN_TELEPORT"]] = true,
[transports["VINDICAAR_EREDATH_TELEPORT"]] = true,
[transports["VINDICAAR_ANTORANWASTES_TELEPORT"]] = true,
},
faction = "Sanctuary",
}
zones[BZ["Krokuun"]] = {
low = 45,
high = 45,
ct_low = 45,
continent = Argus,
expansion = Legion,
paths = {
[transports["KROKUUN_VINDICAAR_TELEPORT"]] = true,
[transports["KROKUUN_EREDATH_TELEPORT"]] = true,
[transports["KROKUUN_ANTORANWASTES_TELEPORT"]] = true,
},
flightnodes = {
[1976] = true, -- Destiny Point, Krokuun (N)
[1967] = true, -- Shattered Fields, Krokuun (N)
[1928] = true, -- Krokul Hovel, Krokuun (N)
},
}
zones[BZ["Antoran Wastes"]] = {
low = 45,
high = 45,
ct_low = 45,
continent = Argus,
expansion = Legion,
instances = {
[BZ["Antorus, the Burning Throne"]] = true,
},
paths = {
[transports["ANTORANWASTES_VINDICAAR_TELEPORT"]] = true,
[transports["ANTORANWASTES_KROKUUN_TELEPORT"]] = true,
[transports["ANTORANWASTES_EREDATH_TELEPORT"]] = true,
[BZ["Antorus, the Burning Throne"]] = true,
},
flightnodes = {
[1993] = true, -- The Veiled Den, Antoran Wastes (N)
[1988] = true, -- Hope's Landing, Antoran Wastes (N)
[1992] = true, -- Light's Purchase, Antoran Wastes (N)
},
}
zones[BZ["Eredath"]] = {
low = 45,
high = 45,
ct_low = 45,
continent = Argus,
expansion = Legion,
instances = {
[BZ["The Seat of the Triumvirate"]] = true,
},
paths = {
[BZ["The Seat of the Triumvirate"]] = true,
[transports["EREDATH_VINDICAAR_TELEPORT"]] = true,
[transports["EREDATH_KROKUUN_TELEPORT"]] = true,
[transports["EREDATH_ANTORANWASTES_TELEPORT"]] = true,
},
flightnodes = {
[2003] = true, -- City Center, Eredath (N)
[1991] = true, -- Prophet's Reflection, Eredath (N)
[1981] = true, -- Shadowguard Incursion, Eredath (N)
[1978] = true, -- Conservatory of the Arcane, Eredath (N)
[1982] = true, -- Triumvirate's End, Eredath (N)
},
}
-- WoW BFA zones
-- Zandalar cities and zones (Horde)
zones[BZ["Dazar'alor"]] = {
instances = {
[BZ["The MOTHERLODE!!"]] = true,
},
paths = {
[BZ["Zuldazar"]] = true,
[BZ["The MOTHERLODE!!"]] = true,
[transports["ZULDAZAR_ECHOISLES_BOAT"]] = true,
[transports["ZULDAZAR_ORGRIMMAR_PORTAL"]] = true,
[transports["ZULDAZAR_THUNDERBLUFF_PORTAL"]] = true,
[transports["ZULDAZAR_SILVERMOON_PORTAL"]] = true,
[transports["ZULDAZAR_SILITHUS_PORTAL"]] = true,
[transports["ZULDAZAR_NAZJATAR_PORTAL"]] = true,
[transports["ZULDAZAR_MECHAGON_BOAT"]] = true,
},
flightnodes = {
[2061] = true, -- The Sliver, Zuldazar (H)
[1959] = true, -- The Great Seal (H)
[1957] = true, -- Port of Zandalar, Zuldazar (H)
[2381] = true, -- The Mugambala, Zuldazar (H)
},
faction = "Horde",
continent = Zandalar,
expansion = Battle_for_Azeroth,
type = "City",
}
zones[BZ["Nazmir"]] = {
low = 25,
high = 50,
ct_low = 25,
instances = {
[BZ["The Underrot"]] = true,
[BZ["Uldir"]] = true,
},
paths = {
[BZ["Vol'dun"]] = true,
[BZ["Zuldazar"]] = true,
[BZ["The Underrot"]] = true,
[BZ["Uldir"]] = true,
},
flightnodes = {
[2161] = true, -- Redfield's Watch, Nazmir (A)
[2078] = true, -- Fort Victory, Nazmir (A)
[1955] = true, -- Gloom Hollow, Nazmir (H)
[2080] = true, -- Grimwatt's Crash, Nazmir (A)
[1956] = true, -- Forlorn Ruins, Nazmir (H)
[1953] = true, -- Zul'jan, Nazmir (H)
[1954] = true, -- Zo'bal Ruins, Nazmir (H)
},
faction = "Horde",
continent = Zandalar,
expansion = Battle_for_Azeroth,
}
zones[BZ["Vol'dun"]] = {
low = 35,
high = 50,
ct_low = 35,
instances = {
[BZ["Temple of Sethraliss"]] = true,
},
paths = {
[BZ["Nazmir"]] = true,
[BZ["Zuldazar"]] = true,
[BZ["Temple of Sethraliss"]] = true,
},
flightnodes = {
[2112] = true, -- Vulture's Nest, Vol'dun (A)
[2120] = true, -- Tortaka Refuge, Vol'dun (N)
[2162] = true, -- Devoted Sanctuary, Vol'dun (N)
[2143] = true, -- Scorched Sands Outpost, Vol'dun (H)
[2119] = true, -- Sanctuary of the Devoted, Vol'dun (N)
[2117] = true, -- Vulpera Hideaway, Vol'dun (H)
[2111] = true, -- Vorrik's Sanctum, Vol'dun (H)
[2118] = true, -- Temple of Akunda, Vol'dun (H)
[2144] = true, -- Goldtusk Inn, Vol'dun (H)
[2110] = true, -- Shatterstone Harbour, Vol'dun
},
faction = "Horde",
continent = Zandalar,
expansion = Battle_for_Azeroth,
}
zones[BZ["Zuldazar"]] = {
low = 10,
high = 50,
ct_low = 10,
instances = {
[BZ["The MOTHERLODE!!"]] = true,
[BZ["Atal'Dazar"]] = true,
[BZ["Kings' Rest"]] = true,
[BZ["Battle of Dazar'alor"]] = true,
[BZ["Mugambala"]] = true, -- Arena
},
paths = {
[BZ["Dazar'alor"]] = true,
[BZ["Nazmir"]] = true,
[BZ["Vol'dun"]] = true,
[BZ["Atal'Dazar"]] = true,
[BZ["Kings' Rest"]] = true,
[BZ["Battle of Dazar'alor"]] = true,
[BZ["Mugambala"]] = true, -- Arena
},
flightnodes = {
[1975] = true, -- Zeb'ahari, Zuldazar (H)
[2061] = true, -- The Sliver, Zuldazar (H)
[2009] = true, -- Warport Rastari, Zuldazar (H)
[2012] = true, -- Xibala, Zuldazar (A)
[2164] = true, -- Isle of Fangs, Zuldazar (H)
[2045] = true, -- Garden of the Loa, Zuldazar (H)
[2075] = true, -- Seeker's Outpost, Zuldazar (N)
[2145] = true, -- Verdant Hollow, Zuldazar (A)
[2147] = true, -- Castaway Encampment, Zuldazar (A)
[1959] = true, -- The Great Seal (H)
[2153] = true, -- Mistvine Ledge, Zuldazar (A)
[2126] = true, -- Scaletrader Post, Zuldazar (N)
[2066] = true, -- Atal'Gral, Zuldazar (N)
[2027] = true, -- Temple of the Prophet, Zuldazar (H)
[1966] = true, -- Warbeast Kraal, Zuldazar (H)
[2165] = true, -- Tusk Isle, Zuldazar (H)
[1965] = true, -- Nesingwary's Gameland, Zuldazar (N)
[2076] = true, -- Atal'Gral, Zuldazar (N)
[1957] = true, -- Port of Zandalar, Zuldazar (H)
[1974] = true, -- Xibala, Zuldazar (H)
[2071] = true, -- Dreadpearl, Zuldazar (N)
[2046] = true, -- Atal'dazar, Zuldazar (H)
[2148] = true, -- Mugamba Overlook, Zuldazar (A)
[2157] = true, -- Veiled Grotto, Zuldazar (A)
},
faction = "Horde",
continent = Zandalar,
expansion = Battle_for_Azeroth,
}
-- Kul Tiras cities and zones (Alliance)
zones[BZ["Boralus"]] = {
instances = {
[BZ["Hook Point"]] = true,
},
paths = {
[BZ["Tiragarde Sound"]] = true,
[transports["TIRAGARDESOUND_STORMWIND_BOAT"]] = true,
[transports["TIRAGARDESOUND_STORMWIND_PORTAL"]] = true,
[transports["TIRAGARDESOUND_EXODAR_PORTAL"]] = true,
[transports["TIRAGARDESOUND_IRONFORGE_PORTAL"]] = true,
[transports["TIRAGARDESOUND_SILITHUS_PORTAL"]] = true,
[transports["TIRAGARDESOUND_NAZJATAR_PORTAL"]] = true,
[transports["TIRAGARDESOUND_MECHAGON_FLIGHTPATH"]] = true,
[BZ["Hook Point"]] = true,
},
flightnodes = {
[2083] = true, -- Tradewinds Market, Tiragarde Sound (A)
[2277] = true, -- Proudmoore Keep, Tiragarde Sound (A)
[2278] = true, -- Mariner's Row, Tiragarde Sound (A)
},
faction = "Alliance",
continent = Kul_Tiras,
expansion = Battle_for_Azeroth,
type = "City",
}
zones[BZ["Stormsong Valley"]] = {
low = 35,
high = 50,
ct_low = 35,
instances = {
[BZ["Shrine of the Storm"]] = true,
[BZ["Crucible of Storms"]] = true,
},
paths = {
[BZ["Shrine of the Storm"]] = true,
[BZ["Tiragarde Sound"]] = true,
[BZ["Crucible of Storms"]] = true,
},
flightnodes = {
[2101] = true, -- The Amber Waves, Stormsong Valley (A)
[2094] = true, -- Warfang Hold, Stormsong Valley (H)
[2095] = true, -- Shrine of the Storm, Stormsong Valley (H)
[2088] = true, -- Mildenhall Meadery, Stormsong Valley (A)
[2089] = true, -- Seekers Vista, Stormsong Valley (N)
[2097] = true, -- Deadwash, Stormsong Valley (A)
[2093] = true, -- Ironmaul Overlook, Stormsong Valley (H)
[2092] = true, -- Diretusk Hollow, Stormsong Valley (H)
[2133] = true, -- Shrine of the Storm, Stormsong Valley (A)
[2137] = true, -- Millstone Hamlet, Stormsong Valley (A)
[2085] = true, -- Tidecross, Stormsong Valley (A)
[2138] = true, -- Fort Daelin, Stormsong Valley (A)
[2086] = true, -- Brennadam, Stormsong Valley (A)
[2139] = true, -- Windfall Cavern, Stormsong Valley (H)
[2090] = true, -- Hillcrest Pasture, Stormsong Valley (H)
[2091] = true, -- Stonetusk Watch, Stormsong Valley (H)
},
faction = "Alliance",
continent = Kul_Tiras,
expansion = Battle_for_Azeroth,
}
zones[BZ["Drustvar"]] = {
low = 25,
high = 50,
ct_low = 25,
instances = {
[BZ["Waycrest Manor"]] = true,
},
paths = {
[BZ["Tiragarde Sound"]] = true,
[BZ["Waycrest Manor"]] = true,
},
flightnodes = {
[2037] = true, -- Barbthorn Ridge, Drustvar (A)
[2109] = true, -- Whitegrove Chapel, Drustvar (N)
[2034] = true, -- Hangman's Point, Drustvar (A)
[2127] = true, -- Anyport, Drustvar (N)
[2135] = true, -- Krazzlefrazz Outpost, Drustvar (H)
[2106] = true, -- Arom's Stand, Drustvar (A)
[2107] = true, -- Watchman's Rise, Drustvar (A)
[2033] = true, -- Fallhaven, Drustvar (A)
[2108] = true, -- Falconhurst, Drustvar (A)
[2035] = true, -- Fletcher's Hollow, Drustvar (A)
[2275] = true, -- Mudfisher Cove, Drustvar (H)
[2274] = true, -- Swiftwind Post, Drustvar (H)
},
faction = "Alliance",
continent = Kul_Tiras,
expansion = Battle_for_Azeroth,
}
zones[BZ["Tiragarde Sound"]] = {
low = 10,
high = 50,
ct_low = 10,
instances = {
[BZ["Tol Dagor"]] = true,
[BZ["Freehold"]] = true,
[BZ["Siege of Boralus"]] = true,
},
paths = {
[BZ["Boralus"]] = true,
[BZ["Drustvar"]] = true,
[BZ["Stormsong Valley"]] = true,
[BZ["Tol Dagor"]] = true,
[BZ["Freehold"]] = true,
[BZ["Siege of Boralus"]] = true,
},
flightnodes = {
[2079] = true, -- Kennings Lodge, Tiragarde Sound (A)
[2102] = true, -- Roughneck Camp, Tiragarde Sound (A)
[2096] = true, -- Tol Dagor, Tiragarde Sound (A)
[2023] = true, -- Freehold, Tiragarde Sound (N)
[2276] = true, -- Tol Dagor, Tiragarde Sound (H)
[2074] = true, -- Bridgeport, Tiragarde Sound (A)
[2277] = true, -- Proudmoore Keep, Tiragarde Sound (A)
[2060] = true, -- Hatherford, Tiragarde Sound (A)
[2278] = true, -- Mariner's Row, Tiragarde Sound (A)
[2087] = true, -- Outrigger Post, Tiragarde Sound (A)
[2084] = true, -- Norwington Estate, Tiragarde Sound (A)
[2077] = true, -- Castaway Point, Tiragarde Sound (N)
[2083] = true, -- Tradewinds Market, Tiragarde Sound (A)
[2273] = true, -- Waning Glacier, Tiragarde Sound (H)
[2042] = true, -- Vigil Hill, Tiragarde Sound (A)
[2279] = true, -- Stonefist Watch, Tiragarde Sound (H)
[2062] = true, -- Wolf's Den, Tiragarde Sound (H)
[2140] = true, -- Plunder Harbour, Tiragarde Sound (H)
[2067] = true, -- Timberfell Outpost, Tiragarde Sound (H)
},
faction = "Alliance",
continent = Kul_Tiras,
expansion = Battle_for_Azeroth,
}
-- Patch 8.2.0 zones
zones[BZ["Nazjatar"]] = {
low = 50,
high = 50,
ct_low = 50,
instances = {
[BZ["The Eternal Palace"]] = true,
},
paths = {
[transports["NAZJATAR_ZULDAZAR_PORTAL"]] = true,
[transports["NAZJATAR_TIRAGARDESOUND_PORTAL"]] = true,
[BZ["The Eternal Palace"]] = true,
},
flightnodes = {
[2404] = true, -- Newhome, Nazjatar (H)
[2406] = true, -- Elun'alor Temple, Nazjatar (A)
[2408] = true, -- Mezzamere, Nazjatar (A)
[2405] = true, -- Zin'Azshari, Nazjatar (H)
[2409] = true, -- Wreck of the Old Blanchy, Nazjatar (A)
[2407] = true, -- Utama's Stand, Nazjatar (A)
[2412] = true, -- Wreck of the Hungry Riverbeast, Nazjatar (H)
[2411] = true, -- Ashen Strand, Nazjatar (A)
[2410] = true, -- Ashen Strand, Nazjatar (H)
[2437] = true, -- Ekka's Hideaway, Nazjatar (H)
},
continent = Azeroth,
expansion = Battle_for_Azeroth,
}
zones[BZ["Mechagon Island"]] = {
low = 50,
high = 50,
ct_low = 50,
paths = {
[transports["MECHAGON_ZULDAZAR_BOAT"]] = true,
[transports["MECHAGON_TIRAGARDESOUND_FLIGHTPATH"]] = true,
[BZ["Mechagon"]] = true, -- Operation: Mechagon (no map for this name in C_Map?)
-- [BZ["The Robodrome"]] = true, -- Arena
},
instances = {
[BZ["Mechagon"]] = true, -- Operation: Mechagon (no map for this name in C_Map?)
-- [BZ["The Robodrome"]] = true, -- Arena
},
flightnodes = {
[2441] = true, -- Prospectus Bay, Mechagon (H)
[2442] = true, -- Overspark Expedition Camp, Mechagon (A)
},
continent = Kul_Tiras,
expansion = Battle_for_Azeroth,
}
-- Shadowlands zones
-- New contested starting zone, an island located in North Sea, to the northeast of the Broken Isles
-- and in between Northrend and Lordaeron.
zones[BZ["Exile's Reach"]] = {
low = 1,
high = 10,
instances = {
[BZ["Darkmaul Citadel"]] = true,
},
paths = {
[BZ["Darkmaul Citadel"]] = true,
},
-- Unlear what these flight nodes are. Alliance only, with only one flight path, connecting them to each other. Don't show up on map.
flightnodes = {
[2401] = true, -- Ogre Citadel, Exile's Reach Island
[2402] = true, -- Alliance Outpost, Exile's Reach
},
-- continent = ??, -- No continent
expansion = Shadowlands,
faction = (isHorde and "Horde" or "Alliance"), -- Always friendly: zone exists for both factions separately
}
-- Starting zone dungeon
zones[BZ["Darkmaul Citadel"]] = {
low = 7,
high = 10,
paths = BZ["Exile's Reach"],
groupMinSize = 1,
groupMaxSize = 5,
type = "Instance",
--entrancePortal = { BZ["Exile's Reach"], 0, 0 }, -- No entrance portal (must use group finder)
-- continent = ??, -- No continent
expansion = Shadowlands,
faction = (isHorde and "Horde" or "Alliance"), -- Always friendly: zone exists for both factions separately
}
-- 10565
zones[BZ["Oribos"]] = {
instances = {
[BZ["Tazavesh, the Veiled Market"]] = true,
},
paths = {
[transports["ORIBOS_ORGRIMMAR_PORTAL"]] = true,
[transports["ORIBOS_STORMWIND_PORTAL"]] = true,
[transports["ORIBOS_MAW_PORTAL"]] = true,
[transports["ORIBOS_KORTHIA_WAYSTONE"]] = true,
[transports["ORIBOS_BASTION_FLIGHTPATH"]] = true,
[transports["ORIBOS_MALDRAXXUS_FLIGHTPATH"]] = true,
[transports["ORIBOS_ARDENWEALD_FLIGHTPATH"]] = true,
[transports["ORIBOS_REVENDRETH_FLIGHTPATH"]] = true,
[transports["ORIBOS_TAZAVESH_FLIGHTPATH"]] = true,
[transports["ORIBOS_ZERETHMORTIS_WAYSTONE"]] = true,
[transports["ORIBOS_MECHANGON_PORTAL"]] = true,
[transports["ORIBOS_KARAZHAN_PORTAL"]] = true,
[transports["ORIBOS_GORGROND_PORTAL"]] = true,
},
flightnodes = {
[2395] = true, -- Oribos
},
type = "City",
faction = "Sanctuary",
continent = The_Shadowlands,
expansion = Shadowlands,
}
-- 10413
zones[BZ["Bastion"]] = {
low = 50,
high = 52,
instances = {
[BZ["The Necrotic Wake"]] = true,
[BZ["Spires of Ascension"]] = true,
},
paths = {
[transports["BASTION_ORIBOS_FLIGHTPATH"]] = true,
[transports["BASTION_ELYSIANHOLD_FLIGHTPATH"]] = true,
[BZ["The Necrotic Wake"]] = true,
[BZ["Spires of Ascension"]] = true,
},
flightnodes = {
[2519] = true, -- Aspirant's Rest, Bastion
[2630] = true, -- Aspirant's Rest, Bastion
[2520] = true, -- Sagehaven, Bastion
[2632] = true, -- Sagehaven, Bastion
[2528] = true, -- Elysian Hold, Bastion
[2625] = true, -- Elysian Hold, Bastion
[2529] = true, -- Hero's Rest, Bastion
[2626] = true, -- Hero's Rest, Bastion
[2631] = true, -- Xandria's Vigil, Bastion
[2633] = true, -- Temple of Purity, Bastion
[2634] = true, -- Seat of Eternal Hymns, Bastion
[2635] = true, -- Temple of Humility, Bastion
[2636] = true, -- Eonian Archives, Bastion
[2680] = true, -- Eonian Archives, Bastion
[2637] = true, -- Summoned Steward, Bastion
},
continent = The_Shadowlands,
expansion = Shadowlands,
}
-- Kyrain Covenant Sanctum
zones[BZ["Elysian Hold"]] = {
paths = {
[transports["ELYSIANHOLD_BASTION_FLIGHTPATH"]] = true,
},
flightnodes = {
[2528] = true, -- Elysian Hold, Bastion
[2625] = true, -- Elysian Hold, Bastion
},
faction = "Sanctuary",
continent = The_Shadowlands,
expansion = Shadowlands,
}
-- 11462
zones[BZ["Maldraxxus"]] = {
low = 52,
high = 54,
instances = {
[BZ["Plaguefall"]] = true,
[BZ["Theater of Pain"]] = true,
},
paths = {
[transports["MALDRAXXUS_ORIBOS_FLIGHTPATH"]] = true,
[BZ["Seat of the Primus"]] = true,
[BZ["Plaguefall"]] = true,
[BZ["Theater of Pain"]] = true,
},
flightnodes = {
[2398] = true, -- Bleak Redoubt, Maldraxxus
[2560] = true, -- Keres' Rest, Maldraxxus
[2569] = true, -- Plague Watch, Maldraxxus
[2561] = true, -- Renounced Bastille, Maldraxxus
[2559] = true, -- Spider's Watch, Maldraxxus
[2558] = true, -- The Spearhead, Maldraxxus
[2643] = true, -- Theater of Pain North, Maldraxxus
[2564] = true, -- Theater of Pain, Maldraxxus
},
continent = The_Shadowlands,
expansion = Shadowlands,
}
-- Necrolord Covenant Sanctum
zones[BZ["Seat of the Primus"]] = {
paths = {
[BZ["Maldraxxus"]] = true,
},
faction = "Sanctuary",
continent = The_Shadowlands,
expansion = Shadowlands,
}
-- 11510
zones[BZ["Ardenweald"]] = {
low = 55,
high = 58,
instances = {
[BZ["Mists of Tirna Scithe"]] = true,
[BZ["De Other Side"]] = true,
},
paths = {
[transports["ARDENWEALD_ORIBOS_FLIGHTPATH"]] = true,
[BZ["Heart of the Forest"]] = true,
[BZ["Mists of Tirna Scithe"]] = true,
[BZ["De Other Side"]] = true,
},
flightnodes = {
[2530] = true, -- Dreamsong Fenn, Ardenweald
[2565] = true, -- Starlit Overlook, Ardenweald
[2589] = true, -- Claw's Edge, Ardenweald
[2584] = true, -- Glitterfall Basin, Ardenweald
[2587] = true, -- Heart of the Forest, Ardenweald
[2586] = true, -- Hibernal Hollow, Ardenweald
[2590] = true, -- Refugee Camp, Ardenweald
[2588] = true, -- Root-Home, Ardenweald
[2585] = true, -- Tirna Vaal, Ardenweald
},
continent = The_Shadowlands,
expansion = Shadowlands,
}
-- Night Fae Covenant Sanctum
zones[BZ["Heart of the Forest"]] = {
paths = {
[BZ["Ardenweald"]] = true,
},
flightnodes = {
[2587] = true, -- Heart of the Forest, Ardenweald
},
faction = "Sanctuary",
continent = The_Shadowlands,
expansion = Shadowlands,
}
-- 10413
zones[BZ["Revendreth"]] = {
low = 57,
high = 60,
instances = {
[BZ["Halls of Atonement"]] = true,
[BZ["Sanguine Depths"]] = true,
[BZ["Castle Nathria"]] = true,
},
paths = {
[transports["REVENDRETH_ORIBOS_FLIGHTPATH"]] = true,
[BZ["Sinfall"]] = true,
[BZ["Halls of Atonement"]] = true,
[BZ["Sanguine Depths"]] = true,
[BZ["Castle Nathria"]] = true,
},
flightnodes = {
[2537] = true, -- Charred Ramparts, Revendreth
[2488] = true, -- Darkhaven, Revendreth
[2515] = true, -- Dominance Keep, Revendreth
[2512] = true, -- Halls of Atonement, Revendreth
[2517] = true, -- Menagerie of the Master, Revendreth
[2513] = true, -- Old Gate, Revendreth
[2514] = true, -- Pridefall Hamlet, Revendreth
[2511] = true, -- Sanctuary of the Mad, Revendreth
[2548] = true, -- Sinfall, Revendreth
[2518] = true, -- Wanecrypt Hill, Revendreth
},
continent = The_Shadowlands,
expansion = Shadowlands,
}
-- Venthyr Covenant Sanctum
zones[BZ["Sinfall"]] = {
paths = {
[BZ["Revendreth"]] = true,
},
flightnodes = {
[2548] = true, -- Sinfall, Revendreth
},
faction = "Sanctuary",
continent = The_Shadowlands,
expansion = Shadowlands,
}
zones[BZ["The Maw"]] = {
low = 60,
high = 60,
instances = {
[BZ["Sanctum of Domination"]] = true,
},
continent = The_Shadowlands,
expansion = Shadowlands,
paths = {
[transports["MAW_ORIBOS_WAYSTONE"]] = true,
[BZ["Sanctum of Domination"]] = true,
[BZ["Korthia"]] = true,
},
flightnodes = {
[2700] = true, -- Ve'nari's Refuge
},
}
-- Korthia, City of Secrets
zones[BZ["Korthia"]] = {
low = 60,
high = 60,
continent = The_Shadowlands,
expansion = Shadowlands,
paths = {
[transports["KORTHIA_ORIBOS_WAYSTONE"]] = true,
[BZ["The Maw"]] = true,
},
flightnodes = {
[2698] = true, -- Keeper's Respite
},
}
-- 13536
zones[BZ["Zereth Mortis"]] = {
low = 60,
high = 60,
instances = {
[BZ["Sepulcher of the First Ones"]] = true,
[BZ["Enigma Crucible"]] = true,
},
paths = {
[transports["ZERETHMORTIS_ORIBOS_WAYSTONE"]] = true,
[BZ["Sepulcher of the First Ones"]] = true,
[BZ["Enigma Crucible"]] = true,
},
flightnodes = {
[2724] = true, -- Haven, Zereth Mortis
[2728] = true, -- Pilgrim's Grace, Zereth Mortis
[2725] = true, -- Faith's Repose, Zereth Mortis
[2737] = true, -- Sepulcher Of The First Ones, Zereth Mortis
[2734] = true, -- Antecedent Isle, Zereth Mortis
[2733] = true, -- Zovaal's Grasp, Zereth Mortis
[2736] = true, -- Sepulcher Overlook, Zereth Mortis
},
continent = The_Shadowlands,
expansion = Shadowlands,
}
-- DragonFlight zones
-- 13862
zones[BZ["Valdrakken"]] = {
paths = {
[BZ["Thaldraszus"]] = true,
[transports["VALDRAKKEN_ORGRIMMAR_PORTAL"]] = true,
[transports["VALDRAKKEN_STORMWIND_PORTAL"]] = true,
[transports["VALDRAKKEN_SHADOWMOONDRAENOR_PORTAL"]] = true,
[transports["VALDRAKKEN_DALARANBROKENISLES_PORTAL"]] = true,
[transports["VALDRAKKEN_JADEFOREST_PORTAL"]] = true,
},
flightnodes = {
[2810] = true, -- Valdrakken, Thaldraszus (N)
},
type = "City",
faction = "Sanctuary",
continent = Dragon_Isles,
expansion = DragonFlight,
}
-- 13644
zones[BZ["The Waking Shores"]] = {
low = 60,
high = 62,
instances = {
[BZ["Neltharus"]] = true,
[BZ["Ruby Life Pools"]] = true,
},
paths = {
[BZ["Ohn'ahran Plains"]] = true,
[BZ["Neltharus"]] = true,
[BZ["Ruby Life Pools"]] = true,
[transports["WAKINGSHORES_ORGRIMMAR_ZEPPELIN"]] = true,
[transports["WAKINGSHORES_STORMWIND_BOAT"]] = true,
},
flightnodes = {
[2800] = true, -- Apex Canopy, The Waking Shores (N)
[2801] = true, -- Apex Observatory, The Waking Shores (N)
[2802] = true, -- Obsidian Throne, The Waking Shores (N)
[2803] = true, -- Uktulut Pier, The Waking Shores (N)
[2804] = true, -- Uktulut Backwater, The Waking Shores (N)
[2805] = true, -- Wingrest Embassy, The Waking Shores (N)
[2806] = true, -- Life Vault Ruins, The Waking Shores (N)
[2807] = true, -- Ruby Life Pools, The Waking Shores (N)
[2808] = true, -- Obsidian Bulwark, The Waking Shores (N)
[2809] = true, -- Dragonscale Basecamp, The Waking Shores (N)
[2817] = true, -- Skytop Observatory, The Waking Shores (N)
[2842] = true, -- Rubyscale Outpost, The Waking Shores (N)
},
continent = Dragon_Isles,
expansion = DragonFlight,
}
-- 13645
zones[BZ["Ohn'ahran Plains"]] = {
low = 62,
high = 65,
instances = {
[BZ["The Nokhud Offensive"]] = true,
},
paths = {
[BZ["The Waking Shores"]] = true,
[BZ["The Azure Span"]] = true,
[BZ["The Nokhud Offensive"]] = true,
[BZ["Zaralek Cavern"]] = true,
[BZ["Amirdrassil"]] = true,
[transports["OHNAHRANPLAINS_EMERALDDREAM_PORTAL"]] = true,
},
flightnodes = {
[2790] = true, -- Timberstep Outpost, Ohn'ahran Plains (N)
[2792] = true, -- Maruukai, Ohn'ahran Plains (N)
[2793] = true, -- Forkriver Crossing, Ohn'ahran Plains (N)
[2794] = true, -- Teerakai, Ohn'ahran Plains (N)
[2795] = true, -- Broadhoof Outpost, Ohn'ahran Plains (N)
[2796] = true, -- Shady Sanctuary, Ohn'ahran Plains (N)
[2797] = true, -- Emberwatch, Ohn'ahran Plains (N)
[2798] = true, -- Pinewood Post, Ohn'ahran Plains (N)
[2799] = true, -- Rusza'thar Reach, Ohn'ahran Plains (N)
[2825] = true, -- Ohn'iri Springs, Ohn'ahran Plains (N)
[2839] = true, -- Rusza'thar Reach, Ohn'ahran Plains (N)
},
continent = Dragon_Isles,
expansion = DragonFlight,
}
-- 13646
zones[BZ["The Azure Span"]] = {
low = 65,
high = 68,
instances = {
[BZ["The Azure Vault"]] = true,
[BZ["Brackenhide Hollow"]] = true,
},
paths = {
[BZ["Ohn'ahran Plains"]] = true,
[BZ["Thaldraszus"]] = true,
[BZ["The Azure Vault"]] = true,
[BZ["Brackenhide Hollow"]] = true,
[BZ["Zaralek Cavern"]] = true,
},
flightnodes = {
[2773] = true, -- Azure Archives, Azure Span (N)
[2774] = true, -- Camp Antonidas, Azure Span (N)
[2775] = true, -- Iskaara, Azure Span (N)
[2784] = true, -- Camp Nowhere, Azure Span (N)
[2786] = true, -- Rhonin's Shield, Azure Span (N)
[2787] = true, -- Cobalt Assembly, Azure Span (N)
[2788] = true, -- Theron's Watch, Azure Span (N)
[2789] = true, -- Three-Falls Lookout, Azure Span (N)
[2838] = true, -- Cobalt Assembly, Azure Span (N)
[2837] = true, -- Vakthros, Azure Span (Neutral)
},
continent = Dragon_Isles,
expansion = DragonFlight,
}
-- 13647
zones[BZ["Thaldraszus"]] = {
low = 68,
high = 70,
instances = {
[BZ["Algeth'ar Academy"]] = true,
[BZ["Halls Of Infusion"]] = true,
[BZ["Vault of the Incarnates"]] = true,
[BZ["Dawn of the Infinite"]] = true,
},
paths = {
[BZ["Valdrakken"]] = true,
[BZ["The Azure Span"]] = true,
[BZ["Algeth'ar Academy"]] = true,
[BZ["Halls Of Infusion"]] = true,
[BZ["Vault of the Incarnates"]] = true,
[BZ["Dawn of the Infinite"]] = true,
},
flightnodes = {
[2810] = true, -- Valdrakken, Thaldraszus (N)
[2811] = true, -- Gelikyr Post, Thaldraszus (N)
[2812] = true, -- Temporal Conflux, Thaldraszus (N)
[2814] = true, -- Veiled Ossuary, Thaldraszus (N)
[2813] = true, -- Algeth'era, Thaldraszus (N)
[2815] = true, -- Garden Shrine, Thaldraszus (N)
[2816] = true, -- Shifting Sands, Thaldraszus (N)
[2818] = true, -- Vault of the Incarnates, Thaldraszus (N)
[2836] = true, -- Algeth'era, Thaldraszus (Neutral)
},
continent = Dragon_Isles,
expansion = DragonFlight,
}
-- 10.0.7
-- Previously: Dracthyr Evokers starting zone (UIMapID 2026)
zones[BZ["The Forbidden Reach"]] = {
low = 70,
high = 70,
flightnodes = {
[2855] = true, -- Morqut Village, The Forbidden Reach (N)
[2862] = true, -- Morqut Islet, Forbidden Reach (Neutral)
},
continent = Dragon_Isles,
expansion = DragonFlight,
}
-- 10.1.0
-- 14022
zones[BZ["Zaralek Cavern"]] = {
low = 70,
high = 70,
instances = {
[BZ["Aberrus, the Shadowed Crucible"]] = true,
},
paths = {
[BZ["Ohn'ahran Plains"]] = true,
[BZ["The Azure Span"]] = true,
[BZ["Aberrus, the Shadowed Crucible"]] = true,
},
flightnodes = {
[2864] = true, -- Obsidian Rest, Zaralek Cavern (Neutral)
[2865] = true, -- Dragonscale Camp, Zaralek Cavern (Neutral)
[2863] = true, -- Loamm, Zaralek Cavern (Neutral)
},
continent = Dragon_Isles,
expansion = DragonFlight,
}
-- 10.2.0
-- 14529
zones[BZ["Emerald Dream"]] = {
low = 70,
high = 70,
instances = {
[BZ["Amirdrassil, the Dream's Hope"]] = true,
},
paths = {
[transports["EMERALDDREAM_OHNAHRANPLAINS_PORTAL"]] = true,
[BZ["Amirdrassil, the Dream's Hope"]] = true,
},
flightnodes = {
[2902] = true, -- Central Encampment, The Emerald Dream (Neutral)
[2903] = true, -- Verdant Landing, The Emerald Dream (Neutral)
[2904] = true, -- Eye of Ysera, The Emerald Dream (Neutral)
[2905] = true, -- Wellspring Overlook, The Emerald Dream (Neutral)
},
continent = Dragon_Isles,
expansion = DragonFlight,
}
-- 10.2.5
-- 14969
zones[BZ["Amirdrassil"]] = {
low = 70,
high = 70,
-- instances = {
-- [BZ["Aberrus, the Shadowed Crucible"]] = true,
-- },
paths = {
[transports["AMIRDRASSIL_STORMWIND_PORTAL"]] = true,
[transports["AMIRDRASSIL_DARKSHORE_PORTAL"]] = true,
[transports["AMIRDRASSIL_MOUNTHYJAL_PORTAL"]] = true,
[transports["AMIRDRASSIL_VALSHARAH_PORTAL"]] = true,
[transports["AMIRDRASSIL_FERALAS_PORTAL"]] = true,
[BZ["Ohn'ahran Plains"]] = true,
},
flightnodes = {
[2915] = true, -- Bel'ameth, Amirdrassil (Neutral)
},
continent = Dragon_Isles,
expansion = DragonFlight,
}
-- ============= DUNGEONS ===============
-- Classic dungeons --
zones[BZ["Ragefire Chasm"]] = {
low = 7,
high = 30,
ct_low = 7,
continent = Kalimdor,
expansion = Classic,
paths = BZ["Orgrimmar"],
groupSize = 5,
faction = "Horde",
type = "Instance",
entrancePortal = { BZ["Orgrimmar"], 52.8, 49 },
}
zones[BZ["The Deadmines"]] = {
low = 7,
high = 30,
ct_low = 7,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = BZ["Westfall"],
groupSize = 5,
faction = "Alliance",
type = "Instance",
entrancePortal = { BZ["Westfall"], 42.6, 72.2 },
}
zones[BZ["Shadowfang Keep"]] = {
low = 8,
high = 30,
ct_low = 8,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = BZ["Silverpine Forest"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Silverpine Forest"], 44.80, 67.83 },
}
zones[BZ["Wailing Caverns"]] = {
low = 8,
high = 30,
ct_low = 8,
continent = Kalimdor,
expansion = Classic,
paths = BZ["Northern Barrens"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Northern Barrens"], 42.1, 66.5 },
}
zones[BZ["Blackfathom Deeps"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Kalimdor,
expansion = Classic,
paths = BZ["Ashenvale"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Ashenvale"], 14.6, 15.3 },
}
zones[BZ["The Stockade"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = BZ["Stormwind City"],
groupSize = 5,
faction = "Alliance",
type = "Instance",
entrancePortal = { BZ["Stormwind City"], 50.5, 66.3 },
}
zones[BZ["Gnomeregan"]] = {
low = 10,
high = 30,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = BZ["Dun Morogh"],
groupSize = 5,
faction = "Alliance",
type = "Instance",
entrancePortal = { BZ["Dun Morogh"], 24, 38.9 },
}
zones[BZ["Scarlet Halls"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = BZ["Tirisfal Glades"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Tirisfal Glades"], 84.9, 35.3 },
}
zones[BZ["Scarlet Monastery"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = BZ["Tirisfal Glades"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Tirisfal Glades"], 85.3, 32.1 },
}
zones[BZ["Razorfen Kraul"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Kalimdor,
expansion = Classic,
paths = BZ["Southern Barrens"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Southern Barrens"], 40.8, 94.5 },
}
-- consists of The Wicked Grotto, Foulspore Cavern and Earth Song Falls
zones[BZ["Maraudon"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Kalimdor,
expansion = Classic,
paths = BZ["Desolace"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Desolace"], 29, 62.4 },
}
zones[BZ["Razorfen Downs"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Kalimdor,
expansion = Classic,
paths = BZ["Thousand Needles"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Thousand Needles"], 47.5, 23.7 },
}
zones[BZ["Uldaman"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = BZ["Badlands"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Badlands"], 42.4, 18.6 },
}
-- a.k.a. Warpwood Quarters
zones[BZ["Dire Maul - East"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Kalimdor,
expansion = Classic,
paths = BZ["Dire Maul"],
groupSize = 5,
type = "Instance",
complex = BZ["Dire Maul"],
entrancePortal = { BZ["Feralas"], 66.7, 34.8 },
}
-- a.k.a. Capital Gardens
zones[BZ["Dire Maul - West"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Kalimdor,
expansion = Classic,
paths = BZ["Dire Maul"],
groupSize = 5,
type = "Instance",
complex = BZ["Dire Maul"],
entrancePortal = { BZ["Feralas"], 60.3, 30.6 },
}
-- a.k.a. Gordok Commons
zones[BZ["Dire Maul - North"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Kalimdor,
expansion = Classic,
paths = BZ["Dire Maul"],
groupSize = 5,
type = "Instance",
complex = BZ["Dire Maul"],
entrancePortal = { BZ["Feralas"], 62.5, 24.9 },
}
zones[BZ["Scholomance"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = BZ["Western Plaguelands"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Western Plaguelands"], 69.4, 72.8 },
}
-- consists of Main Gate and Service Entrance
zones[BZ["Stratholme"]] = {
low = 15,
high = 30,
ct_low = 15, -- Note: 20 for Service Entrance?
continent = Eastern_Kingdoms,
expansion = Classic,
paths = BZ["Eastern Plaguelands"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Eastern Plaguelands"], 30.8, 14.4 },
}
zones[BZ["Zul'Farrak"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Kalimdor,
expansion = Classic,
paths = BZ["Tanaris"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Tanaris"], 36, 11.7 },
}
-- consists of Detention Block and Upper City
zones[BZ["Blackrock Depths"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = {
[BZ["Molten Core"]] = true,
[BZ["Blackrock Mountain"]] = true,
},
groupSize = 5,
type = "Instance",
complex = BZ["Blackrock Mountain"],
entrancePortal = { BZ["Searing Gorge"], 35.4, 84.4 },
}
-- a.k.a. Sunken Temple
zones[BZ["The Temple of Atal'Hakkar"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = BZ["Swamp of Sorrows"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Swamp of Sorrows"], 70, 54 },
}
-- a.k.a. Lower Blackrock Spire
zones[BZ["Blackrock Spire"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = {
[BZ["Blackrock Mountain"]] = true,
[BZ["Blackwing Lair"]] = true,
[BZ["Blackwing Descent"]] = true,
},
groupSize = 5,
type = "Instance",
complex = BZ["Blackrock Mountain"],
entrancePortal = { BZ["Burning Steppes"], 29.7, 37.5 },
}
-- Burning Crusade dungeons (Outland) --
zones[BZ["Hellfire Ramparts"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Hellfire Citadel"],
groupSize = 5,
type = "Instance",
complex = BZ["Hellfire Citadel"],
entrancePortal = { BZ["Hellfire Peninsula"], 46.8, 54.9 },
}
zones[BZ["The Blood Furnace"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Hellfire Citadel"],
groupSize = 5,
type = "Instance",
complex = BZ["Hellfire Citadel"],
entrancePortal = { BZ["Hellfire Peninsula"], 46.8, 54.9 },
}
zones[BZ["The Slave Pens"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Coilfang Reservoir"],
groupSize = 5,
type = "Instance",
complex = BZ["Coilfang Reservoir"],
entrancePortal = { BZ["Zangarmarsh"], 50.2, 40.8 },
}
zones[BZ["The Underbog"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Coilfang Reservoir"],
groupSize = 5,
type = "Instance",
complex = BZ["Coilfang Reservoir"],
entrancePortal = { BZ["Zangarmarsh"], 50.2, 40.8 },
}
zones[BZ["Mana-Tombs"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Ring of Observance"],
groupSize = 5,
type = "Instance",
complex = BZ["Ring of Observance"],
entrancePortal = { BZ["Terokkar Forest"], 39.6, 65.5 },
}
zones[BZ["Auchenai Crypts"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Ring of Observance"],
groupSize = 5,
type = "Instance",
complex = BZ["Ring of Observance"],
entrancePortal = { BZ["Terokkar Forest"], 39.6, 65.5 },
}
-- a.k.a. The Escape from Durnhold Keep
zones[BZ["Old Hillsbrad Foothills"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Kalimdor,
expansion = The_Burning_Crusade,
paths = BZ["Caverns of Time"],
groupSize = 5,
type = "Instance",
complex = BZ["Caverns of Time"],
entrancePortal = { BZ["Caverns of Time"], 26.7, 32.6 },
}
zones[BZ["Sethekk Halls"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Ring of Observance"],
groupSize = 5,
type = "Instance",
complex = BZ["Ring of Observance"],
entrancePortal = { BZ["Terokkar Forest"], 39.6, 65.5 },
}
zones[BZ["Shadow Labyrinth"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Ring of Observance"],
groupSize = 5,
type = "Instance",
complex = BZ["Ring of Observance"],
entrancePortal = { BZ["Terokkar Forest"], 39.6, 65.5 },
}
zones[BZ["The Shattered Halls"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Hellfire Citadel"],
groupSize = 5,
type = "Instance",
complex = BZ["Hellfire Citadel"],
entrancePortal = { BZ["Hellfire Peninsula"], 46.8, 54.9 },
}
zones[BZ["The Steamvault"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Coilfang Reservoir"],
groupSize = 5,
type = "Instance",
complex = BZ["Coilfang Reservoir"],
entrancePortal = { BZ["Zangarmarsh"], 50.2, 40.8 },
}
zones[BZ["The Mechanar"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Outland,
expansion = The_Burning_Crusade,
-- paths = BZ["Tempest Keep"],
paths = BZ["Netherstorm"],
groupSize = 5,
type = "Instance",
-- complex = BZ["Tempest Keep"],
entrancePortal = { BZ["Netherstorm"], 76.5, 65.1 },
}
zones[BZ["The Botanica"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Outland,
expansion = The_Burning_Crusade,
-- paths = BZ["Tempest Keep"],
paths = BZ["Netherstorm"],
groupSize = 5,
type = "Instance",
-- complex = BZ["Tempest Keep"],
entrancePortal = { BZ["Netherstorm"], 76.5, 65.1 },
}
zones[BZ["The Arcatraz"]] = {
low = 25,
high = 30,
ct_low = 25,
continent = Outland,
expansion = The_Burning_Crusade,
-- paths = BZ["Tempest Keep"],
paths = BZ["Netherstorm"],
groupSize = 5,
type = "Instance",
-- complex = BZ["Tempest Keep"],
entrancePortal = { BZ["Netherstorm"], 76.5, 65.1 },
}
-- Wrath of the Lich King dungeons (Northrend) --
zones[BZ["Utgarde Keep"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Howling Fjord"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Howling Fjord"], 57.30, 46.84 },
}
zones[BZ["The Nexus"]] = {
low = 10,
high = 30,
ct_low = 10,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Coldarra"],
groupSize = 5,
type = "Instance",
complex = BZ["Coldarra"],
entrancePortal = { BZ["Borean Tundra"], 27.50, 26.03 },
}
zones[BZ["Azjol-Nerub"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Dragonblight"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Dragonblight"], 26.01, 50.83 },
}
zones[BZ["Ahn'kahet: The Old Kingdom"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Dragonblight"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Dragonblight"], 28.49, 51.73 },
}
zones[BZ["Drak'Tharon Keep"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = {
[BZ["Grizzly Hills"]] = true,
[BZ["Zul'Drak"]] = true,
},
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Zul'Drak"], 28.53, 86.93 },
}
zones[BZ["The Violet Hold"]] = {
low = 15,
high = 30,
ct_low = 15,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Dalaran"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Dalaran"], 66.78, 68.19 },
}
zones[BZ["Gundrak"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Zul'Drak"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Zul'Drak"], 76.14, 21.00 },
}
zones[BZ["Halls of Stone"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["The Storm Peaks"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["The Storm Peaks"], 39.52, 26.91 },
}
zones[BZ["Halls of Lightning"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["The Storm Peaks"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["The Storm Peaks"], 45.38, 21.37 },
}
zones[BZ["The Oculus"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Coldarra"],
groupSize = 5,
type = "Instance",
complex = BZ["Coldarra"],
entrancePortal = { BZ["Borean Tundra"], 27.52, 26.67 },
}
zones[BZ["Utgarde Pinnacle"]] = {
low = 20,
high = 30,
ct_low = 20,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Howling Fjord"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Howling Fjord"], 57.25, 46.60 },
}
zones[BZ["The Culling of Stratholme"]] = {
low = 25,
high = 30,
ct_low = 25,
continent = Kalimdor,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Caverns of Time"],
groupSize = 5,
type = "Instance",
complex = BZ["Caverns of Time"],
entrancePortal = { BZ["Caverns of Time"], 60.3, 82.8 },
}
zones[BZ["Magisters' Terrace"]] = {
low = 25,
high = 30,
ct_low = 25,
continent = Eastern_Kingdoms,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Isle of Quel'Danas"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Isle of Quel'Danas"], 61.3, 30.9 },
}
-- a.k.a. The Opening of the Black Portal
zones[BZ["The Black Morass"]] = {
low = 25,
high = 30,
ct_low = 25,
continent = Kalimdor,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Caverns of Time"],
groupSize = 5,
type = "Instance",
complex = BZ["Caverns of Time"],
entrancePortal = { BZ["Caverns of Time"], 34.4, 84.9 },
}
zones[BZ["Trial of the Champion"]] = {
low = 25,
high = 30,
ct_low = 25,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Icecrown"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Icecrown"], 74.18, 20.45 },
}
zones[BZ["The Forge of Souls"]] = {
low = 25,
high = 30,
ct_low = 25,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Icecrown"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Icecrown"], 52.60, 89.35 },
}
zones[BZ["Halls of Reflection"]] = {
low = 25,
high = 30,
ct_low = 25,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Icecrown"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Icecrown"], 52.60, 89.35 },
}
zones[BZ["Pit of Saron"]] = {
low = 25,
high = 30,
ct_low = 25,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Icecrown"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Icecrown"], 52.60, 89.35 },
}
-- Cataclysm dungeons --
zones[BZ["Blackrock Caverns"]] = {
low = 30,
high = 35,
ct_low = 30,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = {
[BZ["Blackrock Mountain"]] = true,
},
groupSize = 5,
type = "Instance",
complex = BZ["Blackrock Mountain"],
entrancePortal = { BZ["Searing Gorge"], 47.8, 69.1 },
}
zones[BZ["Throne of the Tides"]] = {
low = 30,
high = 35,
ct_low = 30,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = BZ["Abyssal Depths"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Abyssal Depths"], 69.3, 25.2 },
}
zones[BZ["The Stonecore"]] = {
low = 30,
high = 35,
ct_low = 30,
continent = The_Maelstrom,
expansion = Cataclysm,
paths = BZ["Deepholm"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Deepholm"], 47.70, 51.96 },
}
zones[BZ["The Vortex Pinnacle"]] = {
low = 30,
high = 35,
ct_low = 30,
continent = Kalimdor,
expansion = Cataclysm,
paths = {
[BZ["Uldum"]] = true,
},
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Uldum"], 76.79, 84.51 },
}
zones[BZ["Lost City of the Tol'vir"]] = {
low = 30,
high = 35,
ct_low = 30,
continent = Kalimdor,
expansion = Cataclysm,
paths = {
[BZ["Uldum"]] = true,
},
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Uldum"], 60.53, 64.24 },
}
zones[BZ["Grim Batol"]] = {
low = 30,
high = 35,
ct_low = 30,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = BZ["Twilight Highlands"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Twilight Highlands"], 19, 53.5 },
}
zones[BZ["Halls of Origination"]] = {
low = 30,
high = 35,
ct_low = 30,
continent = Kalimdor,
expansion = Cataclysm,
paths = {
[BZ["Uldum"]] = true,
},
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Uldum"], 69.09, 52.95 },
}
zones[BZ["End Time"]] = {
low = 35,
high = 35,
continent = Kalimdor,
expansion = Cataclysm,
paths = BZ["Caverns of Time"],
groupSize = 5,
type = "Instance",
complex = BZ["Caverns of Time"],
entrancePortal = { BZ["Caverns of Time"], 57.1, 25.7 },
}
zones[BZ["Hour of Twilight"]] = {
low = 35,
high = 35,
continent = Kalimdor,
expansion = Cataclysm,
paths = BZ["Caverns of Time"],
groupSize = 5,
type = "Instance",
complex = BZ["Caverns of Time"],
entrancePortal = { BZ["Caverns of Time"], 67.9, 29.0 },
}
zones[BZ["Well of Eternity"]] = {
low = 35,
high = 35,
continent = Kalimdor,
expansion = Cataclysm,
paths = BZ["Caverns of Time"],
groupSize = 5,
type = "Instance",
complex = BZ["Caverns of Time"],
entrancePortal = { BZ["Caverns of Time"], 22.2, 63.6 },
}
-- Note: before Cataclysm, this was a lvl 70 10-man raid
zones[BZ["Zul'Aman"]] = {
low = 35,
high = 35,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = BZ["Ghostlands"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Ghostlands"], 77.7, 63.2 },
}
-- Note: before Cataclysm, this was a lvl 60 20-man raid
zones[BZ["Zul'Gurub"]] = {
low = 35,
high = 35,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = BZ["Northern Stranglethorn"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Northern Stranglethorn"], 52.2, 17.1 },
}
-- Mists of Pandaria dungeons --
zones[BZ["Temple of the Jade Serpent"]] = {
low = 10,
high = 35,
ct_low = 10,
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = BZ["The Jade Forest"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["The Jade Forest"], 56.20, 57.90 },
}
zones[BZ["Stormstout Brewery"]] = {
low = 15,
high = 35,
ct_low = 15,
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = BZ["Valley of the Four Winds"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Valley of the Four Winds"], 36.10, 69.10 },
}
zones[BZ["Shado-Pan Monastery"]] = {
low = 20,
high = 35,
ct_low = 20,
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = BZ["Kun-Lai Summit"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Kun-Lai Summit"], 36.7, 47.6 },
}
zones[BZ["Mogu'shan Palace"]] = {
low = 20,
high = 35,
ct_low = 20,
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = BZ["Vale of Eternal Blossoms"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Vale of Eternal Blossoms"], 80.7, 33.0 },
}
zones[BZ["Gate of the Setting Sun"]] = {
low = 25,
high = 35,
ct_low = 25,
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = BZ["Dread Wastes"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Dread Wastes"], 15.80, 74.30 },
}
zones[BZ["Siege of Niuzao Temple"]] = {
low = 25,
high = 35,
ct_low = 25,
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = BZ["Townlong Steppes"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Townlong Steppes"], 34.5, 81.1 },
}
-- Warlords of Draenor dungeons --
zones[BZ["Bloodmaul Slag Mines"]] = {
low = 10,
high = 40,
ct_low = 10,
continent = Draenor,
expansion = Warlords_of_Draenor,
paths = BZ["Frostfire Ridge"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Frostfire Ridge"], 50.0, 24.8 },
}
zones[BZ["Iron Docks"]] = {
low = 15,
high = 40,
ct_low = 15,
continent = Draenor,
expansion = Warlords_of_Draenor,
paths = BZ["Gorgrond"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Gorgrond"], 45.2, 13.7 },
}
zones[BZ["Auchindoun"]] = {
low = 20,
high = 40,
ct_low = 20,
continent = Draenor,
expansion = Warlords_of_Draenor,
paths = BZ["Talador"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Talador"], 43.6, 74.1 },
}
zones[BZ["Skyreach"]] = {
low = 30,
high = 40,
ct_low = 30,
continent = Draenor,
expansion = Warlords_of_Draenor,
paths = BZ["Spires of Arak"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Spires of Arak"], 35.6, 33.5 },
}
zones[BZ["Shadowmoon Burial Grounds"]] = {
low = 10,
high = 40,
ct_low = 10,
continent = Draenor,
expansion = Warlords_of_Draenor,
paths = BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")",
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")", 31.9, 42.5 },
}
zones[BZ["Grimrail Depot"]] = {
low = 35,
high = 40,
ct_low = 35,
continent = Draenor,
expansion = Warlords_of_Draenor,
paths = BZ["Gorgrond"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Gorgrond"], 55.2, 32.1 },
}
zones[BZ["The Everbloom"]] = {
low = 35,
high = 40,
ct_low = 35,
continent = Draenor,
expansion = Warlords_of_Draenor,
paths = BZ["Gorgrond"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Gorgrond"], 59.5, 45.3 },
}
zones[BZ["Upper Blackrock Spire"]] = {
low = 35,
high = 40,
continent = Eastern_Kingdoms,
expansion = Warlords_of_Draenor,
paths = {
[BZ["Blackrock Mountain"]] = true,
},
groupSize = 5,
type = "Instance",
complex = BZ["Blackrock Mountain"],
entrancePortal = { BZ["Burning Steppes"], 29.7, 37.5 },
}
-- Legion dungeons --
zones[BZ["Eye of Azshara"]] = {
low = 10,
high = 45,
ct_low = 10,
continent = Broken_Isles,
expansion = Legion,
paths = BZ["Azsuna"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Azsuna"], 67.1, 41.1 },
}
zones[BZ["Darkheart Thicket"]] = {
low = 10,
high = 45,
ct_low = 10,
continent = Broken_Isles,
expansion = Legion,
paths = BZ["Val'sharah"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Val'sharah"], 59.2, 31.5 },
}
zones[BZ["Neltharion's Lair"]] = {
low = 10,
high = 45,
ct_low = 10,
continent = Broken_Isles,
expansion = Legion,
paths = BZ["Highmountain"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Highmountain"], 49.6, 68.4 },
}
zones[BZ["Halls of Valor"]] = {
low = 10,
high = 45,
ct_low = 10,
continent = Broken_Isles,
expansion = Legion,
paths = BZ["Stormheim"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Stormheim"], 68.3, 66.2 },
}
zones[BZ["Violet Hold"]] = { -- .." ("..BZ["Broken Isles"]..")"] = {
low = 10,
high = 45,
ct_low = 10,
continent = Broken_Isles,
expansion = Legion,
paths = {
[BZ["Dalaran"].." ("..BZ["Broken Isles"]..")"] = true,
},
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Dalaran"].." ("..BZ["Broken Isles"]..")", 54.8, 54.3 },
}
-- = Maw of Souls = The Naglfar??
-- Helmouth Cliffs appears to be the location of the entrance to Maw of Souls
-- However, there's no mapID for Maw of Souls
zones[BZ["Helmouth Cliffs"]] = {
low = 10,
high = 45,
ct_low = 10,
continent = Broken_Isles,
expansion = Legion,
paths = BZ["Stormheim"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Stormheim"], 53.0, 47.2 },
}
zones[BZ["Court of Stars"]] = {
low = 45,
high = 45,
ct_low = 45,
continent = Broken_Isles,
expansion = Legion,
paths = BZ["Suramar"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Suramar"], 50.7, 65.5 },
}
zones[BZ["The Arcway"]] = {
low = 45,
high = 45,
ct_low = 45,
continent = Broken_Isles,
expansion = Legion,
paths = BZ["Suramar"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Suramar"], 41.8, 60.7 },
}
zones[BZ["Cathedral of Eternal Night"]] = {
low = 45,
high = 45,
ct_low = 10,
continent = Broken_Isles,
expansion = Legion,
paths = BZ["Broken Shore"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Broken Shore"], 63, 18 },
}
zones[BZ["The Seat of the Triumvirate"]] = {
low = 45,
high = 45,
continent = Argus,
expansion = Legion,
paths = BZ["Eredath"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Eredath"], 22.3, 56.1 },
}
zones[BZ["Black Rook Hold"]] = {
low = 10,
high = 45,
ct_low = 10,
continent = Broken_Isles,
expansion = Legion,
paths = BZ["Val'sharah"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Val'sharah"], 38.7, 53.2 },
}
zones[BZ["Vault of the Wardens"]] = {
low = 10,
high = 45,
ct_low = 10,
continent = Broken_Isles,
expansion = Legion,
paths = BZ["Azsuna"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Azsuna"], 48.2, 82.7 },
}
zones[BZ["Return to Karazhan"]] = {
low = 45,
high = 45,
continent = Eastern_Kingdoms,
expansion = Legion,
paths = BZ["Deadwind Pass"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Deadwind Pass"], 46.7, 70.2 },
}
-- WoW BFA dungeons
-- Alliance
zones[BZ["Shrine of the Storm"]] = {
low = GetBFAInstanceLow(10, "Alliance"),
high = 50,
ct_low = 10, -- ?
continent = Kul_Tiras,
expansion = Battle_for_Azeroth,
paths = BZ["Stormsong Valley"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Stormsong Valley"], 78.8, 26.6 },
}
zones[BZ["Waycrest Manor"]] = {
low = GetBFAInstanceLow(10, "Alliance"),
high = 50,
ct_low = 10, -- ?
continent = Kul_Tiras,
expansion = Battle_for_Azeroth,
paths = BZ["Drustvar"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Drustvar"], 33.7, 12.7 },
}
zones[BZ["Freehold"]] = {
low = GetBFAInstanceLow(10, "Alliance"),
high = 50,
ct_low = 10,
continent = Kul_Tiras,
expansion = Battle_for_Azeroth,
paths = BZ["Tiragarde Sound"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Tiragarde Sound"], 84.7, 78.7 },
}
zones[BZ["Tol Dagor"]] = {
low = GetBFAInstanceLow(10, "Alliance"),
high = 50,
ct_low = 10,
continent = Kul_Tiras,
expansion = Battle_for_Azeroth,
paths = BZ["Tiragarde Sound"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Tiragarde Sound"], 99.1, 47.3 },
}
zones[BZ["Siege of Boralus"]] = {
low = 50,
high = 50,
continent = Kul_Tiras,
expansion = Battle_for_Azeroth,
paths = BZ["Tiragarde Sound"],
groupSize = 5,
type = "Instance",
entrancePortal = GetSiegeOfBoralusEntrance(),
}
-- Patch 8.1.5 raid
zones[BZ["Crucible of Storms"]] = {
low = 50,
high = 50,
continent = Kul_Tiras,
expansion = Battle_for_Azeroth,
paths = BZ["Stormsong Valley"],
groupSize = 10,
altGroupSize = 30,
type = "Instance",
entrancePortal = { BZ["Stormsong Valley"], 84.0, 46.4 },
}
-- Patch 8.2.0 dungeon
-- Is called Operation: Mechagon but there's no map for this name in C_Map
zones[BZ["Mechagon"]] = {
low = 50,
high = 50,
continent = Kul_Tiras,
expansion = Battle_for_Azeroth,
paths = BZ["Mechagon Island"],
groupSize = 5,
type = "Instance",
--entrancePortal = { BZ["Mechagon Island"], 84.0, 46.4 }, TODO
}
-- Patch 8.2.0 raid
zones[BZ["The Eternal Palace"]] = {
low = 50,
high = 50,
continent = Azeroth,
expansion = Battle_for_Azeroth,
paths = BZ["Nazjatar"],
groupSize = 10,
altGroupSize = 30,
type = "Instance",
entrancePortal = { BZ["Nazjatar"], 50.21, 10.97 },
}
-- Horde
zones[BZ["Atal'Dazar"]] = {
low = GetBFAInstanceLow(10, "Horde"),
high = 50,
ct_low = 10,
continent = Zandalar,
expansion = Battle_for_Azeroth,
paths = BZ["Zuldazar"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Zuldazar"], 43.6, 39.4 },
}
zones[BZ["Temple of Sethraliss"]] = {
low = GetBFAInstanceLow(10, "Horde"),
high = 50,
ct_low = 10,
continent = Zandalar,
expansion = Battle_for_Azeroth,
paths = BZ["Vol'dun"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Vol'dun"], 51.9, 25.1 },
}
zones[BZ["The Underrot"]] = {
low = GetBFAInstanceLow(10, "Horde"),
high = 50,
ct_low = 10,
continent = Zandalar,
expansion = Battle_for_Azeroth,
paths = BZ["Nazmir"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Nazmir"], 51.9, 65.8 },
}
zones[BZ["The MOTHERLODE!!"]] = {
low = GetBFAInstanceLow(10, "Horde"),
high = 50,
ct_low = 10,
continent = Zandalar,
expansion = Battle_for_Azeroth,
paths = BZ["Dazar'alor"],
groupSize = 5,
type = "Instance",
entrancePortal = GetTheMotherlodeEntrance(),
}
zones[BZ["Kings' Rest"]] = {
low = 50,
high = 50,
continent = Zandalar,
expansion = Battle_for_Azeroth,
paths = BZ["Zuldazar"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Zuldazar"], 37.9, 39.5 },
}
-- Patch 8.1 raids
zones[BZ["Battle of Dazar'alor"]] = {
low = 50,
high = 50,
continent = Zandalar,
expansion = Battle_for_Azeroth,
paths = BZ["Zuldazar"],
groupSize = 10,
altGroupSize = 30,
type = "Instance",
entrancePortal = { BZ["Zuldazar"], 54.3, 29.9 },
}
zones[BZ["Uldir"]] = {
low = 50,
high = 50,
continent = Zandalar,
expansion = Battle_for_Azeroth,
paths = BZ["Nazmir"],
groupSize = 10,
altGroupSize = 30,
type = "Instance",
entrancePortal = { BZ["Nazmir"], 53.9, 62.7 },
}
-- Patch 8.3 raid
-- The entrance of this raid can either be in Uldum or in the Vale of Eternal Blossoms,
-- changing once a week.
-- Two entrances is not supported by the data structure of LibTourist unless a way can be found to detect the current location of the raid entrance.
zones[BZ["Ny'alotha"]] = { -- a.k.a The Waking City
low = 50,
high = 50,
continent = Zandalar,
expansion = Battle_for_Azeroth,
paths = BZ["Uldum"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["Uldum"], 55, 43.6 },
}
-- Shadowlands dungeons
-- 12916
zones[BZ["The Necrotic Wake"]] = {
low = 51,
high = 51,
continent = The_Shadowlands,
expansion = Shadowlands,
paths = BZ["Bastion"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Bastion"], 40.33, 55.23 },
}
-- 12837
zones[BZ["Spires of Ascension"]] = {
low = 60,
high = 60,
continent = The_Shadowlands,
expansion = Shadowlands,
paths = BZ["Bastion"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Bastion"], 58.47, 28.70 },
}
-- 13228
zones[BZ["Plaguefall"]] = {
low = 53,
high = 53,
continent = The_Shadowlands,
expansion = Shadowlands,
paths = BZ["Maldraxxus"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Maldraxxus"], 59.30, 64.84 },
}
-- 12841
zones[BZ["Theater of Pain"]] = {
low = 60,
high = 60,
continent = The_Shadowlands,
expansion = Shadowlands,
paths = BZ["Maldraxxus"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Maldraxxus"], 53.21, 53.14 },
}
-- 13334
zones[BZ["Mists of Tirna Scithe"]] = {
low = 55,
high = 55,
continent = The_Shadowlands,
expansion = Shadowlands,
paths = BZ["Ardenweald"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Ardenweald"], 35.71, 54.21 },
}
-- 13309
zones[BZ["De Other Side"]] = {
low = 60,
high = 60,
continent = The_Shadowlands,
expansion = Shadowlands,
paths = BZ["Ardenweald"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Ardenweald"], 68.60, 65.98 },
}
-- 12831
zones[BZ["Halls of Atonement"]] = {
low = 57,
high = 57,
continent = The_Shadowlands,
expansion = Shadowlands,
paths = BZ["Revendreth"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Revendreth"], 77.96, 48.52 },
}
-- 12842
zones[BZ["Sanguine Depths"]] = {
low = 60,
high = 60,
continent = The_Shadowlands,
expansion = Shadowlands,
paths = BZ["Revendreth"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Revendreth"], 51.09, 30.07 },
}
-- 13577
zones[BZ["Tazavesh, the Veiled Market"]] = {
low = 60,
high = 60,
continent = The_Shadowlands,
expansion = Shadowlands,
paths = {
[transports["TAZAVESH_ORIBOS_FLIGHTPATH"]] = true,
},
flightnodes = {
[2703] = true, -- Tazavesh, the Veiled Market
},
groupSize = 5,
type = "Instance",
--entrancePortal = { BZ["Revendreth"], 0, 0 }, -- TODO
}
-- DragonFlight dungeons
-- 14011
zones[BZ["Neltharus"]] = {
low = 70,
high = 70,
continent = Dragon_Isles,
expansion = DragonFlight,
paths = BZ["The Waking Shores"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["The Waking Shores"], 25.57, 56.95 },
}
-- 14063
zones[BZ["Ruby Life Pools"]] = {
low = 61,
high = 70,
continent = Dragon_Isles,
expansion = DragonFlight,
paths = BZ["The Waking Shores"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["The Waking Shores"], 60.00, 75.77 },
}
-- whole Ohn'ahran Plains zone?
zones[BZ["The Nokhud Offensive"]] = {
low = 60,
high = 70,
continent = Dragon_Isles,
expansion = DragonFlight,
paths = BZ["Ohn'ahran Plains"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Ohn'ahran Plains"], 62.01, 42.44 },
flightnodes = {
[2847] = true, -- Maruukai, The Nokhud Offensive (Neutral)
[2848] = true, -- The Nokhud Approach, The Nokhud Offensive (Neutral)
[2849] = true, -- The Battle of Spears, The Nokhud Offensive (Neutral)
[2850] = true, -- Teerakai, The Nokhud Offensive (Neutral)
[2851] = true, -- Ohn'iri Springs, The Nokhud Offensive (Neutral)
},
}
-- 13954
zones[BZ["The Azure Vault"]] = {
low = 70,
high = 70,
continent = Dragon_Isles,
expansion = DragonFlight,
paths = BZ["The Azure Span"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["The Azure Span"], 38.89, 64.76 },
}
-- 13991
zones[BZ["Brackenhide Hollow"]] = {
low = 66,
high = 70,
continent = Dragon_Isles,
expansion = DragonFlight,
paths = BZ["The Azure Span"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["The Azure Span"], 11.57, 48.78 },
}
-- 14032
zones[BZ["Algeth'ar Academy"]] = {
low = 70,
high = 70,
continent = Dragon_Isles,
expansion = DragonFlight,
paths = BZ["Thaldraszus"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Thaldraszus"], 58.28, 42.35 },
}
-- 14082
zones[BZ["Halls Of Infusion"]] = {
low = 69,
high = 70,
continent = Dragon_Isles,
expansion = DragonFlight,
paths = BZ["Thaldraszus"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Thaldraszus"], 59.24, 60.64 },
}
-- 13968
zones[BZ["Uldaman: Legacy of Tyr"]] = {
low = 70,
high = 70,
continent = Eastern_Kingdoms,
expansion = DragonFlight,
paths = BZ["Badlands"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Badlands"], 42.4, 18.6 },
}
zones[BZ["Dawn of the Infinite"]] = {
low = 70,
high = 70,
continent = Dragon_Isles,
expansion = DragonFlight,
paths = BZ["Thaldraszus"],
groupSize = 5,
type = "Instance",
entrancePortal = { BZ["Thaldraszus"], 59.24, 60.64 },
}
-- ==================RAIDS=====================
-- Classic Raids --
zones[BZ["Blackwing Lair"]] = {
low = 30,
high = 30,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = BZ["Blackrock Mountain"],
groupSize = 40,
type = "Instance",
complex = BZ["Blackrock Mountain"],
entrancePortal = { BZ["Burning Steppes"], 29.7, 37.5 },
}
zones[BZ["Molten Core"]] = {
low = 30,
high = 30,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = BZ["Blackrock Mountain"],
groupSize = 40,
type = "Instance",
complex = BZ["Blackrock Mountain"],
entrancePortal = { BZ["Searing Gorge"], 35.4, 84.4 },
}
zones[BZ["Ahn'Qiraj"]] = {
low = 30,
high = 30,
continent = Kalimdor,
expansion = Classic,
paths = BZ["Ahn'Qiraj: The Fallen Kingdom"],
groupSize = 40,
type = "Instance",
complex = BZ["Ahn'Qiraj: The Fallen Kingdom"],
entrancePortal = { BZ["Ahn'Qiraj: The Fallen Kingdom"], 46.6, 7.4 },
}
zones[BZ["Ruins of Ahn'Qiraj"]] = {
low = 30,
high = 30,
continent = Kalimdor,
expansion = Classic,
paths = BZ["Ahn'Qiraj: The Fallen Kingdom"],
groupSize = 20,
type = "Instance",
complex = BZ["Ahn'Qiraj: The Fallen Kingdom"],
entrancePortal = { BZ["Ahn'Qiraj: The Fallen Kingdom"], 58.9, 14.3 },
}
-- Burning Crusade raids
zones[BZ["Karazhan"]] = {
low = 30,
high = 30,
continent = Eastern_Kingdoms,
expansion = The_Burning_Crusade,
paths = BZ["Deadwind Pass"],
groupSize = 10,
type = "Instance",
entrancePortal = { BZ["Deadwind Pass"], 40.9, 73.2 },
}
-- a.k.a. The Battle for Mount Hyjal
zones[BZ["Hyjal Summit"]] = {
low = 30,
high = 30,
continent = Kalimdor,
expansion = The_Burning_Crusade,
paths = BZ["Caverns of Time"],
groupSize = 25,
type = "Instance",
complex = BZ["Caverns of Time"],
entrancePortal = { BZ["Caverns of Time"], 38.8, 16.6 },
}
zones[BZ["Black Temple"]] = {
low = 30,
high = 30,
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Shadowmoon Valley"],
groupSize = 25,
type = "Instance",
entrancePortal = { BZ["Shadowmoon Valley"], 77.7, 43.7 },
}
zones[BZ["Magtheridon's Lair"]] = {
low = 30,
high = 30,
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Hellfire Citadel"],
groupSize = 25,
type = "Instance",
complex = BZ["Hellfire Citadel"],
entrancePortal = { BZ["Hellfire Peninsula"], 46.8, 54.9 },
}
zones[BZ["Serpentshrine Cavern"]] = {
low = 30,
high = 30,
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Coilfang Reservoir"],
groupSize = 25,
type = "Instance",
complex = BZ["Coilfang Reservoir"],
entrancePortal = { BZ["Zangarmarsh"], 50.2, 40.8 },
}
zones[BZ["Gruul's Lair"]] = {
low = 30,
high = 30,
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Blade's Edge Mountains"],
groupSize = 25,
type = "Instance",
entrancePortal = { BZ["Blade's Edge Mountains"], 68, 24 },
}
zones[BZ["Tempest Keep"]] = {
low = 30,
high = 30,
continent = Outland,
expansion = The_Burning_Crusade,
-- paths = BZ["Tempest Keep"],
paths = BZ["Netherstorm"],
groupSize = 25,
type = "Instance",
-- complex = BZ["Tempest Keep"],
entrancePortal = { BZ["Netherstorm"], 76.5, 65.1 },
}
zones[BZ["Sunwell Plateau"]] = {
low = 30,
high = 30,
continent = Eastern_Kingdoms,
expansion = The_Burning_Crusade,
paths = BZ["Isle of Quel'Danas"],
groupSize = 25,
type = "Instance",
entrancePortal = { BZ["Isle of Quel'Danas"], 44.3, 45.7 },
}
-- Wrath of the Lich King raids
zones[BZ["The Eye of Eternity"]] = {
low = 30,
high = 30,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Coldarra"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
complex = BZ["Coldarra"],
entrancePortal = { BZ["Borean Tundra"], 27.54, 26.68 },
}
zones[BZ["Onyxia's Lair"]] = {
low = 30,
high = 30,
continent = Kalimdor,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Dustwallow Marsh"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["Dustwallow Marsh"], 52, 76 },
}
zones[BZ["Naxxramas"]] = {
low = 30,
high = 30,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Dragonblight"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["Dragonblight"], 87.30, 51.00 },
}
zones[BZ["The Obsidian Sanctum"]] = {
low = 30,
high = 30,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Dragonblight"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["Dragonblight"], 60.00, 57.00 },
}
zones[BZ["Ulduar"]] = {
low = 30,
high = 30,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["The Storm Peaks"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["The Storm Peaks"], 41.56, 17.76 },
}
zones[BZ["Trial of the Crusader"]] = {
low = 30,
high = 30,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Icecrown"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["Icecrown"], 75.07, 21.80 },
}
zones[BZ["Icecrown Citadel"]] = {
low = 30,
high = 30,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Icecrown"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["Icecrown"], 53.86, 87.27 },
}
zones[BZ["Vault of Archavon"]] = {
low = 30,
high = 30,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Wintergrasp"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["Wintergrasp"], 50, 11.2 },
}
zones[BZ["The Ruby Sanctum"]] = {
low = 30,
high = 30,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Dragonblight"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["Dragonblight"], 61.00, 53.00 },
}
-- Cataclysm raids
zones[BZ["Firelands"]] = {
low = 35,
high = 35,
continent = Kalimdor,
expansion = Cataclysm,
paths = BZ["Mount Hyjal"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["Mount Hyjal"], 47.3, 78.3 },
}
zones[BZ["Throne of the Four Winds"]] = {
low = 35,
high = 35,
continent = Kalimdor,
expansion = Cataclysm,
paths = {
[BZ["Uldum"]] = true,
},
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["Uldum"], 38.26, 80.66 },
}
zones[BZ["Blackwing Descent"]] = {
low = 35,
high = 35,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = {
[BZ["Burning Steppes"]] = true,
[BZ["Blackrock Mountain"]] = true,
[BZ["Blackrock Spire"]] = true,
},
groupSize = 10,
altGroupSize = 25,
type = "Instance",
complex = BZ["Blackrock Mountain"],
entrancePortal = { BZ["Burning Steppes"], 26.1, 24.6 },
}
zones[BZ["The Bastion of Twilight"]] = {
low = 35,
high = 35,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = BZ["Twilight Highlands"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["Twilight Highlands"], 33.8, 78.2 },
}
zones[BZ["Dragon Soul"]] = {
low = 35,
high = 35,
continent = Kalimdor,
expansion = Cataclysm,
paths = BZ["Caverns of Time"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
complex = BZ["Caverns of Time"],
entrancePortal = { BZ["Caverns of Time"], 60.0, 21.1 },
}
-- Opens when your faction controls Tol Barad
zones[BZ["Baradin Hold"]] = {
low = 35,
high = 35,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = BZ["Tol Barad"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
-- entrancePortal = { BZ["Tol Barad"], 33.8, 78.2 }, n/a
}
-- Mists of Pandaria raids
zones[BZ["Mogu'shan Vaults"]] = {
low = 35,
high = 35,
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = BZ["Kun-Lai Summit"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["Kun-Lai Summit"], 59.1, 39.8 },
}
zones[BZ["Heart of Fear"]] = {
low = 35,
high = 35,
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = BZ["Dread Wastes"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["Dread Wastes"], 39.0, 35.0 },
}
zones[BZ["Terrace of Endless Spring"]] = {
low = 35,
high = 35,
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = BZ["The Veiled Stair"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["The Veiled Stair"], 47.9, 60.8 },
}
zones[BZ["Throne of Thunder"]] = {
low = 35,
high = 35,
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = BZ["Isle of Thunder"],
groupSize = 10,
altGroupSize = 25,
type = "Instance",
entrancePortal = { BZ["The Veiled Stair"], 63.5, 32.2 },
}
zones[BZ["Siege of Orgrimmar"]] = {
low = 35,
high = 35,
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = BZ["Vale of Eternal Blossoms"],
groupMinSize = 10,
groupMaxSize = 30,
type = "Instance",
entrancePortal = { BZ["Vale of Eternal Blossoms"], 74.0, 42.2 },
}
-- Warlords of Draenor raids
zones[BZ["Blackrock Foundry"]] = {
low = 40,
high = 40,
continent = Draenor,
expansion = Warlords_of_Draenor,
paths = BZ["Gorgrond"],
groupMinSize = 10,
groupMaxSize = 30,
type = "Instance",
entrancePortal = { BZ["Gorgrond"], 51.5, 27.4 },
}
zones[BZ["Highmaul"]] = {
low = 40,
high = 40,
continent = Draenor,
expansion = Warlords_of_Draenor,
paths = BZ["Nagrand"].." ("..BZ["Draenor"]..")",
groupMinSize = 10,
groupMaxSize = 30,
type = "Instance",
entrancePortal = { BZ["Nagrand"].." ("..BZ["Draenor"]..")", 34, 38 },
}
zones[BZ["Hellfire Citadel"].." ("..BZ["Draenor"]..")"] = {
low = 40,
high = 40,
continent = Draenor,
expansion = Warlords_of_Draenor,
paths = BZ["Tanaan Jungle"],
groupMinSize = 10,
groupMaxSize = 30,
type = "Instance",
entrancePortal = { BZ["Tanaan Jungle"], 45, 53 },
}
-- Legion raids
zones[BZ["The Emerald Nightmare"]] = {
low = 45,
high = 45,
continent = Broken_Isles,
expansion = Legion,
paths = BZ["Val'sharah"],
groupMinSize = 10,
groupMaxSize = 30,
type = "Instance",
entrancePortal = { BZ["Val'sharah"], 57.1, 39.9 },
}
zones[BZ["The Nighthold"]] = {
low = 45,
high = 45,
continent = Broken_Isles,
expansion = Legion,
paths = BZ["Suramar"],
groupMinSize = 10,
groupMaxSize = 30,
type = "Instance",
entrancePortal = { BZ["Suramar"], 42.2, 59.7 },
}
zones[BZ["Antorus, the Burning Throne"]] = {
low = 45,
high = 45,
continent = Argus,
expansion = Legion,
paths = BZ["Antoran Wastes"],
groupMinSize = 10,
groupMaxSize = 30,
type = "Instance",
entrancePortal = { BZ["Antoran Wastes"], 54.91, 62.41 },
}
-- Shadowlands raids
zones[BZ["Castle Nathria"]] = {
low = 60,
high = 60,
continent = The_Shadowlands,
expansion = Shadowlands,
paths = BZ["Revendreth"],
groupMinSize = 10,
groupMaxSize = 30,
type = "Instance",
entrancePortal = { BZ["Revendreth"], 45.7, 41.4 },
}
zones[BZ["Sanctum of Domination"]] = {
low = 60,
high = 60,
continent = The_Shadowlands,
expansion = Shadowlands,
paths = BZ["The Maw"],
groupMinSize = 10,
groupMaxSize = 30,
type = "Instance",
entrancePortal = { BZ["The Maw"], 68.4, 32.5 },
}
zones[BZ["Sepulcher of the First Ones"]] = {
low = 60,
high = 60,
continent = The_Shadowlands,
expansion = Shadowlands,
paths = BZ["Zereth Mortis"],
groupMinSize = 10,
groupMaxSize = 30,
type = "Instance",
entrancePortal = { BZ["Zereth Mortis"], 68.4, 32.5 },
}
-- DragonFlight raids
-- 14030
zones[BZ["Vault of the Incarnates"]] = {
low = 70,
high = 70,
continent = Dragon_Isles,
expansion = DragonFlight,
paths = BZ["Thaldraszus"],
groupMinSize = 10,
groupMaxSize = 30,
type = "Instance",
entrancePortal = { BZ["Thaldraszus"], 73.14, 55.60 },
}
-- 14663
zones[BZ["Aberrus, the Shadowed Crucible"]] = {
low = 70,
high = 70,
continent = Dragon_Isles,
expansion = DragonFlight,
paths = BZ["Zaralek Cavern"],
groupMinSize = 10,
groupMaxSize = 30,
type = "Instance",
--entrancePortal = { BZ["Zaralek Cavern"], 73.14, 55.60 }, -- todo
}
-- 14643
zones[BZ["Amirdrassil, the Dream's Hope"]] = {
low = 70,
high = 70,
continent = Dragon_Isles,
expansion = DragonFlight,
paths = BZ["Emerald Dream"],
groupMinSize = 10,
groupMaxSize = 30,
type = "Instance",
--entrancePortal = { BZ["Emerald Dream"], 73.14, 55.60 }, -- todo
}
-- ==============BATTLEGROUNDS================
zones[BZ["Arathi Basin"]] = {
low = 7,
high = MAX_PLAYER_LEVEL,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = BZ["Arathi Highlands"],
groupSize = 15,
type = "Battleground",
texture = "ArathiBasin",
}
zones[BZ["Warsong Gulch"]] = {
low = 10,
high = MAX_PLAYER_LEVEL,
continent = Kalimdor,
expansion = Classic,
paths = isHorde and BZ["Northern Barrens"] or BZ["Ashenvale"],
groupSize = 10,
type = "Battleground",
texture = "WarsongGulch",
}
zones[BZ["Eye of the Storm"]] = {
low = 20,
high = MAX_PLAYER_LEVEL,
continent = Outland,
expansion = The_Burning_Crusade,
groupSize = 15,
type = "Battleground",
texture = "NetherstormArena",
}
zones[BZ["Alterac Valley"]] = {
low = 10,
high = MAX_PLAYER_LEVEL,
continent = Eastern_Kingdoms,
expansion = Classic,
paths = BZ["Hillsbrad Foothills"],
groupSize = 40,
type = "Battleground",
texture = "AlteracValley",
}
zones[BZ["Strand of the Ancients"]] = {
low = 10,
high = MAX_PLAYER_LEVEL,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
groupSize = 15,
type = "Battleground",
texture = "StrandoftheAncients",
}
zones[BZ["Isle of Conquest"]] = {
low = 20,
high = MAX_PLAYER_LEVEL,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
groupSize = 40,
type = "Battleground",
texture = "IsleofConquest",
}
zones[BZ["The Battle for Gilneas"]] = {
low = 20,
high = MAX_PLAYER_LEVEL,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
groupSize = 10,
type = "Battleground",
texture = "TheBattleforGilneas",
}
zones[BZ["Twin Peaks"]] = {
low = 30,
high = MAX_PLAYER_LEVEL,
continent = Eastern_Kingdoms,
expansion = Cataclysm,
paths = BZ["Twilight Highlands"],
groupSize = 10,
type = "Battleground",
texture = "TwinPeaks", -- TODO: verify
}
zones[BZ["Deepwind Gorge"]] = {
low = 40,
high = MAX_PLAYER_LEVEL,
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = BZ["Valley of the Four Winds"],
groupSize = 15,
type = "Battleground",
texture = "DeepwindGorge", -- TODO: verify
}
-- ==============ARENAS================
-- Circle of Blood
zones[BZ["Blade's Edge Arena"]] = {
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Blade's Edge Mountains"],
type = "Arena",
}
-- Ring of Trials
zones[BZ["Nagrand Arena"]] = {
continent = Outland,
expansion = The_Burning_Crusade,
paths = BZ["Nagrand"],
type = "Arena",
}
zones[BZ["Ruins of Lordaeron"]] = {
continent = Kalimdor,
expansion = The_Burning_Crusade,
paths = BZ["Undercity"],
type = "Arena",
}
zones[BZ["Dalaran Arena"]] = {
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = BZ["Dalaran"],
type = "Arena",
}
-- "The Ring of Valor arena featured unique mechanics with pillars moving up and down.
-- However, the arena was plagued with bugs and Blizzard ultimately decided to
-- remove it with intentions of bringing it back as soon as the bugs were resolved."
-- zones[BZ["The Ring of Valor"]] = {
-- continent = Kalimdor,
-- expansion = Wrath_of_the_Lich_King,
-- type = "Arena",
-- }
-- Zone name = TolVirArena
-- Not sure if this arena is still present in the game. AreaID is 6296.
-- MapID = 980 ("Tol Dagor")?
-- zones[BZ["Tol'Viron Arena"]] = {
-- continent = Kalimdor,
-- expansion = Mists_of_Pandaria,
-- paths = BZ["Uldum"],
-- type = "Arena",
-- }
-- PvE arena, Stormwind. Is a subzone of the Deeprun Tram, and shares it's map ID, 396. AreaID is 6618.
-- zones[BZ["Bizmo's Brawlpub"]] = {
-- continent = Eastern_Kingdoms,
-- expansion = Mists_of_Pandaria,
-- paths = BZ["Stormwind City"],
-- faction = "Alliance",
-- type = "Arena",
-- }
-- PvE arena, Orgrimmar
zones[BZ["Brawl'gar Arena"]] = {
continent = Kalimdor,
expansion = Mists_of_Pandaria,
paths = BZ["Orgrimmar"],
faction = "Horde",
type = "Arena",
}
zones[BZ["The Tiger's Peak"]] = {
continent = Pandaria,
expansion = Mists_of_Pandaria,
paths = BZ["Kun-Lai Summit"],
type = "Arena",
}
-- Zone name = AshamanesFall
-- MapID = 1552. AreaID is 8008.
-- zones[BZ["Ashamane's Fall"]] = {
-- continent = Broken_Isles,
-- expansion = Legion,
-- paths = BZ["Val'sharah"],
-- type = "Arena",
-- }
-- Zone name = RavencourtArena
-- MapID = 1504. AreaID is 7816.
-- zones[BZ["Black Rook Hold Arena"]] = {
-- continent = Broken_Isles,
-- expansion = Legion,
-- paths = BZ["Val'sharah"],
-- type = "Arena",
-- }
-- Added in patch 8.0.1
-- Zone name = KulTirasArena
-- MapID = 1825. AreaID is 9279.
-- Arena appears to be buggy and not much appreciated by players.
zones[BZ["Hook Point"]] = {
continent = Kul_Tiras,
expansion = Battle_for_Azeroth,
paths = BZ["Boralus"],
faction = "Alliance",
type = "Arena",
}
-- Added in patch 8.0.1
-- Zone name = MugambalaArena
-- MapID = 1911. AreaID is 9992.
zones[BZ["Mugambala"]] = {
continent = Zuldazar,
expansion = Battle_for_Azeroth,
paths = BZ["Zuldazar"],
faction = "Horde",
type = "Arena",
}
-- Added in patch 8.2.0
-- Zone name = MechagonArena
-- MapID is 2167. AreaID is 10497.
-- zones[BZ["The Robodrome"]] = {
-- continent = Kul_Tiras,
-- expansion = Battle_for_Azeroth,
-- paths = BZ["Mechagon Island"],
-- type = "Arena",
-- }
-- Added in patch 9.2.5
-- Zone name = EnigmaCrucible
-- MapID is 2547. AreaID is 14083.
zones[BZ["Enigma Crucible"]] = {
continent = The_Shadowlands,
expansion = Shadowlands,
paths = BZ["Zereth Mortis"],
type = "Arena",
}
-- ==============COMPLEXES================
zones[BZ["Dire Maul"]] = {
low = 15,
high = 30,
continent = Kalimdor,
expansion = Classic,
instances = {
[BZ["Dire Maul - East"]] = true,
[BZ["Dire Maul - North"]] = true,
[BZ["Dire Maul - West"]] = true,
},
paths = {
[BZ["Feralas"]] = true,
[BZ["Dire Maul - East"]] = true,
[BZ["Dire Maul - North"]] = true,
[BZ["Dire Maul - West"]] = true,
},
type = "Complex",
}
zones[BZ["Blackrock Mountain"]] = {
low = 15,
high = 30,
continent = Eastern_Kingdoms,
expansion = Classic,
instances = {
[BZ["Blackrock Depths"]] = true,
[BZ["Blackrock Caverns"]] = true,
[BZ["Blackwing Lair"]] = true,
[BZ["Blackwing Descent"]] = true,
[BZ["Molten Core"]] = true,
[BZ["Blackrock Spire"]] = true,
[BZ["Upper Blackrock Spire"]] = true,
},
paths = {
[BZ["Burning Steppes"]] = true,
[BZ["Searing Gorge"]] = true,
[BZ["Blackwing Lair"]] = true,
[BZ["Blackwing Descent"]] = true,
[BZ["Molten Core"]] = true,
[BZ["Blackrock Depths"]] = true,
[BZ["Blackrock Caverns"]] = true,
[BZ["Blackrock Spire"]] = true,
[BZ["Upper Blackrock Spire"]] = true,
},
type = "Complex",
}
zones[BZ["Hellfire Citadel"]] = {
low = 10,
high = 30,
continent = Outland,
expansion = The_Burning_Crusade,
instances = {
[BZ["The Blood Furnace"]] = true,
[BZ["Hellfire Ramparts"]] = true,
[BZ["Magtheridon's Lair"]] = true,
[BZ["The Shattered Halls"]] = true,
},
paths = {
[BZ["Hellfire Peninsula"]] = true,
[BZ["The Blood Furnace"]] = true,
[BZ["Hellfire Ramparts"]] = true,
[BZ["Magtheridon's Lair"]] = true,
[BZ["The Shattered Halls"]] = true,
},
type = "Complex",
}
zones[BZ["Coldarra"]] = {
low = 10,
high = 30,
continent = Northrend,
expansion = Wrath_of_the_Lich_King,
paths = {
[BZ["Borean Tundra"]] = true,
[BZ["The Nexus"]] = true,
[BZ["The Oculus"]] = true,
[BZ["The Eye of Eternity"]] = true,
},
instances = {
[BZ["The Nexus"]] = true,
[BZ["The Oculus"]] = true,
[BZ["The Eye of Eternity"]] = true,
},
type = "Complex",
}
zones[BZ["Coilfang Reservoir"]] = {
low = 10,
high = 30,
continent = Outland,
expansion = The_Burning_Crusade,
instances = {
[BZ["The Underbog"]] = true,
[BZ["Serpentshrine Cavern"]] = true,
[BZ["The Steamvault"]] = true,
[BZ["The Slave Pens"]] = true,
},
paths = {
[BZ["Zangarmarsh"]] = true,
[BZ["The Underbog"]] = true,
[BZ["Serpentshrine Cavern"]] = true,
[BZ["The Steamvault"]] = true,
[BZ["The Slave Pens"]] = true,
},
type = "Complex",
}
zones[BZ["Ahn'Qiraj: The Fallen Kingdom"]] = {
low = 15,
high = 30,
continent = Kalimdor,
expansion = Classic,
paths = {
[BZ["Silithus"]] = true,
[BZ["Ahn'Qiraj"]] = true,
[BZ["Ruins of Ahn'Qiraj"]] = true,
},
instances = {
[BZ["Ahn'Qiraj"]] = true,
[BZ["Ruins of Ahn'Qiraj"]] = true,
},
type = "Complex",
}
zones[BZ["Ring of Observance"]] = {
low = 15,
high = 30,
continent = Outland,
expansion = The_Burning_Crusade,
instances = {
[BZ["Mana-Tombs"]] = true,
[BZ["Sethekk Halls"]] = true,
[BZ["Shadow Labyrinth"]] = true,
[BZ["Auchenai Crypts"]] = true,
},
paths = {
[BZ["Terokkar Forest"]] = true,
[BZ["Mana-Tombs"]] = true,
[BZ["Sethekk Halls"]] = true,
[BZ["Shadow Labyrinth"]] = true,
[BZ["Auchenai Crypts"]] = true,
},
type = "Complex",
}
zones[BZ["Caverns of Time"]] = {
low = 15,
high = 30,
continent = Kalimdor,
expansion = Classic,
instances = {
[BZ["Old Hillsbrad Foothills"]] = true,
[BZ["The Black Morass"]] = true,
[BZ["Hyjal Summit"]] = true,
[BZ["The Culling of Stratholme"]] = true,
[BZ["End Time"]] = true,
[BZ["Hour of Twilight"]] = true,
[BZ["Well of Eternity"]] = true,
[BZ["Dragon Soul"]] = true,
},
paths = {
[transports["COT_STORMWIND_PORTAL"]] = true,
[transports["COT_ORGRIMMAR_PORTAL"]] = true,
[BZ["Tanaris"]] = true,
[BZ["Old Hillsbrad Foothills"]] = true,
[BZ["The Black Morass"]] = true,
[BZ["Hyjal Summit"]] = true,
[BZ["The Culling of Stratholme"]] = true,
[BZ["End Time"]] = true,
[BZ["Hour of Twilight"]] = true,
[BZ["Well of Eternity"]] = true,
[BZ["Dragon Soul"]] = true,
},
type = "Complex",
}
-- Had to remove the complex 'Tempest Keep' because of the renamed 'The Eye' instance now has same name (Legion)
-- zones[BZ["Tempest Keep"]] = {
-- low = 67,
-- high = 75,
-- continent = Outland,
-- expansion = The_Burning_Crusade,
-- instances = {
-- [BZ["The Mechanar"]] = true,
-- [BZ["Tempest Keep"]] = true, -- previously "The Eye"
-- [BZ["The Botanica"]] = true,
-- [BZ["The Arcatraz"]] = true,
-- },
-- paths = {
-- [BZ["Netherstorm"]] = true,
-- [BZ["The Mechanar"]] = true,
-- [BZ["Tempest Keep"]] = true,
-- [BZ["The Botanica"]] = true,
-- [BZ["The Arcatraz"]] = true,
-- },
-- type = "Complex",
-- }
--------------------------------------------------------------------------------------------------------
-- CORE --
--------------------------------------------------------------------------------------------------------
trace("Tourist: Initializing continents...")
local continentNames = Tourist:GetMapContinentsAlt()
continentNames[947] = "Azeroth" -- For the Nazjatar zone, which has Azeroth as parent map
local counter = 0
for continentMapID, continentName in pairs(continentNames) do
trace("Processing Continent "..tostring(continentMapID)..": "..continentName.."...")
if zones[continentName] then
-- Set MapID
zones[continentName].zoneMapID = continentMapID
-- Get map art ID
zones[continentName].texture = C_Map.GetMapArtID(continentMapID)
-- Get map size in yards
local cWidth = HBD:GetZoneSize(continentMapID)
if not cWidth then
trace("|r|cffff4422! -- Tourist:|r No HBD size data for "..tostring(continentName))
end
if cWidth == 0 then
trace("|r|cffff4422! -- Tourist:|r HBD size is zero for "..tostring(continentName))
end
zones[continentName].yards = cWidth or 0
--trace("Tourist: Continent size in yards for "..tostring(continentName).." ("..tostring(continentMapID).."): "..tostring(round(zones[continentName].yards, 2)))
else
-- Unknown Continent
trace("|r|cffff4422! -- Tourist:|r TODO: Add Continent '"..tostring(continentName).."' ("..tostring(continentMapID)..")")
end
counter = counter + 1
end
trace("Tourist: Processed "..tostring(counter).." continents")
trace("Tourist: Initializing zones...")
local doneZones = {}
local mapZones = {}
local uniqueZoneName
local minLvl, maxLvl, minPetLvl, maxPetLvl
local counter2 = 0
counter = 0
for continentMapID, continentName in pairs(continentNames) do
mapZones = Tourist:GetMapZonesAlt(continentMapID)
counter = 0
for zoneMapID, zoneName in pairs(mapZones) do
-- Add mapIDs to lookup table
zoneMapIDtoContinentMapID[zoneMapID] = continentMapID
-- Check for duplicate on continent name + zone name
if not doneZones[continentName.."."..zoneName] then
uniqueZoneName = Tourist:GetUniqueZoneNameForLookup(zoneName, continentMapID)
if zones[uniqueZoneName] then
-- Set zone mapID. Note: a zone can have multiple map ID's so this might not be entirely accurate
zones[uniqueZoneName].zoneMapID = zoneMapID
-- Get zone texture ID
zones[uniqueZoneName].texture = C_Map.GetMapArtID(continentMapID)
-- Get zone player and battle pet levels
minLvl, maxLvl, minPetLvl, maxPetLvl = C_Map.GetMapLevels(zoneMapID)
--if minLvl and minLvl > 0 then zones[uniqueZoneName].low = minLvl end
--if maxLvl and maxLvl > 0 then zones[uniqueZoneName].high = maxLvl end
if minPetLvl and minPetLvl > 0 then zones[uniqueZoneName].battlepet_low = minPetLvl end
if maxPetLvl and maxPetLvl > 0 then zones[uniqueZoneName].battlepet_high = maxPetLvl end
-- Get map size
local zWidth = HBD:GetZoneSize(zoneMapID)
if not zWidth then
trace("|r|cffff4422! -- Tourist:|r No size data for "..tostring(zoneName).." ("..tostring(continentName)..")" )
end
if zWidth == 0 then
trace("|r|cffff4422! -- Tourist:|r Size is zero for "..tostring(zoneName).." ("..tostring(continentName)..")" )
end
if zWidth ~= 0 or not zones[uniqueZoneName].yards then
-- Make sure the size is always set (even if it's 0) but don't overwrite any hardcoded values if the size is 0
zones[uniqueZoneName].yards = zWidth
end
else
trace("|r|cffff4422! -- Tourist:|r TODO: Add zone "..tostring(zoneName).." (to "..tostring(continentName)..")" )
end
doneZones[continentName.."."..zoneName] = true
else
trace("|r|cffff4422! -- Tourist:|r Duplicate zone: "..tostring(zoneName).." [ID "..tostring(zoneMapID).."] (at "..tostring(continentName)..")" )
end
counter = counter + 1
end -- zone loop
trace( "Tourist: Processed "..tostring(counter).." zones for "..continentName.." (ID = "..tostring(continentMapID)..")" )
counter2 = counter2 + counter
end -- continent loop
trace("Tourist: Processed "..tostring(counter2).." zones")
trace("Tourist: Filling lookup tables...")
-- Fill the lookup tables
for k,v in pairs(zones) do
lows[k] = v.low or 0
highs[k] = v.high or 0
ct_lows[k] = v.ct_low or 0
expansions[k] = v.expansion
continents[k] = v.continent or UNKNOWN
instances[k] = v.instances
paths[k] = v.paths or false
flightnodes[k] = v.flightnodes or false
types[k] = v.type or "Zone"
groupSizes[k] = v.groupSize
groupMinSizes[k] = v.groupMinSize
groupMaxSizes[k] = v.groupMaxSize
groupAltSizes[k] = v.altGroupSize
factions[k] = v.faction
yardWidths[k] = v.yards
yardHeights[k] = v.yards and v.yards * 2/3 or nil
battlepet_lows[k] = v.battlepet_low
battlepet_highs[k] = v.battlepet_high
textures[k] = v.texture
complexOfInstance[k] = v.complex
zoneComplexes[k] = v.complexes
if v.texture then
textures_rev[v.texture] = k
end
zoneMapIDs[k] = v.zoneMapID
if v.entrancePortal then
entrancePortals_zone[k] = v.entrancePortal[1]
entrancePortals_x[k] = v.entrancePortal[2]
entrancePortals_y[k] = v.entrancePortal[3]
end
if v.flightnodes then
for nodeID in pairs(v.flightnodes) do
if not FlightnodeLookupTable[nodeID] then
FlightnodeLookupTable[nodeID] = true
end
end
end
end
trace("Tourist: Built Flightnode lookup table: "..tostring(tablelength(FlightnodeLookupTable)).." nodes.")
zones = nil
trace("Tourist: Initialized.")
PLAYER_LEVEL_UP(Tourist)
end