tool lock

This commit is contained in:
slarticodefast
2025-08-26 20:04:10 +02:00
parent 4505f61ff2
commit f4056e854b
6 changed files with 95 additions and 13 deletions

View File

@@ -8,7 +8,7 @@ namespace Content.Shared.Tools.Components;
/// <summary> /// <summary>
/// Component responsible for simple tool interactions. /// 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> /// </summary>
[RegisterComponent, NetworkedComponent] [RegisterComponent, NetworkedComponent]
[Access(typeof(SimpleToolUsageSystem))] [Access(typeof(SimpleToolUsageSystem))]
@@ -40,8 +40,15 @@ public sealed partial class SimpleToolUsageComponent : Component
public LocId BlockedMessage = "simple-tool-usage-blocked-message"; public LocId BlockedMessage = "simple-tool-usage-blocked-message";
} }
/// <summary>
/// Cancelable event that can be used to prevent tool interaction.
/// </summary>
[ByRefEvent] [ByRefEvent]
public record struct AttemptSimpleToolUseEvent(EntityUid User, bool Cancelled = false); 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] [Serializable, NetSerializable]
public sealed partial class SimpleToolDoAfterEvent : SimpleDoAfterEvent; public sealed partial class SimpleToolDoAfterEvent : SimpleDoAfterEvent;

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -1,3 +1,16 @@
selectable-lock-verb-category-name = Add lock 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)}.

View 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-record = Record lock phrase
voice-trigger-lock-verb-message = Locking the item will disable features that reveal its true nature! voice-trigger-lock-verb-message = Locking the item will disable features that reveal its true nature!

View File

@@ -15,18 +15,46 @@
lockTime: 0 lockTime: 0
unlockTime: 0 unlockTime: 0
- type: LockOnTrigger - type: LockOnTrigger
keysIn: [ lock ]
- type: SelectableComponentAdder - type: SelectableComponentAdder
selections: 1 selections: 1
verbCategoryName: selectable-lock-verb-category-name
entries: entries:
- verbName: selectable-lock-verb-no-lock - verbName: selectable-lock-tool-prying-verb
popup: selectable-lock-verb-no-lock-popup popup: selectable-lock-tool-prying-popup
priority: 0 priority: 4
componentsToAdd: null componentsToAdd:
- verbName: voice-trigger-lock-add-verb - type: TriggerOnSimpleToolUsage
popup: voice-trigger-lock-add-verb-popup 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 priority: 1
componentsToAdd: componentsToAdd:
- type: TriggerOnVoice - type: TriggerOnVoice
keyOut: lock
listenRange: 2 # more fun listenRange: 2 # more fun
startRecordingVerb: voice-trigger-lock-verb-record startRecordingVerb: voice-trigger-lock-verb-record
recordingVerbMessage: voice-trigger-lock-verb-message recordingVerbMessage: voice-trigger-lock-verb-message
@@ -34,4 +62,8 @@
inspectInitializedLoc: voice-trigger-lock-on-examine inspectInitializedLoc: voice-trigger-lock-on-examine
- type: ActiveListener - type: ActiveListener
- type: VoiceTriggerLock - type: VoiceTriggerLock
verbCategoryName: selectable-lock-verb-category-name - verbName: selectable-lock-no-lock-verb
popup: selectable-lock-no-lock-popup
priority: 0
componentsToAdd: null