Add automatic emergency shuttle call (#12473)
* Add automatic emergency shuttle call This adds a cvar shuttle.auto_call_time which is an integer N, that calls the emergency shuttle automatically without intervention after N minutes. This can be disabled by setting N to 0. After a vote to extend, the shuttle will be called automatically every shuttle.auto_call_extension_time minutes. * Update Resources/Locale/en-US/round-end/round-end-system.ftl Co-authored-by: theashtronaut <112137107+theashtronaut@users.noreply.github.com> Co-authored-by: Moony <moony@hellomouse.net> Co-authored-by: theashtronaut <112137107+theashtronaut@users.noreply.github.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using Content.Server.Administration.Logs;
|
using Content.Server.Administration.Logs;
|
||||||
using Content.Server.AlertLevel;
|
using Content.Server.AlertLevel;
|
||||||
|
using Content.Shared.CCVar;
|
||||||
using Content.Server.Chat;
|
using Content.Server.Chat;
|
||||||
using Content.Server.Chat.Managers;
|
using Content.Server.Chat.Managers;
|
||||||
using Content.Server.Chat.Systems;
|
using Content.Server.Chat.Systems;
|
||||||
@@ -10,6 +11,7 @@ using Content.Server.Station.Systems;
|
|||||||
using Content.Shared.Database;
|
using Content.Shared.Database;
|
||||||
using Content.Shared.GameTicking;
|
using Content.Shared.GameTicking;
|
||||||
using Robust.Shared.Audio;
|
using Robust.Shared.Audio;
|
||||||
|
using Robust.Shared.Configuration;
|
||||||
using Robust.Shared.Player;
|
using Robust.Shared.Player;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Timing;
|
using Robust.Shared.Timing;
|
||||||
@@ -24,6 +26,7 @@ namespace Content.Server.RoundEnd
|
|||||||
public sealed class RoundEndSystem : EntitySystem
|
public sealed class RoundEndSystem : EntitySystem
|
||||||
{
|
{
|
||||||
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
||||||
|
[Dependency] private readonly IConfigurationManager _cfg = default!;
|
||||||
[Dependency] private readonly IChatManager _chatManager = default!;
|
[Dependency] private readonly IChatManager _chatManager = default!;
|
||||||
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
||||||
[Dependency] private readonly IPrototypeManager _protoManager = default!;
|
[Dependency] private readonly IPrototypeManager _protoManager = default!;
|
||||||
@@ -47,10 +50,19 @@ namespace Content.Server.RoundEnd
|
|||||||
public TimeSpan? ExpectedShuttleLength => ExpectedCountdownEnd - LastCountdownStart;
|
public TimeSpan? ExpectedShuttleLength => ExpectedCountdownEnd - LastCountdownStart;
|
||||||
public TimeSpan? ShuttleTimeLeft => ExpectedCountdownEnd - _gameTiming.CurTime;
|
public TimeSpan? ShuttleTimeLeft => ExpectedCountdownEnd - _gameTiming.CurTime;
|
||||||
|
|
||||||
|
public TimeSpan AutoCallStartTime;
|
||||||
|
private bool AutoCalledBefore = false;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
SubscribeLocalEvent<RoundRestartCleanupEvent>(_ => Reset());
|
SubscribeLocalEvent<RoundRestartCleanupEvent>(_ => Reset());
|
||||||
|
SetAutoCallTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetAutoCallTime()
|
||||||
|
{
|
||||||
|
AutoCallStartTime = _gameTiming.CurTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Reset()
|
private void Reset()
|
||||||
@@ -69,6 +81,8 @@ namespace Content.Server.RoundEnd
|
|||||||
|
|
||||||
LastCountdownStart = null;
|
LastCountdownStart = null;
|
||||||
ExpectedCountdownEnd = null;
|
ExpectedCountdownEnd = null;
|
||||||
|
SetAutoCallTime();
|
||||||
|
AutoCalledBefore = false;
|
||||||
RaiseLocalEvent(RoundEndSystemChangedEvent.Default);
|
RaiseLocalEvent(RoundEndSystemChangedEvent.Default);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +91,7 @@ namespace Content.Server.RoundEnd
|
|||||||
return _cooldownTokenSource == null;
|
return _cooldownTokenSource == null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RequestRoundEnd(EntityUid? requester = null, bool checkCooldown = true)
|
public void RequestRoundEnd(EntityUid? requester = null, bool checkCooldown = true, bool autoCall = false)
|
||||||
{
|
{
|
||||||
var duration = DefaultCountdownDuration;
|
var duration = DefaultCountdownDuration;
|
||||||
|
|
||||||
@@ -92,10 +106,10 @@ namespace Content.Server.RoundEnd
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RequestRoundEnd(duration, requester, checkCooldown);
|
RequestRoundEnd(duration, requester, checkCooldown, autoCall);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RequestRoundEnd(TimeSpan countdownTime, EntityUid? requester = null, bool checkCooldown = true)
|
public void RequestRoundEnd(TimeSpan countdownTime, EntityUid? requester = null, bool checkCooldown = true, bool autoCall = false)
|
||||||
{
|
{
|
||||||
if (_gameTicker.RunLevel != GameRunLevel.InRound) return;
|
if (_gameTicker.RunLevel != GameRunLevel.InRound) return;
|
||||||
|
|
||||||
@@ -128,13 +142,26 @@ namespace Content.Server.RoundEnd
|
|||||||
units = "eta-units-minutes";
|
units = "eta-units-minutes";
|
||||||
}
|
}
|
||||||
|
|
||||||
_chatSystem.DispatchGlobalAnnouncement(Loc.GetString("round-end-system-shuttle-called-announcement",
|
if (autoCall)
|
||||||
("time", time),
|
{
|
||||||
("units", Loc.GetString(units))),
|
_chatSystem.DispatchGlobalAnnouncement(Loc.GetString("round-end-system-shuttle-auto-called-announcement",
|
||||||
Loc.GetString("Station"),
|
("time", time),
|
||||||
false,
|
("units", Loc.GetString(units))),
|
||||||
null,
|
Loc.GetString("Station"),
|
||||||
Color.Gold);
|
false,
|
||||||
|
null,
|
||||||
|
Color.Gold);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_chatSystem.DispatchGlobalAnnouncement(Loc.GetString("round-end-system-shuttle-called-announcement",
|
||||||
|
("time", time),
|
||||||
|
("units", Loc.GetString(units))),
|
||||||
|
Loc.GetString("Station"),
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
Color.Gold);
|
||||||
|
}
|
||||||
|
|
||||||
SoundSystem.Play("/Audio/Announcements/shuttlecalled.ogg", Filter.Broadcast());
|
SoundSystem.Play("/Audio/Announcements/shuttlecalled.ogg", Filter.Broadcast());
|
||||||
|
|
||||||
@@ -206,6 +233,24 @@ namespace Content.Server.RoundEnd
|
|||||||
RaiseLocalEvent(RoundEndSystemChangedEvent.Default);
|
RaiseLocalEvent(RoundEndSystemChangedEvent.Default);
|
||||||
}, _cooldownTokenSource.Token);
|
}, _cooldownTokenSource.Token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Update(float frameTime)
|
||||||
|
{
|
||||||
|
// Check if we should auto-call.
|
||||||
|
int mins = AutoCalledBefore ? _cfg.GetCVar(CCVars.EmergencyShuttleAutoCallExtensionTime)
|
||||||
|
: _cfg.GetCVar(CCVars.EmergencyShuttleAutoCallTime);
|
||||||
|
if (mins != 0 && _gameTiming.CurTime - AutoCallStartTime > TimeSpan.FromMinutes(mins))
|
||||||
|
{
|
||||||
|
if (!_shuttle.EmergencyShuttleArrived && ExpectedCountdownEnd is null)
|
||||||
|
{
|
||||||
|
RequestRoundEnd(null, false, true);
|
||||||
|
AutoCalledBefore = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always reset auto-call in case of a recall.
|
||||||
|
SetAutoCallTime();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class RoundEndSystemChangedEvent : EntityEventArgs
|
public sealed class RoundEndSystemChangedEvent : EntityEventArgs
|
||||||
|
|||||||
@@ -1028,6 +1028,19 @@ namespace Content.Shared.CCVar
|
|||||||
public static readonly CVarDef<float> EmergencyRecallTurningPoint =
|
public static readonly CVarDef<float> EmergencyRecallTurningPoint =
|
||||||
CVarDef.Create("shuttle.recall_turning_point", 0.5f, CVar.SERVERONLY);
|
CVarDef.Create("shuttle.recall_turning_point", 0.5f, CVar.SERVERONLY);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Time in minutes after round start to auto-call the shuttle. Set to zero to disable.
|
||||||
|
/// </summary>
|
||||||
|
public static readonly CVarDef<int> EmergencyShuttleAutoCallTime =
|
||||||
|
CVarDef.Create("shuttle.auto_call_time", 90, CVar.SERVERONLY);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Time in minutes after the round was extended (by recalling the shuttle) to call
|
||||||
|
/// the shuttle again.
|
||||||
|
/// </summary>
|
||||||
|
public static readonly CVarDef<int> EmergencyShuttleAutoCallExtensionTime =
|
||||||
|
CVarDef.Create("shuttle.auto_call_extension_time", 45, CVar.SERVERONLY);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The map to load for CentCom for the emergency shuttle to dock to.
|
/// The map to load for CentCom for the emergency shuttle to dock to.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
## RoundEndSystem
|
## RoundEndSystem
|
||||||
|
|
||||||
round-end-system-shuttle-called-announcement = An emergency shuttle has been sent. ETA: {$time} {$units}.
|
round-end-system-shuttle-called-announcement = An emergency shuttle has been sent. ETA: {$time} {$units}.
|
||||||
|
round-end-system-shuttle-auto-called-announcement = An automatic crew shift change shuttle has been sent. ETA: {$time} {$units}. Recall the shuttle to extend the shift.
|
||||||
round-end-system-shuttle-recalled-announcement = The emergency shuttle has been recalled.
|
round-end-system-shuttle-recalled-announcement = The emergency shuttle has been recalled.
|
||||||
round-end-system-round-restart-eta-announcement = Restarting the round in {$minutes} minutes...
|
round-end-system-round-restart-eta-announcement = Restarting the round in {$minutes} minutes...
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user