using System.Linq; using Content.Server.Chat.Managers; using Content.Server.Chat.Systems; using Content.Server.GameTicking.Rules; using Content.Server.GameTicking.Rules.Components; using Content.Server.Mind; using Content.Server._White.AspectsSystem.Aspects.Components; using Content.Server._White.AspectsSystem.Base; using Content.Server.GameTicking.Components; using Robust.Shared.Audio.Systems; using Robust.Shared.Random; namespace Content.Server._White.AspectsSystem.Aspects { public sealed class TraitoredAspect : AspectSystem { [Dependency] private readonly TraitorRuleSystem _traitorRuleSystem = default!; [Dependency] private readonly IChatManager _chatManager = default!; [Dependency] private readonly ChatSystem _chatSystem = default!; [Dependency] private readonly MindSystem _mindSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly IRobustRandom _random = default!; private bool _announcedForTraitors; private float _timeElapsed; private float _timeElapsedForTraitor; private float _wacky; private const float WackyAaa = 430; protected override void Started(EntityUid uid, TraitoredAspectComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) { base.Started(uid, component, gameRule, args); // Just to make sure ResetValues(); if (!HasTraitorGameRule()) ForceEndSelf(uid, gameRule); _wacky = _random.Next(720, 860); } protected override void ActiveTick(EntityUid uid, TraitoredAspectComponent component, GameRuleComponent gameRule, float frameTime) { base.ActiveTick(uid, component, gameRule, frameTime); _timeElapsedForTraitor += frameTime; _timeElapsed += frameTime; if (_timeElapsedForTraitor >= WackyAaa && !_announcedForTraitors) { AnnounceToTators(uid, gameRule); _announcedForTraitors = true; } if (_timeElapsed >= _wacky) { AnnounceToAll(uid, gameRule); } } protected override void Ended(EntityUid uid, TraitoredAspectComponent component, GameRuleComponent gameRule, GameRuleEndedEvent args) { base.Ended(uid, component, gameRule, args); ResetValues(); } #region Helpers private void AnnounceToTators(EntityUid uid, GameRuleComponent rule) { var traitors = _traitorRuleSystem.GetOtherTraitorMindsAliveAndConnected(null); if (traitors.Count == 0) return; foreach (var traitor in traitors) { if (!_mindSystem.TryGetSession(traitor.Mind, out var session)) continue; var traitorMind = traitor.Mind.OwnedEntity; if (traitorMind == null) continue; _chatManager.DispatchServerMessage(session, "Внимание, коммуникации синдиката были перехвачены, скоро вас раскроют!"); _audio.PlayEntity("/Audio/White/Aspects/palevo.ogg", traitorMind.Value, traitorMind.Value); } } private void AnnounceToAll(EntityUid uid, GameRuleComponent rule) { var traitors = _traitorRuleSystem.GetOtherTraitorMindsAliveAndConnected(null); var msg = "Станция, служба контрразведки НаноТрейзен рассекретила передачу Синдиката и выяснила проникниших на вашу станцию агентов. Агенты имеют следующие имена: \n"; foreach (var traitor in traitors) { var name = traitor.Mind.CharacterName; if (!string.IsNullOrEmpty(name)) { msg += $" {name}\n"; } } msg = msg + "\nОфицерскому составу - немедленно устранить вышеперечисленных агентов."; _chatSystem.DispatchGlobalAnnouncement(msg, "Центральное Командование", colorOverride: Color.Aquamarine); ForceEndSelf(uid, rule); } private void ResetValues() { _announcedForTraitors = false; _timeElapsed = 0; _timeElapsedForTraitor = 0; } private bool HasTraitorGameRule() { return EntityQuery().Any(); } #endregion } }