Sdphantom50583@legacy41569983 (talk | contribs) (Replaced code with working one) |
Sdphantom50583@legacy41569983 (talk | contribs) (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 |
+ | 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 |
||
− | + | 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 |
+ | if not obj then return 0; end-- Hopefully this doesn't happen |
− | local fx,fy,bx,by= |
+ | 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