using Content.Server.Cloning; using Content.Server.GameTicking; using Content.Server.GameTicking.Rules.Components; using Content.Server._White.AspectsSystem.Aspects.Components; using Content.Server._White.AspectsSystem.Base; using Content.Server._White.Other.FastAndFuriousSystem; using Content.Server.GameTicking.Components; using Content.Shared.Cloning; using Content.Shared.Movement.Components; using Content.Shared.Movement.Systems; namespace Content.Server._White.AspectsSystem.Aspects; public sealed class FastAndFuriousAspect : AspectSystem { [Dependency] private readonly ChatHelper _chatHelper = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(HandleLateJoin); SubscribeLocalEvent(HandleCloning); } protected override void Started(EntityUid uid, FastAndFuriousAspectComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) { base.Started(uid, component, gameRule, args); var query = EntityQueryEnumerator(); while (query.MoveNext(out var ent, out _)) { EnsureComp(ent); } } protected override void Ended(EntityUid uid, FastAndFuriousAspectComponent component, GameRuleComponent gameRule, GameRuleEndedEvent args) { base.Ended(uid, component, gameRule, args); var query = EntityQueryEnumerator(); while (query.MoveNext(out var ent, out _)) { EnsureComp(ent); } } private void HandleCloning(EntityUid uid, MovementSpeedModifierComponent component, ref CloningEvent ev) { ModifySpeedIfActive(ev.Target); } private void HandleLateJoin(PlayerSpawnCompleteEvent ev) { var query = EntityQueryEnumerator(); while (query.MoveNext(out var ruleEntity, out _, out var gameRule)) { if (!GameTicker.IsGameRuleAdded(ruleEntity, gameRule)) continue; if (!ev.LateJoin) return; ModifySpeedIfActive(ev.Mob); _chatHelper.SendAspectDescription(ev.Mob, Loc.GetString("fast-and-furious-aspect-desc")); } } private void ModifySpeedIfActive(EntityUid mob) { var query = EntityQueryEnumerator(); while (query.MoveNext(out var ruleEntity, out _, out var gameRule)) { if (!GameTicker.IsGameRuleAdded(ruleEntity, gameRule)) continue; if (!HasComp(mob)) return; EnsureComp(mob); } } }