Quantcast

Update (and compat) for Astrolabe-1.0 with Cataclysm

James Whitehead II [11-24-10 - 14:21]
Update (and compat) for Astrolabe-1.0 with Cataclysm
Filename
TomTom.lua
TomTom_CrazyArrow.lua
TomTom_Waypoints.lua
libs/Astrolabe/Astrolabe.lua
diff --git a/TomTom.lua b/TomTom.lua
index 575210e..8047a8f 100755
--- a/TomTom.lua
+++ b/TomTom.lua
@@ -4,12 +4,8 @@

 -- Simple localization table for messages
 local L = TomTomLocals
-local Astrolabe = DongleStub("Astrolabe-0.4")
 local ldb = LibStub("LibDataBroker-1.1")

--- Speed up minimap updates
-Astrolabe.MinimapUpdateTime = 0.1
-
 -- Create the addon object
 TomTom = {
 	events = {},
@@ -28,6 +24,63 @@ TomTom = {
 if TomTom.version == "wowi:revision" then TomTom.version = "SVN" end
 if TomTom.version == "@project-version@" then TomTom.version = "SCM" end

+--[[--------------------------------------------------------------------------
+--  Astrolabe compatability library
+----------------------------------------------------------------------------]]
+
+local compat = {}
+TomTom.compat = compat
+
+do
+    local Astrolabe = DongleStub("Astrolabe-1.0")
+
+    -- Create a lookup table from mapID to c,z pairs
+    local mapcz = {}
+    for cid, zlist in ipairs(Astrolabe.ContinentList) do
+        for zid, mapid in pairs(zlist) do
+            mapcz[mapid] = {cid, zid}
+        end
+    end
+
+    -- Speed up minimap updates
+    Astrolabe.MinimapUpdateTime = 0.1
+
+    -- This function takes the mapID return from the Astrolabe function
+    -- and converts it to a c,z,x,y tuple
+    function compat:GetCurrentPlayerPosition()
+        local map, floor, x, y = Astrolabe:GetCurrentPlayerPosition()
+        local c, z = mapcz[map]
+        return c, z, x, y
+    end
+
+    function compat:GetDirectionToIcon(...)
+        return Astrolabe:GetDirectionToIcon(...)
+    end
+
+    function compat:GetDistanceToIcon(...)
+        return Astrolabe:GetDistanceToIcon(...)
+    end
+
+    function compat:RemoveIconFromMinimap(...)
+        return Astrolabe:RemoveIconFromMinimap(...)
+    end
+
+    function compat:IsIconOnEdge(...)
+        return Astrolabe:IsIconOnEdge(...)
+    end
+
+    function compat:PlaceIconOnMinimap(icon, c, z, x, y)
+        local mapId = Astrolabe:GetMapID(c, z)
+        return Astrolabe:PlaceIconOnMinimap(icon, mapId, nil, x, y)
+    end
+
+    function compat:PlaceIconOnWorldMap(frame, icon, c, z, x, y)
+        local mapId = Astrolabe:GetMapID(c, z)
+        return Astrolabe:PlaceIconOnWorldMap(frame, icon, mapId, nil, x, y)
+    end
+
+end
+
 TomTom.eventFrame:SetScript("OnEvent", function(self, event, ...)
 	local method = TomTom.events[event]
 	if method and TomTom[method] then
@@ -181,7 +234,7 @@ function TomTom:ADDON_LOADED(event, addon)
 				end

 				counter = 0
-				local c,z,x,y = Astrolabe:GetCurrentPlayerPosition()
+				local c,z,x,y = compat:GetCurrentPlayerPosition()
 				local opt = TomTom.db.profile

 				if x and y then
@@ -860,42 +913,45 @@ function TomTom:SetCustomWaypoint(c,z,x,y,callback,minimap,world, silent)
 	return self:AddZWaypoint(c, z, x, y, desc, false, minimap, world, callback, silent)
 end

--- Code taken from HandyNotes, thanks Xinhuan
----------------------------------------------------------
--- Public functions for plugins to convert between MapFile <-> C,Z
---
-local continentMapFile = {
-	[WORLDMAP_COSMIC_ID] = "Cosmic", -- That constant is -1
-	[0] = "World",
-	[1] = "Kalimdor",
-	[2] = "Azeroth",
-	[3] = "Expansion01",
-}
-local reverseMapFileC = {}
-local reverseMapFileZ = {}
-for C = 1, #Astrolabe.ContinentList do
-	for Z = 1, #Astrolabe.ContinentList[C] do
-		local mapFile = Astrolabe.ContinentList[C][Z]
-		reverseMapFileC[mapFile] = C
-		reverseMapFileZ[mapFile] = Z
-	end
-end
-for C = -1, 3 do
-	local mapFile = continentMapFile[C]
-	reverseMapFileC[mapFile] = C
-	reverseMapFileZ[mapFile] = 0
-end
+do
+    local Astrolabe = DongleStub("Astrolabe-1.0")
+    -- Code taken from HandyNotes, thanks Xinhuan
+    ---------------------------------------------------------
+    -- Public functions for plugins to convert between MapFile <-> C,Z
+    --
+    local continentMapFile = {
+        [WORLDMAP_COSMIC_ID] = "Cosmic", -- That constant is -1
+        [0] = "World",
+        [1] = "Kalimdor",
+        [2] = "Azeroth",
+        [3] = "Expansion01",
+    }
+    local reverseMapFileC = {}
+    local reverseMapFileZ = {}
+    for C = 1, #Astrolabe.ContinentList do
+        for Z = 1, #Astrolabe.ContinentList[C] do
+            local mapFile = Astrolabe.ContinentList[C][Z]
+            reverseMapFileC[mapFile] = C
+            reverseMapFileZ[mapFile] = Z
+        end
+    end
+    for C = -1, 3 do
+        local mapFile = continentMapFile[C]
+        reverseMapFileC[mapFile] = C
+        reverseMapFileZ[mapFile] = 0
+    end

-function TomTom:GetMapFile(C, Z)
-	if not C or not Z then return end
-	if Z == 0 then
-		return continentMapFile[C]
-	elseif C > 0 then
-		return Astrolabe.ContinentList[C][Z]
-	end
-end
-function TomTom:GetCZ(mapFile)
-	return reverseMapFileC[mapFile], reverseMapFileZ[mapFile]
+    function TomTom:GetMapFile(C, Z)
+        if not C or not Z then return end
+        if Z == 0 then
+            return continentMapFile[C]
+        elseif C > 0 then
+            return Astrolabe.ContinentList[C][Z]
+        end
+    end
+    function TomTom:GetCZ(mapFile)
+        return reverseMapFileC[mapFile], reverseMapFileZ[mapFile]
+    end
 end

 -- Public functions for plugins to convert between coords <--> x,y
@@ -931,7 +987,7 @@ do
 	end

 	function WorldMap_OnUpdate(self, elapsed)
-		local c,z,x,y = Astrolabe:GetCurrentPlayerPosition()
+		local c,z,x,y = compat:GetCurrentPlayerPosition()
 		local opt = TomTom.db.profile

 		if not x or not y then
@@ -952,7 +1008,7 @@ end

 do
 	function Block_OnUpdate(self, elapsed)
-		local c,z,x,y = Astrolabe:GetCurrentPlayerPosition()
+		local c,z,x,y = compat:GetCurrentPlayerPosition()
 		local opt = TomTom.db.profile

 		if not x or not y then
@@ -974,7 +1030,7 @@ do
 	end

     function Block_OnClick(self, button, down)
-        local c,z,x,y = Astrolabe:GetCurrentPlayerPosition()
+        local c,z,x,y = compat:GetCurrentPlayerPosition()
         local zone = TomTom:GetMapFile(c, z)
         local desc = format("%s: %.2f, %.2f", zone, x*100, y*100)
         TomTom:AddZWaypoint(c, z, x*100, y*100, desc)
@@ -997,7 +1053,7 @@ for cidx,c in ipairs{GetMapContinents()} do
 end

 function TomTom:GetClosestWaypoint()
-	local c,z,x,y = Astrolabe:GetCurrentPlayerPosition()
+	local c,z,x,y = compat:GetCurrentPlayerPosition()
 	local zone = TomTom:GetMapFile(c, z)
 	local closest_uid = nil
 	local closest_dist = nil
@@ -1032,7 +1088,7 @@ end
 SLASH_TOMTOM_WAYBACK1 = "/wayb"
 SLASH_TOMTOM_WAYBACK2 = "/wayback"
 SlashCmdList["TOMTOM_WAYBACK"] = function(msg)
-	local backc,backz,backx,backy = Astrolabe:GetCurrentPlayerPosition()
+	local backc,backz,backx,backy = compat:GetCurrentPlayerPosition()
 	TomTom:AddZWaypoint(backc, backz, backx*100, backy*100, L["Wayback"])
 end

@@ -1158,3 +1214,5 @@ SlashCmdList["TOMTOM_WAY"] = function(msg)
 		return usage()
 	end
 end
+
+
diff --git a/TomTom_CrazyArrow.lua b/TomTom_CrazyArrow.lua
index 42c6c21..20f424a 100644
--- a/TomTom_CrazyArrow.lua
+++ b/TomTom_CrazyArrow.lua
@@ -6,7 +6,6 @@
 --    with the artwork.)
 ----------------------------------------------------------------------------]]

-local Astrolabe = DongleStub("Astrolabe-0.4")
 local sformat = string.format
 local L = TomTomLocals
 local ldb = LibStub("LibDataBroker-1.1")
diff --git a/TomTom_Waypoints.lua b/TomTom_Waypoints.lua
index b8784db..d3c102c 100644
--- a/TomTom_Waypoints.lua
+++ b/TomTom_Waypoints.lua
@@ -8,8 +8,8 @@
 --  TomTom:AddZWaypoint() and TomTom:RemoveWaypoint() instead.
 ----------------------------------------------------------------------------]]

--- Import Astrolabe for locations
-local Astrolabe = DongleStub("Astrolabe-0.4")
+-- Import compat library
+local compat = TomTom.compat

 -- Create a tooltip to be used when mousing over waypoints
 local tooltip = CreateFrame("GameTooltip", "TomTomTooltip", UIParent, "GameTooltipTemplate")
@@ -77,7 +77,7 @@ local rad_135 = math.rad(135)
 local function rotateArrow(self)
 	if self.disabled then return end

-	local angle = Astrolabe:GetDirectionToIcon(self)
+	local angle = compat:GetDirectionToIcon(self)
 	if not angle then return self:Hide() end
 	angle = angle + rad_135

@@ -185,10 +185,10 @@ function TomTom:SetWaypoint(c, z, x, y, callbacks, show_minimap, show_world)
 	point.uid = getuid(point)

 	-- Place the waypoint
-	Astrolabe:PlaceIconOnMinimap(point.minimap, c, z, x, y)
+	compat:PlaceIconOnMinimap(point.minimap, c, z, x, y)

 	if show_world then
-		Astrolabe:PlaceIconOnWorldMap(TomTomMapOverlay, point.worldmap, c, z, x, y)
+		compat:PlaceIconOnWorldMap(TomTomMapOverlay, point.worldmap, c, z, x, y)
 	else
 		point.worldmap.disabled = true
 	end
@@ -244,7 +244,7 @@ end
 function TomTom:ClearWaypoint(uid)
 	local point = resolveuid(uid, true)
 	if point then
-		Astrolabe:RemoveIconFromMinimap(point.minimap)
+		compat:RemoveIconFromMinimap(point.minimap)
 		point.minimap:Hide()
 		point.worldmap:Hide()

@@ -265,12 +265,12 @@ end

 function TomTom:GetDistanceToWaypoint(uid)
 	local point = resolveuid(uid)
-	return point and Astrolabe:GetDistanceToIcon(point.minimap)
+	return point and compat:GetDistanceToIcon(point.minimap)
 end

 function TomTom:GetDirectionToWaypoint(uid)
 	local point = resolveuid(uid)
-	return point and Astrolabe:GetDirectionToIcon(point.minimap)
+	return point and compat:GetDirectionToIcon(point.minimap)
 end

 do
@@ -334,7 +334,7 @@ do
 	local minimap_count = 0

 	function Minimap_OnUpdate(self, elapsed)
-		local dist,x,y = Astrolabe:GetDistanceToIcon(self)
+		local dist,x,y = compat:GetDistanceToIcon(self)
 		local disabled = self.disabled

 		if not dist or IsInInstance() then
@@ -349,7 +349,7 @@ do
 		-- Reset the counter
 		minimap_count = 0

-		local edge = Astrolabe:IsIconOnEdge(self)
+		local edge = compat:IsIconOnEdge(self)
 		local data = self.point
 		local callbacks = data.callbacks

@@ -360,7 +360,7 @@ do
 				self.arrow:Show()

 				-- Rotate the icon, as required
-				local angle = Astrolabe:GetDirectionToIcon(self)
+				local angle = compat:GetDirectionToIcon(self)
 				angle = angle + rad_135

 				if GetCVar("rotateMinimap") == "1" then
@@ -438,7 +438,7 @@ do

 			local data = self.point
 			if data.worldmap and data.show_world and not disabled then
-				local x,y = Astrolabe:PlaceIconOnWorldMap(TomTomMapOverlay, self, data.c, data.z, data.x, data.y)
+				local x,y = compat:PlaceIconOnWorldMap(TomTomMapOverlay, self, data.c, data.z, data.x, data.y)
 				if (x and y and (0 < x and x <= 1) and (0 < y and y <= 1)) then
 					self:Show()
 				else
@@ -454,7 +454,7 @@ do
 		if event == "PLAYER_ENTERING_WORLD" then
 			local data = self.point
 			if data and data.uid and resolveuid(data.uid) then
-				Astrolabe:PlaceIconOnMinimap(self, data.c, data.z, data.x, data.y)
+				compat:PlaceIconOnMinimap(self, data.c, data.z, data.x, data.y)
 			end
 		end
 	end
diff --git a/libs/Astrolabe/Astrolabe.lua b/libs/Astrolabe/Astrolabe.lua
index 1b58576..80f8544 100644
--- a/libs/Astrolabe/Astrolabe.lua
+++ b/libs/Astrolabe/Astrolabe.lua
@@ -1,7 +1,7 @@
 --[[
 Name: Astrolabe
-Revision: $Rev: 107 $
-$Date: 2009-08-05 08:34:29 +0100 (Wed, 05 Aug 2009) $
+Revision: $Rev: 116 $
+$Date: 2010-11-23 04:59:44 +0000 (Tue, 23 Nov 2010) $
 Author(s): Esamynn (esamynn at wowinterface.com)
 Inspired By: Gatherer by Norganna
              MapLibrary by Kristofer Karlsson (krka at kth.se)
@@ -13,7 +13,7 @@ Description:
 	This library also manages and updates the position of Minimap icons
 	automatically.

-Copyright (C) 2006-2008 James Carrothers
+Copyright (C) 2006-2010 James Carrothers

 License:
 	This library is free software; you can redistribute it and/or
@@ -41,8 +41,8 @@ Note:
 -- WARNING!!!
 -- DO NOT MAKE CHANGES TO THIS LIBRARY WITHOUT FIRST CHANGING THE LIBRARY_VERSION_MAJOR
 -- STRING (to something unique) OR ELSE YOU MAY BREAK OTHER ADDONS THAT USE THIS LIBRARY!!!
-local LIBRARY_VERSION_MAJOR = "Astrolabe-0.4"
-local LIBRARY_VERSION_MINOR = tonumber(string.match("$Revision: 107 $", "(%d+)") or 1)
+local LIBRARY_VERSION_MAJOR = "Astrolabe-1.0"
+local LIBRARY_VERSION_MINOR = tonumber(string.match("$Revision: 116 $", "(%d+)") or 1)

 if not DongleStub then error(LIBRARY_VERSION_MAJOR .. " requires DongleStub.") end
 if not DongleStub:IsNewerVersion(LIBRARY_VERSION_MAJOR, LIBRARY_VERSION_MINOR) then return end
@@ -50,7 +50,7 @@ if not DongleStub:IsNewerVersion(LIBRARY_VERSION_MAJOR, LIBRARY_VERSION_MINOR) t
 local Astrolabe = {};

 -- define local variables for Data Tables (defined at the end of this file)
-local WorldMapSize, MinimapSize, ValidMinimapShapes;
+local WorldMapSize, MinimapSize, ValidMinimapShapes, zeroData;

 function Astrolabe:GetVersion()
 	return LIBRARY_VERSION_MAJOR, LIBRARY_VERSION_MINOR;
@@ -107,6 +107,15 @@ local yield = coroutine.yield
 local next = next
 local GetFramerate = GetFramerate

+local real_GetCurrentMapAreaID = GetCurrentMapAreaID
+local function GetCurrentMapAreaID()
+	local id = real_GetCurrentMapAreaID();
+	if ( id < 0 and GetCurrentMapContinent() == WORLDMAP_WORLD_ID ) then
+		return 0;
+	end
+	return id;
+end
+

 --------------------------------------------------------------------------------------------------------------
 -- Internal Utility Functions
@@ -130,15 +139,12 @@ local function argcheck(value, num, ...)
 	error(string.format("Bad argument #%d to 'Astrolabe.%s' (%s expected, got %s)", num, name, types, type(value)), 3)
 end

-local function getContPosition( zoneData, z, x, y )
-	if ( z ~= 0 ) then
-		zoneData = zoneData[z];
-		x = x * zoneData.width + zoneData.xOffset;
-		y = y * zoneData.height + zoneData.yOffset;
-	else
-		x = x * zoneData.width;
-		y = y * zoneData.height;
+local function getSystemPosition( mapData, f, x, y )
+	if ( f ~= 0 ) then
+		mapData = mapData[f];
 	end
+	x = x * mapData.width + mapData.xOffset;
+	y = y * mapData.height + mapData.yOffset;
 	return x, y;
 end

@@ -147,58 +153,68 @@ end
 -- General Utility Functions
 --------------------------------------------------------------------------------------------------------------

-function Astrolabe:ComputeDistance( c1, z1, x1, y1, c2, z2, x2, y2 )
+function Astrolabe:ComputeDistance( m1, f1, x1, y1, m2, f2, x2, y2 )
 	--[[
-	argcheck(c1, 2, "number");
-	assert(3, c1 >= 0, "ComputeDistance: Illegal continent index to c1: "..c1);
-	argcheck(z1, 3, "number", "nil");
+	argcheck(m1, 2, "number");
+	assert(3, m1 >= 0, "ComputeDistance: Illegal map id to m1: "..m1);
+	argcheck(f1, 3, "number", "nil");
 	argcheck(x1, 4, "number");
 	argcheck(y1, 5, "number");
-	argcheck(c2, 6, "number");
-	assert(3, c2 >= 0, "ComputeDistance: Illegal continent index to c2: "..c2);
-	argcheck(z2, 7, "number", "nil");
+	argcheck(m2, 6, "number");
+	assert(3, m2 >= 0, "ComputeDistance: Illegal map id to m2: "..m2);
+	argcheck(f2, 7, "number", "nil");
 	argcheck(x2, 8, "number");
 	argcheck(y2, 9, "number");
 	--]]

-	z1 = z1 or 0;
-	z2 = z2 or 0;
+	f1 = f1 or 0;
+	f2 = f2 or 0;

 	local dist, xDelta, yDelta;
-	if ( c1 == c2 and z1 == z2 ) then
-		-- points in the same zone
-		local zoneData = WorldMapSize[c1];
-		if ( z1 ~= 0 ) then
-			zoneData = zoneData[z1];
+	if ( m1 == m2 and f1 == f2 ) then
+		-- points in the same zone on the same floor
+		local mapData = WorldMapSize[m1];
+		if ( f1 ~= 0 ) then
+			mapData = mapData[f1];
 		end
-		xDelta = (x2 - x1) * zoneData.width;
-		yDelta = (y2 - y1) * zoneData.height;
-
-	elseif ( c1 == c2 ) then
-		-- points on the same continent
-		local zoneData = WorldMapSize[c1];
-		x1, y1 = getContPosition(zoneData, z1, x1, y1);
-		x2, y2 = getContPosition(zoneData, z2, x2, y2);
-		xDelta = (x2 - x1);
-		yDelta = (y2 - y1);
+		xDelta = (x2 - x1) * mapData.width;
+		yDelta = (y2 - y1) * mapData.height;

-	elseif ( c1 and c2 ) then
-		local cont1 = WorldMapSize[c1];
-		local cont2 = WorldMapSize[c2];
-		if ( cont1.parentContinent == cont2.parentContinent ) then
-			x1, y1 = getContPosition(cont1, z1, x1, y1);
-			x2, y2 = getContPosition(cont2, z2, x2, y2);
-			if ( c1 ~= cont1.parentContinent ) then
-				x1 = x1 + cont1.xOffset;
-				y1 = y1 + cont1.yOffset;
-			end
-			if ( c2 ~= cont2.parentContinent ) then
-				x2 = x2 + cont2.xOffset;
-				y2 = y2 + cont2.yOffset;
+	else
+		local map1 = WorldMapSize[m1];
+		local map2 = WorldMapSize[m2];
+		if ( map1.system == map2.system ) then
+			-- points within the same system (continent)
+			x1, y1 = getSystemPosition(map1, f1, x1, y1);
+			x2, y2 = getSystemPosition(map2, f2, x2, y2);
+			xDelta = (x2 - x1);
+			yDelta = (y2 - y1);
+
+		else
+			local sp1 = map1.systemParent;
+			local sp2 = map2.systemParent;
+			if ( sp1 == sp2 ) then
+				--local worldID = sp1;
+				-- instead of a new local, reuse sp1
+				local s1 = map1.system;
+				local s2 = map2.system;
+				x1, y1 = getSystemPosition(map1, f1, x1, y1);
+				x2, y2 = getSystemPosition(map2, f2, x2, y2);
+				if not ( s1 == map1.systemParent ) then
+					local cont1 = WorldMapSize[sp1][s1];
+					x1 = x1 - cont1.xOffset;
+					y1 = y1 - cont1.yOffset;
+				end
+				if not ( s2 == map2.systemParent ) then
+					local cont2 = WorldMapSize[sp1][s2];
+					x2 = x2 - cont2.xOffset;
+					y2 = y2 - cont2.yOffset;
+				end
+
+				xDelta = x2 - x1;
+				yDelta = y2 - y1;
 			end
-
-			xDelta = x2 - x1;
-			yDelta = y2 - y1;
+
 		end

 	end
@@ -208,64 +224,77 @@ function Astrolabe:ComputeDistance( c1, z1, x1, y1, c2, z2, x2, y2 )
 	return dist, xDelta, yDelta;
 end

-function Astrolabe:TranslateWorldMapPosition( C, Z, xPos, yPos, nC, nZ )
+function Astrolabe:TranslateWorldMapPosition( M, F, xPos, yPos, nM, nF )
 	--[[
-	argcheck(C, 2, "number");
-	argcheck(Z, 3, "number", "nil");
+	argcheck(M, 2, "number");
+	argcheck(F, 3, "number", "nil");
 	argcheck(xPos, 4, "number");
 	argcheck(yPos, 5, "number");
-	argcheck(nC, 6, "number");
-	argcheck(nZ, 7, "number", "nil");
+	argcheck(nM, 6, "number");
+	argcheck(nF, 7, "number", "nil");
 	--]]

-	Z = Z or 0;
-	nZ = nZ or 0;
-	if ( nC < 0 ) then
+	F = F or 0;
+	nF = nF or 0;
+	if ( nM < 0 ) then
 		return;
 	end

-	local zoneData;
-	if ( C == nC and Z == nZ ) then
+	local mapData;
+	if ( M == nM and F == nF ) then
 		return xPos, yPos;

-	elseif ( C == nC ) then
-		-- points on the same continent
-		zoneData = WorldMapSize[C];
-		xPos, yPos = getContPosition(zoneData, Z, xPos, yPos);
-		if ( nZ ~= 0 ) then
-			zoneData = WorldMapSize[C][nZ];
-			xPos = xPos - zoneData.xOffset;
-			yPos = yPos - zoneData.yOffset;
-		end
-
-	elseif ( C and nC ) and ( WorldMapSize[C].parentContinent == WorldMapSize[nC].parentContinent ) then
-		-- different continents, same world
-		zoneData = WorldMapSize[C];
-		local parentContinent = zoneData.parentContinent;
-		xPos, yPos = getContPosition(zoneData, Z, xPos, yPos);
-		if ( C ~= parentContinent ) then
-			-- translate up to world map if we aren't there already
-			xPos = xPos + zoneData.xOffset;
-			yPos = yPos + zoneData.yOffset;
-			zoneData = WorldMapSize[parentContinent];
-		end
-		if ( nC ~= parentContinent ) then
-			-- translate down to the new continent
-			zoneData = WorldMapSize[nC];
-			xPos = xPos - zoneData.xOffset;
-			yPos = yPos - zoneData.yOffset;
-			if ( nZ ~= 0 ) then
-				zoneData = zoneData[nZ];
-				xPos = xPos - zoneData.xOffset;
-				yPos = yPos - zoneData.yOffset;
+	else
+		local map = WorldMapSize[M];
+		local nMap = WorldMapSize[nM];
+		if ( map.system == nMap.system ) then
+			-- points within the same system (continent)
+			xPos, yPos = getSystemPosition(map, F, xPos, yPos);
+			mapData = WorldMapSize[nM];
+			if ( nF ~= 0 ) then
+				mapData = mapData[nF];
+			end
+			xPos = xPos - mapData.xOffset;
+			yPos = yPos - mapData.yOffset;
+
+		else
+			-- different continents, same world
+			local SP = map.systemParent;
+			local nSP = nMap.systemParent;
+			if ( SP == nSP ) then
+				--local worldID = SP;
+				-- instead of a new local, reuse SP
+				local S = map.system;
+				local nS = nMap.system;
+				mapData = WorldMapSize[M];
+				xPos, yPos = getSystemPosition(mapData, F, xPos, yPos);
+				if ( M ~= SP ) then
+					-- translate up to world map if we aren't there already
+					local cont = WorldMapSize[SP][S];
+					xPos = xPos - cont.xOffset;
+					yPos = yPos - cont.yOffset;
+					mapData = WorldMapSize[SP];
+				end
+				if ( nM ~= SP ) then
+					-- translate down to the new continent
+					local nCont = WorldMapSize[SP][nS];
+					xPos = xPos + nCont.xOffset;
+					yPos = yPos + nCont.yOffset;
+					mapData = WorldMapSize[nM];
+					if ( nF ~= 0 ) then
+						mapData = mapData[nF];
+					end
+				end
+
+			else
+				return;
 			end
+
 		end

-	else
-		return;
 	end

-	return (xPos / zoneData.width), (yPos / zoneData.height);
+	return (xPos / mapData.width), (yPos / mapData.height);
 end

 --*****************************************************************************
@@ -281,24 +310,26 @@ function Astrolabe:GetUnitPosition( unit, noMapChange )
 			-- to change map zoom, so return
 			return;
 		end
-		local lastCont, lastZone = GetCurrentMapContinent(), GetCurrentMapZone();
+		local lastMapID, lastFloor = GetCurrentMapAreaID(), GetCurrentMapDungeonLevel();
 		SetMapToCurrentZone();
 		x, y = GetPlayerMapPosition(unit);
 		if ( x <= 0 and y <= 0 ) then
-			SetMapZoom(GetCurrentMapContinent());
+			WorldMapZoomOutButton_OnClick();
 			x, y = GetPlayerMapPosition(unit);
 			if ( x <= 0 and y <= 0 ) then
-				-- we are in an instance or otherwise off the continent map
+				-- we are in an instance or otherwise off map
 				return;
 			end
 		end
-		local C, Z = GetCurrentMapContinent(), GetCurrentMapZone();
-		if ( C ~= lastCont or Z ~= lastZone ) then
-			SetMapZoom(lastCont, lastZone); -- set map zoom back to what it was before
+		local M, F = GetCurrentMapAreaID(), GetCurrentMapDungeonLevel();
+		if ( M ~= lastMapID or F ~= lastFloor ) then
+			-- set map zoom back to what it was before
+			SetMapByID(lastMapID);
+			SetDungeonMapLevel(lastFloor);
 		end
-		return C, Z, x, y;
+		return M, F, x, y;
 	end
-	return GetCurrentMapContinent(), GetCurrentMapZone(), x, y;
+	return GetCurrentMapAreaID(), GetCurrentMapDungeonLevel(), x, y;
 end

 --*****************************************************************************
@@ -310,31 +341,30 @@ end
 -- setting before this function returns, if it was changed.
 --*****************************************************************************
 function Astrolabe:GetCurrentPlayerPosition()
-	local x, y = GetPlayerMapPosition("player");
-	if ( x <= 0 and y <= 0 ) then
-		if ( self.WorldMapVisible ) then
-			-- we know there is a visible world map, so don't cause
-			-- WORLD_MAP_UPDATE events by changing map zoom
-			return;
-		end
-		local lastCont, lastZone = GetCurrentMapContinent(), GetCurrentMapZone();
-		SetMapToCurrentZone();
-		x, y = GetPlayerMapPosition("player");
-		if ( x <= 0 and y <= 0 ) then
-			SetMapZoom(GetCurrentMapContinent());
-			x, y = GetPlayerMapPosition("player");
-			if ( x <= 0 and y <= 0 ) then
-				-- we are in an instance or otherwise off the continent map
-				return;
-			end
-		end
-		local C, Z = GetCurrentMapContinent(), GetCurrentMapZone();
-		if ( C ~= lastCont or Z ~= lastZone ) then
-			SetMapZoom(lastCont, lastZone); --set map zoom back to what it was before
-		end
-		return C, Z, x, y;
+	return self:GetUnitPosition("player", self.WorldMapVisible);
+end
+
+function Astrolabe:GetMapID(continent, zone)
+	zone = zone or 0;
+	local ret = self.ContinentList[continent];
+	if ( ret ) then
+		return ret[zone];
+	end
+	if ( continent == 0 and zone == 0 ) then
+		return 0;
+	end
+end
+
+function Astrolabe:GetMapInfo( mapID, mapFloor )
+	mapFloor = mapFloor or 0
+	local mapData = WorldMapSize[mapID]
+	local system, systemParent = mapData.system, mapData.systemParent
+	if ( mapFloor ~= 0 ) then
+		mapData = mapData[mapFloor];
+	end
+	if ( mapData ~= zeroData ) then
+		return system, systemParent, mapData.width, mapData.height, mapData.xOffset, mapData.yOffset
 	end
-	return GetCurrentMapContinent(), GetCurrentMapZone(), x, y;
 end


@@ -437,34 +467,34 @@ local function placeIconOnMinimap( minimap, minimapZoom, mapWidth, mapHeight, ic
 	icon:SetPoint("CENTER", minimap, "CENTER", xDist/xScale, -yDist/yScale);
 end

-function Astrolabe:PlaceIconOnMinimap( icon, continent, zone, xPos, yPos )
+function Astrolabe:PlaceIconOnMinimap( icon, mapID, mapFloor, xPos, yPos )
 	-- check argument types
 	argcheck(icon, 2, "table");
 	assert(3, icon.SetPoint and icon.ClearAllPoints, "Usage Message");
-	argcheck(continent, 3, "number");
-	argcheck(zone, 4, "number", "nil");
+	argcheck(mapID, 3, "number");
+	argcheck(mapFloor, 4, "number", "nil");
 	argcheck(xPos, 5, "number");
 	argcheck(yPos, 6, "number");

 	-- if the positining system is currently active, just use the player position used by the last incremental (or full) update
 	-- otherwise, make sure we base our calculations off of the most recent player position (if one is available)
-	local lC, lZ, lx, ly;
+	local lM, lF, lx, ly;
 	if ( self.processingFrame:IsShown() ) then
-		lC, lZ, lx, ly = unpack(self.LastPlayerPosition);
+		lM, lF, lx, ly = unpack(self.LastPlayerPosition);
 	else
-		lC, lZ, lx, ly = self:GetCurrentPlayerPosition();
-		if ( lC and lC >= 0 ) then
+		lM, lF, lx, ly = self:GetCurrentPlayerPosition();
+		if ( lM and lM >= 0 ) then
 			local lastPosition = self.LastPlayerPosition;
-			lastPosition[1] = lC;
-			lastPosition[2] = lZ;
+			lastPosition[1] = lM;
+			lastPosition[2] = lF;
 			lastPosition[3] = lx;
 			lastPosition[4] = ly;
 		else
-			lC, lZ, lx, ly = unpack(self.LastPlayerPosition);
+			lM, lF, lx, ly = unpack(self.LastPlayerPosition);
 		end
 	end

-	local dist, xDist, yDist = self:ComputeDistance(lC, lZ, lx, ly, continent, zone, xPos, yPos);
+	local dist, xDist, yDist = self:ComputeDistance(lM, lF, lx, ly, mapID, mapFloor, xPos, yPos);
 	if not ( dist ) then
 		--icon's position has no meaningful position relative to the player's current location
 		return -1;
@@ -478,8 +508,8 @@ function Astrolabe:PlaceIconOnMinimap( icon, continent, zone, xPos, yPos )
 	end

 	AddedOrUpdatedIcons[icon] = iconData
-	iconData.continent = continent;
-	iconData.zone = zone;
+	iconData.mapID = mapID;
+	iconData.mapFloor = mapFloor;
 	iconData.xPos = xPos;
 	iconData.yPos = yPos;
 	iconData.dist = dist;
@@ -559,11 +589,11 @@ do

 			resetIncrementalUpdate = false -- by definition, the incremental update is reset if it is here

-			local C, Z, x, y = self:GetCurrentPlayerPosition();
-			if ( C and C >= 0 ) then
+			local M, F, x, y = self:GetCurrentPlayerPosition();
+			if ( M and M >= 0 ) then
 				local Minimap = Minimap;
 				local lastPosition = self.LastPlayerPosition;
-				local lC, lZ, lx, ly = unpack(lastPosition);
+				local lM, lF, lx, ly = unpack(lastPosition);

 				minimapRotationEnabled = GetCVar("rotateMinimap") ~= "0"
 				if ( minimapRotationEnabled ) then
@@ -576,7 +606,7 @@ do
 				-- check Minimap Shape
 				minimapShape = GetMinimapShape and ValidMinimapShapes[GetMinimapShape()];

-				if ( lC == C and lZ == Z and lx == x and ly == y ) then
+				if ( lM == M and lF == F and lx == x and ly == y ) then
 					-- player has not moved since the last update
 					if ( lastZoom ~= Minimap:GetZoom() or self.ForceNextUpdate or minimapRotationEnabled ) then
 						local currentZoom = Minimap:GetZoom();
@@ -602,7 +632,7 @@ do
 						self.ForceNextUpdate = false;
 					end
 				else
-					local dist, xDelta, yDelta = self:ComputeDistance(lC, lZ, lx, ly, C, Z, x, y);
+					local dist, xDelta, yDelta = self:ComputeDistance(lM, lF, lx, ly, M, F, x, y);
 					if ( dist ) then
 						local currentZoom = Minimap:GetZoom();
 						lastZoom = currentZoom;
@@ -631,15 +661,15 @@ do
 							end
 						end
 						if not ( resetIncrementalUpdate ) then
-							lastPosition[1] = C;
-							lastPosition[2] = Z;
+							lastPosition[1] = M;
+							lastPosition[2] = F;
 							lastPosition[3] = x;
 							lastPosition[4] = y;
 						end
 					else
 						self:RemoveAllMinimapIcons()
-						lastPosition[1] = C;
-						lastPosition[2] = Z;
+						lastPosition[1] = M;
+						lastPosition[2] = F;
 						lastPosition[3] = x;
 						lastPosition[4] = y;
 					end
@@ -688,8 +718,8 @@ do
 			resetFullUpdate = false -- by definition, the full update is reset if it is here
 			fullUpdateInProgress = true -- set the flag the says a full update is in progress

-			local C, Z, x, y = self:GetCurrentPlayerPosition();
-			if ( C and C >= 0 ) then
+			local M, F, x, y = self:GetCurrentPlayerPosition();
+			if ( M and M >= 0 ) then
 				minimapRotationEnabled = GetCVar("rotateMinimap") ~= "0"
 				if ( minimapRotationEnabled ) then
 					minimapRotationOffset = GetPlayerFacing();
@@ -708,7 +738,7 @@ do
 				local mapHeight = Minimap:GetHeight();
 				local count = 0
 				for icon, data in pairs(self.MinimapIcons) do
-					local dist, xDist, yDist = self:ComputeDistance(C, Z, x, y, data.continent, data.zone, data.xPos, data.yPos);
+					local dist, xDist, yDist = self:ComputeDistance(M, F, x, y, data.mapID, data.mapFloor, data.xPos, data.yPos);
 					if ( dist ) then
 						placeIconOnMinimap(Minimap, currentZoom, mapWidth, mapHeight, icon, dist, xDist, yDist);

@@ -732,8 +762,8 @@ do

 				if not ( resetFullUpdate ) then
 					local lastPosition = self.LastPlayerPosition;
-					lastPosition[1] = C;
-					lastPosition[2] = Z;
+					lastPosition[1] = M;
+					lastPosition[2] = F;
 					lastPosition[3] = x;
 					lastPosition[4] = y;

@@ -829,19 +859,19 @@ end
 -- World Map Icon Placement
 --------------------------------------------------------------------------------------------------------------

-function Astrolabe:PlaceIconOnWorldMap( worldMapFrame, icon, continent, zone, xPos, yPos )
+function Astrolabe:PlaceIconOnWorldMap( worldMapFrame, icon, mapID, mapFloor, xPos, yPos )
 	-- check argument types
 	argcheck(worldMapFrame, 2, "table");
 	assert(3, worldMapFrame.GetWidth and worldMapFrame.GetHeight, "Usage Message");
 	argcheck(icon, 3, "table");
 	assert(3, icon.SetPoint and icon.ClearAllPoints, "Usage Message");
-	argcheck(continent, 4, "number");
-	argcheck(zone, 5, "number", "nil");
+	argcheck(mapID, 4, "number");
+	argcheck(mapFloor, 5, "number", "nil");
 	argcheck(xPos, 6, "number");
 	argcheck(yPos, 7, "number");

-	local C, Z = GetCurrentMapContinent(), GetCurrentMapZone();
-	local nX, nY = self:TranslateWorldMapPosition(continent, zone, xPos, yPos, C, Z);
+	local M, F = GetCurrentMapAreaID(), GetCurrentMapDungeonLevel();
+	local nX, nY = self:TranslateWorldMapPosition(mapID, mapFloor, xPos, yPos, M, F);

 	-- anchor and :Show() the icon if it is within the boundry of the current map, :Hide() it otherwise
 	if ( nX and nY and (0 < nX and nX <= 1) and (0 < nY and nY <= 1) ) then
@@ -922,9 +952,10 @@ function Astrolabe:OnShow( frame )
 	if not ( self.WorldMapVisible ) then
 		SetMapToCurrentZone();
 	end
-	local C, Z = Astrolabe:GetCurrentPlayerPosition();
-	if ( C and C >= 0 ) then
-		SetMapZoom(C, Z);
+	local M, F = Astrolabe:GetCurrentPlayerPosition();
+	if ( M and M >= 0 ) then
+		SetMapByID(M);
+		SetDungeonMapLevel(F);
 	else
 		frame:Hide();
 		return
@@ -963,6 +994,55 @@ end
 -- Library Registration
 --------------------------------------------------------------------------------------------------------------

+local function harvestMapData( HarvestedMapData )
+	local mapData = {}
+	local mapName = GetMapInfo();
+	local mapID = GetCurrentMapAreaID();
+	local numFloors = GetNumDungeonMapLevels();
+	mapData.mapName = mapName;
+	mapData.cont = (GetCurrentMapContinent()) or -100;
+	mapData.zone = (GetCurrentMapZone()) or -100;
+	mapData.numFloors = numFloors;
+	local _, TLx, TLy, BRx, BRy = GetCurrentMapZone();
+	if ( TLx and TLy and BRx and BRy ) then
+		mapData[0] = {};
+		if not ( TLx < BRx ) then
+			TLx = -TLx;
+			BRx = -BRx;
+		end
+		if not ( TLy < BRy) then
+			TLy = -TLy;
+			BRy = -BRy;
+		end
+		mapData[0].TLx = TLx;
+		mapData[0].TLy = TLy;
+		mapData[0].BRx = BRx;
+		mapData[0].BRy = BRy;
+	end
+	if ( numFloors > 0 ) then
+		for f = 1, numFloors do
+			SetDungeonMapLevel(f);
+			local _, TLx, TLy, BRx, BRy = GetCurrentMapDungeonLevel();
+			if ( TLx and TLy and BRx and BRy ) then
+				mapData[f] = {};
+				if not ( TLx < BRx ) then
+					TLx = -TLx;
+					BRx = -BRx;
+				end
+				if not ( TLy < BRy) then
+					TLy = -TLy;
+					BRy = -BRy;
+				end
+				mapData[f].TLx = TLx;
+				mapData[f].TLy = TLy;
+				mapData[f].BRx = BRx;
+				mapData[f].BRy = BRy;
+			end
+		end
+	end
+	HarvestedMapData[mapID] = mapData;
+end
+
 local function activate( newInstance, oldInstance )
 	if ( oldInstance ) then -- this is an upgrade activate
 		if ( oldInstance.DumpNewIconsCache ) then
@@ -985,13 +1065,28 @@ local function activate( newInstance, oldInstance )
 		local frame = CreateFrame("Frame");
 		newInstance.processingFrame = frame;

+		newInstance.HarvestedMapData = {};
+		local HarvestedMapData = newInstance.HarvestedMapData;
+
 		newInstance.ContinentList = { GetMapContinents() };
 		for C in pairs(newInstance.ContinentList) do
 			local zones = { GetMapZones(C) };
 			newInstance.ContinentList[C] = zones;
+			SetMapZoom(C, 0);
+			zones[0] = GetCurrentMapAreaID();
+			harvestMapData(HarvestedMapData);
 			for Z in ipairs(zones) do
 				SetMapZoom(C, Z);
-				zones[Z] = GetMapInfo();
+				zones[Z] = GetCurrentMapAreaID();
+				harvestMapData(HarvestedMapData);
+			end
+		end
+
+		for id=1,10000 do
+			if not ( HarvestedMapData[id] ) then
+				if ( SetMapByID(id) ) then
+					harvestMapData(HarvestedMapData);
+				end
 			end
 		end
 	end
@@ -1077,508 +1172,407 @@ ValidMinimapShapes = {
 -- distances across and offsets of the world maps
 -- in game yards
 WorldMapSize = {
-	-- World Map of Azeroth
 	[0] = {
-		parentContinent = 0,
-		height = 31809.64857610083,
-		width = 47714.278579261,
-	},
-	-- Kalimdor
-	{ -- [1]
-		parentContinent = 0,
-		height = 24533.025279205,
-		width = 36800.210572494,
-		xOffset = -8590.40725049343,
-		yOffset = 5628.692856102324,
-		zoneData = {
-			Ashenvale = {
-				height = 3843.722331667447,
-				width = 5766.728885829694,
-				xOffset = 15366.76675592628,
-				yOffset = 8126.925930315996,
-			},
-			Aszhara = {
-				height = 3381.22554790382,
-				width = 5070.886912363937,
-				xOffset = 20343.90431905976,
-				yOffset = 7458.18074892042,
-			},
-			AzuremystIsle = {
-				height = 2714.563862990522,
-				width = 4070.87719998905,
-				xOffset = 9966.708003150136,
-				yOffset = 5460.278492344226,
-			},
-			Barrens = {
-				height = 6756.201888541853,
-				width = 10133.44231353798,
-				xOffset = 14443.84040901447,
-				yOffset = 11187.32063797497,
-			},
-			BloodmystIsle = {
-				height = 2174.984213312164,
-				width = 3262.535628257626,
-				xOffset = 9541.702868577344,
-				yOffset = 3424.87645454774,
-			},
-			Darkshore = {
-				height = 4366.635262519317,
-				width = 6550.07142937905,
-				xOffset = 14125.0864431955,
-				yOffset = 4466.535577798089,
-			},
-			Darnassis = {
-				height = 705.7244742259542,
-				width = 1058.344272032854,
-				xOffset = 14128.39058434346,
-				yOffset = 2561.565704787642,
-			},
-			Desolace = {
-				height = 2997.895112390325,
-				width = 4495.882561567951,
-				xOffset = 12833.40568925697,
-				yOffset = 12347.7291386989,
-			},
-			Durotar = {
-				height = 3524.975103516492,
-				width = 5287.556393263762,
-				xOffset = 19029.30641831177,
-				yOffset = 10991.48866520544,
-			},
-			Dustwallow = {
-				height = 3499.975024621409,
-				width = 5250.057340719384,
-				xOffset = 18041.79555525144,
-				yOffset = 14833.12785083746,
-			},
-			Felwood = {
-				height = 3833.30578953572,
-				width = 5750.062500603067,
-				xOffset = 15425.10050841866,
-				yOffset = 5666.52696052216,
-			},
-			Feralas = {
-				height = 4633.300220031075,
-				width = 6950.07476479001,
-				xOffset = 11625.05968863682,
-				yOffset = 15166.45859885191,
-			},
-			Moonglade = {
-				height = 1539.572004392277,
-				width = 2308.359613919473,
-				xOffset = 18448.04941280923,
-				yOffset = 4308.203668830446,
-			},
-			Mulgore = {
-				height = 3424.975591847491,
-				width = 5137.555664509726,
-				xOffset = 15018.84638430639,
-				yOffset = 13072.72374939454,
-			},
-			Ogrimmar = {
-				height = 935.4097495193695,
-				width = 1402.619172463506,
-				xOffset = 20747.42615230776,
-				yOffset = 10525.94819392488,
-			},
-			Silithus = {
-				height = 2322.900917404436,
-				width = 3483.371660836989,
-				xOffset = 14529.25779832084,
-				yOffset = 18758.10034739171,
-			},
-			StonetalonMountains = {
-				height = 3256.22685709556,
-				width = 4883.386126224323,
-				xOffset = 13820.91659894445,
-				yOffset = 9883.163451643639,
-			},
-			Tanaris = {
-				height = 4599.967247105565,
-				width = 6900.075410478199,
-				xOffset = 17285.53717337067,
-				yOffset = 18674.76738951156,
-			},
-			Teldrassil = {
-				height = 3393.725685278266,
-				width = 5091.720159017256,
-				xOffset = 13252.16118637725,
-				yOffset = 968.6435100517717,
-			},
-			TheExodar = {
-				height = 704.6827795715492,
-				width = 1056.782908333002,
-				xOffset = 10533.08067788734,
-				yOffset = 6276.205943683332,
-			},
-			ThousandNeedles = {
-				height = 2933.311990587089,
-				width = 4400.046926738385,
-				xOffset = 17500.12330544135,
-				yOffset = 16766.44742072096,
-			},
-			ThunderBluff = {
-				height = 695.8286363220358,
-				width = 1043.761162566134,
-				xOffset = 16550.11296988024,
-				yOffset = 13649.80296445508,
-			},
-			UngoroCrater = {
-				height = 2466.648940830691,
-				width = 3700.039952384531,
-				xOffset = 16533.4461782123,
-				yOffset = 18766.43318304924,
-			},
-			Winterspring = {
-				height = 4733.299352687333,
-				width = 7100.076688034489,
-				xOffset = 17383.45536235255,
-				yOffset = 4266.537029274375,
-			},
+		height = 31809.52239,
+		system = 0,
+		systemParent = 0,
+		width = 47714.28663,
+		xOffset = 0,
+		yOffset = 0,
+		[13] = {
+			xOffset = -8476.18926,
+			yOffset = -18428.5703,
 		},
-	},
-	-- Eastern Kingdoms
-	{ -- [2]
-		parentContinent = 0,
-		height = 27149.795290881,
-		width = 40741.175327834,
-		xOffset = 18542.31220836664,
-		yOffset = 3585.574573158966,
-		zoneData = {
-			Alterac = {
-				height = 1866.674220583334,
-				width = 2799.999464405289,
-				xOffset = 17388.63468066122,
-				yOffset = 9676.382149825957,
-			},
-			Arathi = {
-				height = 2400.009317069356,
-				width = 3599.999517304195,
-				xOffset = 19038.63447926361,
-				yOffset = 11309.72195295708,
-			},
-			Badlands = {
-				height = 1658.340337615859,
-				width = 2487.500569928747,
-				xOffset = 20251.13345045087,
-				yOffset = 17065.99453090572,
-			},
-			BlastedLands = {
-				height = 2233.342487048268,
-				width = 3349.999380719363,
-				xOffset = 19413.63423284709,
-				yOffset = 21743.09620559562,
-			},
-			BurningSteppes = {
-				height = 1952.091015081907,
-				width = 2929.167049647848,
-				xOffset = 18438.63415866318,
-				yOffset = 18207.66550773985,
-			},
-			DeadwindPass = {
-				height = 1666.673717206878,
-				width = 2499.999255461505,
-				xOffset = 19005.30099399293,
-				yOffset = 21043.09319963172,
-			},
-			DunMorogh = {
-				height = 3283.346244075043,
-				width = 4925.000979131685,
-				xOffset = 16369.88372014602,
-				yOffset = 15053.48652833869,
-			},
-			Duskwood = {
-				height = 1800.007435102674,
-				width = 2699.999451812027,
-				xOffset = 17338.63474984946,
-				yOffset = 20893.09262994406,
-			},
-			EasternPlaguelands = {
-				height = 2687.510259086504,
-				width = 4031.248684963022,
-				xOffset = 20459.46800337001,
-				yOffset = 7472.207074316265,
-			},
-			Elwynn = {
-				height = 2314.592478810788,
-				width = 3470.832795915813,
-				xOffset = 16636.55146195304,
-				yOffset = 19116.00248086271,
-			},
-			EversongWoods = {
-				height = 3283.346090242183,
-				width = 4925.00271131707,
-				xOffset = 20259.46550654072,
-				yOffset = 2534.687768168357,
-			},
-			Ghostlands = {
-				height = 2200.008615840919,
-				width = 3300.001914001321,
-				xOffset = 21055.29898547313,
-				yOffset = 5309.698628620597,
-			},
-			Hilsbrad = {
-				height = 2133.341648261057,
-				width = 3199.998998314975,
-				xOffset = 17105.30161317513,
-				yOffset = 10776.38647689923,
-			},
-			Hinterlands = {
-				height = 2566.6767425107,
-				width = 3849.999302583992,
-				xOffset = 19746.96759079755,
-				yOffset = 9709.715638073398,
-			},
-			Ironforge = {
-				height = 527.6066263822604,
-				width = 790.625237342102,
-				xOffset = 18885.55918004965,
-				yOffset = 15745.64757909506,
-			},
-			LochModan = {
-				height = 1839.589436540107,
-				width = 2758.333078630792,
-				xOffset = 20165.71744013867,
-				yOffset = 15663.90644131906,
-			},
-			Redridge = {
-				height = 1447.921846941264,
-				width = 2170.833008876805,
-				xOffset = 19742.80073199006,
-				yOffset = 19751.42200372843,
-			},
-			SearingGorge = {
-				height = 1487.505327445583,
-				width = 2231.249676776115,
-				xOffset = 18494.88412729142,
-				yOffset = 17276.41249042905,
-			},
-			SilvermoonCity = {
-				height = 806.7736903384404,
-				width = 1211.459296502504,
-				xOffset = 22172.71642224908,
-				yOffset = 3422.648306718702,
-			},
-			Silverpine = {
-				height = 2800.0110500699,
-				width = 4199.999060067367,
-				xOffset = 14721.96859379216,
-				yOffset = 9509.714862642681,
-			},
-			Stormwind = {
-				height = 1158.337650999629,
-				width = 1737.500553362899,
-				xOffset = 16449.05109973784,
-				yOffset = 19172.25293704512,
-			},
-			Stranglethorn = {
-				height = 4254.183097414531,
-				width = 6381.247773741421,
-				xOffset = 15951.13530113703,
-				yOffset = 22345.18245588815,
-			},
-			Sunwell = {
-				height = 2218.75784157939,
-				width = 3327.080984022923,
-				xOffset = 21074.05125342849,
-				yOffset = 7.594755912743345,
-			},
-			SwampOfSorrows = {
-				height = 1529.173582734637,
-				width = 2293.750686253685,
-				xOffset = 20394.88344424886,
-				yOffset = 20797.25895394673,
-			},
-			Tirisfal = {
-				height = 3012.512329627232,
-				width = 4518.747902731258,
-				xOffset = 15138.6360714653,
-				yOffset = 7338.872677268415,
-			},
-			Undercity = {
-				height = 640.1066040851099,
-				width = 959.3745478926886,
-				xOffset = 17298.77542115219,
-				yOffset = 9298.435370484816,
-			},
-			WesternPlaguelands = {
-				height = 2866.677851772014,
-				width = 4299.999720893135,
-				xOffset = 17755.30124459509,
-				yOffset = 7809.708293788776,
-			},
-			Westfall = {
-				height = 2333.342511708478,
-				width = 3499.999662793482,
-				xOffset = 15155.30169114852,
-				yOffset = 20576.42535247717,
-			},
-			Wetlands = {
-				height = 2756.260945423485,
-				width = 4135.416085415621,
-				xOffset = 18561.55114967782,
-				yOffset = 13324.31325114659,
-			},
+		[14] = {
+			xOffset = -36714.28738,
+			yOffset = -14761.90436,
+		},
+		[485] = {
+			xOffset = -25238.09554,
+			yOffset = -11047.61835,
 		},
 	},
-	-- Outland
-	{ -- [3]
-		parentContinent = 3,
-		height = 11642.355227091,
-		width = 17463.987300595,
-		zoneData = {
-			BladesEdgeMountains = {
-				height = 3616.553525584605,
-				width = 5424.971374542539,
-				xOffset = 4150.184588602209,
-				yOffset = 1412.982196881336,
-			},
-			Hellfire = {
-				height = 3443.64230460125,
-				width = 5164.556244744065,
-				xOffset = 7456.417231266903,
-				yOffset = 4339.973859432732,
-			},
-			Nagrand = {
-				height = 3683.218433421437,
-				width = 5524.971116484553,
-				xOffset = 2700.192056890117,
-				yOffset = 5779.512082963144,
-			},
-			Netherstorm = {
-				height = 3716.550667470386,
-				width = 5574.970542741407,
-				xOffset = 7512.666973902843,
-				yOffset = 365.0979868806522,
-			},
-			ShadowmoonValley = {
-				height = 3666.551832578994,
-				width = 5499.971055470069,
-				xOffset = 8770.993482940312,
-				yOffset = 7769.033432511459,
-			},
-			ShattrathCity = {
-				height = 870.8062268244973,
-				width = 1306.243111124071,
-				xOffset = 6860.744657085816,
-				yOffset = 7295.086006462451,
-			},
-			TerokkarForest = {
-				height = 3599.887549731843,
-				width = 5399.971897226099,
-				xOffset = 5912.67529110344,
-				yOffset = 6821.146327166267,
-			},
-			Zangarmarsh = {
-				height = 3351.978661481413,
-				width = 5027.057239215307,
-				xOffset = 3521.020775148071,
-				yOffset = 3885.821395736634,
-			},
+	[13] = {
+		height = 24533.19945,
+		systemParent = 0,
+		width = 36799.81197,
+		xOffset = -17066.60126,
+		yOffset = -12799.89961,
+	},
+	[14] = {
+		height = 27149.68748,
+		systemParent = 0,
+		width = 40741.17907,
+		xOffset = -18171.96844,
+		yOffset = -11176.34367,
+	},
+	[321] = {
+		{ -- [1]
+			height = 1159.5835,
+			width = 1739.375,
+			xOffset = 3506.354,
+			yOffset = -2486.66675,
+		},
+		{ -- [2]
+			height = 241.39025,
+			width = 362.08962,
+			xOffset = 4163.96713,
+			yOffset = -1932.27183,
 		},
+		xOffset = 8690.02719,
+		yOffset = -3623.15183,
+	},
+	[401] = {
+		height = 2825.00046,
+		width = 4237.49828,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[443] = {
+		height = 764.58325,
+		width = 1145.83472,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[461] = {
+		height = 1170.83309,
+		width = 1756.25023,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[462] = {
+		height = 3283.33296,
+		width = 4924.99935,
+		xOffset = 2087.50023,
+		yOffset = -8641.66578,
+	},
+	[463] = {
+		height = 2200.0001,
+		width = 3300.00085,
+		xOffset = 2883.33272,
+		yOffset = -5866.66614,
+	},
+	[464] = {
+		height = 2714.58133,
+		width = 4070.83028,
+		xOffset = -7099.9985,
+		yOffset = -7339.58233,
+	},
+	[466] = {
+		height = 11642.71843,
+		systemParent = 466,
+		width = 17464.0779,
+		xOffset = -12996.03902,
+		yOffset = -5821.35914,
+	},
+	[471] = {
+		height = 704.68794,
+		width = 1056.7699,
+		xOffset = -6533.63241,
+		yOffset = -6523.64995,
+	},
+	[476] = {
+		height = 2174.99908,
+		width = 3262.50031,
+		xOffset = -7525.00003,
+		yOffset = -9374.99943,
+	},
+	[480] = {
+		height = 806.7719,
+		width = 1211.45871,
+		xOffset = 4000.74932,
+		yOffset = -7753.70939,
+	},
+	[482] = {
+		height = 1514.58311,
+		width = 2270.83529,
+		xOffset = 0,
+		yOffset = 0,
 	},
-	-- Northrend
-	{ -- [4]
-		parentContinent = 0,
-		height = 11834.3119870532,
-		width = 17751.3962441049,
-		xOffset = 16020.94044398222,
-		yOffset = 454.2451915717977,
-		zoneData = {
-			BoreanTundra = {
-				height = 3843.764953143499,
-				width = 5764.582303295793,
-				xOffset = 646.3192474426043,
-				yOffset = 5695.48114050537,
-			},
-			CrystalsongForest = {
-				height = 1814.590295101352,
-				width = 2722.916513743646,
-				xOffset = 7773.401390128443,
-				yOffset = 4091.308181657137,
-			},
-			Dalaran = {
-				height = 553.3418567935553,
-				width = 830.0149393375432,
-				xOffset = 8164.641313001377,
-				yOffset = 4526.723129621716,
-			},
-			Dragonblight = {
-				height = 3739.598062842169,
-				width = 5608.332396545997,
-				xOffset = 5590.068422600026,
-				yOffset = 5018.394866268677,
-			},
-			GrizzlyHills = {
-				height = 3500.013689934217,
-				width = 5249.998732532693,
-				xOffset = 10327.56786162186,
-				yOffset = 5076.728707808831,
-			},
-			HrothgarsLanding = {
-				height = 2452.093653509858,
-				width = 3677.082560623348,
-				xOffset = 6419.234857391856,
-				yOffset = -187.8757232657943,
-			},
-			HowlingFjord = {
-				height = 4031.265457002443,
-				width = 6045.831836878359,
-				xOffset = 10615.0679627145,
-				yOffset = 7476.73831512609,
-			},
-			IcecrownGlacier = {
-				height = 4181.266519840844,
-				width = 6270.832975322177,
-				xOffset = 3773.401695036191,
-				yOffset = 1166.296622984233,
-			},
-			LakeWintergrasp = {
-				height = 1983.341134082619,
-				width = 2974.99948105957,
-				xOffset = 4887.98528918423,
-				yOffset = 4876.727878058311,
-			},
-			SholazarBasin = {
-				height = 2904.178067737769,
-				width = 4356.249510482578,
-				xOffset = 2287.985538503677,
-				yOffset = 3305.888591396293,
-			},
-			TheStormPeaks = {
-				height = 4741.684740041381,
-				width = 7112.498187401986,
-				xOffset = 7375.484940713573,
-				yOffset = 395.46058562991,
-			},
-			ZulDrak = {
-				height = 3329.179762967791,
-				width = 4993.749118857795,
-				xOffset = 9817.151095677416,
-				yOffset = 2924.637042390465,
-			},
+	[485] = {
+		height = 11834.26515,
+		systemParent = 0,
+		width = 17751.39839,
+		xOffset = -9217.15231,
+		yOffset = -10593.37487,
+	},
+	[499] = {
+		height = 2218.75027,
+		width = 3327.08362,
+		xOffset = 2902.08234,
+		yOffset = -11168.74965,
+	},
+	[502] = {
+		height = 2108.33411,
+		width = 3162.49385,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[504] = {
+		{ -- [1]
+			height = 553.33995,
+			width = 830.01643,
+			xOffset = -1052.51109,
+			yOffset = -6066.67115,
 		},
+		{ -- [2]
+			height = 375.48927,
+			width = 563.22279,
+			xOffset = -915.86865,
+			yOffset = -5975.33259,
+		},
+		xOffset = -1270.796,
+		yOffset = -11581.57677,
+	},
+	[512] = {
+		height = 1162.50002,
+		width = 1743.74946,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[531] = {
+		height = 774.99991,
+		width = 1162.49961,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[540] = {
+		height = 1766.66716,
+		width = 2650.00164,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[544] = {
+		system = 544,
+	},
+	[545] = {
+		height = 2097.91669,
+		width = 3145.83325,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[602] = {
+		height = 1022.91668,
+		width = 1533.33347,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[605] = {
+		system = 605,
+	},
+	[609] = {
+		height = 502.08329,
+		width = 752.08331,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[611] = {
+		height = 593.74988,
+		width = 889.58325,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[640] = {
+		system = 640,
+	},
+	[677] = {
+		height = 593.74988,
+		width = 889.58325,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[678] = {
+		height = 2097.91669,
+		width = 3145.83325,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[679] = {
+		height = 2097.91669,
+		width = 3145.83325,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[681] = {
+		height = 3010.41666,
+		width = 4514.58301,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[682] = {
+		height = 3010.41666,
+		width = 4514.58301,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[686] = {
+		height = 922.9166,
+		width = 1383.33334,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[708] = {
+		height = 1343.75002,
+		width = 2014.58153,
+		xOffset = -4810.41584,
+		yOffset = 2160.41647,
+	},
+	[709] = {
+		height = 1224.99954,
+		width = 1837.49974,
+		xOffset = -5212.4997,
+		yOffset = 1222.91666,
+	},
+	[717] = {
+		height = 1674.99988,
+		width = 2512.4912,
+		xOffset = 0,
+		yOffset = 0,
+	},
+	[737] = {
+		system = 737,
 	},
 }

-local zeroData;
-zeroData = { xOffset = 0, height = 0, yOffset = 0, width = 0, __index = function() return zeroData end };
+local function zeroDataFunc(tbl, key)
+	if ( type(key) == "number" ) then
+		return zeroData;
+	else
+		return 0;
+	end
+end
+
+zeroData = { xOffset = 0, height = 0, yOffset = 0, width = 0, __index = zeroDataFunc };
 setmetatable(zeroData, zeroData);
-setmetatable(WorldMapSize, zeroData);

-for continent, zones in pairs(Astrolabe.ContinentList) do
-	local mapData = WorldMapSize[continent];
-	for index, mapName in pairs(zones) do
-		if not ( mapData.zoneData[mapName] ) then
-			--WE HAVE A PROBLEM!!!
-			ChatFrame1:AddMessage("Astrolabe is missing data for "..select(index, GetMapZones(continent))..".");
-			mapData.zoneData[mapName] = zeroData;
+function printError( ... )
+	if ( ASTROLABE_VERBOSE) then
+		print(...)
+	end
+end
+
+for mapID, harvestedData in pairs(Astrolabe.HarvestedMapData) do
+	local mapData = WorldMapSize[mapID];
+	if ( mapData ) then
+		if ( harvestedData.numFloors > 0 ) then
+			for f, harvData in pairs(harvestedData) do
+				if ( type(f) == "number" and f > 0 ) then
+					if not ( mapData[f] ) then
+						mapData[f] = {};
+					end
+					local floorData = mapData[f]
+					if not ( floorData.width ) then
+						floorData.width = harvData.BRx - harvData.TLx
+					end
+					if not ( floorData.height ) then
+						floorData.height = harvData.BRy - harvData.TLy
+					end
+					if not ( floorData.xOffset ) then
+						floorData.xOffset = harvData.TLx
+					end
+					if not ( floorData.yOffset ) then
+						floorData.yOffset = harvData.TLy
+					end
+				end
+			end
+			for f = 1, harvestedData.numFloors do
+				if not ( mapData[f] ) then
+					printError(("Astrolabe is missing data for %s [%d], floor %d."):format(harvestedData.mapName, mapID, f));
+				end
+			end
+			-- TODO: handle floored world maps
+
+		else
+			local harvData = harvestedData[0]
+			if not ( mapData.width ) then
+				mapData.width = harvData.BRx - harvData.TLx
+			end
+			if not ( mapData.height ) then
+				mapData.height = harvData.BRy - harvData.TLy
+			end
+			if not ( mapData.xOffset ) then
+				mapData.xOffset = harvData.TLx
+			end
+			if not ( mapData.yOffset ) then
+				mapData.yOffset = harvData.TLy
+			end
+
 		end
-		mapData[index] = mapData.zoneData[mapName];
-		mapData.zoneData[mapName] = nil;
+
+	else
+		mapData = {};
+
+		if ( harvestedData.numFloors > 0 ) then
+			for f, harvData in pairs(harvestedData) do
+				if ( type(f) == "number" and f > 0 ) then
+					mapData[f] = {};
+					local floorData = mapData[f]
+					floorData.width = harvData.BRx - harvData.TLx
+					floorData.height = harvData.BRy - harvData.TLy
+					floorData.xOffset = harvData.TLx
+					floorData.yOffset = harvData.TLy
+				end
+			end
+			for f = 1, harvestedData.numFloors do
+				if not ( mapData[f] ) then
+					printError(("Astrolabe is missing data for %s [%d], floor %d."):format(harvestedData.mapName, mapID, f));
+				end
+			end
+
+		else
+			local harvData = harvestedData[0]
+			if ( harvData ) then
+				mapData.width = harvData.BRx - harvData.TLx
+				mapData.height = harvData.BRy - harvData.TLy
+				mapData.xOffset = harvData.TLx
+				mapData.yOffset = harvData.TLy
+
+			else
+				printError(("Astrolabe is missing data for %s [%d]."):format(harvestedData.mapName, mapID));
+
+			end
+
+		end
+
+		-- if we don't have any data, we're gonna use zeroData, but we also need to
+		-- setup the system and systemParent IDs so things don't get confused
+		if not ( next(mapData, nil) ) then
+			mapData = { xOffset = 0, height = 0, yOffset = 0, width = 0 };
+			setmetatable(mapData, zeroData);
+
+			-- if this is a regluar outside zone map and
+			if ( harvestedData.cont > 0 and harvestedData.zone == 0 ) then
+				printError(("Astrolabe is missing data for world map %s [%d] (%d, %d)."):format(harvestedData.mapName, mapID, harvestedData.cont, harvestedData.zone));
+			end
+		end
+
+		-- store the data in the WorldMapSize DB
+		WorldMapSize[mapID] = mapData;
+
+	end
+
+	-- setup system and systemParent IDs
+	if ( mapData and mapData ~= zeroData ) then
+		if not ( mapData.system ) then
+			mapData.system = mapID;
+
+			if ( harvestedData.cont > 0 and harvestedData.zone > 0 ) then
+				mapData.system = Astrolabe:GetMapID(harvestedData.cont, nil);
+			end
+		end
+		if not ( mapData.systemParent ) then
+			mapData.systemParent = mapID;
+
+			local systemData = WorldMapSize[mapData.system];
+			if ( systemData and systemData.systemParent ) then
+				mapData.systemParent = systemData.systemParent;
+			end
+		end
+		setmetatable(mapData, zeroData);
 	end
 end

+setmetatable(WorldMapSize, zeroData);

 -- register this library with AstrolabeMapMonitor, this will cause a full update if PLAYER_LOGIN has already fired
 local AstrolabeMapMonitor = DongleStub("AstrolabeMapMonitor");