mirror of
https://github.com/MarkuruThunderhoof/RecipeRadar.git
synced 2026-09-22 15:36:57 +00:00
217 lines
6.2 KiB
Lua
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
|