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");