Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PLUGIN.Title = "Auto Compass"
- PLUGIN.Description = "Automatic compass shows direction player is facing via notice box"
- PLUGIN.Author = "LazyMammal"
- PLUGIN.Version = "0.1.0"
- -- timers use global scope to allow smooth "oxide.reload autocompass"
- if ACpopupTimer or ACsaveTimer then
- print "Auto Compass: cancelling old timers"
- end
- if ACpopupTimer then ACpopupTimer:Destroy() end
- if ACsaveTimer then ACsaveTimer:Destroy() end
- ACpopupTimer = nil
- ACsaveTimer = nil
- function PLUGIN:Init()
- -- load config file
- self.cfgfile = "autocompass"
- local b, res = config.Read(self.cfgfile)
- self.Config = res or {}
- if (not b) or (self.Config.update_interval == nil) then
- self:LoadDefaultConfig()
- if (res) then config.Save(self.cfgfile) end
- end
- -- load player toggle preferences
- self.toggleTable = {}
- self.toggleDataFile = util.GetDatafile( "autocompass_data" )
- local txt = self.toggleDataFile:GetText()
- if txt ~= "" then self.toggleTable = json.decode( txt ) end
- -- store last known angle
- self.angleTable = {}
- -- add chat commands
- self:AddChatCommand( "compass", self.cmdCompass)
- -- add timers
- print "Auto Compass: initiating timers"
- ACpopupTimer = timer.Repeat( self.Config.update_interval, function() self:AutoCompass() end )
- ACsaveTimer = timer.Repeat( self.Config.save_interval, function() self:SaveTogglePrefs() end )
- end
- function PLUGIN:LoadDefaultConfig()
- print "Auto Compass: using default config"
- self.Config.update_interval = 5 -- popup update frequency (seconds)
- self.Config.save_interval = 300 -- user prefs save frequency (seconds)
- end
- function PLUGIN:SaveTogglePrefs()
- self.toggleDataFile:SetText( json.encode( self.toggleTable ) )
- self.toggleDataFile:Save()
- end
- function PLUGIN:AutoCompass() -- function called by timer, checks each player for change in direction
- local userlist = rust.GetAllNetUsers()
- for k, netuser in pairs(userlist) do
- local steamID = rust.CommunityIDToSteamID( tonumber(rust.GetUserID(netuser)) )
- local toggle = self.toggleTable[steamID]
- if toggle then
- -- test for 'significant' change
- local angle = self:GetAngle(netuser)
- local prev = self.angleTable[steamID]
- local diff = nil
- if not (prev == nil) then diff = (prev-angle+360)%360 end
- if (prev == nil) or (diff == nil) or (diff > 5 and diff < 355) then -- not within 5 deg of prev
- self.angleTable[steamID] = angle
- -- send popup notice to player
- local label = self:GetLabel(angle)
- rust.InventoryNotice(netuser, label)
- else
- -- force popup next time
- self.angleTable[steamID] = nil
- end
- end
- end
- end
- function PLUGIN:GetAngle(netuser)
- local controllable = netuser.playerClient.controllable
- if (controllable == nil) then return 0 end
- local char = controllable:GetComponent("Character")
- return tonumber(((char.eyesYaw+90)%360)) -- angle in degrees
- end
- function PLUGIN:GetLabel(angle)
- -- get (inter)cardinal direction
- local octal = 1+math.floor((angle+22.5)/360*8)%8 -- eight directions (index 1..8)
- -- build direction label
- local label = {"Norte","Noreste","Este","Sudeste","Sur","Sudoeste","Oeste","Noroeste"}
- return label[octal] .. " " .. math.floor(angle) .. "°"
- end
- function PLUGIN:cmdCompass(netuser, cmd, args) -- chat command to toggle popup notification
- local steamID = rust.CommunityIDToSteamID( tonumber(rust.GetUserID(netuser)) )
- if self.toggleTable[steamID] then
- self.toggleTable[steamID] = nil
- rust.Notice(netuser, "Brujula OFF")
- else
- self.toggleTable[steamID] = true
- rust.Notice(netuser, "Brujula ON")
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement