From 66ada0ed93da5595802ab05dc146f42a768c2fa0 Mon Sep 17 00:00:00 2001 From: Vanessa Date: Fri, 21 Nov 2025 15:50:52 -0600 Subject: [PATCH] Ported base implementation of SimpleToolSystem. --- .../Tools/Systems/SimpleToolUsageSystem.cs | 79 +++++++++++++++++++ .../Locale/en-US/tools/simple-tool-usage.ftl | 1 + 2 files changed, 80 insertions(+) create mode 100644 Content.Shared/Tools/Systems/SimpleToolUsageSystem.cs create mode 100644 Resources/Locale/en-US/tools/simple-tool-usage.ftl diff --git a/Content.Shared/Tools/Systems/SimpleToolUsageSystem.cs b/Content.Shared/Tools/Systems/SimpleToolUsageSystem.cs new file mode 100644 index 00000000000..0f7da9af8a0 --- /dev/null +++ b/Content.Shared/Tools/Systems/SimpleToolUsageSystem.cs @@ -0,0 +1,79 @@ +using Content.Shared.DoAfter; +using Content.Shared.Interaction; +using Content.Shared.Tools.Components; +using Content.Shared.Verbs; +using Robust.Shared.Utility; + +namespace Content.Shared.Tools.Systems; + +public sealed partial class SimpleToolUsageSystem : EntitySystem +{ + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly SharedToolSystem _tools = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAfterInteract); + SubscribeLocalEvent>(OnGetInteractionVerbs); + } + + private void OnAfterInteract(Entity ent, ref AfterInteractUsingEvent args) + { + if (!args.CanReach || args.Handled) + return; + + if (!_tools.HasQuality(args.Used, ent.Comp.Quality)) + return; + + AttemptToolUsage(ent, args.User, args.Used); + } + + public void OnGetInteractionVerbs(Entity ent, ref GetVerbsEvent args) + { + if (ent.Comp.UsageVerb == null) + return; + + if (!args.CanAccess || !args.CanInteract) + return; + + var disabled = args.Using == null || !_tools.HasQuality(args.Using.Value, ent.Comp.Quality); + + var used = args.Using; + var user = args.User; + + InteractionVerb verb = new() + { + Act = () => + { + if (used != null) + AttemptToolUsage(ent, user, used.Value); + }, + Disabled = disabled, + Message = disabled ? Loc.GetString(ent.Comp.BlockedMessage, ("quality", ent.Comp.Quality)) : null, + Text = Loc.GetString(ent.Comp.UsageVerb), + }; + + args.Verbs.Add(verb); + } + + private void AttemptToolUsage(Entity ent, EntityUid user, EntityUid tool) + { + var attemptEv = new AttemptSimpleToolUseEvent(user); + RaiseLocalEvent(ent, ref attemptEv); + + if (attemptEv.Cancelled) + return; + + var doAfterArgs = new DoAfterArgs(EntityManager, user, ent.Comp.DoAfter, new SimpleToolDoAfterEvent(), ent, tool) + { + BreakOnDamage = true, + BreakOnDropItem = true, + BreakOnMove = true, + BreakOnHandChange = true, + }; + + _doAfterSystem.TryStartDoAfter(doAfterArgs); + } +} diff --git a/Resources/Locale/en-US/tools/simple-tool-usage.ftl b/Resources/Locale/en-US/tools/simple-tool-usage.ftl new file mode 100644 index 00000000000..fd6ae49d224 --- /dev/null +++ b/Resources/Locale/en-US/tools/simple-tool-usage.ftl @@ -0,0 +1 @@ +simple-tool-usage-blocked-message = You need a tool that can perform {$quality}!