auto doors

h0wHigh

Retired Staff
Retired Staff
Aug 5, 2014
103
9
18
This is from the .lua from oxide.

Code:
PLUGIN.Title = "Door Closer"
PLUGIN.Description = "Automatic door closer. Players no longer need to close doors behind them."
PLUGIN.Author = "LazyMammal"
PLUGIN.Version = "0.1.1"

-- repeat timer uses global scope to allow smooth "oxide.reload doorcloser"
if DoorCloserSaveTimer then
    print "Door Closer: cancelling old timer"
    DoorCloserSaveTimer:Destroy()
end
DoorCloserSaveTimer = nil

-- Credit to "Door Remote Control" plugin for door state changer
local NullableOfVector3 = typesystem.MakeNullableOf( UnityEngine.Vector3 )
local NullableOfBoolean = typesystem.MakeNullableOf( System.Boolean )
local ToggleStateServer = util.FindOverloadedMethod( Rust.BasicDoor, "ToggleStateServer", bf.private_instance, { NullableOfVector3, System.UInt64, NullableOfBoolean } )
local GetDoorState, SetDoorState = typesystem.GetField( Rust.BasicDoor, "state", bf.private_instance )
local CurrentTime = util.GetStaticPropertyGetter( cs.gettype("NetCull, Assembly-CSharp"), "timeInMillis")
function PLUGIN:close_door(door)
    if (tostring(GetDoorState(door)) == "Opened: 1") then
        local timestamp = CurrentTime()
        local origin = new( UnityEngine.Vector3 )
        local arr = util.ArrayFromTable( System.Object, { new( NullableOfVector3, origin ), timestamp, nil }, 3 )
        cs.convertandsetonarray( arr, 1, timestamp, System.UInt64._type )
        local res= ToggleStateServer:Invoke( door, arr )
    end
end

function PLUGIN:Init()

    -- load config file
    self.cfgfile = "doorcloser"
    local b, res = config.Read(self.cfgfile)
    self.Config = res or {}
    if (not b) or (self.Config.delay == nil) then
        self:LoadDefaultConfig()
        if (res) then config.Save(self.cfgfile) end
    end
   
    -- load player preferences
    self.delayTable = {}
    self.prefsDataFile = util.GetDatafile( "doorcloser_data" )
    local txt = self.prefsDataFile:GetText()
    if txt ~= "" then self.delayTable = json.decode( txt ) end

    -- add chat commands
    self:AddChatCommand( "doorcloser", self.cmdDoorCloser)
   
    -- add timers
    print "Door Closer: initiating save timer"
    DoorCloserSaveTimer = timer.Repeat( self.Config.save_interval, function() self:SavePrefs() end )

end

function PLUGIN:LoadDefaultConfig()
    print "Door Closer: using default config"
    self.Config.delay = 5 -- default delay (seconds)
    self.Config.delay_max = 30 -- maximum delay allowed (seconds)
    self.Config.enabled = false -- is Door Closer enabled by default
    self.Config.save_interval = 310 -- user prefs save frequency (seconds)
end

function PLUGIN:SavePrefs()
    self.prefsDataFile:SetText( json.encode( self.delayTable ) )
    self.prefsDataFile:Save()
end

function PLUGIN:CanOpenDoor(netuser, door) -- called when a user opens door (or at least attempts to)
    local steamID = rust.CommunityIDToSteamID( tonumber(rust.GetUserID(netuser)) )
    local delay = self.delayTable[steamID]
    if delay == nil and self.Config.enabled then -- use default delay if plugin is enabled by default
        delay = self.Config.delay
    end
   
    if delay ~= nil and delay >= 0 then -- don't activate if delay is zero or nil
        if (tostring(GetDoorState(door)) == "Closed: 3") then
            -- come back after short delay to close door
            timer.Once( delay, function() self:DoorCloser(door) end )
        end
    end
end

function PLUGIN:DoorCloser(door)
    local basicdoor = door:GetComponent("BasicDoor")
    if basicdoor ~= nil then -- if (door.name == "MetalDoor(Clone)" or door.name == "WoodenDoor(Clone)") then
        -- close door (if open)
        self:close_door(door)
    end
end

function PLUGIN:cmdDoorCloser(netuser, cmd, args)  -- chat command to change Door Closer setting
    local steamID = rust.CommunityIDToSteamID( tonumber(rust.GetUserID(netuser)) )
   
    if #args > 0 then -- delay specified
        local delay = tonumber(args[1])
       
        if delay == nil or delay <= 0 then -- off
            self.delayTable[steamID] = 0
            rust.Notice(netuser, "Door Closer OFF.")
        else
            delay = math.min( delay, self.Config.delay_max ) -- don't exceed delay_max
            self.delayTable[steamID] = delay
            rust.Notice(netuser, "Door Closer: ".. delay .." seconds")
        end
   
    else -- no arg, toggle
        local delay = self.delayTable[steamID]
        if delay == nil and self.Config.enabled then -- use default delay if plugin is enabled by default
            print "DC: using default"
            delay = self.Config.delay
        end
   
        if delay ~= nil and delay > 0 then -- de-activate if delay is set
            self.delayTable[steamID] = 0
            rust.Notice(netuser, "Door Closer OFF")
        else
            self.delayTable[steamID] = self.Config.delay
            rust.Notice(netuser, "Door Closer ON")
        end
    end
end

function PLUGIN:SendHelpText( netuser )
    rust.SendChatToUser( netuser, "Door Closer: /doorcloser [delay]" )
end
 

Bombardir

New Member
Member
Aug 10, 2014
1
0
1
This is from the .lua from oxide.

Code:
PLUGIN.Title = "Door Closer"
PLUGIN.Description = "Automatic door closer. Players no longer need to close doors behind them."
PLUGIN.Author = "LazyMammal"
PLUGIN.Version = "0.1.1"

-- repeat timer uses global scope to allow smooth "oxide.reload doorcloser"
if DoorCloserSaveTimer then
    print "Door Closer: cancelling old timer"
    DoorCloserSaveTimer:Destroy()
end
DoorCloserSaveTimer = nil

-- Credit to "Door Remote Control" plugin for door state changer
local NullableOfVector3 = typesystem.MakeNullableOf( UnityEngine.Vector3 )
local NullableOfBoolean = typesystem.MakeNullableOf( System.Boolean )
local ToggleStateServer = util.FindOverloadedMethod( Rust.BasicDoor, "ToggleStateServer", bf.private_instance, { NullableOfVector3, System.UInt64, NullableOfBoolean } )
local GetDoorState, SetDoorState = typesystem.GetField( Rust.BasicDoor, "state", bf.private_instance )
local CurrentTime = util.GetStaticPropertyGetter( cs.gettype("NetCull, Assembly-CSharp"), "timeInMillis")
function PLUGIN:close_door(door)
    if (tostring(GetDoorState(door)) == "Opened: 1") then
        local timestamp = CurrentTime()
        local origin = new( UnityEngine.Vector3 )
        local arr = util.ArrayFromTable( System.Object, { new( NullableOfVector3, origin ), timestamp, nil }, 3 )
        cs.convertandsetonarray( arr, 1, timestamp, System.UInt64._type )
        local res= ToggleStateServer:Invoke( door, arr )
    end
end

function PLUGIN:Init()

    -- load config file
    self.cfgfile = "doorcloser"
    local b, res = config.Read(self.cfgfile)
    self.Config = res or {}
    if (not b) or (self.Config.delay == nil) then
        self:LoadDefaultConfig()
        if (res) then config.Save(self.cfgfile) end
    end

    -- load player preferences
    self.delayTable = {}
    self.prefsDataFile = util.GetDatafile( "doorcloser_data" )
    local txt = self.prefsDataFile:GetText()
    if txt ~= "" then self.delayTable = json.decode( txt ) end

    -- add chat commands
    self:AddChatCommand( "doorcloser", self.cmdDoorCloser)

    -- add timers
    print "Door Closer: initiating save timer"
    DoorCloserSaveTimer = timer.Repeat( self.Config.save_interval, function() self:SavePrefs() end )

end

function PLUGIN:LoadDefaultConfig()
    print "Door Closer: using default config"
    self.Config.delay = 5 -- default delay (seconds)
    self.Config.delay_max = 30 -- maximum delay allowed (seconds)
    self.Config.enabled = false -- is Door Closer enabled by default
    self.Config.save_interval = 310 -- user prefs save frequency (seconds)
end

function PLUGIN:SavePrefs()
    self.prefsDataFile:SetText( json.encode( self.delayTable ) )
    self.prefsDataFile:Save()
end

function PLUGIN:CanOpenDoor(netuser, door) -- called when a user opens door (or at least attempts to)
    local steamID = rust.CommunityIDToSteamID( tonumber(rust.GetUserID(netuser)) )
    local delay = self.delayTable[steamID]
    if delay == nil and self.Config.enabled then -- use default delay if plugin is enabled by default
        delay = self.Config.delay
    end

    if delay ~= nil and delay >= 0 then -- don't activate if delay is zero or nil
        if (tostring(GetDoorState(door)) == "Closed: 3") then
            -- come back after short delay to close door
            timer.Once( delay, function() self:DoorCloser(door) end )
        end
    end
end

function PLUGIN:DoorCloser(door)
    local basicdoor = door:GetComponent("BasicDoor")
    if basicdoor ~= nil then -- if (door.name == "MetalDoor(Clone)" or door.name == "WoodenDoor(Clone)") then
        -- close door (if open)
        self:close_door(door)
    end
end

function PLUGIN:cmdDoorCloser(netuser, cmd, args)  -- chat command to change Door Closer setting
    local steamID = rust.CommunityIDToSteamID( tonumber(rust.GetUserID(netuser)) )

    if #args > 0 then -- delay specified
        local delay = tonumber(args[1])
    
        if delay == nil or delay <= 0 then -- off
            self.delayTable[steamID] = 0
            rust.Notice(netuser, "Door Closer OFF.")
        else
            delay = math.min( delay, self.Config.delay_max ) -- don't exceed delay_max
            self.delayTable[steamID] = delay
            rust.Notice(netuser, "Door Closer: ".. delay .." seconds")
        end

    else -- no arg, toggle
        local delay = self.delayTable[steamID]
        if delay == nil and self.Config.enabled then -- use default delay if plugin is enabled by default
            print "DC: using default"
            delay = self.Config.delay
        end

        if delay ~= nil and delay > 0 then -- de-activate if delay is set
            self.delayTable[steamID] = 0
            rust.Notice(netuser, "Door Closer OFF")
        else
            self.delayTable[steamID] = self.Config.delay
            rust.Notice(netuser, "Door Closer ON")
        end
    end
end

function PLUGIN:SendHelpText( netuser )
    rust.SendChatToUser( netuser, "Door Closer: /doorcloser [delay]" )
end
Lol. Don't know what i'm doing here, but this is legacy example)

It's Experimental:
Code:
PLUGIN.Title        = "AutoDoorCloser"
PLUGIN.Description  = "Automaticly close the doors"
PLUGIN.Author       = "Bombardir"
PLUGIN.Version      = V(1, 3, 1)
PLUGIN.HasConfig = true
PLUGIN.ResourceId = 800

local Timers, Data, msgs, UpdateLayerMethod, settings = {}

local function SendChatMessage(player, msg)
    player:SendConsoleCommand("chat.add", (msgs.ChatPlayerIcon and rust.UserIDFromPlayer(player)) or 0, msgs.ChatFormat:format(msg))
end

function PLUGIN:Init()
    settings = self.Config.Settings or {}
    settings.DataFile = settings.DataFile or "AutoDoorCloserData"
    settings.DefaultTime = settings.DefaultTime or 3
    settings.MinTime = settings.MinTime or 1
    if settings.MinTime <= 0 then settings.MinTime = 0.1 end
    settings.MaxTime = settings.MaxTime or 10
    if settings.MaxTime < settings.MinTime then settings.MaxTime = settings.MinTime + 0.1 end
    settings.Command = settings.Command or "ad"
    self.Config.Settings = settings
    
    msgs = self.Config.Message or {}
    msgs.ChatFormat = msgs.ChatFormat or "<color=#af5>[AutoDoor]</color> %s"
    if msgs.ChatPlayerIcon == nil then msgs.ChatPlayerIcon = true end
    msgs.SuccesOn = msgs.SuccesOn or "Your doors will close automatically after %s sec."
    msgs.SuccesOff = msgs.SuccesOff or "You turn off the automatic closing doors!"
    msgs.ErrorMin = (msgs.ErrorMin or "The minimum value of time: %s"):format(settings.MinTime)
    msgs.ErrorMax = (msgs.ErrorMax or "The maximum value of time: %s"):format(settings.MaxTime)
    msgs.Syntax = (msgs.Syntax or "/%s [off/<time>]"):format(settings.Command)
    msgs.Help = (msgs.Help or "/%s [off/<time>] -- set/del time for automatic closing doors"):format(settings.Command)
    self.Config.Message = msgs
 
    Data = datafile.GetDataTable( settings.DataFile )
 
    if settings.Command ~= "" then command.AddChatCommand(settings.Command, self.Plugin, "C_AD") end
    self:SaveConfig()
 
    UpdateLayerMethod = global.BuildingBlock._type:GetMethod("UpdateLayer", rust.PrivateBindingFlag() )
end

function PLUGIN:SendHelpText(player)
    SendChatMessage(player, msgs.Help)
end

function PLUGIN:CanOpenDoor( player, lock )
    local door = lock:GetParentEntity()
    door = door and door:GetComponent("Door")
    if door and not door:IsOpen() then
        if Timers[door] then Timers[door]:Destroy() Timers[door] = nil end
        local ADtime = Data[rust.UserIDFromPlayer(player)]
        if ADtime == nil then ADtime = settings.DefaultTime end
        if ADtime then
            Timers[door] = timer.Once(ADtime, function()
                if door and door:IsOpen() then
                    door:SetFlag(global.BaseEntity.Flags.Open, false)
                    UpdateLayerMethod:Invoke(door, nil)
                    door:SendNetworkUpdateImmediate(false)
                end
                Timers[door] = nil
            end)
        end
    end
end

function PLUGIN:C_AD(player, _, args)
    if args.Length > 0 then
        local ADtime = tonumber(args[0])
        local steam = rust.UserIDFromPlayer(player)
        if ADtime then
            if ADtime >= settings.MinTime then
                if ADtime <= settings.MaxTime then
                    Data[steam] = ADtime
                    SendChatMessage(player, msgs.SuccesOn:format(ADtime))
                else
                    SendChatMessage(player, msgs.ErrorMax)
                end
            else
                SendChatMessage(player, msgs.ErrorMin)
            end
        else
            Data[steam] = false
            SendChatMessage(player, msgs.SuccesOff)
        end
        datafile.SaveDataTable( settings.DataFile )
    else
        SendChatMessage(player, msgs.Syntax)
    end
end

How to close door:
Code:
                    door:SetFlag(global.BaseEntity.Flags.Open, false)
                    UpdateLayerMethod:Invoke(door, nil)
                    door:SendNetworkUpdateImmediate(false)
 
Last edited:

DreTaX

Probably knows the answer...
Administrator
Jun 29, 2014
4,093
4,784
113
At your house.
github.com
This is from the .lua from oxide.

Code:
PLUGIN.Title = "Door Closer"
PLUGIN.Description = "Automatic door closer. Players no longer need to close doors behind them."
PLUGIN.Author = "LazyMammal"
PLUGIN.Version = "0.1.1"

-- repeat timer uses global scope to allow smooth "oxide.reload doorcloser"
if DoorCloserSaveTimer then
    print "Door Closer: cancelling old timer"
    DoorCloserSaveTimer:Destroy()
end
DoorCloserSaveTimer = nil

-- Credit to "Door Remote Control" plugin for door state changer
local NullableOfVector3 = typesystem.MakeNullableOf( UnityEngine.Vector3 )
local NullableOfBoolean = typesystem.MakeNullableOf( System.Boolean )
local ToggleStateServer = util.FindOverloadedMethod( Rust.BasicDoor, "ToggleStateServer", bf.private_instance, { NullableOfVector3, System.UInt64, NullableOfBoolean } )
local GetDoorState, SetDoorState = typesystem.GetField( Rust.BasicDoor, "state", bf.private_instance )
local CurrentTime = util.GetStaticPropertyGetter( cs.gettype("NetCull, Assembly-CSharp"), "timeInMillis")
function PLUGIN:close_door(door)
    if (tostring(GetDoorState(door)) == "Opened: 1") then
        local timestamp = CurrentTime()
        local origin = new( UnityEngine.Vector3 )
        local arr = util.ArrayFromTable( System.Object, { new( NullableOfVector3, origin ), timestamp, nil }, 3 )
        cs.convertandsetonarray( arr, 1, timestamp, System.UInt64._type )
        local res= ToggleStateServer:Invoke( door, arr )
    end
end

function PLUGIN:Init()

    -- load config file
    self.cfgfile = "doorcloser"
    local b, res = config.Read(self.cfgfile)
    self.Config = res or {}
    if (not b) or (self.Config.delay == nil) then
        self:LoadDefaultConfig()
        if (res) then config.Save(self.cfgfile) end
    end
 
    -- load player preferences
    self.delayTable = {}
    self.prefsDataFile = util.GetDatafile( "doorcloser_data" )
    local txt = self.prefsDataFile:GetText()
    if txt ~= "" then self.delayTable = json.decode( txt ) end

    -- add chat commands
    self:AddChatCommand( "doorcloser", self.cmdDoorCloser)
 
    -- add timers
    print "Door Closer: initiating save timer"
    DoorCloserSaveTimer = timer.Repeat( self.Config.save_interval, function() self:SavePrefs() end )

end

function PLUGIN:LoadDefaultConfig()
    print "Door Closer: using default config"
    self.Config.delay = 5 -- default delay (seconds)
    self.Config.delay_max = 30 -- maximum delay allowed (seconds)
    self.Config.enabled = false -- is Door Closer enabled by default
    self.Config.save_interval = 310 -- user prefs save frequency (seconds)
end

function PLUGIN:SavePrefs()
    self.prefsDataFile:SetText( json.encode( self.delayTable ) )
    self.prefsDataFile:Save()
end

function PLUGIN:CanOpenDoor(netuser, door) -- called when a user opens door (or at least attempts to)
    local steamID = rust.CommunityIDToSteamID( tonumber(rust.GetUserID(netuser)) )
    local delay = self.delayTable[steamID]
    if delay == nil and self.Config.enabled then -- use default delay if plugin is enabled by default
        delay = self.Config.delay
    end
 
    if delay ~= nil and delay >= 0 then -- don't activate if delay is zero or nil
        if (tostring(GetDoorState(door)) == "Closed: 3") then
            -- come back after short delay to close door
            timer.Once( delay, function() self:DoorCloser(door) end )
        end
    end
end

function PLUGIN:DoorCloser(door)
    local basicdoor = door:GetComponent("BasicDoor")
    if basicdoor ~= nil then -- if (door.name == "MetalDoor(Clone)" or door.name == "WoodenDoor(Clone)") then
        -- close door (if open)
        self:close_door(door)
    end
end

function PLUGIN:cmdDoorCloser(netuser, cmd, args)  -- chat command to change Door Closer setting
    local steamID = rust.CommunityIDToSteamID( tonumber(rust.GetUserID(netuser)) )
 
    if #args > 0 then -- delay specified
        local delay = tonumber(args[1])
     
        if delay == nil or delay <= 0 then -- off
            self.delayTable[steamID] = 0
            rust.Notice(netuser, "Door Closer OFF.")
        else
            delay = math.min( delay, self.Config.delay_max ) -- don't exceed delay_max
            self.delayTable[steamID] = delay
            rust.Notice(netuser, "Door Closer: ".. delay .." seconds")
        end
 
    else -- no arg, toggle
        local delay = self.delayTable[steamID]
        if delay == nil and self.Config.enabled then -- use default delay if plugin is enabled by default
            print "DC: using default"
            delay = self.Config.delay
        end
 
        if delay ~= nil and delay > 0 then -- de-activate if delay is set
            self.delayTable[steamID] = 0
            rust.Notice(netuser, "Door Closer OFF")
        else
            self.delayTable[steamID] = self.Config.delay
            rust.Notice(netuser, "Door Closer ON")
        end
    end
end

function PLUGIN:SendHelpText( netuser )
    rust.SendChatToUser( netuser, "Door Closer: /doorcloser [delay]" )
end
Can you test this?
http://pastie.org/private/0zkbbb3mkd578h4ozsbtdw

Python:
__author__ = 'DreTaX'
__version__ = '1.0'
import clr
clr.AddReferenceByPartialName("Fougerite")
import Fougerite

"""
    Class
"""

class AutoDoorCloser:

    def On_DoorUse(self, Player, DoorUseEvent):
        if not DoorUseEvent.Open:
            self.addJob(2, DoorUseEvent)

    """
        Timer Functions
    """

    def addJob(self, xtime, Event):
        List = Plugin.CreateDict()
        List["Event"] = Event
        Plugin.CreateParallelTimer("AutoCloser", xtime * 1000, List).Start()

    def AutoCloserCallback(self, timer):
        timer.Kill()
        List = timer.Args
        Event = List["Event"]
        Event.Open = False
 
Last edited:

DreTaX

Probably knows the answer...
Administrator
Jun 29, 2014
4,093
4,784
113
At your house.
github.com
Python:
__author__ = 'DreTaX'
__version__ = '1.0'
import clr
clr.AddReferenceByPartialName("Fougerite")
import Fougerite

"""
    Class
"""

class AutoDoorCloser:

    def On_DoorUse(self, Player, DoorUseEvent):
        #if not DoorUseEvent.Open:
        self.addJob(2, DoorUseEvent)

    """
        Timer Functions
    """

    def addJob(self, xtime, Event):
        List = Plugin.CreateDict()
        List["Event"] = Event
        Plugin.CreateParallelTimer("AutoCloser", xtime * 1000, List).Start()

    def AutoCloserCallback(self, timer):
        timer.Kill()
        List = timer.Args
        Event = List["Event"]
        Event.Open = False
Test that too
 

maughanorama

Member
Member
Nov 27, 2014
181
10
18
50
sorry still autodoor.py could noot be loaded ... :( from a Fougerite.reload.

when i do a python autodoor.py from outside the game in a terminal get
Traceback (most recent call last):
File "autodoor.py", line 3, in <module>
import clr
ImportError: No module named clr
 
Last edited:

Jakkee

Retired Staff
Retired Staff
Plugin Developer
Jul 28, 2014
1,465
932
113
Australia
Load fine for me, I added Util.Log() to find where the code stops.
It doesn't...
Finds the timer and does all the code in there but the door doesn't close.
Not sure if this is a bug or just me but Util.Log() doesn't show in Console if its used in a timer, But it still shows in logs.

Python:
__title__ = 'AutoDoorCloser'
__author__ = 'DreTaX'
__version__ = '1.0'

import clr
clr.AddReferenceByPartialName("Fougerite")
import Fougerite

"""
    Class
"""

class AutoDoorCloser:

    def On_DoorUse(self, Player, DoorUseEvent):
        Util.Log("DoorEvent started...")
        #if not DoorUseEvent.Open:
        self.addJob(DoorUseEvent)
        Util.Log("Waiting for callback...")

    """
        Timer Functions
    """

    def addJob(self, Event):
        Util.Log("Starting job")
        List = Plugin.CreateDict()
        List["Event"] = Event
        Util.Log("Dict created")
        Plugin.CreateParallelTimer("AutoCloser", 2000, List).Start()
        Util.Log("Timer started")

    def AutoCloserCallback(self, timer):
        Util.Log("Found timer")
        timer.Kill()
        Util.Log("Timer killed")
        List = timer.Args
        Event = List["Event"]
        Util.Log("Got event, Attempting to close")
        Event.Open = False
        Util.Log("Closed, Task complete.")
What it looks like in the logs:
Code:
[3/17/2015 12:12:41 PM] [Console] DoorEvent started...
[3/17/2015 12:12:41 PM] [Console] Starting job
[3/17/2015 12:12:41 PM] [Console] Dict created
[3/17/2015 12:12:41 PM] [Console] Timer started
[3/17/2015 12:12:41 PM] [Console] Waiting for callback...
[3/17/2015 12:12:43 PM] [Console] Found timer
[3/17/2015 12:12:43 PM] [Console] Timer killed
[3/17/2015 12:12:43 PM] [Console] Got event, Attempting to close
[3/17/2015 12:12:43 PM] [Console] Closed, Task complete.
What it looks like in console:
 
Last edited: