WoWInterface

WoWInterface (https://www.wowinterface.com/forums/index.php)
-   Lua/XML Help (https://www.wowinterface.com/forums/forumdisplay.php?f=16)
-   -   Ping minimap question (https://www.wowinterface.com/forums/showthread.php?t=48944)

Spawnova 02-17-14 03:13 AM

Ping minimap question
 
Since the function to ping the minimap uses it's own values instead of what GetPlayerMapPosition returns, I'm having trouble pinging the minimap at the location I would like to.

For instance I would like to ping 58,58 on the minimap, but Minimap:PingLocation() uses pixels from the minimaps center rather than coordinates.

If anyone knows how to do this or can point me in the right direction I would appreciate it.

Vlad 02-17-14 06:47 AM

Math is the answer.

You got your x and y coordinates from GetPlayerMapPosition("player")
You got the wanted x and y position you wish to ping.
Some math should help solve the issue! :D

The important thing here is how PingLocation behaves, since the coordinates are pixel distances relative to the center of the minimap (positive coordinates are above or to the right of the center, negative are below or to the left), and not world coordinates!

This means you need to account for the zoom levels, get the size of the map and calculate where your desired coordinates lie in the minimap scope of coordinates, then finally apply the ping animation.

Working on the answer as I haven't done this particular formula before. By all means if someone else wishes to reply, do it!

Spawnova 02-17-14 06:50 AM

Yea I've been working on it most of this morning, I'm not very good at math when it comes to things like this but I'm still trying to figure it out in the mean time.

Vlad 02-17-14 07:00 AM

*Edit*

I just edited my reply.

Here is what I found out, with Astrolabe this is a really easy thing to do, here is sample code:
Code:

local icon = CreateFrame("Frame")
icon:SetSize(1, 1)

local astrolabe = DongleStub("Astrolabe-1.0")

local function ApplyMinimapMath(x, y)
  local scale = Minimap:GetEffectiveScale()
  x = x/scale
  y = y/scale
  local cx, cy = Minimap:GetCenter()
  x = x - cx
  y = y - cy
  if sqrt(x*x + y*y) < (Minimap:GetWidth()/2) then
    return x, y
  end
end

local function PingLocation(mapID, level, x, y)
  if astrolabe:PlaceIconOnMinimap(icon, mapID, level, x, y) == 0 then
    local x, y = icon:GetCenter()
    local edge = astrolabe:IsIconOnEdge(icon)
    astrolabe:RemoveIconFromMinimap(icon)
    if not edge then
      x, y = ApplyMinimapMath(x, y)
      if x then
        Minimap:PingLocation(x, y)
      end
    end
  end
end

-- pings in the middle of your current map and level
PingLocation(GetCurrentMapAreaID(), GetCurrentMapDungeonLevel(), .5, .5)

You can find the latest version of Astrolabe and DongleStub at:
http://svn.esamynn.org/astrolabe/trunk/

Spawnova 02-17-14 08:59 AM

Thanks vlad, I appreciate all the help. ^.^

This does a lot more than what I was thinking it will be fun to mess around with it. :D


All times are GMT -6. The time now is 05:24 PM.

vBulletin © 2024, Jelsoft Enterprises Ltd
© 2004 - 2022 MMOUI