Yeah, that's where I stuck. Is there any oxide alternativies for ths? I think i missed to update a door.
Yeah, that's where I stuck. Is there any oxide alternativies for ths? I think i missed to update a door.
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)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
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
door:SetFlag(global.BaseEntity.Flags.Open, false)
UpdateLayerMethod:Invoke(door, nil)
door:SendNetworkUpdateImmediate(false)
Can you test this?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
__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
__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
__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.")
[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.