From f4056e854b2ffc21f047dc52836d5ee720757e3d Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Tue, 26 Aug 2025 20:04:10 +0200 Subject: [PATCH] tool lock --- .../Components/SimpleToolUsageComponent.cs | 9 +++- .../Triggers/TriggerOnSimpleToolUsage.cs | 12 +++++ .../Trigger/Systems/TriggerOnToolUseSystem.cs | 21 +++++++++ .../Locale/en-US/locks/selectable-locks.ftl | 17 ++++++- .../Locale/en-US/locks/voice-trigger-lock.ftl | 3 -- .../Entities/Objects/Specific/locks.yml | 46 ++++++++++++++++--- 6 files changed, 95 insertions(+), 13 deletions(-) create mode 100644 Content.Shared/Trigger/Components/Triggers/TriggerOnSimpleToolUsage.cs create mode 100644 Content.Shared/Trigger/Systems/TriggerOnToolUseSystem.cs diff --git a/Content.Shared/Tools/Components/SimpleToolUsageComponent.cs b/Content.Shared/Tools/Components/SimpleToolUsageComponent.cs index 1f1e9c65f8..a425073ce8 100644 --- a/Content.Shared/Tools/Components/SimpleToolUsageComponent.cs +++ b/Content.Shared/Tools/Components/SimpleToolUsageComponent.cs @@ -8,7 +8,7 @@ namespace Content.Shared.Tools.Components; /// /// Component responsible for simple tool interactions. -/// Using a tool with the correct quality on an entity with this component will start a doAfter and raise events. +/// Using a tool with the correct quality on an entity with this component will start a DoAfter and raise the other systems can subscribe to. /// [RegisterComponent, NetworkedComponent] [Access(typeof(SimpleToolUsageSystem))] @@ -40,8 +40,15 @@ public sealed partial class SimpleToolUsageComponent : Component public LocId BlockedMessage = "simple-tool-usage-blocked-message"; } +/// +/// Cancelable event that can be used to prevent tool interaction. +/// [ByRefEvent] public record struct AttemptSimpleToolUseEvent(EntityUid User, bool Cancelled = false); +/// +/// Raised after the right tool is used on an entity with +/// and the DoAfter has finished. +/// [Serializable, NetSerializable] public sealed partial class SimpleToolDoAfterEvent : SimpleDoAfterEvent; diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnSimpleToolUsage.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnSimpleToolUsage.cs new file mode 100644 index 0000000000..ffa60c35ee --- /dev/null +++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnSimpleToolUsage.cs @@ -0,0 +1,12 @@ +using Content.Shared.Tools.Components; +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Triggers; + +/// +/// Triggers an entity with when the correct tool +/// is used on it and the DoAfter has finished. +/// The user is the player using the tool. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TriggerOnSimpleToolUsageComponent : BaseTriggerOnXComponent; diff --git a/Content.Shared/Trigger/Systems/TriggerOnToolUseSystem.cs b/Content.Shared/Trigger/Systems/TriggerOnToolUseSystem.cs new file mode 100644 index 0000000000..01f612aadf --- /dev/null +++ b/Content.Shared/Trigger/Systems/TriggerOnToolUseSystem.cs @@ -0,0 +1,21 @@ +using Content.Shared.Tools.Components; +using Content.Shared.Trigger.Components.Triggers; + +namespace Content.Shared.Trigger.Systems; + +public sealed class TriggerOnToolUseSystem : EntitySystem +{ + [Dependency] private readonly TriggerSystem _trigger = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnToolUse); + } + + private void OnToolUse(Entity ent, ref SimpleToolDoAfterEvent args) + { + _trigger.Trigger(ent.Owner, args.User, ent.Comp.KeyOut); + } +} diff --git a/Resources/Locale/en-US/locks/selectable-locks.ftl b/Resources/Locale/en-US/locks/selectable-locks.ftl index 3dbf088505..574e784dd7 100644 --- a/Resources/Locale/en-US/locks/selectable-locks.ftl +++ b/Resources/Locale/en-US/locks/selectable-locks.ftl @@ -1,3 +1,16 @@ selectable-lock-verb-category-name = Add lock -selectable-lock-verb-no-lock = No lock -selectable-lock-verb-no-lock-popup = No lock has been added to {THE($target)}. + +selectable-lock-no-lock-verb = No lock +selectable-lock-no-lock-popup = No lock has been added to {THE($target)}. + +selectable-lock-voice-verb = Voice Lock +selectable-lock-voice-popup = A voice lock has been added to {THE($target)}. + +selectable-lock-tool-prying-verb = Tool Lock (Crowbar) +selectable-lock-tool-prying-popup = A prying tool lock has been added to {THE($target)}. + +selectable-lock-tool-screwing-verb = Tool Lock (Screwdriver) +selectable-lock-tool-screwing-popup = A screwing tool lock has been added to {THE($target)}. + +selectable-lock-tool-cutting-verb = Tool Lock (Wirecutter) +selectable-lock-tool-cutting-popup = A cutting tool lock has been added to {THE($target)}. diff --git a/Resources/Locale/en-US/locks/voice-trigger-lock.ftl b/Resources/Locale/en-US/locks/voice-trigger-lock.ftl index a7069378f8..fd2dc38d23 100644 --- a/Resources/Locale/en-US/locks/voice-trigger-lock.ftl +++ b/Resources/Locale/en-US/locks/voice-trigger-lock.ftl @@ -1,6 +1,3 @@ -voice-trigger-lock-add-verb = Voice Lock -voice-trigger-lock-add-verb-popup = A voice lock has been added to {THE($target)}. - voice-trigger-lock-verb-record = Record lock phrase voice-trigger-lock-verb-message = Locking the item will disable features that reveal its true nature! diff --git a/Resources/Prototypes/Entities/Objects/Specific/locks.yml b/Resources/Prototypes/Entities/Objects/Specific/locks.yml index c280c4a60e..bcb204cf48 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/locks.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/locks.yml @@ -15,18 +15,46 @@ lockTime: 0 unlockTime: 0 - type: LockOnTrigger + keysIn: [ lock ] - type: SelectableComponentAdder selections: 1 + verbCategoryName: selectable-lock-verb-category-name entries: - - verbName: selectable-lock-verb-no-lock - popup: selectable-lock-verb-no-lock-popup - priority: 0 - componentsToAdd: null - - verbName: voice-trigger-lock-add-verb - popup: voice-trigger-lock-add-verb-popup + - verbName: selectable-lock-tool-prying-verb + popup: selectable-lock-tool-prying-popup + priority: 4 + componentsToAdd: + - type: TriggerOnSimpleToolUsage + keyOut: lock + - type: SimpleToolUsage + quality: Prying + doAfter: 1 + - verbName: selectable-lock-tool-screwing-verb + popup: selectable-lock-tool-screwing-popup + priority: 3 + componentsToAdd: + - type: TriggerOnSimpleToolUsage + keyOut: lock + - type: SimpleToolUsage + quality: Screwing + doAfter: 1 + - verbName: selectable-lock-tool-cutting-verb + popup: selectable-lock-tool-cutting-popup + priority: 2 + componentsToAdd: + - type: TriggerOnSimpleToolUsage + keyOut: lock + - type: SimpleToolUsage + quality: Cutting + doAfter: 1 + # no anchoring since some objects might be anchorable + # no pulsing because it conflicts with the linking ability of the multitool + - verbName: selectable-lock-voice-verb + popup: selectable-lock-voice-popup priority: 1 componentsToAdd: - type: TriggerOnVoice + keyOut: lock listenRange: 2 # more fun startRecordingVerb: voice-trigger-lock-verb-record recordingVerbMessage: voice-trigger-lock-verb-message @@ -34,4 +62,8 @@ inspectInitializedLoc: voice-trigger-lock-on-examine - type: ActiveListener - type: VoiceTriggerLock - verbCategoryName: selectable-lock-verb-category-name + - verbName: selectable-lock-no-lock-verb + popup: selectable-lock-no-lock-popup + priority: 0 + componentsToAdd: null + -- 2.51.2