]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
tool lock
authorslarticodefast <161409025+slarticodefast@users.noreply.github.com>
Tue, 26 Aug 2025 18:04:10 +0000 (20:04 +0200)
committerslarticodefast <161409025+slarticodefast@users.noreply.github.com>
Tue, 26 Aug 2025 18:04:10 +0000 (20:04 +0200)
Content.Shared/Tools/Components/SimpleToolUsageComponent.cs
Content.Shared/Trigger/Components/Triggers/TriggerOnSimpleToolUsage.cs [new file with mode: 0644]
Content.Shared/Trigger/Systems/TriggerOnToolUseSystem.cs [new file with mode: 0644]
Resources/Locale/en-US/locks/selectable-locks.ftl
Resources/Locale/en-US/locks/voice-trigger-lock.ftl
Resources/Prototypes/Entities/Objects/Specific/locks.yml

index 1f1e9c65f84c54211be4b5e20150cd44bb0ea2b4..a425073ce8fd7e9cf0edce0bcc1b88946c2c2aca 100644 (file)
@@ -8,7 +8,7 @@ namespace Content.Shared.Tools.Components;
 
 /// <summary>
 /// 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 <see cref="SimpleToolDoAfterEvent"/> other systems can subscribe to.
 /// </summary>
 [RegisterComponent, NetworkedComponent]
 [Access(typeof(SimpleToolUsageSystem))]
@@ -40,8 +40,15 @@ public sealed partial class SimpleToolUsageComponent : Component
     public LocId BlockedMessage = "simple-tool-usage-blocked-message";
 }
 
+/// <summary>
+/// Cancelable event that can be used to prevent tool interaction.
+/// </summary>
 [ByRefEvent]
 public record struct AttemptSimpleToolUseEvent(EntityUid User, bool Cancelled = false);
 
+/// <summary>
+/// Raised after the right tool is used on an entity with <see cref="SimpleToolUsageComponent"/>
+/// and the DoAfter has finished.
+/// </summary>
 [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 (file)
index 0000000..ffa60c3
--- /dev/null
@@ -0,0 +1,12 @@
+using Content.Shared.Tools.Components;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Trigger.Components.Triggers;
+
+/// <summary>
+/// Triggers an entity with <see cref="SimpleToolUsageComponent"/> when the correct tool
+/// is used on it and the DoAfter has finished.
+/// The user is the player using the tool.
+/// </summary>
+[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 (file)
index 0000000..01f612a
--- /dev/null
@@ -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<TriggerOnSimpleToolUsageComponent, SimpleToolDoAfterEvent>(OnToolUse);
+    }
+
+    private void OnToolUse(Entity<TriggerOnSimpleToolUsageComponent> ent, ref SimpleToolDoAfterEvent args)
+    {
+        _trigger.Trigger(ent.Owner, args.User, ent.Comp.KeyOut);
+    }
+}
index 3dbf088505a4473aa2e37b88ef2dc0f6357c4aca..574e784dd7060eee3443ec21bbf84b7e41bad710 100644 (file)
@@ -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)}.
index a7069378f85fd938ffe5a17d658db8b1da12b106..fd2dc38d23e40f29de6b01010c822cd6c452b1a0 100644 (file)
@@ -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!
 
index c280c4a60e7d2e6a3c56fa6e02ad9bcc6a0461c1..bcb204cf488b2cdfc9107f942789371cdc6b78d0 100644 (file)
     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
+