RustServer/plugins/WipeKits.cs

198 lines
6.8 KiB
C#

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("Wipe Kits", "Ryan", "1.2.51")]
[Description("Puts a configurable cooldown on each kit depending on their kitname.")]
public class WipeKits : RustPlugin
{
#region Declaration
private static ConfigFile _cFile;
private DateTime _cachedWipeTime;
private const string Perm = "wipekits.bypass";
#endregion
#region Config
private class ConfigFile
{
[JsonProperty(PropertyName = "Kit Names & Cooldowns - Cooldowns (minutes)")]
public Dictionary<string, float> Kits;
[JsonProperty(PropertyName = "Use GUI Kits (true/false)")]
public bool UseGui { get; set; }
public static ConfigFile DefaultConfig()
{
return new ConfigFile
{
Kits = new Dictionary<string, float>()
{
["kitname1"] = 5,
["kitname2"] = 5
},
UseGui = false
};
}
}
protected override void LoadDefaultConfig()
{
PrintWarning("Loading default configuration file...");
_cFile = ConfigFile.DefaultConfig();
}
protected override void LoadConfig()
{
base.LoadConfig();
try
{
_cFile = Config.ReadObject<ConfigFile>();
if (_cFile == null)
{
Regenerate();
}
}
catch { Regenerate(); }
}
protected override void SaveConfig() => Config.WriteObject(_cFile);
private void Regenerate()
{
PrintWarning($"Configuration file at 'oxide/config/{Name}.json' seems to be corrupt, regenerating...");
LoadDefaultConfig();
}
#endregion Config
#region Lang
protected override void LoadDefaultMessages()
{
lang.RegisterMessages(new Dictionary<string, string>
{
// Time formatting
["DayFormat"] = "<color=orange>{0}</color> day and <color=orange>{1}</color> hours",
["DaysFormat"] = "<color=orange>{0}</color> days and <color=orange>{1}</color> hours",
["HourFormat"] = "<color=orange>{0}</color> hour and <color=orange>{1}</color> minutes",
["HoursFormat"] = "<color=orange>{0}</color> hours and <color=orange>{1}</color> minutes",
["MinFormat"] = "<color=orange>{0}</color> minute and <color=orange>{1}</color> seconds",
["MinsFormat"] = "<color=orange>{0}</color> minutes and <color=orange>{1}</color> seconds",
["SecsFormat"] = "<color=orange>{0}</color> seconds",
// Can't use command
["CantUse"] = "The server's just wiped! Try again in {0}",
}, this);
}
#endregion Lang
#region Methods
private string Lang(string key, string id = null, params object[] args) => string.Format(lang.GetMessage(key, this, id), args);
private string GetFormattedTime(double time)
{
var timeSpan = TimeSpan.FromSeconds(time);
if (timeSpan.TotalSeconds < 1)
{
return null;
}
if (Math.Floor(timeSpan.TotalDays) >= 1)
{
return string.Format(timeSpan.Days > 1 ? Lang("DaysFormat", null, timeSpan.Days, timeSpan.Hours) : Lang("DayFormat", null, timeSpan.Days, timeSpan.Hours));
}
if (Math.Floor(timeSpan.TotalMinutes) >= 60)
{
return string.Format(timeSpan.Hours > 1 ? Lang("HoursFormat", null, timeSpan.Hours, timeSpan.Minutes) : Lang("HourFormat", null, timeSpan.Hours, timeSpan.Minutes));
}
if (Math.Floor(timeSpan.TotalSeconds) >= 60)
{
return string.Format(timeSpan.Minutes > 1 ? Lang("MinsFormat", null, timeSpan.Minutes, timeSpan.Seconds) : Lang("MinFormat", null, timeSpan.Minutes, timeSpan.Seconds));
}
return Lang("SecsFormat", null, timeSpan.Seconds);
}
private TimeSpan GetNextKitTime(float cooldown)
{
var timeSince = TimeSpan.FromSeconds((DateTime.UtcNow.ToLocalTime() - _cachedWipeTime).TotalSeconds);
if (timeSince.TotalSeconds > cooldown * 60)
{
return TimeSpan.Zero;
}
double timeUntil = cooldown * 60 - Math.Round(timeSince.TotalSeconds);
return TimeSpan.FromSeconds(timeUntil);
}
#endregion
#region Hooks
private void OnServerInitialized()
{
if(!_cFile.UseGui)
{
Unsubscribe(nameof(OnServerCommand));
}
_cachedWipeTime = SaveRestore.SaveCreatedTime.ToLocalTime();
}
private object OnServerCommand(ConsoleSystem.Arg arg)
{
var player = arg?.Player();
if (player == null || arg.cmd == null)
{
return null;
}
if (arg.cmd.FullName.ToLower().StartsWith("kit.gui") && _cFile.Kits.ContainsKey(arg.GetString(0).ToLower()))
{
float kitCooldown = _cFile.Kits[arg.GetString(0).ToLower()];
if (GetNextKitTime(kitCooldown) != TimeSpan.Zero)
{
player.SendConsoleCommand("kit.close");
PrintToChat(player, Lang("CantUse", player.UserIDString, GetFormattedTime(GetNextKitTime(kitCooldown).TotalSeconds)));
return true;
}
}
return null;
}
private object OnPlayerCommand(BasePlayer player, string command, string[] args)
{
if (command.ToLower() == "kit")
{
float kitCooldown;
if (!args.Any() || !_cFile.Kits.TryGetValue(args[0].Replace("\"", ""), out kitCooldown))
{
return null;
}
if (GetNextKitTime(kitCooldown) == TimeSpan.Zero)
{
return null;
}
PrintToChat(player, Lang("CantUse", player.UserIDString, GetFormattedTime(GetNextKitTime(kitCooldown).TotalSeconds)));
return true;
}
return null;
}
#endregion
}
}