Files
2024-12-22 20:37:19 +03:00

132 lines
4.7 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<TraitoredAspectComponent>
{
[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<TraitorRuleComponent>().Any();
}
#endregion
}
}