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