using Content.Shared.Popups; using Content.Shared.Interaction; using Content.Shared.DoAfter; using Content.Shared.Verbs; using Content.Shared.Sprite; using Robust.Shared.Audio.Systems; using Robust.Shared.Timing; namespace Content.Shared.Paint; /// /// Removes paint from an entity. /// public sealed class PaintRemoverSystem : SharedPaintSystem { [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnInteract); SubscribeLocalEvent(OnDoAfter); SubscribeLocalEvent>(OnPaintRemoveVerb); } // When entity is painted, remove paint from that entity. private void OnInteract(EntityUid uid, PaintRemoverComponent component, AfterInteractEvent args) { if (args.Handled) return; if (!args.CanReach || args.Target is not { Valid: true } target || !HasComp(target)) return; _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.CleanDelay, new PaintRemoverDoAfterEvent(), uid, args.Target, uid) { BreakOnMove = true, BreakOnDamage = true, MovementThreshold = 1.0f, }); args.Handled = true; } private void OnDoAfter(EntityUid uid, PaintRemoverComponent component, DoAfterEvent args) { if (args.Cancelled || args.Handled || args.Args.Target == null) return; if (args.Target is not { Valid: true } target) return; if (!TryComp(target, out PaintedComponent? paint)) return; paint.Enabled = false; _audio.PlayPredicted(component.Sound, target, args.User); _popup.PopupClient(Loc.GetString("paint-removed", ("target", target)), args.User, args.User, PopupType.Medium); _appearanceSystem.SetData(target, PaintVisuals.Painted, false); RemComp(target); Dirty(target, paint); args.Handled = true; } private void OnPaintRemoveVerb(EntityUid uid, PaintRemoverComponent component, GetVerbsEvent args) { if (!args.CanInteract || !args.CanAccess) return; var paintremovalText = Loc.GetString("paint-remove-verb"); var verb = new UtilityVerb() { Act = () => { _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.CleanDelay, new PaintRemoverDoAfterEvent(), uid, args.Target, uid) { BreakOnMove = true, BreakOnDamage = true, MovementThreshold = 1.0f, }); }, Text = paintremovalText }; args.Verbs.Add(verb); } }