Advertisement
Guest User

compass.lua

a guest
Jan 28th, 2017
4,566
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.85 KB | None | 0 0
  1. local compass = { cardinal={}, intercardinal={}}
  2.  
  3. -- Configuration. Please be careful when editing. It does not check for errors.
  4. compass.show = true
  5. compass.position = {x = 0.5, y = 0.07, centered = true}
  6. compass.width = 0.25
  7. compass.fov = 180
  8. compass.followGameplayCam = true
  9.  
  10. compass.ticksBetweenCardinals = 9.0
  11. compass.tickColour = {r = 255, g = 255, b = 255, a = 255}
  12. compass.tickSize = {w = 0.001, h = 0.003}
  13.  
  14. compass.cardinal.textSize = 0.25
  15. compass.cardinal.textOffset = 0.015
  16. compass.cardinal.textColour = {r = 255, g = 255, b = 255, a = 255}
  17.  
  18. compass.cardinal.tickShow = true
  19. compass.cardinal.tickSize = {w = 0.001, h = 0.012}
  20. compass.cardinal.tickColour = {r = 255, g = 255, b = 255, a = 255}
  21.  
  22. compass.intercardinal.show = true
  23. compass.intercardinal.textShow = true
  24. compass.intercardinal.textSize = 0.2
  25. compass.intercardinal.textOffset = 0.015
  26. compass.intercardinal.textColour = {r = 255, g = 255, b = 255, a = 255}
  27.  
  28. compass.intercardinal.tickShow = true
  29. compass.intercardinal.tickSize = {w = 0.001, h = 0.006}
  30. compass.intercardinal.tickColour = {r = 255, g = 255, b = 255, a = 255}
  31. -- End of configuration
  32.  
  33.  
  34. Citizen.CreateThread( function()
  35.     if compass.position.centered then
  36.         compass.position.x = compass.position.x - compass.width / 2
  37.     end
  38.    
  39.     while compass.show do
  40.         Wait( 0 )
  41.        
  42.         local pxDegree = compass.width / compass.fov
  43.         local playerHeadingDegrees = 0
  44.        
  45.         if compass.followGameplayCam then
  46.             -- Converts [-180, 180] to [0, 360] where E = 90 and W = 270
  47.             local camRot = Citizen.InvokeNative( 0x837765A25378F0BB, 0, Citizen.ResultAsVector() )
  48.             playerHeadingDegrees = 360.0 - ((camRot.z + 360.0) % 360.0)
  49.         else
  50.             -- Converts E = 270 to E = 90
  51.             playerHeadingDegrees = 360.0 - GetEntityHeading( GetPlayerPed( -1 ) )
  52.         end
  53.        
  54.         local tickDegree = playerHeadingDegrees - compass.fov / 2
  55.         local tickDegreeRemainder = compass.ticksBetweenCardinals - (tickDegree % compass.ticksBetweenCardinals)
  56.         local tickPosition = compass.position.x + tickDegreeRemainder * pxDegree
  57.        
  58.         tickDegree = tickDegree + tickDegreeRemainder
  59.        
  60.         while tickPosition < compass.position.x + compass.width do
  61.             if (tickDegree % 90.0) == 0 then
  62.                 -- Draw cardinal
  63.                 if compass.cardinal.tickShow then
  64.                     DrawRect( tickPosition, compass.position.y, compass.cardinal.tickSize.w, compass.cardinal.tickSize.h, compass.cardinal.tickColour.r, compass.cardinal.tickColour.g, compass.cardinal.tickColour.b, compass.cardinal.tickColour.a )
  65.                 end
  66.                
  67.                 drawText( degreesToIntercardinalDirection( tickDegree ), tickPosition, compass.position.y + compass.cardinal.textOffset, {
  68.                     size = compass.cardinal.textSize,
  69.                     colour = compass.cardinal.textColour,
  70.                     outline = true,
  71.                     centered = true
  72.                 })
  73.             elseif (tickDegree % 45.0) == 0 and compass.intercardinal.show then
  74.                 -- Draw intercardinal
  75.                 if compass.intercardinal.tickShow then
  76.                     DrawRect( tickPosition, compass.position.y, compass.intercardinal.tickSize.w, compass.intercardinal.tickSize.h, compass.intercardinal.tickColour.r, compass.intercardinal.tickColour.g, compass.intercardinal.tickColour.b, compass.intercardinal.tickColour.a )
  77.                 end
  78.                
  79.                 if compass.intercardinal.textShow then
  80.                     drawText( degreesToIntercardinalDirection( tickDegree ), tickPosition, compass.position.y + compass.intercardinal.textOffset, {
  81.                         size = compass.intercardinal.textSize,
  82.                         colour = compass.intercardinal.textColour,
  83.                         outline = true,
  84.                         centered = true
  85.                     })
  86.                 end
  87.             else
  88.                 -- Draw tick
  89.                 DrawRect( tickPosition, compass.position.y, compass.tickSize.w, compass.tickSize.h, compass.tickColour.r, compass.tickColour.g, compass.tickColour.b, compass.tickColour.a )
  90.             end
  91.            
  92.             -- Advance to the next tick
  93.             tickDegree = tickDegree + compass.ticksBetweenCardinals
  94.             tickPosition = tickPosition + pxDegree * compass.ticksBetweenCardinals
  95.         end
  96.     end
  97. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement