Files
crystall-punk-14/Content.Server/_CP14/RoundEnd/CP14RoundEndSystem.CBT.cs

145 lines
4.9 KiB
C#
Raw Normal View History

using Content.Server.GameTicking;
using Content.Shared.CCVar;
using Robust.Server;
using Robust.Shared.Audio;
using Robust.Shared.Console;
namespace Content.Server._CP14.RoundEnd;
public sealed partial class CP14RoundEndSystem
{
[Dependency] private readonly IConsoleHost _consoleHost = default!;
[Dependency] private readonly GameTicker _ticker = default!;
[Dependency] private readonly IBaseServer _baseServer = default!;
private TimeSpan _nextUpdateTime = TimeSpan.Zero;
private readonly TimeSpan _updateFrequency = TimeSpan.FromSeconds(50f);
private bool _enabled;
private void InitCbt()
{
_enabled = _cfg.GetCVar(CCVars.CP14ClosedBetaTest);
_cfg.OnValueChanged(CCVars.CP14ClosedBetaTest,
_ => { _enabled = _cfg.GetCVar(CCVars.CP14ClosedBetaTest); },
true);
}
// Вы можете сказать: Эд, ты ебанулся? Это же лютый щиткод!
// И я вам отвечу: Да. Но сама система ограничения времени работы сервера - временная штука на этап разработки, которая будет удалена.
// Мне просто лень каждый раз запускать и выключать сервер ручками.
private void UpdateCbt(float _)
{
if (!_enabled || _timing.CurTime < _nextUpdateTime)
return;
_nextUpdateTime = _timing.CurTime + _updateFrequency;
var now = DateTime.UtcNow.AddHours(3); // Moscow time
OpenSaturdayRule(now);
LanguageRule(now);
LimitPlaytimeRule(now);
ApplyAnnouncements(now);
}
private void OpenSaturdayRule(DateTime now)
{
var curWhitelist = _cfg.GetCVar(CCVars.WhitelistEnabled);
var isOpenWeened = now.DayOfWeek is DayOfWeek.Saturday;
if (isOpenWeened && curWhitelist)
{
_cfg.SetCVar(CCVars.WhitelistEnabled, false);
}
else if (!isOpenWeened && !curWhitelist)
{
_cfg.SetCVar(CCVars.WhitelistEnabled, true);
}
}
private void LanguageRule(DateTime now)
{
var curLang = _cfg.GetCVar(CCVars.Language);
2025-05-22 14:53:46 +03:00
var ruHalfDay = now.Hour < 19 && now.Hour >= 9;
if (ruHalfDay && curLang != "ru-RU")
{
_cfg.SetCVar(CCVars.Language, "ru-RU");
_chatSystem.DispatchGlobalAnnouncement(
"WARNING: The server changes its language to Russian. For the changes to apply to your device, reconnect to the server.",
announcementSound: new SoundPathSpecifier("/Audio/Effects/beep1.ogg"),
sender: "Server"
);
}
else if (!ruHalfDay && curLang != "en-US")
{
_cfg.SetCVar(CCVars.Language, "en-US");
_chatSystem.DispatchGlobalAnnouncement(
"WARNING: The server changes its language to English. For the changes to apply to your device, reconnect to the server.",
announcementSound: new SoundPathSpecifier("/Audio/Effects/beep1.ogg"),
sender: "Server"
);
}
}
private void LimitPlaytimeRule(DateTime now)
{
var playtime = (now.Hour is >= 15 and < 19) || (now.Hour is >= 20 and < 24);
if (playtime)
{
if (_ticker.Paused)
_ticker.TogglePause();
}
else
{
if (_ticker.RunLevel == GameRunLevel.InRound)
_roundEnd.EndRound();
if (!_ticker.Paused)
_ticker.TogglePause();
}
}
private void ApplyAnnouncements(DateTime now)
{
var timeMap = new (int Hour, int Minute, Action Action)[]
{
(18, 45, () =>
{
_chatSystem.DispatchGlobalAnnouncement(
Loc.GetString("cp14-cbt-close-15m"),
announcementSound: new SoundPathSpecifier("/Audio/Effects/beep1.ogg"),
sender: "Server"
);
}),
(19, 2, () =>
{
_baseServer.Shutdown("Русский ОБТ подошел к концу. Следующие 3 часа будет английский ОБТ. Просьба не мешать англоязычным ребятам играть в свое время :)");
}),
(23, 45, () =>
{
_chatSystem.DispatchGlobalAnnouncement(
Loc.GetString("cp14-cbt-close-15m"),
announcementSound: new SoundPathSpecifier("/Audio/Effects/beep1.ogg"),
sender: "Server"
);
}),
(00, 2, () =>
{
_consoleHost.ExecuteCommand("golobby");
}),
};
foreach (var (hour, minute, action) in timeMap)
{
if (now.Hour == hour && now.Minute == minute)
action.Invoke();
}
}
}