mirror of
https://github.com/MarkuruThunderhoof/RecipeRadar.git
synced 2026-10-18 11:20:51 +00:00
Now usable with "custom git addon" feature of launchers
This commit is contained in:
+216
@@ -0,0 +1,216 @@
|
||||
|
||||
-- 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
|
||||
Reference in New Issue
Block a user