CatStation/Content.Shared/Plunger/Systems/PlungerSystem.cs
Whatstone a88d2c5164
Cleanup: Resolve remaining PopupSystem warnings in Content.Shared (#44685)
* PopupClient to PopupEntity/Coordinates

* PopupPredictedX to PopupEntity/Cursor/Coordinates

* The rest of the damn owl

* nullability fixes

* Buckle cleanup

* cleanup, address PR comments

* ExecutionSystem: one popup method

* correct my filthy lies

* Apply most of ajcm's suggestions

* return user to SharedItemRecallSystem.cs

* Fix lingering Ensnarable broadcast popups

* targeted drain popups

* fix lingering untargeted Guardian popups

I read the comment on GuardianHostRecall.  Oops.

* target stethoscope popups

* fix the PDA vibration popup

* Fix target for encryption key removal popup

* anomaly scanner: args.User, not uid

* disposal unit comment, bcast pda vibration popup
2026-07-16 21:54:33 +00:00

76 lines
2.4 KiB
C#

using Content.Shared.DoAfter;
using Content.Shared.Interaction;
using Content.Shared.Popups;
using Content.Shared.Plunger.Components;
using Robust.Shared.Audio.Systems;
using Content.Shared.Random.Helpers;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Content.Shared.Random;
namespace Content.Shared.Plunger.Systems;
/// <summary>
/// Plungers can be used to unblock entities with PlungerUseComponent.
/// </summary>
public sealed partial class PlungerSystem : EntitySystem
{
[Dependency] private IRobustRandom _random = default!;
[Dependency] private SharedAudioSystem _audio = default!;
[Dependency] private SharedDoAfterSystem _doAfter = default!;
[Dependency] private SharedPopupSystem _popup = default!;
public override void Initialize()
{
SubscribeLocalEvent<PlungerComponent, AfterInteractEvent>(OnInteract);
SubscribeLocalEvent<PlungerComponent, PlungerDoAfterEvent>(OnDoAfter);
}
private void OnInteract(EntityUid uid, PlungerComponent component, AfterInteractEvent args)
{
if (args.Handled)
return;
if (!args.CanReach || args.Target is not { Valid: true } target)
return;
if (!TryComp<PlungerUseComponent>(args.Target, out var plunger))
return;
if (plunger.NeedsPlunger)
return;
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.PlungeDuration, new PlungerDoAfterEvent(), uid, target, uid)
{
BreakOnMove = true,
BreakOnDamage = true,
MovementThreshold = 1.0f,
});
args.Handled = true;
}
private void OnDoAfter(EntityUid uid, PlungerComponent 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 PlungerUseComponent? plunge))
return;
_popup.PopupEntity(Loc.GetString("plunger-unblock", ("target", target)), args.User, args.User, PopupType.Medium);
plunge.Plunged = true;
var spawn = ProtoMan.Index<WeightedRandomEntityPrototype>(plunge.PlungerLoot).Pick(_random);
_audio.PlayPredicted(plunge.Sound, uid, uid);
Spawn(spawn, Transform(target).Coordinates);
RemComp<PlungerUseComponent>(target);
Dirty(target, plunge);
args.Handled = true;
}
}