Files
RecipeRadar/Minimap.lua
T

217 lines
6.2 KiB
Lua

-- Minimap.lua: minimap vendor plotting code
-- $Id: Minimap.lua 429 2006-08-22 19:16:17Z jnmiller $
-- Note: the mapping code in here is from MapNotes, by Sir.Bender, et al.
-- Initializes the state of the minimap overlays and settings.
function RecipeRadar_Minimap_Init()
-- time between minimap updates, in seconds
RECIPERADAR_MINIMAP_UPDATE = 0.1
-- determine minimap scale
RecipeRadar_Minimap_SetIndoorness()
for i = 1, RECIPERADAR_MAPPED_VENDORS_MAX do
local button = getglobal("RecipeRadarMinimapIcon" .. i)
button.Elapsed = 0
button:Hide()
end
end
function RecipeRadar_Minimap_OnNewRegion()
SetMapToCurrentZone()
for i = 1, RECIPERADAR_MAPPED_VENDORS_MAX do
local button = getglobal("RecipeRadarMinimapIcon" .. i)
if (button.IsMapped and button.Region == GetRealZoneText()) then
button:Show()
else
button:Hide()
end
end
end
-- Map the given icon to the given vendor.
function RecipeRadar_Minimap_AddVendor(id, vendor, region)
local button = getglobal("RecipeRadarMinimapIcon" .. id)
button.Vendor = vendor
button.Region = region
button.Elapsed = RECIPERADAR_MINIMAP_UPDATE
button.IsMapped = true
button:Show()
end
-- Resets and unmaps the given icon.
function RecipeRadar_Minimap_RemoveVendor(id)
local button = getglobal("RecipeRadarMinimapIcon" .. id)
button.Vendor = nil
button.Region = nil
button.IsMapped = false
button:Hide()
end
function RecipeRadar_Minimap_OnUpdate(elapsed)
if (this.Region ~= GetRealZoneText()) then
this:Hide()
return
end
this.Elapsed = this.Elapsed + elapsed
if (this.Elapsed < RECIPERADAR_MINIMAP_UPDATE) then
return
end
this.Elapsed = 0
RecipeRadar_Minimap_UpdateButton(this)
end
-- Determines whether the minimap is displaying an indoor location
-- by comparing the minimapZoom and minimapInsideZoom CVars (from MapNotes).
function RecipeRadar_Minimap_SetIndoorness()
local test_zoom = 0
if (GetCVar("minimapZoom") == GetCVar("minimapInsideZoom")) then
if (GetCVar("minimapInsideZoom") + 0 >= 3) then
Minimap:SetZoom(Minimap:GetZoom() - 1)
test_zoom = 1
else
Minimap:SetZoom(Minimap:GetZoom() + 1)
test_zoom = -1
end
end
RecipeRadar_Minimap_IsIndoor =
(GetCVar("minimapInsideZoom") + 0 == Minimap:GetZoom())
Minimap:SetZoom(Minimap:GetZoom() + test_zoom)
end
-- Computes the distance between two points on the minimap.
function RecipeRadar_Minimap_Distance(p1_x, p1_y, p2_x, p2_y)
local dist_x, dist_y = p2_x - p1_x, p2_y - p1_y
return dist_x, dist_y
end
-- Computes the length of the hypotenuse between two lines.
function RecipeRadar_Minimap_Pythagorean(length1, length2)
local distance = math.sqrt(length1 * length1 + length2 * length2)
if (distance == 0) then
return 0.0000000001
end
return distance
end
-- Retrieves the appropriate scaling constants from our MapData table.
function RecipeRadar_Minimap_GetScale(continent, is_indoor, zoom)
if (continent == 0) then
RecipeRadar_Print("ASSERT FAILED: continent = 0")
return nil
end
local scale_x = RecipeRadar_MapData[continent].Scale[zoom].x
local scale_y = RecipeRadar_MapData[continent].Scale[zoom].y
if (is_indoor == true) then
scale_x = scale_x * RecipeRadar_MapData.IndoorZoomRatio[zoom]
scale_y = scale_y * RecipeRadar_MapData.IndoorZoomRatio[zoom]
end
return scale_x, scale_y
end
-- Finds the appropriate location on the minimap, accounting for the fact
-- that the minimap has a radius of only 57 (or so) units (from MapNotes).
function RecipeRadar_Minimap_GetPosition(offs_x, offs_y, scale_x, scale_y)
local map_x, map_y = offs_x * scale_x, offs_y * scale_y
local mapDist = RecipeRadar_Minimap_Pythagorean(map_x, map_y)
local mapWidth = Minimap:GetWidth()/2;
local mapHeight = Minimap:GetHeight()/2;
if (Squeenix or (simpleMinimap_Skins and simpleMinimap_Skins:GetShape() == "square")
or (pfUI and pfUI.minimap)) then
if (math.abs(map_x) > mapWidth) then
map_x = (mapWidth)*((map_x<0 and -1) or 1);
end
if (math.abs(map_y) > mapHeight) then
map_y = (mapHeight)*((map_y<0 and -1) or 1);
end
elseif (mapDist >= mapWidth) then
-- Remap it to just inside the minimap, by:converting dx,dy to angle,distance
-- then truncate distance to 58 and convert angle,58 to dx,dy
local flipAxis = 1;
if (map_x == 0) then map_x = 0.0000000001;
elseif (map_x < 0) then flipAxis = -1;
end
local angle = math.atan(map_y / map_x);
map_x = math.cos(angle) * mapWidth * flipAxis;
map_y = math.sin(angle) * mapHeight * flipAxis;
end
return map_x, map_y
end
-- Plots the given button on the minimap.
function RecipeRadar_Minimap_UpdateButton(button)
local pl_x, pl_y = GetPlayerMapPosition("player")
if (pl_x == 0 and pl_y == 0) then
button:Hide() -- the player is in an unmappable location
return
end
-- only mapping the first location in our database
local vendor = button.Vendor.Coordinates[1]
if (not vendor) then return end
-- some code to display the current coordinates for debugging
if (RecipeRadar_Options.PositionDebug) then
RecipeRadar_Print("Debugging " .. button.Vendor.Name)
RecipeRadar_Print("Database Coords: " .. vendor.x .. ", " .. vendor.y)
RecipeRadar_Print("Player Coords: " .. pl_x .. ", " .. pl_y)
RecipeRadar_Options.PositionDebug = false
end
-- we don't need all these computations if the player isn't moving
if (pl_x == button.pl_x and pl_y == button.pl_y) then return end
button.pl_x, button.pl_y = pl_x, pl_y
pl_x, pl_y = RecipeRadar_Maps_LocalToAbsolute(pl_x, pl_y, button.Region)
vendor = RecipeRadar_Maps_LocalToAbsoluteTable(vendor, button.Region)
local offs_x, offs_y = RecipeRadar_Minimap_Distance(pl_x, pl_y,
vendor.x, vendor.y)
local region = RecipeRadar_RegionData[button.Region]
local scale_x, scale_y = RecipeRadar_Minimap_GetScale(
region.Continent, RecipeRadar_Minimap_IsIndoor, Minimap:GetZoom())
local pos_x, pos_y = RecipeRadar_Minimap_GetPosition(
offs_x, offs_y, scale_x, scale_y)
button:SetPoint("CENTER", "Minimap", "CENTER", pos_x, -pos_y)
end