forked from PenisBlistashiq/Rust-plugins-236-240-dev
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAutoDoorCloser.cs
More file actions
180 lines (159 loc) · 8.21 KB
/
Copy pathAutoDoorCloser.cs
File metadata and controls
180 lines (159 loc) · 8.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
using System;
using Oxide.Core;
using System.Linq;
using UnityEngine;
using System.Text;
using System.Reflection;
using Oxide.Core.Plugins;
using Oxide.Core.Libraries;
using Oxide.Core.Configuration;
using System.Collections.Generic;
using Oxide.Core.Libraries.Covalence;
namespace Oxide.Plugins
{
[Info("AutoDoorCloser", "Ryamkk", "1.0.5", ResourceId = 1924)]
// Слив плагинов server-rust by Apolo YouGame
[Description("Переработка плагина AutoDoor с oxide. Почти схожая версия плагина с Moscow.ovh :)")]
/*
* Это моя первая пробная работа (доделка плагина) не судите строго :)
*
* Планы на следующие обновления:
* Добавить конфигурацию. ✔
* Добавить блокировку автоматического закрытия дверей при реидблоке. ✔
* Добавить блокировку автоматического закрытия дверей при смерти.
* Добавить отдельный параметр закрытия ворот и ставень.
*
*/
class AutoDoorCloser : RustPlugin
{
[PluginReference]
Plugin NoEscape;
#region Variables
readonly DynamicConfigFile dataFile = Interface.Oxide.DataFileSystem.GetFile("AutoDoorCloser");
List<string> playerPrefs = new List<string>();
bool CancelOnKill = false;
#endregion
#region Variables Configuration
private string Permission; // Названия привилегии для использования команды.
private bool PermissionSupport; // Разрешить использования функционала плагина только тем игрокам у которых есть привилегия.
private int DelayDoor; // Задержка перед автоматическим закрытием дверей (в секундах).
private bool UseRaidBlocker; //Разрешить/Запретить использования автоматического закрытия дверей при РеидБлоке.
#endregion
#region Configuration
protected override void LoadDefaultConfig()
{
GetVariable(Config, "A. Задержка перед автоматическим закрытием дверей (в секундах).", out DelayDoor, 10);
GetVariable(Config, "B. (Разрешить/Запретить) использования автоматического закрытия дверей при РеидБлоке.", out UseRaidBlocker, false);
GetVariable(Config, "C. (Разрешить/Запретить) использования функционала плагина только тем игрокам у которых есть привилегия.", out PermissionSupport, false);
GetVariable(Config, "D. Названия привилегии для использования команды.", out Permission, "autodoorcloser.access");
SaveConfig();
}
#endregion
#region OxideCore
void OnDoorOpened(Door door, BasePlayer player)
{
if (door == null || !door.IsOpen() || door.OwnerID == 0 || door.LookupPrefab().name.Contains("shutter")) return;
if (PermissionSupport && !IsAllowed(player.UserIDString, Permission)) return;
if (IsRaidBlocked(player.UserIDString))
{
SendReply(player, GetMessage("RAID.BLOCKED", player));
return;
}
if (playerPrefs.Contains(player.UserIDString)) return;
timer.Once(DelayDoor, () =>
{
if (!door || !door.IsOpen()) return;
if (CancelOnKill && player.IsDead()) return;
door.SetFlag(BaseEntity.Flags.Open, false);
door.SendNetworkUpdateImmediate();
});
}
#endregion
#region Oxide
void OnServerInitialized() => LoadDefaultConfig();
void Init()
{
LoadDefaultMessages();
permission.RegisterPermission(Permission, this);
playerPrefs = dataFile.ReadObject<List<string>>();
}
bool IsRaidBlocked(string targetId) => UseRaidBlocker && (bool)(NoEscape?.Call("IsRaidBlockedS", targetId) ?? false);
#endregion
#region ChatCommand
[ChatCommand("ad")]
void AutoDoorCommand(BasePlayer player, string command, string[] args)
{
if(PermissionSupport)
{
if (!IsAllowed(player.UserIDString, Permission))
{
SendReply(player, GetMessage("NO.ACCESS", player, command));
return;
}
}
if (IsRaidBlocked(player.UserIDString))
{
SendReply(player, GetMessage("RAID.BLOCKED", player));
return;
}
if (args.Length == 0)
{
SendReply(player, GetMessage("CMD.AD.HELP", player, playerPrefs.Contains(player.UserIDString) ? "<color=#ff0000>Выключен</color>" : "<color=#00ff00>Включено</color>"));
return;
}
if (args.Length == 1)
{
switch (args[0])
{
case "on":
if (!playerPrefs.Contains(player.UserIDString))
{
SendReply(player, GetMessage("ALREADY.ON", player));
return;
}
playerPrefs.Remove(player.UserIDString);
SendReply(player, GetMessage("AUTO.CLOSE.ON", player));
break;
case "off":
if (playerPrefs.Contains(player.UserIDString))
{
SendReply(player, GetMessage("ALREADY.OFF", player));
return;
}
playerPrefs.Add(player.UserIDString);
SendReply(player, GetMessage("AUTO.CLOSE.OFF", player));
break;
}
dataFile.WriteObject(playerPrefs);
}
}
#endregion
#region Localization
void LoadDefaultMessages()
{
lang.RegisterMessages(new Dictionary<string, string>
{
["NO.ACCESS"] = "У вас нет доступа к этой команде.",
["RAID.BLOCKED"] = "Активирован РеидБлок автоматическое закрытия дверей недоступно!",
["ALREADY.ON"] = "Автоматическое закрытие дверей уже включено.",
["AUTO.CLOSE.ON"] = "Вы включили автоматическое закрытие дверей.",
["ALREADY.OFF"] = "Автоматическое закрытия дверей уже выключено.",
["AUTO.CLOSE.OFF"] = "Вы выключили автоматическое закрытие дверей.",
["CMD.AD.HELP"] = "<size=17>Текущее состояние: {0}</size>\n" +
"ДОСТУПНЫЕ КОМАНДЫ:\n" +
"/ad on - Включить автоматическое закрытие дверей.\n" +
"/ad off - Выключить автоматическое закрытие дверей.",
}, this);
}
#endregion
#region Helpers
string GetMessage(string key, BasePlayer player, params string[] args) => String.Format(lang.GetMessage(key, this, player.UserIDString), args);
bool IsAllowed(string id, string perm) => permission.UserHasPermission(id, perm);
T GetConfig<T>(string name, T defaultValue) => Config[name] == null ? defaultValue : (T)Convert.ChangeType(Config[name], typeof(T));
public static void GetVariable<T>(DynamicConfigFile config, string name, out T value, T defaultValue)
{
config[name] = value = config[name] == null ? defaultValue : (T)Convert.ChangeType(config[name], typeof(T));
}
#endregion
}
}