355 lines
11 KiB
C#
355 lines
11 KiB
C#
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>";
|
|
}
|
|
|
|
}
|
|
} |