forked from wylab/wylab-station-14
+71









Dmitry
GitHub
PJBot
ScarKy0
Samuka-C
ArtisticRoomba
Partmedia
slarticodefast
themias
Victor Shen
Ed
Milon
Kirus59
Nemanja
Stomf
drakewill-CRL
PraxisMapper
EmoGarbage404
lzk
Princess Cheeseballs
IProduceWidgets
TytosB
abadaba695
kosticia
Thinbug
pathetic meowmeow
SlamBamActionman
Boaz1111
ActiveMammmoth
Myra
Whatstone
Pieter-Jan Briers
K-Dynamic
Gentleman-Bird
metalgearsloth
BIGZi0348
LaCumbiaDelCoronavirus
imatsoup
Matthew Herber
Ertanic
MissKay1994
Errant
eoineoineoin
Tiniest Shark
nikitosych
Tayrtahn
Perry Fraser
YoungThug
beck-thompson
metalgearsloth
Southbridge
Vladislav Suchkov
Prole
Unkn0wn_Gh0st
3nderall
Radezolid
J
Ghagliiarghii
chromiumboy
youtissoum
Minemoder5000
Spanky
Spessmann
github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
brainfood1183
Deerstop
B_Kirill
archee1
Cojoke
Quantum-cross
poklj
Krunklehorn
OnyxTheBrave
UpAndLeaves
Flareguy
Zalycon
deltanedas
Verm
nikthechampiongr
ScarKy0
Dmitry
25c5e59248
Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com> Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com> Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Co-authored-by: Samuka-C <47865393+Samuka-C@users.noreply.github.com> Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Co-authored-by: Partmedia <kevinz5000@gmail.com> Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Co-authored-by: themias <89101928+themias@users.noreply.github.com> Co-authored-by: Victor Shen <71985089+Vexerot@users.noreply.github.com> Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> Co-authored-by: Milon <milonpl.git@proton.me> Co-authored-by: Kirus59 <145689588+Kirus59@users.noreply.github.com> Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Co-authored-by: Stomf <5dorkydorks@gmail.com> Co-authored-by: drakewill-CRL <46307022+drakewill-CRL@users.noreply.github.com> Co-authored-by: PraxisMapper <praxismapper@gmail.com> Co-authored-by: EmoGarbage404 <retron404@gmail.com> Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> Co-authored-by: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com> Co-authored-by: TytosB <54259736+TytosB@users.noreply.github.com> Co-authored-by: abadaba695 <spacestation13thingy@gmail.com> Co-authored-by: kosticia <kosticia46@gmail.com> Co-authored-by: Thinbug <101073555+Thinbug0@users.noreply.github.com> Co-authored-by: pathetic meowmeow <uhhadd@gmail.com> Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Co-authored-by: Boaz1111 <149967078+Boaz1111@users.noreply.github.com> Co-authored-by: ActiveMammmoth <140334666+ActiveMammmoth@users.noreply.github.com> Co-authored-by: Myra <vasilis@pikachu.systems> Co-authored-by: Whatstone <166147148+whatston3@users.noreply.github.com> Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com> Co-authored-by: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Co-authored-by: Gentleman-Bird <dcgreen406@gmail.com> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: BIGZi0348 <svalker0348@gmail.com> Co-authored-by: LaCumbiaDelCoronavirus <90893484+LaCumbiaDelCoronavirus@users.noreply.github.com> Co-authored-by: imatsoup <93290208+imatsoup@users.noreply.github.com> Co-authored-by: Matthew Herber <32679887+happyrobot33@users.noreply.github.com> Co-authored-by: Ertanic <36124833+Ertanic@users.noreply.github.com> Co-authored-by: MissKay1994 <15877268+MissKay1994@users.noreply.github.com> Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com> Co-authored-by: eoineoineoin <helloworld@eoinrul.es> Co-authored-by: Tiniest Shark <head.rebel@yahoo.com> Co-authored-by: nikitosych <boriszyn@gmail.com> Co-authored-by: Tayrtahn <tayrtahn@gmail.com> Co-authored-by: Perry Fraser <perryprog@users.noreply.github.com> Co-authored-by: YoungThug <ramialanbagy@gmail.com> Co-authored-by: beck-thompson <107373427+beck-thompson@users.noreply.github.com> Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com> Co-authored-by: Southbridge <7013162+southbridge-fur@users.noreply.github.com> Co-authored-by: Vladislav Suchkov <20380250+murolem@users.noreply.github.com> Co-authored-by: Prole <172158352+Prole0@users.noreply.github.com> Co-authored-by: Unkn0wn_Gh0st <shadowstalkermll@gmail.com> Co-authored-by: 3nderall <101940324+3nderall@users.noreply.github.com> Co-authored-by: Radezolid <snappednexus@gmail.com> Co-authored-by: J <billsmith116@gmail.com> Co-authored-by: Ghagliiarghii <68826635+Ghagliiarghii@users.noreply.github.com> Co-authored-by: chromiumboy <50505512+chromiumboy@users.noreply.github.com> Co-authored-by: youtissoum <51883137+youtissoum@users.noreply.github.com> Co-authored-by: Minemoder5000 <minemoder50000@gmail.com> Co-authored-by: Spanky <scott@wearejacob.com> Co-authored-by: Spessmann <156740760+Spessmann@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: brainfood1183 <113240905+brainfood1183@users.noreply.github.com> Co-authored-by: Deerstop <edainturner@gmail.com> Co-authored-by: B_Kirill <153602297+B-Kirill@users.noreply.github.com> Co-authored-by: archee1 <archee3@hotmail.co.uk> Co-authored-by: Cojoke <83733158+Cojoke-dot@users.noreply.github.com> Co-authored-by: Quantum-cross <7065792+Quantum-cross@users.noreply.github.com> Co-authored-by: poklj <compgeek223@gmail.com> Co-authored-by: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com> Co-authored-by: OnyxTheBrave <131422822+OnyxTheBrave@users.noreply.github.com> Co-authored-by: UpAndLeaves <92269094+Alpha-Two@users.noreply.github.com> Co-authored-by: Flareguy <78941145+Flareguy@users.noreply.github.com> Co-authored-by: Zalycon <84675130+Zalycon@users.noreply.github.com> Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: Verm <32827189+Vermidia@users.noreply.github.com> Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Co-authored-by: ScarKy0 <scarky0@onet.eu> Co-authored-by: Dmitry <57028746+dimm00n@users.noreply.github.com>
230 lines
7.4 KiB
C#
230 lines
7.4 KiB
C#
using System.Linq;
|
|
using Content.Server.Chat.Systems;
|
|
using Content.Server.Station.Systems;
|
|
using Content.Shared.CCVar;
|
|
using Robust.Shared.Audio;
|
|
using Robust.Shared.Audio.Systems;
|
|
using Robust.Shared.Configuration;
|
|
using Robust.Shared.Prototypes;
|
|
|
|
namespace Content.Server.AlertLevel;
|
|
|
|
public sealed class AlertLevelSystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly IConfigurationManager _cfg = default!;
|
|
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
|
[Dependency] private readonly ChatSystem _chatSystem = default!;
|
|
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
|
[Dependency] private readonly StationSystem _stationSystem = default!;
|
|
|
|
// Until stations are a prototype, this is how it's going to have to be.
|
|
public const string DefaultAlertLevelSet = "stationAlerts";
|
|
|
|
public override void Initialize()
|
|
{
|
|
SubscribeLocalEvent<StationInitializedEvent>(OnStationInitialize);
|
|
SubscribeLocalEvent<PrototypesReloadedEventArgs>(OnPrototypeReload);
|
|
}
|
|
|
|
public override void Update(float time)
|
|
{
|
|
var query = EntityQueryEnumerator<AlertLevelComponent>();
|
|
|
|
while (query.MoveNext(out var station, out var alert))
|
|
{
|
|
if (alert.CurrentDelay <= 0)
|
|
{
|
|
if (alert.ActiveDelay)
|
|
{
|
|
RaiseLocalEvent(new AlertLevelDelayFinishedEvent());
|
|
alert.ActiveDelay = false;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
alert.CurrentDelay -= time;
|
|
}
|
|
}
|
|
|
|
private void OnStationInitialize(StationInitializedEvent args)
|
|
{
|
|
if (!TryComp<AlertLevelComponent>(args.Station, out var alertLevelComponent))
|
|
return;
|
|
|
|
if (!_prototypeManager.TryIndex(alertLevelComponent.AlertLevelPrototype, out AlertLevelPrototype? alerts))
|
|
{
|
|
return;
|
|
}
|
|
|
|
alertLevelComponent.AlertLevels = alerts;
|
|
|
|
var defaultLevel = alertLevelComponent.AlertLevels.DefaultLevel;
|
|
if (string.IsNullOrEmpty(defaultLevel))
|
|
{
|
|
defaultLevel = alertLevelComponent.AlertLevels.Levels.Keys.First();
|
|
}
|
|
|
|
SetLevel(args.Station, defaultLevel, false, false, true);
|
|
}
|
|
|
|
private void OnPrototypeReload(PrototypesReloadedEventArgs args)
|
|
{
|
|
if (!args.ByType.TryGetValue(typeof(AlertLevelPrototype), out var alertPrototypes)
|
|
|| !alertPrototypes.Modified.TryGetValue(DefaultAlertLevelSet, out var alertObject)
|
|
|| alertObject is not AlertLevelPrototype alerts)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var query = EntityQueryEnumerator<AlertLevelComponent>();
|
|
while (query.MoveNext(out var uid, out var comp))
|
|
{
|
|
comp.AlertLevels = alerts;
|
|
|
|
if (!comp.AlertLevels.Levels.ContainsKey(comp.CurrentLevel))
|
|
{
|
|
var defaultLevel = comp.AlertLevels.DefaultLevel;
|
|
if (string.IsNullOrEmpty(defaultLevel))
|
|
{
|
|
defaultLevel = comp.AlertLevels.Levels.Keys.First();
|
|
}
|
|
|
|
SetLevel(uid, defaultLevel, true, true, true);
|
|
}
|
|
}
|
|
|
|
RaiseLocalEvent(new AlertLevelPrototypeReloadedEvent());
|
|
}
|
|
|
|
public string GetLevel(EntityUid station, AlertLevelComponent? alert = null)
|
|
{
|
|
if (!Resolve(station, ref alert))
|
|
{
|
|
return string.Empty;
|
|
}
|
|
|
|
return alert.CurrentLevel;
|
|
}
|
|
|
|
public float GetAlertLevelDelay(EntityUid station, AlertLevelComponent? alert = null)
|
|
{
|
|
if (!Resolve(station, ref alert))
|
|
{
|
|
return float.NaN;
|
|
}
|
|
|
|
return alert.CurrentDelay;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get the default alert level for a station entity.
|
|
/// Returns an empty string if the station has no alert levels defined.
|
|
/// </summary>
|
|
/// <param name="station">The station entity.</param>
|
|
public string GetDefaultLevel(Entity<AlertLevelComponent?> station)
|
|
{
|
|
if (!Resolve(station.Owner, ref station.Comp) || station.Comp.AlertLevels == null)
|
|
{
|
|
return string.Empty;
|
|
}
|
|
return station.Comp.AlertLevels.DefaultLevel;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Set the alert level based on the station's entity ID.
|
|
/// </summary>
|
|
/// <param name="station">Station entity UID.</param>
|
|
/// <param name="level">Level to change the station's alert level to.</param>
|
|
/// <param name="playSound">Play the alert level's sound.</param>
|
|
/// <param name="announce">Say the alert level's announcement.</param>
|
|
/// <param name="force">Force the alert change. This applies if the alert level is not selectable or not.</param>
|
|
/// <param name="locked">Will it be possible to change level by crew.</param>
|
|
public void SetLevel(EntityUid station, string level, bool playSound, bool announce, bool force = false,
|
|
bool locked = false, MetaDataComponent? dataComponent = null, AlertLevelComponent? component = null)
|
|
{
|
|
if (!Resolve(station, ref component, ref dataComponent)
|
|
|| component.AlertLevels == null
|
|
|| !component.AlertLevels.Levels.TryGetValue(level, out var detail)
|
|
|| component.CurrentLevel == level)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!force)
|
|
{
|
|
if (!detail.Selectable
|
|
|| component.CurrentDelay > 0
|
|
|| component.IsLevelLocked)
|
|
{
|
|
return;
|
|
}
|
|
|
|
component.CurrentDelay = _cfg.GetCVar(CCVars.GameAlertLevelChangeDelay);
|
|
component.ActiveDelay = true;
|
|
}
|
|
|
|
component.CurrentLevel = level;
|
|
component.IsLevelLocked = locked;
|
|
|
|
var stationName = dataComponent.EntityName;
|
|
|
|
var name = level.ToLower();
|
|
|
|
if (Loc.TryGetString($"alert-level-{level}", out var locName))
|
|
{
|
|
name = locName.ToLower();
|
|
}
|
|
|
|
// Announcement text. Is passed into announcementFull.
|
|
var announcement = detail.Announcement;
|
|
|
|
if (Loc.TryGetString(detail.Announcement, out var locAnnouncement))
|
|
{
|
|
announcement = locAnnouncement;
|
|
}
|
|
|
|
// The full announcement to be spat out into chat.
|
|
var announcementFull = Loc.GetString("alert-level-announcement", ("name", name), ("announcement", announcement));
|
|
|
|
var playDefault = false;
|
|
if (playSound)
|
|
{
|
|
if (detail.Sound != null)
|
|
{
|
|
var filter = _stationSystem.GetInOwningStation(station);
|
|
_audio.PlayGlobal(detail.Sound, filter, true, detail.Sound.Params);
|
|
}
|
|
else
|
|
{
|
|
playDefault = true;
|
|
}
|
|
}
|
|
|
|
if (announce)
|
|
{
|
|
_chatSystem.DispatchStationAnnouncement(station, announcementFull, playDefaultSound: playDefault,
|
|
colorOverride: detail.Color, sender: stationName);
|
|
}
|
|
|
|
RaiseLocalEvent(new AlertLevelChangedEvent(station, level));
|
|
}
|
|
}
|
|
|
|
public sealed class AlertLevelDelayFinishedEvent : EntityEventArgs
|
|
{}
|
|
|
|
public sealed class AlertLevelPrototypeReloadedEvent : EntityEventArgs
|
|
{}
|
|
|
|
public sealed class AlertLevelChangedEvent : EntityEventArgs
|
|
{
|
|
public EntityUid Station { get; }
|
|
public string AlertLevel { get; }
|
|
|
|
public AlertLevelChangedEvent(EntityUid station, string alertLevel)
|
|
{
|
|
Station = station;
|
|
AlertLevel = alertLevel;
|
|
}
|
|
}
|