Advertisement
Guest User

Untitled

a guest
Apr 20th, 2014
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.88 KB | None | 0 0
  1. PLUGIN.Title = "Auto Compass"
  2. PLUGIN.Description = "Automatic compass shows direction player is facing via notice box"
  3. PLUGIN.Author = "LazyMammal"
  4. PLUGIN.Version = "0.1.0"
  5.  
  6. -- timers use global scope to allow smooth "oxide.reload autocompass"
  7. if ACpopupTimer or ACsaveTimer then
  8. print "Auto Compass: cancelling old timers"
  9. end
  10. if ACpopupTimer then ACpopupTimer:Destroy() end
  11. if ACsaveTimer then ACsaveTimer:Destroy() end
  12. ACpopupTimer = nil
  13. ACsaveTimer = nil
  14.  
  15. function PLUGIN:Init()
  16.  
  17. -- load config file
  18. self.cfgfile = "autocompass"
  19. local b, res = config.Read(self.cfgfile)
  20. self.Config = res or {}
  21. if (not b) or (self.Config.update_interval == nil) then
  22. self:LoadDefaultConfig()
  23. if (res) then config.Save(self.cfgfile) end
  24. end
  25.  
  26. -- load player toggle preferences
  27. self.toggleTable = {}
  28. self.toggleDataFile = util.GetDatafile( "autocompass_data" )
  29. local txt = self.toggleDataFile:GetText()
  30. if txt ~= "" then self.toggleTable = json.decode( txt ) end
  31.  
  32. -- store last known angle
  33. self.angleTable = {}
  34.  
  35. -- add chat commands
  36. self:AddChatCommand( "compass", self.cmdCompass)
  37.  
  38. -- add timers
  39. print "Auto Compass: initiating timers"
  40. ACpopupTimer = timer.Repeat( self.Config.update_interval, function() self:AutoCompass() end )
  41. ACsaveTimer = timer.Repeat( self.Config.save_interval, function() self:SaveTogglePrefs() end )
  42.  
  43. end
  44.  
  45. function PLUGIN:LoadDefaultConfig()
  46. print "Auto Compass: using default config"
  47. self.Config.update_interval = 5 -- popup update frequency (seconds)
  48. self.Config.save_interval = 300 -- user prefs save frequency (seconds)
  49. end
  50.  
  51. function PLUGIN:SaveTogglePrefs()
  52. self.toggleDataFile:SetText( json.encode( self.toggleTable ) )
  53. self.toggleDataFile:Save()
  54. end
  55.  
  56. function PLUGIN:AutoCompass() -- function called by timer, checks each player for change in direction
  57. local userlist = rust.GetAllNetUsers()
  58. for k, netuser in pairs(userlist) do
  59. local steamID = rust.CommunityIDToSteamID( tonumber(rust.GetUserID(netuser)) )
  60. local toggle = self.toggleTable[steamID]
  61. if toggle then
  62. -- test for 'significant' change
  63. local angle = self:GetAngle(netuser)
  64. local prev = self.angleTable[steamID]
  65. local diff = nil
  66. if not (prev == nil) then diff = (prev-angle+360)%360 end
  67.  
  68. if (prev == nil) or (diff == nil) or (diff > 5 and diff < 355) then -- not within 5 deg of prev
  69. self.angleTable[steamID] = angle
  70.  
  71. -- send popup notice to player
  72. local label = self:GetLabel(angle)
  73. rust.InventoryNotice(netuser, label)
  74. else
  75. -- force popup next time
  76. self.angleTable[steamID] = nil
  77. end
  78. end
  79. end
  80. end
  81.  
  82. function PLUGIN:GetAngle(netuser)
  83. local controllable = netuser.playerClient.controllable
  84. if (controllable == nil) then return 0 end
  85. local char = controllable:GetComponent("Character")
  86. return tonumber(((char.eyesYaw+90)%360)) -- angle in degrees
  87. end
  88.  
  89. function PLUGIN:GetLabel(angle)
  90. -- get (inter)cardinal direction
  91. local octal = 1+math.floor((angle+22.5)/360*8)%8 -- eight directions (index 1..8)
  92. -- build direction label
  93. local label = {"Norte","Noreste","Este","Sudeste","Sur","Sudoeste","Oeste","Noroeste"}
  94. return label[octal] .. " " .. math.floor(angle) .. "°"
  95. end
  96.  
  97. function PLUGIN:cmdCompass(netuser, cmd, args) -- chat command to toggle popup notification
  98. local steamID = rust.CommunityIDToSteamID( tonumber(rust.GetUserID(netuser)) )
  99. if self.toggleTable[steamID] then
  100. self.toggleTable[steamID] = nil
  101. rust.Notice(netuser, "Brujula OFF")
  102. else
  103. self.toggleTable[steamID] = true
  104. rust.Notice(netuser, "Brujula ON")
  105. end
  106. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement