Files
OldThink/Content.Server/_White/AspectsSystem/Aspects/FastAndFuriousAspect.cs
BIGZi0348 e0987b782c Ух ты
2025-01-05 19:12:26 +03:00

82 lines
2.9 KiB
C#

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<FastAndFuriousAspectComponent>
{
[Dependency] private readonly ChatHelper _chatHelper = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PlayerSpawnCompleteEvent>(HandleLateJoin);
SubscribeLocalEvent<MovementSpeedModifierComponent, CloningEvent>(HandleCloning);
}
protected override void Started(EntityUid uid, FastAndFuriousAspectComponent component, GameRuleComponent gameRule,
GameRuleStartedEvent args)
{
base.Started(uid, component, gameRule, args);
var query = EntityQueryEnumerator<MovementSpeedModifierComponent>();
while (query.MoveNext(out var ent, out _))
{
EnsureComp<FastAndFuriousComponent>(ent);
}
}
protected override void Ended(EntityUid uid, FastAndFuriousAspectComponent component, GameRuleComponent gameRule,
GameRuleEndedEvent args)
{
base.Ended(uid, component, gameRule, args);
var query = EntityQueryEnumerator<MovementSpeedModifierComponent>();
while (query.MoveNext(out var ent, out _))
{
EnsureComp<FastAndFuriousComponent>(ent);
}
}
private void HandleCloning(EntityUid uid, MovementSpeedModifierComponent component, ref CloningEvent ev)
{
ModifySpeedIfActive(ev.Target);
}
private void HandleLateJoin(PlayerSpawnCompleteEvent ev)
{
var query = EntityQueryEnumerator<FastAndFuriousAspectComponent, GameRuleComponent>();
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<FastAndFuriousAspectComponent, GameRuleComponent>();
while (query.MoveNext(out var ruleEntity, out _, out var gameRule))
{
if (!GameTicker.IsGameRuleAdded(ruleEntity, gameRule))
continue;
if (!HasComp<MovementSpeedModifierComponent>(mob))
return;
EnsureComp<FastAndFuriousComponent>(mob);
}
}
}