--[[ Name: Tourist-2.0 Revision: $Rev: 5925 $ Author(s): ckknight (ckknight@gmail.com) Website: http://ckknight.wowinterface.com/ Documentation: http://wiki.wowace.com/index.php/Tourist-2.0 SVN: http://svn.wowace.com/root/trunk/TouristLib/Tourist-2.0 Description: A library to provide information about zones and instances. Dependencies: AceLibrary, Babble-Zone-2.0, AceConsole-2.0 (optional) ]] local MAJOR_VERSION = "Tourist-2.0" local MINOR_VERSION = "$Revision: 5925 $" if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary") end if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end if not AceLibrary:HasInstance("Babble-Zone-2.0") then error(MAJOR_VERSION .. " requires Babble-Zone-2.0") end local Tourist = {} local events = {} local loc do local Z = AceLibrary("Babble-Zone-2.0") loc = { BOOTY_BAY = Z"Booty Bay", DEEPRUN_TRAM = Z"Deeprun Tram", IRONFORGE = Z"Ironforge", STORMWIND_CITY = Z"Stormwind City", ELWYNN_FOREST = Z"Elwynn Forest", DUN_MOROGH = Z"Dun Morogh", TIRISFAL_GLADES = Z"Tirisfal Glades", LOCH_MODAN = Z"Loch Modan", SILVERPINE_FOREST = Z"Silverpine Forest", WESTFALL = Z"Westfall", REDRIDGE_MOUNTAINS = Z"Redridge Mountains", DUSKWOOD = Z"Duskwood", HILLSBRAD_FOOTHILLS = Z"Hillsbrad Foothills", WETLANDS = Z"Wetlands", ALTERAC_MOUNTAINS = Z"Alterac Mountains", ARATHI_HIGHLANDS = Z"Arathi Highlands", STRANGLETHORN_VALE = Z"Stranglethorn Vale", BADLANDS = Z"Badlands", SWAMP_OF_SORROWS = Z"Swamp of Sorrows", DEADWIND_PASS = Z"Deadwind Pass", HINTERLANDS = Z"The Hinterlands", SEARING_GORGE = Z"Searing Gorge", BLASTED_LANDS = Z"Blasted Lands", BURNING_STEPPES = Z"Burning Steppes", WESTERN_PLAGUELANDS = Z"Western Plaguelands", EASTERN_PLAGUELANDS = Z"Eastern Plaguelands", RATCHET = Z"Ratchet", GADGETZAN = Z"Gadgetzan", ORGRIMMAR = Z"Orgrimmar", THUNDER_BLUFF = Z"Thunder Bluff", UNDERCITY = Z"Undercity", DUROTAR = Z"Durotar", MULGORE = Z"Mulgore", DARKSHORE = Z"Darkshore", BARRENS = Z"The Barrens", STONETALON_MOUNTAINS = Z"Stonetalon Mountains", ASHENVALE = Z"Ashenvale", THOUSAND_NEEDLES = Z"Thousand Needles", DESOLACE = Z"Desolace", DUSTWALLOW_MARSH = Z"Dustwallow Marsh", FERALAS = Z"Feralas", TANARIS = Z"Tanaris", AZSHARA = Z"Azshara", FELWOOD = Z"Felwood", UN_GORO_CRATER = Z"Un'Goro Crater", SILITHUS = Z"Silithus", WINTERSPRING = Z"Winterspring", HYJAL = Z"Hyjal", MOONGLADE = Z"Moonglade", DARNASSUS = Z"Darnassus", TELDRASSIL = Z"Teldrassil", ALTERAC_VALLEY = Z"Alterac Valley", WARSONG_GULCH = Z"Warsong Gulch", ARATHI_BASIN = Z"Arathi Basin", STOCKADE = Z"The Stockade", RAGEFIRE_CHASM = Z"Ragefire Chasm", ZUL_FARRAK = Z"Zul'Farrak", DEADMINES = Z"The Deadmines", WAILING_CAVERNS = Z"Wailing Caverns", GNOMEREGAN = Z"Gnomeregan", RAZORFEN_KRAUL = Z"Razorfen Kraul", BLACKFATHOM_DEEPS = Z"Blackfathom Deeps", SHADOWFANG_KEEP = Z"Shadowfang Keep", SCARLET_MONASTERY = Z"Scarlet Monastery", ULDAMAN = Z"Uldaman", RAZORFEN_DOWNS = Z"Razorfen Downs", MARAUDON = Z"Maraudon", ONYXIAS_LAIR = Z"Onyxia's Lair", BLACKROCK_MOUNTAIN = Z"Blackrock Mountain", CAVERNS_OF_TIME = Z"Caverns of Time", TEMPLE_OF_ATAL_HAKKAR = Z"The Temple of Atal'Hakkar", DIRE_MAUL = Z"Dire Maul", BLACKROCK_DEPTHS = Z"Blackrock Depths", BLACKROCK_SPIRE = Z"Blackrock Spire", STRATHOLME = Z"Stratholme", MOLTEN_CORE = Z"Molten Core", SCHOLOMANCE = Z"Scholomance", BLACKWING_LAIR = Z"Blackwing Lair", ZUL_GURUB = Z"Zul'Gurub", RUINS_OF_AHN_QIRAJ = Z"Ruins of Ahn'Qiraj", TEMPLE_OF_AHN_QIRAJ = Z"Temple of Ahn'Qiraj", NAXXRAMAS = Z"Naxxramas", } end local playerLevel = 1 local _,race = UnitRace("player") local isHorde = (race == "Orc" or race == "Troll" or race == "Tauren" or race == "Scourge") function events:PLAYER_LEVEL_UP() playerLevel = UnitLevel("player") for k in pairs(self.recZones) do self.recZones[k] = nil end for k in pairs(self.recInstances) do self.recInstances[k] = nil end for zone in self.lowZones do if not self:IsHostile(zone) then local low, high = self:GetLevel(zone) if not self:IsInstance(zone) then if low <= playerLevel and playerLevel <= high then self.recZones[zone] = true end elseif self:IsBattleground(zone) then if playerLevel >= low and (playerLevel == 60 or math.mod(playerLevel, 10) >= 6) then self.recInstances[zone] = true end else if low <= playerLevel and playerLevel <= high then self.recInstances[zone] = true end end end end end events.PLAYER_ENTERING_WORLD = events.PLAYER_LEVEL_UP function Tourist:GetLevel(zone) self:argCheck(zone, 2, "string") if self:IsBattleground(zone) then if zone == loc.ALTERAC_VALLEY then return 51, 60 elseif playerLevel == 60 then return 60, 60 elseif playerLevel >= 50 then return 50, 59 elseif playerLevel >= 40 then return 40, 49 elseif playerLevel >= 30 then return 30, 39 elseif playerLevel >= 20 or zone == loc.ARATHI_BASIN then return 20, 29 else return 10, 19 end end return self.lowZones[zone] or -6, self.highZones[zone] or -6 end function Tourist:GetLevelColor(zone) self:argCheck(zone, 2, "string") if self:IsBattleground(zone) then if (playerLevel < 51 and zone == loc.ALTERAC_VALLEY) or (playerLevel < 20 and zone == loc.ARATHI_BASIN) or (playerLevel < 10 and zone == loc.WARSONG_GULCH) then return 1, 0, 0 end local playerLevel = playerLevel if zone == loc.ALTERAC_VALLEY then playerLevel = playerLevel - 1 end if playerLevel == 60 then return 1, 1, 0 end playerLevel = math.mod(playerLevel, 10) if playerLevel <= 5 then return 1, playerLevel / 10, 0 elseif playerLevel <= 7 then return 1, (playerLevel - 3) / 4, 0 else return (9 - playerLevel) / 2, 1, 0 end end local low, high = self:GetLevel(zone) if playerLevel <= low - 3 then return 1, 0, 0 elseif playerLevel <= low then return 1, (playerLevel - low - 3) / -6, 0 elseif playerLevel <= (low + high) / 2 then return 1, (playerLevel - low) / (high - low) + 0.5, 0 elseif playerLevel <= high then return 2 * (playerLevel - high) / (low - high), 1, 0 elseif playerLevel <= high + 3 then local num = (playerLevel - high) / 6 return num, 1 - num, num else return 0.5, 0.5, 0.5 end end function Tourist:GetFactionColor(zone) self:argCheck(zone, 2, "string") if self:IsAlliance(zone) then if not isHorde then return 0, 1, 0 else return 1, 0, 0 end elseif self:IsHorde(zone) then if isHorde then return 0, 1, 0 else return 1, 0, 0 end else return 1, 1, 0 end end local retNil = function() end local retOne = function(zone, state) if state ~= nil then return else return zone end end local function iterZoneInstances(zone, position) local k = next(zone, position) return k end function Tourist:IterateZoneInstances(zone) self:argCheck(zone, 2, "string") if type(self.zoneInstances[zone]) == nil then return retNil, nil, nil elseif type(self.zoneInstances[zone]) == "table" then return iterZoneInstances, self.zoneInstances[zone], nil else return retOne, self.zoneInstances[zone], nil end end function Tourist:DoesZoneHaveInstances(zone) self:argCheck(zone, 2, "string") return self.zoneInstances[zone] ~= nil end local zonesInstances local function initZonesInstances() if not zonesInstances then zonesInstances = {} for zone in pairs(self.lowZones) do zonesInstances[zone] = true end end initZonesInstances = nil end local function zoneInstanceIter(_, position) local k = next(zonesInstances, position) return k end function Tourist:IterateZonesAndInstances() if initZonesInstances then initZonesInstances() end return zoneInstanceIter, nil, nil end local function zoneIter(_, position) local k = next(zonesInstances, position) while k ~= nil and self:IsInstance(k) 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 not self:IsInstance(k) 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 not self:IsBattleground(k) do k = next(zonesInstances, k) end return k end function Tourist:IterateBattlegrounds() if initZonesInstances then initZonesInstances() end return bgIter, nil, nil end local function allianceIter(_, position) local k = next(zonesInstances, position) while k ~= nil and not self:IsAlliance(k) 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 not self:IsHorde(k) do k = next(zonesInstances, k) end return k end function Tourist:IterateHorde() if initZonesInstances then initZonesInstances() end return hordeIter, nil, nil end function Tourist:IterateFriendly() if isHorde then return self:IterateHordeZonesInstances() else return self:IterateAllianceZonesInstances() end end function Tourist:IterateHostile() if isHorde then return self:IterateAllianceZonesInstances() else return self:IterateHordeZonesInstances() end end local function contestedIter(_, position) local k = next(zonesInstances, position) while k ~= nil and (self:IsAlliance(k) or self:IsHorde(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 recZoneIter(recZones, position) local k = next(recZones, position) return k end function Tourist:IterateRecommendedZones() return recZoneIter, self.recZones, nil end function Tourist:IterateRecommendedInstances() return recZoneIter, self.recInstances, nil end function Tourist:HasRecommendedInstances() return next(self.recInstances) ~= nil end function Tourist:IsInstance(zone) self:argCheck(zone, 2, "string") return self.instances[zone] ~= nil end function Tourist:IsZone(zone) self:argCheck(zone, 2, "string") return self.instances[zone] == nil and not self.lowZones[zone] ~= nil end function Tourist:IsZoneOrInstance(zone) self:argCheck(zone, 2, "string") return self.lowZones[zone] ~= nil end function Tourist:IsBattleground(zone) self:argCheck(zone, 2, "string") return zone == loc.WARSONG_GULCH or zone == loc.ARATHI_BASIN or zone == loc.ALTERAC_VALLEY end function Tourist:IsAlliance(zone) self:argCheck(zone, 2, "string") return zone == loc.IRONFORGE or zone == loc.STORMWIND_CITY or zone == loc.DUN_MOROGH or zone == loc.ELWYNN_FOREST or zone == loc.LOCH_MODAN or zone == loc.WESTFALL or zone == loc.DARNASSUS or zone == loc.TELDRASSIL or zone == loc.DARKSHORE or zone == loc.STOCKADE or zone == loc.GNOMEREGAN or zone == loc.DEADMINES end function Tourist:IsHorde(zone) self:argCheck(zone, 2, "string") return zone == loc.UNDERCITY or zone == loc.ORGRIMMAR or zone == loc.THUNDER_BLUFF or zone == loc.TIRISFAL_GLADES or zone == loc.SILVERPINE_FOREST or zone == loc.DUROTAR or zone == loc.MULGORE or zone == loc.BARRENS or zone == loc.RAGEFIRE_CHASM or zone == loc.SHADOWFANG_KEEP or zone == loc.WAILING_CAVERNS end function Tourist:IsFriendly(zone) self:argCheck(zone, 2, "string") if isHorde then return self:IsHorde(zone) else return self:IsAlliance(zone) end end function Tourist:IsHostile(zone) self:argCheck(zone, 2, "string") if isHorde then return self:IsAlliance(zone) else return self:IsHorde(zone) end end function Tourist:IsContested(zone) self:argCheck(zone, 2, "string") return not self:IsAlliance(zone) and not self:IsHorde(zone) end local function activate(self, oldLib, oldDeactivate) if oldLib then self.frame = oldLib.frame self.frame:UnregisterAllEvents() self.lowZones = oldLib.lowZones self.highZones = oldLib.highZones self.zoneInstances = oldLib.zoneInstances self.instances = oldLib.instances self.recZones = oldLib.recZones self.recInstances = oldLib.recInstances for k in pairs(self.lowZones) do self.lowZones[k] = nil end for k in pairs(self.highZones) do self.highZones[k] = nil end for k in pairs(self.zoneInstances) do self.zoneInstances[k] = nil end for k in pairs(self.instances) do self.instances[k] = nil end else self.frame = CreateFrame("Frame", "TouristLibFrame", UIParent) self.lowZones = {} self.highZones = {} self.zoneInstances = {} self.instances = {} self.recZones = {} self.recInstances = {} end self.frame:RegisterEvent("PLAYER_LEVEL_UP") self.frame:RegisterEvent("PLAYER_ENTERING_WORLD") self.frame:SetScript("OnEvent", function() events[event](self) end) -- Eastern Kingdoms self.lowZones[loc.BOOTY_BAY] = -6 self.highZones[loc.BOOTY_BAY] = -6 self.lowZones[loc.DEEPRUN_TRAM] = -6 self.highZones[loc.DEEPRUN_TRAM] = -6 self.lowZones[loc.IRONFORGE] = -6 self.highZones[loc.IRONFORGE] = -6 self.lowZones[loc.STORMWIND_CITY] = -6 self.highZones[loc.STORMWIND_CITY] = -6 self.lowZones[loc.ELWYNN_FOREST] = 1 self.highZones[loc.ELWYNN_FOREST] = 10 self.lowZones[loc.DUN_MOROGH] = 1 self.highZones[loc.DUN_MOROGH] = 10 self.lowZones[loc.TIRISFAL_GLADES] = 1 self.highZones[loc.TIRISFAL_GLADES] = 10 self.lowZones[loc.LOCH_MODAN] = 10 self.highZones[loc.LOCH_MODAN] = 20 self.lowZones[loc.SILVERPINE_FOREST] = 10 self.highZones[loc.SILVERPINE_FOREST] = 20 self.lowZones[loc.WESTFALL] = 10 self.highZones[loc.WESTFALL] = 20 self.lowZones[loc.REDRIDGE_MOUNTAINS] = 15 self.highZones[loc.REDRIDGE_MOUNTAINS] = 25 self.lowZones[loc.DUSKWOOD] = 18 self.highZones[loc.DUSKWOOD] = 30 self.lowZones[loc.HILLSBRAD_FOOTHILLS] = 20 self.highZones[loc.HILLSBRAD_FOOTHILLS] = 30 self.lowZones[loc.WETLANDS] = 20 self.highZones[loc.WETLANDS] = 30 self.lowZones[loc.ALTERAC_MOUNTAINS] = 30 self.highZones[loc.ALTERAC_MOUNTAINS] = 40 self.lowZones[loc.ARATHI_HIGHLANDS] = 30 self.highZones[loc.ARATHI_HIGHLANDS] = 40 self.lowZones[loc.STRANGLETHORN_VALE] = 30 self.highZones[loc.STRANGLETHORN_VALE] = 45 self.lowZones[loc.BADLANDS] = 35 self.highZones[loc.BADLANDS] = 45 self.lowZones[loc.SWAMP_OF_SORROWS] = 35 self.highZones[loc.SWAMP_OF_SORROWS] = 45 self.lowZones[loc.DEADWIND_PASS] = 37 self.highZones[loc.DEADWIND_PASS] = 60 self.lowZones[loc.HINTERLANDS] = 40 self.highZones[loc.HINTERLANDS] = 50 self.lowZones[loc.SEARING_GORGE] = 43 self.highZones[loc.SEARING_GORGE] = 50 self.lowZones[loc.BLASTED_LANDS] = 45 self.highZones[loc.BLASTED_LANDS] = 55 self.lowZones[loc.BURNING_STEPPES] = 50 self.highZones[loc.BURNING_STEPPES] = 58 self.lowZones[loc.WESTERN_PLAGUELANDS] = 51 self.highZones[loc.WESTERN_PLAGUELANDS] = 58 self.lowZones[loc.EASTERN_PLAGUELANDS] = 53 self.highZones[loc.EASTERN_PLAGUELANDS] = 60 -- Kalimdor self.lowZones[loc.RATCHET] = -6 self.highZones[loc.RATCHET] = -6 self.lowZones[loc.GADGETZAN] = -6 self.highZones[loc.GADGETZAN] = -6 self.lowZones[loc.ORGRIMMAR] = -6 self.highZones[loc.ORGRIMMAR] = -6 self.lowZones[loc.THUNDER_BLUFF] = -6 self.highZones[loc.THUNDER_BLUFF] = -6 self.lowZones[loc.UNDERCITY] = -6 self.highZones[loc.UNDERCITY] = -6 self.lowZones[loc.DUROTAR] = 1 self.highZones[loc.DUROTAR] = 10 self.lowZones[loc.MULGORE] = 1 self.highZones[loc.MULGORE] = 10 self.lowZones[loc.DARKSHORE] = 10 self.highZones[loc.DARKSHORE] = 20 self.lowZones[loc.BARRENS] = 10 self.highZones[loc.BARRENS] = 25 self.lowZones[loc.STONETALON_MOUNTAINS] = 15 self.highZones[loc.STONETALON_MOUNTAINS] = 27 self.lowZones[loc.ASHENVALE] = 18 self.highZones[loc.ASHENVALE] = 30 self.lowZones[loc.THOUSAND_NEEDLES] = 25 self.highZones[loc.THOUSAND_NEEDLES] = 35 self.lowZones[loc.DESOLACE] = 30 self.highZones[loc.DESOLACE] = 40 self.lowZones[loc.DUSTWALLOW_MARSH] = 35 self.highZones[loc.DUSTWALLOW_MARSH] = 45 self.lowZones[loc.FERALAS] = 40 self.highZones[loc.FERALAS] = 50 self.lowZones[loc.TANARIS] = 40 self.highZones[loc.TANARIS] = 50 self.lowZones[loc.AZSHARA] = 45 self.highZones[loc.AZSHARA] = 55 self.lowZones[loc.FELWOOD] = 48 self.highZones[loc.FELWOOD] = 55 self.lowZones[loc.UN_GORO_CRATER] = 48 self.highZones[loc.UN_GORO_CRATER] = 55 self.lowZones[loc.SILITHUS] = 55 self.highZones[loc.SILITHUS] = 60 self.lowZones[loc.WINTERSPRING] = 55 self.highZones[loc.WINTERSPRING] = 60 self.lowZones[loc.HYJAL] = 60 self.highZones[loc.HYJAL] = 60 self.lowZones[loc.MOONGLADE] = -6 self.highZones[loc.MOONGLADE] = -6 self.lowZones[loc.DARNASSUS] = -6 self.highZones[loc.DARNASSUS] = -6 self.lowZones[loc.TELDRASSIL] = 1 self.highZones[loc.TELDRASSIL] = 10 -- Battlegrounds (Tiered) self.lowZones[loc.ALTERAC_VALLEY] = -6 self.highZones[loc.ALTERAC_VALLEY] = -6 self.lowZones[loc.WARSONG_GULCH] = -6 self.highZones[loc.WARSONG_GULCH] = -6 self.lowZones[loc.ARATHI_BASIN] = -6 self.highZones[loc.ARATHI_BASIN] = -6 -- Instances if GetLocale() == "enUS" then self.lowZones[loc.STOCKADE] = 24 self.highZones[loc.STOCKADE] = 32 self.lowZones[loc.RAGEFIRE_CHASM] = 13 self.highZones[loc.RAGEFIRE_CHASM] = 18 self.lowZones[loc.ZUL_FARRAK] = 44 self.highZones[loc.ZUL_FARRAK] = 54 self.lowZones[loc.DEADMINES] = 17 self.highZones[loc.DEADMINES] = 26 self.lowZones[loc.WAILING_CAVERNS] = 17 self.highZones[loc.WAILING_CAVERNS] = 24 self.lowZones[loc.GNOMEREGAN] = 29 self.highZones[loc.GNOMEREGAN] = 38 self.lowZones[loc.RAZORFEN_KRAUL] = 29 self.highZones[loc.RAZORFEN_KRAUL] = 38 self.lowZones[loc.BLACKFATHOM_DEEPS] = 24 self.highZones[loc.BLACKFATHOM_DEEPS] = 32 self.lowZones[loc.SHADOWFANG_KEEP] = 22 self.highZones[loc.SHADOWFANG_KEEP] = 30 self.lowZones[loc.SCARLET_MONASTERY] = 34 self.highZones[loc.SCARLET_MONASTERY] = 45 self.lowZones[loc.ULDAMAN] = 41 self.highZones[loc.ULDAMAN] = 51 self.lowZones[loc.RAZORFEN_DOWNS] = 37 self.highZones[loc.RAZORFEN_DOWNS] = 46 self.lowZones[loc.MARAUDON] = 46 self.highZones[loc.MARAUDON] = 55 self.lowZones[loc.ONYXIAS_LAIR] = 60 self.highZones[loc.ONYXIAS_LAIR] = 62 self.lowZones[loc.BLACKROCK_MOUNTAIN] = 42 self.highZones[loc.BLACKROCK_MOUNTAIN] = 54 self.lowZones[loc.CAVERNS_OF_TIME] = 43 self.highZones[loc.CAVERNS_OF_TIME] = 61 self.lowZones[loc.TEMPLE_OF_ATAL_HAKKAR] = 50 self.highZones[loc.TEMPLE_OF_ATAL_HAKKAR] = 60 self.lowZones[loc.DIRE_MAUL] = 56 self.highZones[loc.DIRE_MAUL] = 60 self.lowZones[loc.BLACKROCK_DEPTHS] = 52 self.highZones[loc.BLACKROCK_DEPTHS] = 60 self.lowZones[loc.BLACKROCK_SPIRE] = 55 self.highZones[loc.BLACKROCK_SPIRE] = 60 self.lowZones[loc.STRATHOLME] = 58 self.highZones[loc.STRATHOLME] = 60 self.lowZones[loc.MOLTEN_CORE] = 60 self.highZones[loc.MOLTEN_CORE] = 62 self.lowZones[loc.SCHOLOMANCE] = 58 self.highZones[loc.SCHOLOMANCE] = 60 self.lowZones[loc.BLACKWING_LAIR] = 60 self.highZones[loc.BLACKWING_LAIR] = 62 self.lowZones[loc.ZUL_GURUB] = 60 self.highZones[loc.ZUL_GURUB] = 62 self.lowZones[loc.RUINS_OF_AHN_QIRAJ] = 60 self.highZones[loc.RUINS_OF_AHN_QIRAJ] = 65 self.lowZones[loc.TEMPLE_OF_AHN_QIRAJ] = 60 self.highZones[loc.TEMPLE_OF_AHN_QIRAJ] = 65 self.lowZones[loc.NAXXRAMAS] = 60 self.highZones[loc.NAXXRAMAS] = 70 else self.lowZones[loc.STOCKADE] = 23 self.highZones[loc.STOCKADE] = 26 self.lowZones[loc.RAGEFIRE_CHASM] = 13 self.highZones[loc.RAGEFIRE_CHASM] = 15 self.lowZones[loc.ZUL_FARRAK] = 43 self.highZones[loc.ZUL_FARRAK] = 47 self.lowZones[loc.DEADMINES] = 15 self.highZones[loc.DEADMINES] = 20 self.lowZones[loc.WAILING_CAVERNS] = 15 self.highZones[loc.WAILING_CAVERNS] = 21 self.lowZones[loc.GNOMEREGAN] = 24 self.highZones[loc.GNOMEREGAN] = 33 self.lowZones[loc.RAZORFEN_KRAUL] = 25 self.highZones[loc.RAZORFEN_KRAUL] = 35 self.lowZones[loc.BLACKFATHOM_DEEPS] = 20 self.highZones[loc.BLACKFATHOM_DEEPS] = 27 self.lowZones[loc.SHADOWFANG_KEEP] = 18 self.highZones[loc.SHADOWFANG_KEEP] = 25 self.lowZones[loc.SCARLET_MONASTERY] = 30 self.highZones[loc.SCARLET_MONASTERY] = 40 self.lowZones[loc.ULDAMAN] = 35 self.highZones[loc.ULDAMAN] = 45 self.lowZones[loc.RAZORFEN_DOWNS] = 35 self.highZones[loc.RAZORFEN_DOWNS] = 40 self.lowZones[loc.MARAUDON] = 40 self.highZones[loc.MARAUDON] = 49 self.lowZones[loc.ONYXIAS_LAIR] = 60 self.highZones[loc.ONYXIAS_LAIR] = 62 self.lowZones[loc.BLACKROCK_MOUNTAIN] = 42 self.highZones[loc.BLACKROCK_MOUNTAIN] = 54 self.lowZones[loc.CAVERNS_OF_TIME] = -6 self.highZones[loc.CAVERNS_OF_TIME] = -6 self.lowZones[loc.TEMPLE_OF_ATAL_HAKKAR] = 44 self.highZones[loc.TEMPLE_OF_ATAL_HAKKAR] = 50 self.lowZones[loc.DIRE_MAUL] = 56 self.highZones[loc.DIRE_MAUL] = 60 self.lowZones[loc.BLACKROCK_DEPTHS] = 48 self.highZones[loc.BLACKROCK_DEPTHS] = 56 self.lowZones[loc.BLACKROCK_SPIRE] = 53 self.highZones[loc.BLACKROCK_SPIRE] = 60 self.lowZones[loc.STRATHOLME] = 55 self.highZones[loc.STRATHOLME] = 60 self.lowZones[loc.MOLTEN_CORE] = 60 self.highZones[loc.MOLTEN_CORE] = 62 self.lowZones[loc.SCHOLOMANCE] = 56 self.highZones[loc.SCHOLOMANCE] = 60 self.lowZones[loc.BLACKWING_LAIR] = 60 self.highZones[loc.BLACKWING_LAIR] = 62 self.lowZones[loc.ZUL_GURUB] = 60 self.highZones[loc.ZUL_GURUB] = 62 self.lowZones[loc.RUINS_OF_AHN_QIRAJ] = 60 self.highZones[loc.RUINS_OF_AHN_QIRAJ] = 65 self.lowZones[loc.TEMPLE_OF_AHN_QIRAJ] = 60 self.highZones[loc.TEMPLE_OF_AHN_QIRAJ] = 65 self.lowZones[loc.NAXXRAMAS] = 60 self.highZones[loc.NAXXRAMAS] = 70 end self.zoneInstances[loc.STORMWIND_CITY] = loc.STOCKADE self.zoneInstances[loc.ELWYNN_FOREST] = self.zoneInstances[loc.ELWYNN_FOREST] self.zoneInstances[loc.ORGRIMMAR] = loc.RAGEFIRE_CHASM self.zoneInstances[loc.DUROTAR] = self.zoneInstances[loc.ORGRIMMAR] self.zoneInstances[loc.DUN_MOROGH] = loc.GNOMEREGAN self.zoneInstances[loc.IRONFORGE] = self.zoneInstances[loc.DUN_MOROGH] self.zoneInstances[loc.TIRISFAL_GLADES] = loc.SCARLET_MONASTERY self.zoneInstances[loc.UNDERCITY] = self.zoneInstances[loc.TIRISFAL_GLADES] self.zoneInstances[loc.WESTFALL] = loc.DEADMINES self.zoneInstances[loc.SILVERPINE_FOREST] = loc.SHADOWFANG_KEEP self.zoneInstances[loc.ALTERAC_MOUNTAINS] = loc.ALTERAC_VALLEY self.zoneInstances[loc.ARATHI_HIGHLANDS] = loc.ARATHI_BASIN self.zoneInstances[loc.STRANGLETHORN_VALE] = loc.ZUL_GURUB self.zoneInstances[loc.SWAMP_OF_SORROWS] = loc.TEMPLE_OF_ATAL_HAKKAR self.zoneInstances[loc.SEARING_GORGE] = { [loc.MOLTEN_CORE] = true, [loc.BLACKWING_LAIR] = true, [loc.BLACKROCK_SPIRE] = true, [loc.BLACKROCK_DEPTHS] = true, } self.zoneInstances[loc.BLACKROCK_MOUNTAIN] = self.zoneInstances[loc.SEARING_GORGE] self.zoneInstances[loc.BURNING_STEPPES] = self.zoneInstances[loc.SEARING_GORGE] self.zoneInstances[loc.EASTERN_PLAGUELANDS] = { [loc.STRATHOLME] = true, [loc.NAXXRAMAS] = true } self.zoneInstances[loc.WESTERN_PLAGUELANDS] = loc.SCHOLOMANCE self.zoneInstances[loc.BARRENS] = { [loc.WAILING_CAVERNS] = true, [loc.RAZORFEN_KRAUL] = true, [loc.RAZORFEN_DOWNS] = true } self.zoneInstances[loc.ASHENVALE] = loc.BLACKFATHOM_DEEPS if UnitFactionGroup("player") == "Horde" then self.zoneInstances[loc.BARRENS][loc.WARSONG_GULCH] = true else self.zoneInstances[loc.ASHENVALE] = { [loc.BLACKFATHOM_DEEPS] = true, [loc.WARSONG_GULCH] = true } end self.zoneInstances[loc.DESOLACE] = loc.MARAUDON self.zoneInstances[loc.DUSTWALLOW_MARSH] = loc.ONYXIAS_LAIR self.zoneInstances[loc.FERALAS] = loc.DIRE_MAUL self.zoneInstances[loc.SILITHUS] = { [loc.RUINS_OF_AHN_QIRAJ] = true, [loc.TEMPLE_OF_AHN_QIRAJ] = true } self.zoneInstances[loc.TANARIS] = loc.ZUL_FARRAK self.zoneInstances[loc.BADLANDS] = loc.ULDAMAN for _,instances in pairs(self.zoneInstances) do if type(instances) == "table" then for instance in pairs(instances) do self.instances[instance] = true end else self.instances[instances] = true end end events.PLAYER_LEVEL_UP(self) if oldDeactivate then oldDeactivate(oldLib) end end local function external(self, major, instance) if major == "AceConsole-2.0" then local print = print if DEFAULT_CHAT_FRAME then function print(text) DEFAULT_CHAT_FRAME:AddMessage(text) end end instance.RegisterChatCommand(self, { "/tourist", "/touristLib" }, { name = MAJOR_VERSION .. "." .. string.gsub(MINOR_VERSION, ".-(%d+).*", "%1"), desc = "A library to provide information about zones and instances.", type = "group", args = { zone = { name = "Zone", desc = "Get information about a zone", type = "text", usage = "", get = false, set = function(text) local type if self:IsBattleground(text) then type = "Battleground" elseif self:IsInstance(text) then type = "Instance" else type = "Zone" end local faction if self:IsAlliance(text) then faction = "Alliance" elseif self:IsHorde(text) then faction = "Horde" else faction = "Contested" end if self:IsHostile(text) then faction = faction .. " (hostile)" elseif self:IsFriendly(text) then faction = faction .. " (friendly)" end local low, high = self:GetLevel(text) print("|cffffff7f" .. text .. "|r") print(" |cffffff7fType: [|r" .. type .. "|cffffff7f]|r") print(" |cffffff7fFaction: [|r" .. faction .. "|cffffff7f]|r") if low ~= -6 and high ~= -6 then print(" |cffffff7fLevels: [|r" .. low .. "-" .. high .. "|cffffff7f]|r") end if self:DoesZoneHaveInstances(text) then print(" |cffffff7fInstances:|r") for instance in self:IterateZoneInstances(text) do local isBG = self:IsBattleground(instance) and " (BG)" or "" local low, high = self:GetLevel(instance) local faction = "" if self:IsAlliance(instance) then faction = " - Alliance" elseif self:IsHorde(instance) then faction = " - Horde" end if self:IsHostile(instance) then faction = faction .. " (hostile)" elseif self:IsFriendly(instance) then faction = faction .. " (friendly)" end print(" " .. instance .. isBG .. " - " .. low .. "-" .. high .. faction) end end end, validate = function(text) return self:IsZoneOrInstance(text) end }, recommend = { name = "Recommended Zones", desc = "List recommended zones", type = "execute", func = function() print("|cffffff7fRecomended zones:|r") for zone in self:IterateRecommendedZones() do local low, high = self:GetLevel(zone) local faction = "" if self:IsAlliance(zone) then faction = " - Alliance" elseif self:IsHorde(zone) then faction = " - Horde" end if self:IsHostile(zone) then faction = faction .. " (hostile)" elseif self:IsFriendly(zone) then faction = faction .. " (friendly)" end print(" |cffffff7f" .. zone .. "|r - " .. low .. "-" .. high .. faction) end if self:HasRecommendedInstances() then print("|cffffff7fRecomended instances:|r") for instance in self:IterateRecommendedInstances() do local isBG = self:IsBattleground(instance) and " (BG)" or "" local low, high = self:GetLevel(instance) local faction = "" if self:IsAlliance(instance) then faction = " - Alliance" elseif self:IsHorde(instance) then faction = " - Horde" end if self:IsHostile(instance) then faction = faction .. " (hostile)" elseif self:IsFriendly(instance) then faction = faction .. " (friendly)" end print(" |cffffff7f" .. instance .. "|r" .. isBG .. " - " .. low .. "-" .. high .. faction) end end end } } }, "TOURIST") end end AceLibrary:Register(Tourist, MAJOR_VERSION, MINOR_VERSION, activate, nil, external) Tourist = nil