C#:
using Facepunch;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Rust;
using System;
using System.Collections.Generic;
using System.ComponentModel;
namespace Oxide.Plugins
{
[Info("Wipe Timer Enhanced", "ZTL/FastBurst", "1.5.6")]
[Description("Allows players to check when the next wipe is")]
class WipeTimerEnhanced : RustPlugin
{
#region Configuration
private static WipeTimerEnhanced Instance;
private new void LoadDefaultMessages()
{
//English
lang.RegisterMessages(new Dictionary<string, string>
{
["CommandWipe"] = "Time until next wipe: {0}"
}, this);
}
#endregion
void Init()
{
Instance = this;
//try
//{
// LoadVariables();
//}
//catch
//{
// PrintWarning("Could not read config, creating new default config");
// LoadDefaultConfig();
//}
}
private void OnNewSave(string filename) => SaveWipeData();
private void SaveWipeData()
{
var date = DateTime.Now;
date = date.AddDays(configData.Settings.AutoWipeIntervalDays); // Adds 7 days to the date
configData.Settings.year = date.Year;
configData.Settings.month = date.Month;
configData.Settings.day = date.Day;
PrintWarning("Server was just wiped, updating Wipe Schedule");
Config.WriteObject(configData, true);
SaveConfig();
}
[ChatCommand("wipe")]
void cmdWipe(BasePlayer player, string command, string[] args)
{
DateTime date1 = new DateTime(configData.Settings.year, configData.Settings.month, configData.Settings.day, configData.Settings.hour, configData.Settings.min, configData.Settings.sec);
System.TimeSpan diff1 = date1.Subtract(DateTime.Now);
string time = string.Format("{0}d:{1}h:{2}m", diff1.Days, diff1.Hours, diff1.Minutes);
SendReply(player, "<color=#aaff55>" + Lang("CommandWipe", player.UserIDString, time) + "</color>");
}
[ChatCommand("wipesave")]
void cmdWipeSave(BasePlayer player, string command, string[] args)
{
DateTime date1 = new DateTime(configData.Settings.year, configData.Settings.month, configData.Settings.day, configData.Settings.hour, configData.Settings.min, configData.Settings.sec);
System.TimeSpan diff1 = date1.Subtract(DateTime.Now);
string time = string.Format("{0}d:{1}h:{2}m", diff1.Days, diff1.Hours, diff1.Minutes);
SendReply(player, "<color=#aaff55>" + Lang("CommandWipe", player.UserIDString, time) + "</color>");
SaveWipeData();
}
object OnPlayerChat(BasePlayer player, string message)
{
DateTime date1 = new DateTime(configData.Settings.year, configData.Settings.month, configData.Settings.day, configData.Settings.hour, configData.Settings.min, configData.Settings.sec);
System.TimeSpan diff1 = date1.Subtract(DateTime.Now);
string time = string.Format("{0}d:{1}h:{2}m", diff1.Days, diff1.Hours, diff1.Minutes);
if (message.Contains("wipe") && configData.Settings.AutoRespond)
{
SendReply(player, "<color=#aaff55>" + Lang("CommandWipe", player.UserIDString, time + "</color>"));
}
return null;
}
void OnPlayerConnected(BasePlayer player)
{
DateTime date1 = new DateTime(configData.Settings.year, configData.Settings.month, configData.Settings.day, configData.Settings.hour, configData.Settings.min, configData.Settings.sec);
System.TimeSpan diff1 = date1.Subtract(DateTime.Now);
string time = string.Format("{0}d:{1}h:{2}m", diff1.Days, diff1.Hours, diff1.Minutes);
if (configData.Settings.AnnouceOnConnect)
{
SendReply(player, "<color=#aaff55>" + Lang("CommandWipe", player.UserIDString, time + "</color>"));
}
}
T GetConfig<T>(string name, T value) => Config[name] == null ? value : (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);
#region Config
private ConfigData configData;
class ConfigData
{
[JsonProperty(PropertyName = "Wipe Timer Settings")]
public Options Settings { get; set; }
public class Options
{
[JsonProperty(PropertyName = "AutoRespond to Chat")]
public bool AutoRespond { get; set; }
[JsonProperty(PropertyName = "Broadcast to players on join")]
public bool AnnouceOnConnect { get; set; }
[JsonProperty(PropertyName = "Wipe cycle days length (default 7 for weekly wipes)")]
public int AutoWipeIntervalDays { get; set; }
[JsonProperty(PropertyName = "Current year")]
public int year { get; set; }
[JsonProperty(PropertyName = "Month of the year")]
public int month { get; set; }
[JsonProperty(PropertyName = "Day of the month")]
public int day { get; set; }
[JsonProperty(PropertyName = "Hour of the day")]
public int hour { get; set; }
[JsonProperty(PropertyName = "Minutes of the hour")]
public int min { get; set; }
[JsonProperty(PropertyName = "Seconds of the minutes")]
public int sec { get; set; }
}
public Oxide.Core.VersionNumber Version { get; set; }
}
protected override void LoadConfig()
{
base.LoadConfig();
configData = Config.ReadObject<ConfigData>();
if (configData.Version < Version)
UpdateConfigValues();
Config.WriteObject(configData, true);
}
protected override void LoadDefaultConfig() => configData = GetBaseConfig();
private ConfigData GetBaseConfig()
{
return new ConfigData
{
Settings = new ConfigData.Options
{
AnnouceOnConnect = true,
AutoRespond = true,
AutoWipeIntervalDays = 7,
day = 2,
hour = 15,
min = 0,
month = 7,
sec = 0,
year = 2026
},
Version = Version
};
}
protected override void SaveConfig() => Config.WriteObject(configData, true);
private void UpdateConfigValues()
{
PrintWarning("Config update detected! Updating config values...");
ConfigData baseConfig = GetBaseConfig();
if (configData.Version < new Core.VersionNumber(1, 5, 1))
configData = baseConfig;
configData.Version = Version;
PrintWarning("Config update completed!");
}
#endregion
}
}