using System.Numerics; using Content.Server._White.AspectsSystem.Aspects.Components; using Content.Server._White.AspectsSystem.Base; using Content.Server.GameTicking; using Content.Server.GameTicking.Components; using Content.Shared._White.Telescope; using Content.Shared.Humanoid; using Content.Shared.Movement.Components; using Content.Shared.Movement.Systems; namespace Content.Server._White.AspectsSystem.Aspects; public sealed class ImmersiveAspect : AspectSystem { [Dependency] private readonly SharedContentEyeSystem _eye = default!; [Dependency] private readonly SharedTelescopeSystem _telescope = default!; [Dependency] private readonly ChatHelper _chatHelper = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(HandleLateJoin); } protected override void Started(EntityUid uid, ImmersiveAspectComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) { base.Started(uid, component, gameRule, args); WayToHRPPlusPlus(); } private void WayToHRPPlusPlus() { var humans = EntityQuery(); foreach (var human in humans) { var entity = human.Owner; if (!HasComp(entity)) continue; FuckUpEye(entity, 0.6f); AddTelescope(entity); _chatHelper.SendAspectDescription(entity, Loc.GetString("immersive-aspect-desc")); } } private void FuckUpEye(EntityUid human, float modifier) { _eye.SetMaxZoom(human, new Vector2(modifier)); _eye.SetZoom(human, new Vector2(modifier)); } private void AddTelescope(EntityUid human) { var telescope = EnsureComp(human); _telescope.SetParameters((human, telescope), 0.15f, 0.07f); } private void HandleLateJoin(PlayerSpawnCompleteEvent ev) { if (!ev.LateJoin) return; if (!HasComp(ev.Mob)) return; var query = EntityQueryEnumerator(); while (query.MoveNext(out var ruleEntity, out _, out var gameRule)) { if (!GameTicker.IsGameRuleAdded(ruleEntity, gameRule)) continue; FuckUpEye(ev.Mob, 0.6f); AddTelescope(ev.Mob); _chatHelper.SendAspectDescription(ev.Mob, Loc.GetString("immersive-aspect-desc")); } } protected override void Ended(EntityUid uid, ImmersiveAspectComponent component, GameRuleComponent gameRule, GameRuleEndedEvent args) { base.Ended(uid, component, gameRule, args); var humans = EntityQuery(); foreach (var human in humans) { var entity = human.Owner; if (!HasComp(entity)) continue; FuckUpEye(entity, 1f); RemComp(entity); } } }