Files
tbd-station-14/Content.Shared/Engineering/Systems/DisassembleOnAltVerbSystem.cs
FungiFellow ed7bea8e01 Inflatable Module (#35100)
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
Co-authored-by: PJB3005 <pieterjan.briers+git@gmail.com>
2025-08-23 15:15:28 -07:00

70 lines
2.2 KiB
C#

using Content.Shared.DoAfter;
using Content.Shared.Engineering.Components;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Verbs;
using Robust.Shared.Network;
namespace Content.Shared.Engineering.Systems;
public sealed partial class DisassembleOnAltVerbSystem : EntitySystem
{
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
[Dependency] private readonly INetManager _net = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<DisassembleOnAltVerbComponent, GetVerbsEvent<AlternativeVerb>>(AddDisassembleVerb);
SubscribeLocalEvent<DisassembleOnAltVerbComponent, DisassembleDoAfterEvent>(OnDisassembleDoAfter);
}
public void StartDisassembly(Entity<DisassembleOnAltVerbComponent> entity, EntityUid user)
{
// Doafter setup
var doAfterArgs = new DoAfterArgs(EntityManager,
user,
entity.Comp.DisassembleTime,
new DisassembleDoAfterEvent(),
entity,
entity)
{
BreakOnMove = true,
};
_doAfter.TryStartDoAfter(doAfterArgs);
}
private void AddDisassembleVerb(Entity<DisassembleOnAltVerbComponent> entity, ref GetVerbsEvent<AlternativeVerb> args)
{
if (!args.CanInteract || !args.CanAccess || args.Hands == null)
return;
var user = args.User;
// Actual verb stuff
AlternativeVerb verb = new()
{
Act = () =>
{
StartDisassembly(entity, user);
},
Text = Loc.GetString("disassemble-system-verb-disassemble"),
Priority = 2
};
args.Verbs.Add(verb);
}
private void OnDisassembleDoAfter(Entity<DisassembleOnAltVerbComponent> entity, ref DisassembleDoAfterEvent args)
{
if (!_net.IsServer || args.Cancelled) // This is odd but it works :)
return;
if (TrySpawnNextTo(entity.Comp.PrototypeToSpawn, entity.Owner, out var spawnedEnt))
_handsSystem.TryPickup(args.User, spawnedEnt.Value);
QueueDel(entity.Owner);
}
}