SickGaming Rust Server Plugsins
This commit is contained in:
355
plugins/TimeOfDay.cs
Normal file
355
plugins/TimeOfDay.cs
Normal file
@@ -0,0 +1,355 @@
|
||||
using Oxide.Core.Plugins;
|
||||
using Oxide.Core;
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Oxide.Plugins
|
||||
{
|
||||
[Info("TimeOfDay", "FuJiCuRa", "2.3.4")]
|
||||
[Description("Does alter day and night duration.")]
|
||||
public class TimeOfDay : RustPlugin
|
||||
{
|
||||
bool Changed;
|
||||
bool Initialized;
|
||||
int componentSearchAttempts;
|
||||
TOD_Time timeComponent;
|
||||
bool activatedDay;
|
||||
|
||||
int authLevelCmds;
|
||||
int authLevelFreeze;
|
||||
int dayLength;
|
||||
int nightLength;
|
||||
int presetDay;
|
||||
int presetMonth;
|
||||
int presetYear;
|
||||
bool setPresetDate;
|
||||
bool freezeDate;
|
||||
bool autoSkipNight;
|
||||
bool autoSkipDay;
|
||||
bool logAutoSkipConsole;
|
||||
bool freezeTimeOnload;
|
||||
float timeToFreeze;
|
||||
|
||||
object GetConfig(string menu, string datavalue, object defaultValue)
|
||||
{
|
||||
var data = Config[menu] as Dictionary<string, object>;
|
||||
if (data == null)
|
||||
{
|
||||
data = new Dictionary<string, object>();
|
||||
Config[menu] = data;
|
||||
Changed = true;
|
||||
}
|
||||
object value;
|
||||
if (!data.TryGetValue(datavalue, out value))
|
||||
{
|
||||
value = defaultValue;
|
||||
data[datavalue] = value;
|
||||
Changed = true;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
void LoadVariables()
|
||||
{
|
||||
dayLength = System.Convert.ToInt32(GetConfig("Settings", "dayLength", 30));
|
||||
nightLength = System.Convert.ToInt32(GetConfig("Settings", "nightLength", 30));
|
||||
freezeDate = System.Convert.ToBoolean(GetConfig("Settings", "freezeDate", false));
|
||||
authLevelCmds = System.Convert.ToInt32(GetConfig("Settings", "authLevelCmds", 1));
|
||||
authLevelFreeze = System.Convert.ToInt32(GetConfig("Settings", "authLevelFreeze", 2));
|
||||
autoSkipNight = System.Convert.ToBoolean(GetConfig("Settings", "autoSkipNight", false));
|
||||
autoSkipDay = System.Convert.ToBoolean(GetConfig("Settings", "autoSkipDay", false));
|
||||
logAutoSkipConsole = System.Convert.ToBoolean(GetConfig("Settings", "logAutoSkipConsole", true));
|
||||
|
||||
presetDay = System.Convert.ToInt32(GetConfig("DatePreset", "presetDay", 1));
|
||||
presetMonth = System.Convert.ToInt32(GetConfig("DatePreset", "presetMonth", 1));
|
||||
presetYear = System.Convert.ToInt32(GetConfig("DatePreset", "presetYear", 2020));
|
||||
setPresetDate = System.Convert.ToBoolean(GetConfig("DatePreset", "setPresetDate", false));
|
||||
|
||||
freezeTimeOnload = System.Convert.ToBoolean(GetConfig("TimeFreeze", "freezeTimeOnload", false));
|
||||
timeToFreeze = System.Convert.ToSingle(GetConfig("TimeFreeze", "timeToFreeze", 12.0));
|
||||
|
||||
if (!Changed) return;
|
||||
SaveConfig();
|
||||
Changed = false;
|
||||
}
|
||||
|
||||
protected override void LoadDefaultConfig()
|
||||
{
|
||||
Config.Clear();
|
||||
LoadVariables();
|
||||
}
|
||||
|
||||
void Loaded()
|
||||
{
|
||||
LoadVariables();
|
||||
Initialized = false;
|
||||
}
|
||||
|
||||
void Unload()
|
||||
{
|
||||
if (timeComponent == null || !Initialized) return;
|
||||
timeComponent.OnSunrise -= OnSunrise;
|
||||
timeComponent.OnSunset -= OnSunset;
|
||||
timeComponent.OnDay -= OnDay;
|
||||
timeComponent.OnHour -= OnHour;
|
||||
}
|
||||
|
||||
void OnServerInitialized()
|
||||
{
|
||||
if (TOD_Sky.Instance == null)
|
||||
{
|
||||
componentSearchAttempts++;
|
||||
if (componentSearchAttempts < 10)
|
||||
timer.Once(1, OnServerInitialized);
|
||||
else
|
||||
PrintWarning("Could not find required component after 10 attempts. Plugin disabled");
|
||||
return;
|
||||
}
|
||||
timeComponent = TOD_Sky.Instance.Components.Time;
|
||||
if (timeComponent == null)
|
||||
{
|
||||
PrintWarning("Could not fetch time component. Plugin disabled");
|
||||
return;
|
||||
}
|
||||
if (setPresetDate)
|
||||
{
|
||||
TOD_Sky.Instance.Cycle.Day = presetDay;
|
||||
TOD_Sky.Instance.Cycle.Month = presetMonth;
|
||||
TOD_Sky.Instance.Cycle.Year = presetYear;
|
||||
}
|
||||
SetTimeComponent();
|
||||
if (freezeTimeOnload)
|
||||
StartupFreeze();
|
||||
}
|
||||
|
||||
void SetTimeComponent()
|
||||
{
|
||||
timeComponent.ProgressTime = true;
|
||||
timeComponent.UseTimeCurve = false;
|
||||
timeComponent.OnSunrise += OnSunrise;
|
||||
timeComponent.OnSunset += OnSunset;
|
||||
timeComponent.OnDay += OnDay;
|
||||
timeComponent.OnHour += OnHour;
|
||||
Initialized = true;
|
||||
if (TOD_Sky.Instance.Cycle.Hour > TOD_Sky.Instance.SunriseTime && TOD_Sky.Instance.Cycle.Hour < TOD_Sky.Instance.SunsetTime)
|
||||
OnSunrise();
|
||||
else
|
||||
OnSunset();
|
||||
}
|
||||
|
||||
void StartupFreeze()
|
||||
{
|
||||
if (!Initialized) return;
|
||||
timeComponent.ProgressTime = false;
|
||||
ConVar.Env.time = timeToFreeze;
|
||||
}
|
||||
|
||||
void OnDay()
|
||||
{
|
||||
if (Initialized && freezeDate)
|
||||
--TOD_Sky.Instance.Cycle.Day;
|
||||
}
|
||||
|
||||
void OnHour()
|
||||
{
|
||||
if (!Initialized) return;
|
||||
if (TOD_Sky.Instance.Cycle.Hour > TOD_Sky.Instance.SunriseTime && TOD_Sky.Instance.Cycle.Hour < TOD_Sky.Instance.SunsetTime && !activatedDay)
|
||||
{
|
||||
OnSunrise();
|
||||
return;
|
||||
}
|
||||
if ((TOD_Sky.Instance.Cycle.Hour > TOD_Sky.Instance.SunsetTime || TOD_Sky.Instance.Cycle.Hour < TOD_Sky.Instance.SunriseTime) && activatedDay)
|
||||
{
|
||||
OnSunset();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void OnSunrise()
|
||||
{
|
||||
if (!Initialized) return;
|
||||
if (autoSkipDay && !autoSkipNight)
|
||||
{
|
||||
TOD_Sky.Instance.Cycle.Hour = TOD_Sky.Instance.SunsetTime;
|
||||
if (logAutoSkipConsole)
|
||||
Puts("Daytime autoskipped");
|
||||
OnSunset();
|
||||
return;
|
||||
}
|
||||
timeComponent.DayLengthInMinutes = dayLength * (24.0f / (TOD_Sky.Instance.SunsetTime - TOD_Sky.Instance.SunriseTime));
|
||||
if (!activatedDay)
|
||||
Interface.CallHook("OnTimeSunrise");
|
||||
activatedDay = true;
|
||||
}
|
||||
|
||||
void OnSunset()
|
||||
{
|
||||
if (!Initialized) return;
|
||||
if (autoSkipNight)
|
||||
{
|
||||
float timeToAdd = (24 - TOD_Sky.Instance.Cycle.Hour) + TOD_Sky.Instance.SunriseTime;
|
||||
TOD_Sky.Instance.Cycle.Hour += timeToAdd;
|
||||
if (logAutoSkipConsole)
|
||||
Puts("Nighttime autoskipped");
|
||||
OnSunrise();
|
||||
return;
|
||||
}
|
||||
timeComponent.DayLengthInMinutes = nightLength * (24.0f / (24.0f - (TOD_Sky.Instance.SunsetTime - TOD_Sky.Instance.SunriseTime)));
|
||||
if (activatedDay)
|
||||
Interface.CallHook("OnTimeSunset");
|
||||
activatedDay = false;
|
||||
}
|
||||
|
||||
[ConsoleCommand("tod.daylength")]
|
||||
void ConsoleDayLength(ConsoleSystem.Arg arg)
|
||||
{
|
||||
if (!Initialized) return;
|
||||
if (arg.Connection != null && arg.Connection.authLevel < authLevelCmds) return;
|
||||
if (arg.Args == null || arg.Args.Length < 1)
|
||||
{
|
||||
SendReply(arg, $"Current 'dayLength' setting is '{dayLength}'");
|
||||
return;
|
||||
}
|
||||
|
||||
int newDaylength = 0;
|
||||
if (int.TryParse(arg.Args[0], out newDaylength))
|
||||
{
|
||||
if (newDaylength < 1)
|
||||
{
|
||||
SendReply(arg, $"The new daylength must be greater zero");
|
||||
return;
|
||||
}
|
||||
}
|
||||
dayLength = newDaylength;
|
||||
SendReply(arg, $"The 'dayLength' has been set to '{dayLength}'");
|
||||
|
||||
if (TOD_Sky.Instance.IsDay)
|
||||
OnSunrise();
|
||||
else
|
||||
OnSunset();
|
||||
Config["Settings", "dayLength"] = dayLength;
|
||||
SaveConfig();
|
||||
}
|
||||
|
||||
[ConsoleCommand("tod.nightlength")]
|
||||
void ConsoleNightLength(ConsoleSystem.Arg arg)
|
||||
{
|
||||
if (!Initialized) return;
|
||||
if (arg.Connection != null && arg.Connection.authLevel < authLevelCmds) return;
|
||||
if (arg.Args == null || arg.Args.Length < 1)
|
||||
{
|
||||
SendReply(arg, $"Current 'nightLength' setting is '{nightLength}'");
|
||||
return;
|
||||
}
|
||||
|
||||
int newNightlength = 0;
|
||||
if (int.TryParse(arg.Args[0], out newNightlength))
|
||||
{
|
||||
if (newNightlength < 1)
|
||||
{
|
||||
SendReply(arg, $"The new nightlength must be greater zero");
|
||||
return;
|
||||
}
|
||||
}
|
||||
nightLength = newNightlength;
|
||||
SendReply(arg, $"The 'nightLength' has been set to '{nightLength}'");
|
||||
if (TOD_Sky.Instance.IsDay)
|
||||
OnSunrise();
|
||||
else
|
||||
OnSunset();
|
||||
Config["Settings", "nightLength"] = nightLength;
|
||||
SaveConfig();
|
||||
}
|
||||
|
||||
[ConsoleCommand("tod.freezetime")]
|
||||
void ConsoleFreezeTime(ConsoleSystem.Arg arg)
|
||||
{
|
||||
if (!Initialized) return;
|
||||
if (arg.Connection != null && arg.Connection.authLevel < authLevelFreeze) return;
|
||||
|
||||
timeComponent.ProgressTime = !timeComponent.ProgressTime;
|
||||
|
||||
if (timeComponent.ProgressTime)
|
||||
SendReply(arg, $"The game time was unfreezed");
|
||||
else
|
||||
SendReply(arg, $"The game time was freezed");
|
||||
}
|
||||
|
||||
[ConsoleCommand("tod.skipday")]
|
||||
void ConsoleSkipDay(ConsoleSystem.Arg arg)
|
||||
{
|
||||
if (!Initialized) return;
|
||||
if (arg.Connection != null && arg.Connection.authLevel < authLevelCmds) return;
|
||||
if (TOD_Sky.Instance.IsNight)
|
||||
{
|
||||
SendReply(arg, $"Night is already active");
|
||||
return;
|
||||
}
|
||||
OnSunset();
|
||||
TOD_Sky.Instance.Cycle.Hour = TOD_Sky.Instance.SunsetTime;
|
||||
SendReply(arg, $"Current daytime skipped");
|
||||
}
|
||||
|
||||
[ConsoleCommand("tod.skipnight")]
|
||||
void ConsoleSkipNight(ConsoleSystem.Arg arg)
|
||||
{
|
||||
if (!Initialized) return;
|
||||
if (arg.Connection != null && arg.Connection.authLevel < authLevelCmds) return;
|
||||
if (TOD_Sky.Instance.IsDay)
|
||||
{
|
||||
SendReply(arg, $"Day is already active");
|
||||
return;
|
||||
}
|
||||
OnSunrise();
|
||||
TOD_Sky.Instance.Cycle.Hour = TOD_Sky.Instance.SunriseTime;
|
||||
SendReply(arg, $"Current nighttime skipped");
|
||||
}
|
||||
|
||||
[ChatCommand("tod")]
|
||||
private void TodCommand(BasePlayer player, string command, string[] args)
|
||||
{
|
||||
if (!Initialized)
|
||||
return;
|
||||
TimeSpan ts1= TimeSpan.FromHours(TOD_Sky.Instance.SunriseTime);
|
||||
TimeSpan ts2= TimeSpan.FromHours(TOD_Sky.Instance.SunsetTime);
|
||||
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
stringBuilder.AppendLine(FormNeutralMessage("-------- Settings --------"));
|
||||
stringBuilder.AppendLine("Current Time".PadRight(15) + TOD_Sky.Instance.Cycle.DateTime.ToString("HH:mm:ss"));
|
||||
stringBuilder.AppendLine("Sunrise Hour".PadRight(15) + string.Format("{0}:{1}", System.Math.Truncate(ts1.TotalHours).ToString(), ts1.Minutes.ToString()));
|
||||
stringBuilder.AppendLine("Sunset Hour".PadRight(15) + string.Format("{0}:{1}", System.Math.Truncate(ts2.TotalHours).ToString(), ts2.Minutes.ToString()));
|
||||
stringBuilder.AppendLine("Daylength".PadRight(15) + dayLength.ToString() + " minutes");
|
||||
stringBuilder.Append("Nightlength".PadRight(15) + nightLength.ToString() + " minutes");
|
||||
PrintPluginMessageToChat(player, stringBuilder.ToString().TrimEnd());
|
||||
}
|
||||
|
||||
[HookMethod("SendHelpText")]
|
||||
private void SendHelpText(BasePlayer player)
|
||||
{
|
||||
if (!Initialized) return;
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
stringBuilder.Append(FormNeutralMessage("-------------------- Available Commands --------------------\n"));
|
||||
stringBuilder.Append(FormNeutralMessage("/tod") + " - Shows current Time Of Day.\n");
|
||||
PrintPluginMessageToChat(player, stringBuilder.ToString());
|
||||
}
|
||||
|
||||
private void PrintPluginMessageToChat(BasePlayer player, string message)
|
||||
{
|
||||
PrintToChat(player, "<b><size=16>[<color=#ffa500ff>" + this.Name + "</color>]</size></b>\n" + message);
|
||||
}
|
||||
|
||||
private void PrintPluginMessageToChat(string message)
|
||||
{
|
||||
PrintToChat("<b><size=16>[<color=#ffa500ff>" + this.Name + "</color>]</size></b>\n" + message);
|
||||
}
|
||||
|
||||
private string FormNeutralMessage(string message)
|
||||
{
|
||||
return "<color=#c0c0c0ff>" + message + "</color>";
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user