diff --git a/Content.Client/Hands/Systems/HandsSystem.cs b/Content.Client/Hands/Systems/HandsSystem.cs index daed0371cd..eb9978039b 100644 --- a/Content.Client/Hands/Systems/HandsSystem.cs +++ b/Content.Client/Hands/Systems/HandsSystem.cs @@ -242,6 +242,16 @@ namespace Content.Client.Hands.Systems _verbs.VerbMenu.OpenVerbMenu(entity); } + + public void UIHandAltActivateItem(string handName) + { + if (!TryGetPlayerHands(out var hands) + || !hands.Hands.TryGetValue(handName, out var hand) + || hand.HeldEntity is not { Valid: true } entity) + return; + + EntityManager.RaisePredictiveEvent(new RequestHandAltInteractEvent(entity)); + } #region visuals diff --git a/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs b/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs index 9ee4bc4b18..55a3aa9f5b 100644 --- a/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs +++ b/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs @@ -69,17 +69,25 @@ public sealed class HandsUIController : UIController, IOnStateEntered(HandleInteractUsingInHand); SubscribeAllEvent(HandleUseInHand); SubscribeAllEvent(HandleMoveItemFromHand); + SubscribeAllEvent(HandleHandAltInteract); SubscribeLocalEvent(HandleExamined); @@ -65,6 +66,12 @@ public abstract partial class SharedHandsSystem : EntitySystem TryInteractHandWithActiveHand(args.SenderSession.AttachedEntity.Value, msg.HandName); } + private void HandleHandAltInteract(RequestHandAltInteractEvent msg, EntitySessionEventArgs args) + { + if (args.SenderSession.AttachedEntity != null) + TryUseItemInHand(args.SenderSession.AttachedEntity.Value, true); + } + private void SwapHandsPressed(ICommonSession? session) { if (!TryComp(session?.AttachedEntity, out SharedHandsComponent? component)) diff --git a/Content.Shared/Hands/HandEvents.cs b/Content.Shared/Hands/HandEvents.cs index 881c420437..f767336b9e 100644 --- a/Content.Shared/Hands/HandEvents.cs +++ b/Content.Shared/Hands/HandEvents.cs @@ -267,6 +267,20 @@ namespace Content.Shared.Hands } } + /// + /// Event raised by a client when they want to alt interact with the item currently in their hands. + /// + [Serializable, NetSerializable] + public sealed class RequestHandAltInteractEvent : EntityEventArgs + { + public EntityUid Entity { get; } + + public RequestHandAltInteractEvent(EntityUid entity) + { + Entity = entity; + } + } + public sealed class HandCountChangedEvent : EntityEventArgs { public HandCountChangedEvent(EntityUid sender)