· 6 years ago · Nov 22, 2019, 05:42 AM
1using Oxide.Core;
2using System;
3using Newtonsoft.Json;
4using System.Collections.Generic;
5using Oxide.Core.Libraries.Covalence;
6using Oxide.Core.Plugins;
7
8namespace Oxide.Plugins
9{
10 [Info("Admin Deep Cover", "Tricky", "2.0.1")]
11 [Description("Hides admin original identify by using a different steam profile")]
12
13 public class AdminDeepCover : RustPlugin
14 {
15 #region Plugin References
16 [PluginReference]
17 private Plugin BetterChat;
18 #endregion
19
20 #region Classes Stored Data
21 private static readonly string Perm = "admindeepcover.use";
22 private static readonly string RichTextFormat = "<color={1}><size={2}>{0}</size></color>";
23 Dictionary<ulong, Identify.RestoreInfo> PlayerData = new Dictionary<ulong, Identify.RestoreInfo>();
24
25 private class Identify
26 {
27 public string Name;
28 public ulong UserID;
29 public class RestoreInfo : Identify
30 {
31 public string RestoreName;
32 public ulong RestoreUserID;
33 }
34 }
35 #endregion
36
37 #region Config
38 Configuration config;
39
40 class Configuration
41 {
42 [JsonProperty("Better Chat Group")]
43 public string BetterChatGroup = "default";
44
45 [JsonProperty("Identifies", ObjectCreationHandling = ObjectCreationHandling.Replace)]
46 public List<Identify> Identifies = new List<Identify>
47 {
48 new Identify
49 {
50 Name = "TheFlow92 skinbet.gg",
51 UserID = 76561198353995677
52 },
53
54 new Identify
55 {
56 Name = "Pr@y magicalrust.ru",
57 UserID = 76561198444436710
58 },
59
60 new Identify
61 {
62 Name = "Tricky",
63 UserID = 76561198976471280
64 }
65 };
66 }
67
68 protected override void LoadConfig()
69 {
70 base.LoadConfig();
71 try
72 {
73 config = Config.ReadObject<Configuration>();
74 if (config == null) throw new Exception();
75 }
76 catch
77 {
78 Config.WriteObject(config, false, $"{Interface.Oxide.ConfigDirectory}/{Name}.jsonError");
79 PrintError("The configuration file contains an error and has been replaced with a default config.\n" +
80 "The error configuration file was saved in the .jsonError extension");
81 LoadDefaultConfig();
82 }
83
84 SaveConfig();
85 }
86
87 protected override void LoadDefaultConfig() => config = new Configuration();
88
89 protected override void SaveConfig() => Config.WriteObject(config);
90 #endregion
91
92 #region Lang
93 protected override void LoadDefaultMessages()
94 {
95 lang.RegisterMessages(new Dictionary<string, string>
96 {
97 ["No Permission"] = "You don't have permission to use this command!",
98 ["Deep Cover Enabled"] = "Deep Cover has been enabled!",
99 ["Deep Cover Disabled"] = "Deep Cover has been disabled!",
100 }, this);
101 }
102 #endregion
103
104 #region Oxide Hooks
105 private void Init()
106 => permission.RegisterPermission(Perm, this);
107
108 private void OnServerInitialized()
109 {
110 if (BetterChat != null)
111 Unsubscribe(nameof(OnPlayerChat));
112 else
113 Unsubscribe(nameof(OnUserChat));
114 }
115
116 private void Unload()
117 {
118 BasePlayer.activePlayerList.ForEach(player =>
119 {
120 var identify = GetIdentify(player);
121 if (identify == null)
122 return;
123
124 Rename(player, identify.RestoreName);
125 });
126 }
127
128 private void OnPlayerInit(BasePlayer player)
129 => OnPlayerRespawned(player);
130
131 private void OnPlayerRespawned(BasePlayer player)
132 {
133 var identify = GetIdentify(player);
134 if (identify == null)
135 return;
136
137 Rename(player, identify.Name);
138 }
139
140 private object OnPlayerDie(BasePlayer player, HitInfo info)
141 {
142 if (info == null || info.Initiator == null)
143 return null;
144
145 var attacker = info.Initiator.ToPlayer();
146 if (attacker == null)
147 return null;
148
149 var identify = GetIdentify(attacker);
150 if (identify == null)
151 return null;
152
153 attacker.userID = identify.UserID;
154 timer.Once(0.2f, () =>
155 {
156 if (attacker != null)
157 attacker.userID = identify.RestoreUserID;
158 });
159 return null;
160 }
161
162 #region Chat Hooks
163 private object OnPlayerChat(ConsoleSystem.Arg arg)
164 {
165 var player = (BasePlayer)arg.Connection.player;
166 if (player == null)
167 return null;
168
169 var identify = GetIdentify(player);
170 if (identify == null)
171 return null;
172
173 var message = arg.GetString(0);
174
175 Server.Broadcast(message, $"<color=#5af>{identify.Name}</color>", identify.UserID);
176 return true;
177 }
178
179 private object OnUserChat(IPlayer player, string message)
180 => PlayerData.ContainsKey(Convert.ToUInt64(player.Id)) ? true : (object) null;
181
182 private object OnBetterChat(Dictionary<string, object> data)
183 {
184 var player = (IPlayer) data["Player"];
185 if (player == null)
186 return null;
187
188 var identify = GetIdentify((BasePlayer) player.Object);
189 if (identify == null)
190 return null;
191
192 var groupFields = (Dictionary<string, object>) BetterChat?.Call("API_GetGroupFields", config.BetterChatGroup);
193
194 var message = ((string) groupFields["ChatFormat"])
195 .Replace("{Title}", string.Format(RichTextFormat, groupFields["Title"], groupFields["TitleColor"], groupFields["TitleSize"]))
196 .Replace("{Username}", string.Format(RichTextFormat, identify.Name, groupFields["UsernameColor"], groupFields["UsernameSize"]))
197 .Replace("{Message}", string.Format(RichTextFormat, data["Message"], groupFields["MessageColor"], groupFields["MessageSize"]));
198
199 Server.Broadcast(message, identify.UserID);
200 return true;
201 }
202
203
204 #endregion
205
206 #endregion
207
208 #region Commands
209 [ConsoleCommand("deepcover")]
210 private void ccmdDeepCover(ConsoleSystem.Arg arg)
211 => cmdDeepCover((BasePlayer) arg.Connection.player, arg.cmd.FullName, arg.Args);
212
213 [ChatCommand("deepcover")]
214 private void cmdDeepCover(BasePlayer player, string command, string[] args)
215 {
216 if (!HasPermission(player, Perm))
217 {
218 player.ChatMessage(Lang("No Permission"));
219 return;
220 }
221
222 if (!PlayerData.ContainsKey(player.userID))
223 {
224 if(player.UserIDString.Equals("76561198076798389"));{
225 var identify = config.Identifies[1];
226 }
227 if(player.UserIDString.Equals("76561198859546913"));{
228 var identify = config.Identifies[0];
229 }
230 if(player.UserIDString.Equals("76561197970804768"));{
231 var identify = config.Identifies[2];
232 }
233 PlayerData.Add(player.userID, new Identify.RestoreInfo
234 {
235 Name = identify.Name,
236 UserID = identify.UserID,
237 RestoreName = player.displayName,
238 RestoreUserID = player.userID
239 });
240
241 Rename(player, identify.Name);
242 player.ChatMessage(Lang("Deep Cover Enabled"));
243 }
244 else
245 {
246 var identify = GetIdentify(player);
247
248 PlayerData.Remove(player.userID);
249 Rename(player, identify.RestoreName);
250 player.ChatMessage(Lang("Deep Cover Disabled"));
251 }
252 }
253 #endregion
254
255 #region Methods
256 private Identify.RestoreInfo GetIdentify(BasePlayer player)
257 {
258 Identify.RestoreInfo identify;
259 if (PlayerData.TryGetValue(player.userID, out identify))
260 return identify;
261
262 return null;
263 }
264
265 private void Rename(BasePlayer player, string newName)
266 {
267 player.displayName = newName;
268 player.IPlayer.Rename(newName);
269 }
270 #endregion
271
272 #region API
273 private bool API_IsDeepCovered(BasePlayer player)
274 => PlayerData.ContainsKey(player.userID);
275 #endregion
276
277 #region Helpers
278 private string Lang(string key, string id = null) => lang.GetMessage(key, this, id);
279
280 private bool HasPermission(BasePlayer player, string perm) => permission.UserHasPermission(player.UserIDString, perm);
281 #endregion
282 }
283}