2025-03-09 23:29:20 +03:00
|
|
|
|
using Content.Server.GameTicking;
|
|
|
|
|
|
using Content.Shared.CCVar;
|
2025-05-21 21:06:44 +03:00
|
|
|
|
using Robust.Server;
|
2025-03-09 23:29:20 +03:00
|
|
|
|
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!;
|
2025-05-21 21:06:44 +03:00
|
|
|
|
[Dependency] private readonly IBaseServer _baseServer = default!;
|
2025-03-09 23:29:20 +03:00
|
|
|
|
|
|
|
|
|
|
private TimeSpan _nextUpdateTime = TimeSpan.Zero;
|
2025-06-29 12:57:41 +03:00
|
|
|
|
private readonly TimeSpan _updateFrequency = TimeSpan.FromSeconds(60f);
|
2025-03-09 23:29:20 +03:00
|
|
|
|
|
|
|
|
|
|
private bool _enabled;
|
|
|
|
|
|
|
|
|
|
|
|
private void InitCbt()
|
|
|
|
|
|
{
|
2025-04-15 23:09:49 +03:00
|
|
|
|
_enabled = _cfg.GetCVar(CCVars.CP14ClosedBetaTest);
|
|
|
|
|
|
_cfg.OnValueChanged(CCVars.CP14ClosedBetaTest,
|
|
|
|
|
|
_ => { _enabled = _cfg.GetCVar(CCVars.CP14ClosedBetaTest); },
|
|
|
|
|
|
true);
|
2025-03-09 23:29:20 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Вы можете сказать: Эд, ты ебанулся? Это же лютый щиткод!
|
2025-05-21 21:06:44 +03:00
|
|
|
|
// И я вам отвечу: Да. Но сама система ограничения времени работы сервера - временная штука на этап разработки, которая будет удалена.
|
|
|
|
|
|
// Мне просто лень каждый раз запускать и выключать сервер ручками.
|
2025-03-09 23:29:20 +03:00
|
|
|
|
private void UpdateCbt(float _)
|
|
|
|
|
|
{
|
2025-04-15 23:09:49 +03:00
|
|
|
|
if (!_enabled || _timing.CurTime < _nextUpdateTime)
|
2025-03-09 23:29:20 +03:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
_nextUpdateTime = _timing.CurTime + _updateFrequency;
|
2025-04-15 23:09:49 +03:00
|
|
|
|
var now = DateTime.UtcNow.AddHours(3); // Moscow time
|
2025-03-09 23:29:20 +03:00
|
|
|
|
|
2025-06-29 12:57:41 +03:00
|
|
|
|
OpenWeekendRule(now);
|
2025-05-21 21:06:44 +03:00
|
|
|
|
LanguageRule(now);
|
2025-04-15 23:09:49 +03:00
|
|
|
|
LimitPlaytimeRule(now);
|
|
|
|
|
|
ApplyAnnouncements(now);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-29 12:57:41 +03:00
|
|
|
|
private void OpenWeekendRule(DateTime now)
|
2025-04-15 23:09:49 +03:00
|
|
|
|
{
|
2025-06-29 12:57:41 +03:00
|
|
|
|
var whitelistEnabled = _cfg.GetCVar(CCVars.WhitelistEnabled);
|
2025-06-30 10:52:13 +03:00
|
|
|
|
var isOpenWeekend = now.DayOfWeek is DayOfWeek.Saturday || now.DayOfWeek is DayOfWeek.Sunday;
|
2025-03-09 23:29:20 +03:00
|
|
|
|
|
2025-06-29 12:57:41 +03:00
|
|
|
|
if (isOpenWeekend && whitelistEnabled)
|
2025-03-09 23:29:20 +03:00
|
|
|
|
{
|
2025-04-15 23:09:49 +03:00
|
|
|
|
_cfg.SetCVar(CCVars.WhitelistEnabled, false);
|
|
|
|
|
|
}
|
2025-06-29 12:57:41 +03:00
|
|
|
|
else if (!isOpenWeekend && !whitelistEnabled)
|
2025-04-15 23:09:49 +03:00
|
|
|
|
{
|
|
|
|
|
|
_cfg.SetCVar(CCVars.WhitelistEnabled, true);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-03-09 23:29:20 +03:00
|
|
|
|
|
2025-05-21 21:06:44 +03:00
|
|
|
|
private void LanguageRule(DateTime now)
|
2025-04-15 23:09:49 +03:00
|
|
|
|
{
|
|
|
|
|
|
var curLang = _cfg.GetCVar(CCVars.Language);
|
|
|
|
|
|
|
2025-06-29 12:57:41 +03:00
|
|
|
|
var ruDays = now.DayOfWeek is DayOfWeek.Tuesday || now.DayOfWeek is DayOfWeek.Thursday || now.DayOfWeek is DayOfWeek.Saturday;
|
2025-05-21 21:06:44 +03:00
|
|
|
|
|
2025-06-29 12:57:41 +03:00
|
|
|
|
if (ruDays && curLang != "ru-RU")
|
2025-04-15 23:09:49 +03:00
|
|
|
|
{
|
2025-05-21 21:06:44 +03:00
|
|
|
|
_cfg.SetCVar(CCVars.Language, "ru-RU");
|
2025-04-15 23:09:49 +03:00
|
|
|
|
|
|
|
|
|
|
_chatSystem.DispatchGlobalAnnouncement(
|
2025-05-21 21:06:44 +03:00
|
|
|
|
"WARNING: The server changes its language to Russian. For the changes to apply to your device, reconnect to the server.",
|
2025-04-15 23:09:49 +03:00
|
|
|
|
announcementSound: new SoundPathSpecifier("/Audio/Effects/beep1.ogg"),
|
|
|
|
|
|
sender: "Server"
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
2025-06-29 12:57:41 +03:00
|
|
|
|
else if (!ruDays && curLang != "en-US")
|
2025-04-15 23:09:49 +03:00
|
|
|
|
{
|
2025-05-21 21:06:44 +03:00
|
|
|
|
_cfg.SetCVar(CCVars.Language, "en-US");
|
2025-04-15 23:09:49 +03:00
|
|
|
|
|
|
|
|
|
|
_chatSystem.DispatchGlobalAnnouncement(
|
2025-05-21 21:06:44 +03:00
|
|
|
|
"WARNING: The server changes its language to English. For the changes to apply to your device, reconnect to the server.",
|
2025-04-15 23:09:49 +03:00
|
|
|
|
announcementSound: new SoundPathSpecifier("/Audio/Effects/beep1.ogg"),
|
|
|
|
|
|
sender: "Server"
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void LimitPlaytimeRule(DateTime now)
|
|
|
|
|
|
{
|
2025-06-29 16:58:36 +03:00
|
|
|
|
var ruDays = now.DayOfWeek is DayOfWeek.Tuesday || now.DayOfWeek is DayOfWeek.Thursday || now.DayOfWeek is DayOfWeek.Saturday;
|
|
|
|
|
|
|
2025-07-04 21:49:52 +03:00
|
|
|
|
var isWeekend = now.DayOfWeek is DayOfWeek.Saturday || now.DayOfWeek is DayOfWeek.Sunday;
|
|
|
|
|
|
|
|
|
|
|
|
var allowedRuPlaytime = isWeekend ? now.Hour is >= 16 and < 20 : now.Hour is >= 18 and < 22;
|
2025-06-29 16:58:36 +03:00
|
|
|
|
var allowedEngPlaytime = now.Hour is >= 20 and < 24;
|
2025-06-29 12:57:41 +03:00
|
|
|
|
var isMonday = now.DayOfWeek is DayOfWeek.Monday;
|
2025-04-15 23:09:49 +03:00
|
|
|
|
|
2025-06-29 16:58:36 +03:00
|
|
|
|
if (((ruDays && allowedRuPlaytime) || (!ruDays && allowedEngPlaytime)) && !isMonday)
|
2025-04-15 23:09:49 +03:00
|
|
|
|
{
|
|
|
|
|
|
if (_ticker.Paused)
|
2025-03-09 23:29:20 +03:00
|
|
|
|
_ticker.TogglePause();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2025-04-15 23:09:49 +03:00
|
|
|
|
if (_ticker.RunLevel == GameRunLevel.InRound)
|
|
|
|
|
|
_roundEnd.EndRound();
|
|
|
|
|
|
|
|
|
|
|
|
if (!_ticker.Paused)
|
2025-03-09 23:29:20 +03:00
|
|
|
|
_ticker.TogglePause();
|
|
|
|
|
|
}
|
2025-04-15 23:09:49 +03:00
|
|
|
|
}
|
2025-03-09 23:29:20 +03:00
|
|
|
|
|
2025-04-15 23:09:49 +03:00
|
|
|
|
private void ApplyAnnouncements(DateTime now)
|
|
|
|
|
|
{
|
2025-06-29 16:58:36 +03:00
|
|
|
|
var ruDays = now.DayOfWeek is DayOfWeek.Tuesday || now.DayOfWeek is DayOfWeek.Thursday || now.DayOfWeek is DayOfWeek.Saturday;
|
|
|
|
|
|
|
2025-04-15 23:09:49 +03:00
|
|
|
|
var timeMap = new (int Hour, int Minute, Action Action)[]
|
2025-03-09 23:29:20 +03:00
|
|
|
|
{
|
2025-06-29 12:57:41 +03:00
|
|
|
|
(21, 45, () =>
|
2025-04-15 23:09:49 +03:00
|
|
|
|
{
|
2025-06-29 16:58:36 +03:00
|
|
|
|
if (!ruDays)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
2025-04-15 23:09:49 +03:00
|
|
|
|
_chatSystem.DispatchGlobalAnnouncement(
|
|
|
|
|
|
Loc.GetString("cp14-cbt-close-15m"),
|
|
|
|
|
|
announcementSound: new SoundPathSpecifier("/Audio/Effects/beep1.ogg"),
|
|
|
|
|
|
sender: "Server"
|
|
|
|
|
|
);
|
|
|
|
|
|
}),
|
2025-06-29 12:57:41 +03:00
|
|
|
|
(22, 2, () =>
|
2025-04-15 23:09:49 +03:00
|
|
|
|
{
|
2025-06-29 16:58:36 +03:00
|
|
|
|
if (!ruDays)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
_consoleHost.ExecuteCommand("golobby");
|
|
|
|
|
|
}),
|
|
|
|
|
|
(23, 44, () =>
|
|
|
|
|
|
{
|
|
|
|
|
|
if (ruDays)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
_chatSystem.DispatchGlobalAnnouncement(
|
|
|
|
|
|
Loc.GetString("cp14-cbt-close-15m"),
|
|
|
|
|
|
announcementSound: new SoundPathSpecifier("/Audio/Effects/beep1.ogg"),
|
|
|
|
|
|
sender: "Server"
|
|
|
|
|
|
);
|
|
|
|
|
|
}),
|
|
|
|
|
|
(23, 59, () =>
|
|
|
|
|
|
{
|
|
|
|
|
|
if (ruDays)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
2025-04-15 23:09:49 +03:00
|
|
|
|
_consoleHost.ExecuteCommand("golobby");
|
|
|
|
|
|
}),
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var (hour, minute, action) in timeMap)
|
2025-03-09 23:29:20 +03:00
|
|
|
|
{
|
2025-04-15 23:09:49 +03:00
|
|
|
|
if (now.Hour == hour && now.Minute == minute)
|
|
|
|
|
|
action.Invoke();
|
2025-03-09 23:29:20 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|