Wowpedia

We have moved to Warcraft Wiki. Click here for information and the new URL.

READ MORE

Wowpedia
(Replaced code with working one)
(Fixed glitch when "Rotate Minimap" is enabled)
 
Line 9: Line 9:
 
local GetPlayerBearing;-- Local definition, remove to make global
 
local GetPlayerBearing;-- Local definition, remove to make global
 
do
 
do
local math=math;-- Local pointer to the Math library
+
local math=math;-- Local pointer to the Math library
local tex;-- Upvalue to hold the pointer for our function
+
local mmring=MinimapCompassTexture;-- Pointer to the Compass Ring
  +
local mmarrow;-- Upvalue to hold the pointer to the Player Arrow
 
 
 
-- Scan for Player Arrow Texture
 
-- Scan for Player Arrow Texture
Line 17: Line 18:
 
-- Scan for a no-name texture with a specific file loaded.
 
-- Scan for a no-name texture with a specific file loaded.
 
if j:IsObjectType("Texture") and not j:GetName() and j:GetTexture():lower()=="interface\\minimap\\minimaparrow" then
 
if j:IsObjectType("Texture") and not j:GetName() and j:GetTexture():lower()=="interface\\minimap\\minimaparrow" then
tex=j;-- Found it, save and stop scanning
+
mmarrow=j;-- Found it, save and stop scanning
 
break;
 
break;
 
end
 
end
Line 24: Line 25:
 
-- Function definition
 
-- Function definition
 
GetPlayerBearing=function()
 
GetPlayerBearing=function()
  +
local obj=GetCVar("rotateMinimap")=="1" and mmring or mmarrow;-- Use the correct texture
if not tex then return 0; end-- Hopefully this doesn't happen
+
if not obj then return 0; end-- Hopefully this doesn't happen
 
 
local fx,fy,bx,by=tex:GetTexCoord();-- Only need front and back of one side (left is returned first)
+
local fx,fy,bx,by=obj:GetTexCoord();-- Only need front and back of one side (left is returned first)
 
local a,dx,dy=0,fx-bx,by-fy;-- Y-Axis flipped for textures so Y values are swapped
 
local a,dx,dy=0,fx-bx,by-fy;-- Y-Axis flipped for textures so Y values are swapped
  +
if obj==mmring then dx=-dx; end-- Compass Ring spins the opposite direction
 
if dy==0 then-- Can't divide by zero
 
if dy==0 then-- Can't divide by zero
 
a=dx<0 and math.pi or 0;-- Could either be one or the other in this condition
 
a=dx<0 and math.pi or 0;-- Could either be one or the other in this condition

Latest revision as of 07:51, 13 February 2010

This is a user-defined function that you can copy and paste into your addon.

Returns the player's current facing bearing based on the rotation of the minimap arrow.

bearing = GetPlayerBearing();

Return values

bearing
number - The player's current bearing (in Radians).

Example Implementation

local GetPlayerBearing;--	Local definition, remove to make global
do
	local math=math;--			Local pointer to the Math library
	local mmring=MinimapCompassTexture;--	Pointer to the Compass Ring
	local mmarrow;--			Upvalue to hold the pointer to the Player Arrow

--	Scan for Player Arrow Texture
	local list={Minimap:GetRegions()};
	for i,j in pairs(list) do
--		Scan for a no-name texture with a specific file loaded.
		if j:IsObjectType("Texture") and not j:GetName() and j:GetTexture():lower()=="interface\\minimap\\minimaparrow" then
			mmarrow=j;--	Found it, save and stop scanning
			break;
		end
	end

--	Function definition
	GetPlayerBearing=function()
		local obj=GetCVar("rotateMinimap")=="1" and mmring or mmarrow;--	Use the correct texture
		if not obj then return 0; end--						Hopefully this doesn't happen

		local fx,fy,bx,by=obj:GetTexCoord();--	Only need front and back of one side (left is returned first)
		local a,dx,dy=0,fx-bx,by-fy;--		Y-Axis flipped for textures so Y values are swapped
		if obj==mmring then dx=-dx; end--	Compass Ring spins the opposite direction
		if dy==0 then--				Can't divide by zero
			a=dx<0 and math.pi or 0;--	Could either be one or the other in this condition
		else
			a=math.atan(dx/dy)+(dy<0 and math.pi or 0);--	atan() only returns half of the values we need, add PI when needed
		end

		return a;
	end
end

Notes

The old code posted here broke due to a change in the Minimap object. The player arrow shown is no longer a Model frame, it's a Texture now. Also note atan() is not the same function as math.atan, the first returns in Degrees while the later returns in Radians.

Due to the returns on math.atan(), the range this function returns with is between -0.5*PI and 1.5*PI