private void AddFlipVerb(EntityUid uid, FlippableComponent component, GetVerbsEvent<Verb> args)
{
- if (!args.CanAccess || !args.CanInteract)
+ if (!args.CanAccess
+ || !args.CanInteract
+ || !args.CanComplexInteract)
return;
// Check if the object is anchored.
{
if (!args.CanAccess
|| !args.CanInteract
+ || !args.CanComplexInteract
|| Transform(uid).NoLocalRotation) // Good ol prototype inheritance, eh?
return;
if (!TryComp<RotatableComponent>(entity, out var rotatableComp))
return false;
- if (!_actionBlocker.CanInteract(player, entity) || !_interaction.InRangeAndAccessible(player, entity))
+ if (!_actionBlocker.CanInteract(player, entity)
+ || !_actionBlocker.CanComplexInteract(player)
+ || !_interaction.InRangeAndAccessible(player, entity))
return false;
// Check if the object is anchored, and whether we are still allowed to rotate it.
if (!TryComp<RotatableComponent>(entity, out var rotatableComp))
return false;
- if (!_actionBlocker.CanInteract(player, entity) || !_interaction.InRangeAndAccessible(player, entity))
+ if (!_actionBlocker.CanInteract(player, entity)
+ || !_actionBlocker.CanComplexInteract(player)
+ || !_interaction.InRangeAndAccessible(player, entity))
return false;
// Check if the object is anchored, and whether we are still allowed to rotate it.
if (!TryComp<FlippableComponent>(entity, out var flippableComp))
return false;
- if (!_actionBlocker.CanInteract(player, entity) || !_interaction.InRangeAndAccessible(player, entity))
+ if (!_actionBlocker.CanInteract(player, entity)
+ || !_actionBlocker.CanComplexInteract(player)
+ || !_interaction.InRangeAndAccessible(player, entity))
return false;
// Check if the object is anchored.
private void OnActivate(EntityUid uid, EmitterComponent component, ActivateInWorldEvent args)
{
- if (args.Handled)
+ if (args.Handled || !args.Complex)
return;
if (TryComp(uid, out LockComponent? lockComp) && lockComp.Locked)
private void OnGetVerb(EntityUid uid, EmitterComponent component, GetVerbsEvent<Verb> args)
{
- if (!args.CanAccess || !args.CanInteract || args.Hands == null)
+ if (!args.CanAccess || !args.CanInteract || !args.CanComplexInteract || args.Hands == null)
return;
if (TryComp<LockComponent>(uid, out var lockComp) && lockComp.Locked)
private void OnActivate(EntityUid uid, RadiationCollectorComponent component, ActivateInWorldEvent args)
{
+ if (!args.Complex)
+ return;
+
if (TryComp(uid, out UseDelayComponent? useDelay) && !_useDelay.TryResetDelay((uid, useDelay), true))
return;
SubscribeLocalEvent<StunbatonComponent, ExaminedEvent>(OnExamined);
SubscribeLocalEvent<StunbatonComponent, SolutionContainerChangedEvent>(OnSolutionChange);
SubscribeLocalEvent<StunbatonComponent, StaminaDamageOnHitAttemptEvent>(OnStaminaHitAttempt);
- SubscribeLocalEvent<StunbatonComponent, ItemToggleActivateAttemptEvent>(TryTurnOn);
SubscribeLocalEvent<StunbatonComponent, ChargeChangedEvent>(OnChargeChanged);
}
}
}
- private void TryTurnOn(Entity<StunbatonComponent> entity, ref ItemToggleActivateAttemptEvent args)
+ protected override void TryTurnOn(Entity<StunbatonComponent> entity, ref ItemToggleActivateAttemptEvent args)
{
+ base.TryTurnOn(entity, ref args);
+
if (!TryComp<BatteryComponent>(entity, out var battery) || battery.CurrentCharge < entity.Comp.EnergyPerUse)
{
args.Cancelled = true;
private void AddVerbs(EntityUid uid, SurveillanceCameraRouterComponent component, GetVerbsEvent<AlternativeVerb> verbs)
{
- if (!_actionBlocker.CanInteract(verbs.User, uid))
+ if (!_actionBlocker.CanInteract(verbs.User, uid) || !_actionBlocker.CanComplexInteract(verbs.User))
{
return;
}
private void AddVerbs(EntityUid uid, SurveillanceCameraComponent component, GetVerbsEvent<AlternativeVerb> verbs)
{
- if (!_actionBlocker.CanInteract(verbs.User, uid))
+ if (!_actionBlocker.CanInteract(verbs.User, uid) || !_actionBlocker.CanComplexInteract(verbs.User))
{
return;
}
using System.Diagnostics.CodeAnalysis;
using System.Numerics;
using Content.Shared.Alert;
+using Content.Shared.ActionBlocker;
using Content.Shared.Buckle.Components;
using Content.Shared.Cuffs.Components;
using Content.Shared.Database;
public static ProtoId<AlertCategoryPrototype> BuckledAlertCategory = "Buckled";
[Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
+ [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
private void InitializeBuckle()
{
if (_gameTiming.CurTime < buckle.Comp.BuckleTime + buckle.Comp.Delay)
return false;
- if (user != null && !_interaction.InRangeUnobstructed(user.Value, strap.Owner, buckle.Comp.Range, popup: popup))
- return false;
+ if (user != null)
+ {
+ if (!_interaction.InRangeUnobstructed(user.Value, strap.Owner, buckle.Comp.Range, popup: popup))
+ return false;
+
+ if (user.Value != buckle.Owner && !_actionBlocker.CanComplexInteract(user.Value))
+ return false;
+ }
var unbuckleAttempt = new UnbuckleAttemptEvent(strap, buckle!, user, popup);
RaiseLocalEvent(buckle, ref unbuckleAttempt);
}
else
{
+ if (!TryComp(args.Dragged, out BuckleComponent? buckle) ||
+ !CanBuckle(args.Dragged, args.User, uid, true, out var _, buckle))
+ return;
+
var doAfterArgs = new DoAfterArgs(EntityManager, args.User, component.BuckleDoafterTime, new BuckleDoAfterEvent(), args.Dragged, args.Dragged, uid)
{
BreakOnMove = true,
if (!args.CanAccess || !args.CanInteract || !component.Buckled)
return;
+ if (!CanUnbuckle((uid, component), args.User, false))
+ return;
+
InteractionVerb verb = new()
{
Act = () => TryUnbuckle(uid, args.User, buckleComp: component),
private void AddToggleLockVerb(EntityUid uid, LockComponent component, GetVerbsEvent<AlternativeVerb> args)
{
- if (!args.CanAccess || !args.CanInteract)
+ if (!args.CanAccess || !args.CanInteract || !args.CanComplexInteract)
return;
AlternativeVerb verb = new()
+using Content.Shared.ActionBlocker;
+using Content.Shared.Item.ItemToggle.Components;
+
namespace Content.Shared.Stunnable;
public abstract class SharedStunbatonSystem : EntitySystem
{
+ [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
+
public override void Initialize()
{
base.Initialize();
+
+ SubscribeLocalEvent<StunbatonComponent, ItemToggleActivateAttemptEvent>(TryTurnOn);
+ SubscribeLocalEvent<StunbatonComponent, ItemToggleDeactivateAttemptEvent>(TryTurnOff);
+ }
+
+ protected virtual void TryTurnOn(Entity<StunbatonComponent> entity, ref ItemToggleActivateAttemptEvent args)
+ {
+ if (args.User != null && !_actionBlocker.CanComplexInteract(args.User.Value)) {
+ args.Cancelled = true;
+ return;
+ }
+ }
+
+ protected virtual void TryTurnOff(Entity<StunbatonComponent> entity, ref ItemToggleDeactivateAttemptEvent args)
+ {
+ if (args.User != null && !_actionBlocker.CanComplexInteract(args.User.Value)) {
+ args.Cancelled = true;
+ return;
+ }
}
}
+using Content.Shared.ActionBlocker;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Components.SolutionManager;
using Content.Shared.Database;
public abstract partial class SharedToolSystem
{
+ [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
+
public void InitializeWelder()
{
SubscribeLocalEvent<WelderComponent, ExaminedEvent>(OnWelderExamine);
SubscribeLocalEvent<WelderComponent, ItemToggledEvent>(OnToggle);
SubscribeLocalEvent<WelderComponent, ItemToggleActivateAttemptEvent>(OnActivateAttempt);
+ SubscribeLocalEvent<WelderComponent, ItemToggleDeactivateAttemptEvent>(OnDeactivateAttempt);
}
public void TurnOn(Entity<WelderComponent> entity, EntityUid? user)
private void OnActivateAttempt(Entity<WelderComponent> entity, ref ItemToggleActivateAttemptEvent args)
{
+ if (args.User != null && !_actionBlocker.CanComplexInteract(args.User.Value)) {
+ args.Cancelled = true;
+ return;
+ }
+
if (!SolutionContainerSystem.TryGetSolution(entity.Owner, entity.Comp.FuelSolutionName, out _, out var solution))
{
args.Cancelled = true;
args.Cancelled = true;
}
}
+
+ private void OnDeactivateAttempt(Entity<WelderComponent> entity, ref ItemToggleDeactivateAttemptEvent args)
+ {
+ if (args.User != null && !_actionBlocker.CanComplexInteract(args.User.Value)) {
+ args.Cancelled = true;
+ return;
+ }
+ }
}
/// </summary>
private void OnChamberActivationVerb(EntityUid uid, ChamberMagazineAmmoProviderComponent component, GetVerbsEvent<ActivationVerb> args)
{
- if (!args.CanAccess || !args.CanInteract || component.BoltClosed == null || !component.CanRack)
+ if (!args.CanAccess || !args.CanInteract || !args.CanComplexInteract || args.Hands == null || component.BoltClosed == null || !component.CanRack)
return;
args.Verbs.Add(new ActivationVerb()
/// </summary>
private void OnChamberInteractionVerb(EntityUid uid, ChamberMagazineAmmoProviderComponent component, GetVerbsEvent<InteractionVerb> args)
{
- if (!args.CanAccess || !args.CanInteract || component.BoltClosed == null)
+ if (!args.CanAccess || !args.CanInteract || !args.CanComplexInteract || args.Hands == null || component.BoltClosed == null)
return;
args.Verbs.Add(new InteractionVerb()
private void OnAltVerb(EntityUid uid, GunComponent component, GetVerbsEvent<AlternativeVerb> args)
{
- if (!args.CanAccess || !args.CanInteract || component.SelectedMode == component.AvailableModes)
+ if (!args.CanAccess || !args.CanInteract || !args.CanComplexInteract || args.Hands == null || component.SelectedMode == component.AvailableModes)
return;
var nextMode = GetNextMode(component);