C#:
/*
TODO:
- Add separate command and option for gates/garages?
*/
using System;
using System.Collections.Generic;
using Oxide.Core;
using Oxide.Core.Configuration;
using Oxide.Core.Libraries.Covalence;
namespace Oxide.Plugins
{
[Info("AutoDoors", "", "3.1.2", ResourceId = 1924)]
[Description("Automatically closes doors behind players after X seconds")]
class AutoDoors : CovalencePlugin
{
// Do NOT edit this file, instead edit AutoDoors.json in oxide/config and AutoDoors.en.json in oxide/lang,
// or create a language file for another language using the 'en' file as a default.#region Initialization
readonly DynamicConfigFile dataFile = Interface.Oxide.DataFileSystem.GetFile("AutoDoors");
Dictionary<string, int> playerPrefs = new Dictionary<string, int>();
const string permAuto = "autodoors.allowed";
void Init()
{
LoadDefaultConfig();
LoadDefaultMessages();
permission.RegisterPermission(permAuto, this);
playerPrefs = dataFile.ReadObject<Dictionary<string, int>>();
}
#endregion
#region Configuration
bool cancelOnKill;
int defaultDelay;
int maximumDelay;
int minimumDelay;
bool usePermissions;
protected override void LoadDefaultConfig()
{
//Config["AllowGates"] = allowGates = GetConfig("AllowGates", true);
//Config["AllowGarages"] = allowGarages = GetConfig("AllowGarages", true);
Config["CancelOnKill"] = cancelOnKill = GetConfig("CancelOnKill", false);
Config["DefaultDelay"] = defaultDelay = GetConfig("DefaultDelay", 5);
Config["MaximumDelay"] = maximumDelay = GetConfig("MaximumDelay", 30);
Config["MinimumDelay"] = minimumDelay = GetConfig("MinimumDelay", 5);
Config["UsePermissions"] = usePermissions = GetConfig("UsePermissions", false);
SaveConfig();
}
#endregion
#region Localization
void LoadDefaultMessages()
{
lang.RegisterMessages(new Dictionary<string, string> {
["DelayDisabled"] = "Automatic door closing is now disabled",
["DelaySet"] = "Automatic door closing delay set to {0}s",
["NotAllowed"] = "You are not allowed to use the '{0}' command",
["Usage"] = "/{0} to disable automatic doors\n /{0} # (a number between 5 and 30)"
}, this);
}
#endregion
#region Command
[Command("ad", "autodoor", "autodoors")]
void ChatCommand(IPlayer player, string command, string[] args)
{
if (usePermissions && !IsAllowed(player.Id, permAuto))
{
player.Reply(Lang("NotAllowed", player.Id, command));
return;
}
int time;
if (args == null || args.Length != 1 || !int.TryParse(args[0], out time)) time = 0;
if (time > maximumDelay || time < minimumDelay && time != 0)
{
player.Reply(Lang("Usage", player.Id, command));
return;
}
playerPrefs[player.Id] = time;
dataFile.WriteObject(playerPrefs);
player.Reply(time == 0 ? Lang("DelayDisabled", player.Id, time) : Lang("DelaySet", player.Id, time));
}
#endregion
#region Door Closing
#if HURTWORLD
void OnSingleDoorUsed(DoorSingleServer door, PlayerSession session)
{
if (door == null || !door.IsOpen) return;
if (usePermissions && !IsAllowed(session.SteamId.ToString(), permAuto)) return;
int time;
if (!playerPrefs.TryGetValue(session.SteamId.ToString(), out time)) time = defaultDelay;
if (time == 0) return;
timer.Once(time, () =>
{
if (!door || !door.IsOpen) return;
if (cancelOnKill && session.WorldPlayerEntity.GetComponent<PlayerStatManager>().Dead) return;
door.DoorCollider.enabled = true;
door.RPC("DOP", uLink.RPCMode.OthersBuffered, false);
door.IsOpen = false;
});
}
void OnDoubleDoorUsed(DoubleDoorServer door, PlayerSession session)
{
if (door == null || !door.IsOpen) return;
if (usePermissions && !IsAllowed(session.SteamId.ToString(), permAuto)) return;
int time;
if (!playerPrefs.TryGetValue(session.SteamId.ToString(), out time)) time = defaultDelay;
if (time == 0) return;
timer.Once(time, () =>
{
if (!door || !door.IsOpen) return;
if (cancelOnKill && session.WorldPlayerEntity.GetComponent<PlayerStatManager>().Dead) return;
door.DoorCollider.enabled = true;
door.RPC("DOP", uLink.RPCMode.OthersBuffered, false);
door.IsOpen = false;
});
}
void OnGarageDoorUsed(GarageDoorServer door, PlayerSession session)
{
if (door == null || !door.IsOpen) return;
if (usePermissions && !IsAllowed(session.SteamId.ToString(), permAuto)) return;
int time;
if (!playerPrefs.TryGetValue(session.SteamId.ToString(), out time)) time = defaultDelay;
if (time == 0) return;
timer.Once(time, () =>
{
if (!door || !door.IsOpen) return;
if (cancelOnKill && session.WorldPlayerEntity.GetComponent<PlayerStatManager>().Dead) return;
door.DoorCollider.enabled = true;
door.RPC("DOP", uLink.RPCMode.OthersBuffered, false);
door.IsOpen = false;
});
}
#endif
#if RUST
void OnDoorOpened(Door door, BasePlayer player)
{
if (door == null || !door.IsOpen() || door.OwnerID == 0 || door.LookupPrefab().name.Contains("shutter")) return;
if (usePermissions && !IsAllowed(player.UserIDString, permAuto)) return;
int time;
if (!playerPrefs.TryGetValue(player.UserIDString, out time)) time = defaultDelay;
if (time == 0) return;
timer.Once(time, () =>
{
if (!door || !door.IsOpen()) return;
if (cancelOnKill && player.IsDead()) return;
door.SetFlag(BaseEntity.Flags.Open, false);
door.SendNetworkUpdateImmediate();
});
}
#endif
#endregion
#region Helpers
T GetConfig<T>(string name, T defaultValue) => Config[name] == null ? defaultValue : (T) Convert.ChangeType(Config[name], typeof (T));
string Lang(string key, string id = null, params object[] args) => string.Format(lang.GetMessage(key, this, id), args);
bool IsAllowed(string id, string perm) => permission.UserHasPermission(id, perm);
#endregion
}
}