using Content.Shared.Administration.Logs; using Content.Shared.Database; using Content.Shared.Emag.Systems; using Content.Shared.Interaction; using Content.Shared.Ninja.Components; using Content.Shared.Tag; using Content.Shared.Whitelist; namespace Content.Shared.Ninja.Systems; /// /// Handles emagging whitelisted objects when clicked. /// public sealed class EmagProviderSystem : EntitySystem { [Dependency] private readonly EmagSystem _emag = default!; [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly SharedNinjaGlovesSystem _gloves = default!; [Dependency] private readonly TagSystem _tag = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnBeforeInteractHand); } /// /// Emag clicked entities that are on the whitelist. /// private void OnBeforeInteractHand(Entity ent, ref BeforeInteractHandEvent args) { // TODO: change this into a generic check event thing if (args.Handled || !_gloves.AbilityCheck(ent, args, out var target)) return; var (uid, comp) = ent; // only allowed to emag entities on the whitelist if (_whitelist.IsWhitelistFail(comp.Whitelist, target)) return; // only allowed to emag non-immune entities if (_tag.HasTag(target, comp.EmagImmuneTag)) return; var handled = _emag.DoEmagEffect(uid, target); if (!handled) return; _adminLogger.Add(LogType.Emag, LogImpact.High, $"{ToPrettyString(uid):player} emagged {ToPrettyString(target):target}"); var ev = new EmaggedSomethingEvent(target); RaiseLocalEvent(uid, ref ev); args.Handled = true; } } /// /// Raised on the player when emagging something. /// [ByRefEvent] public record struct EmaggedSomethingEvent(EntityUid Target);