using Content.Server.Pinpointer; using Content.Shared._NF.Pinpointer; using Content.Shared.Charges.Components; using Content.Shared.Charges.Systems; using Content.Shared.DoAfter; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Pinpointer; using Content.Shared.Popups; namespace Content.Server._NF.Pinpointer; public sealed class ClearPinpointerSystem : EntitySystem { [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly PinpointerSystem _pinpointer = default!; [Dependency] private readonly SharedChargesSystem _charges = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnInteractUsing); SubscribeLocalEvent(OnDoAfter); } private void OnInteractUsing(Entity ent, ref AfterInteractEvent args) { if (!args.CanReach || args.Handled || args.Target == null) return; TryComp(ent, out var charges); if (_charges.IsEmpty((ent, charges))) { if (ent.Comp.EmptyMessage != null) _popup.PopupEntity(Loc.GetString(ent.Comp.EmptyMessage), args.User, args.User); return; } if (args.User == args.Target) { if (ent.Comp.UseOnSelfMessage != null) _popup.PopupEntity(Loc.GetString(ent.Comp.UseOnSelfMessage, ("user", Identity.Entity(args.User, EntityManager))), args.Target.Value, args.Target.Value, PopupType.Small); } else { if (ent.Comp.UseOnOthersMessage != null) _popup.PopupEntity(Loc.GetString(ent.Comp.UseOnOthersMessage, ("user", Identity.Entity(args.User, EntityManager))), args.Target.Value, args.Target.Value, PopupType.Large); } _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, ent.Comp.ClearTime, new ClearPinpointerDoAfterEvent(), ent, target: args.Target, used: ent) { BreakOnDamage = true, BreakOnMove = true }); } /// /// DoAfter: remove all pinpointers that point to this object /// private void OnDoAfter(Entity ent, ref ClearPinpointerDoAfterEvent args) { if (args.Cancelled || args.Handled) return; TryComp(ent, out var charges); if (!_charges.TryUseCharge((ent, charges))) { if (ent.Comp.EmptyMessage != null) _popup.PopupEntity(Loc.GetString(ent.Comp.EmptyMessage), args.User, args.User); return; } if (TryComp(args.Target, out var target)) { foreach (var pinpointer in target.Entities) { if (!TryComp(pinpointer, out var pinpointComp)) continue; _pinpointer.ClearPinpointer(pinpointer, pinpointComp); } RemComp(args.Target.Value); } if (ent.Comp.DestroyAfterUse) QueueDel(ent.Owner); } }