diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs index b9919185c9..f1ecab7456 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs @@ -40,8 +40,9 @@ namespace Content.Server.GameObjects.Components.Disposal { [RegisterComponent] [ComponentReference(typeof(SharedDisposalUnitComponent))] + [ComponentReference(typeof(IActivate))] [ComponentReference(typeof(IInteractUsing))] - public class DisposalUnitComponent : SharedDisposalUnitComponent, IInteractHand, IInteractUsing, IDragDropOn + public class DisposalUnitComponent : SharedDisposalUnitComponent, IInteractHand, IActivate, IInteractUsing, IDragDropOn { [Dependency] private readonly IGameTiming _gameTiming = default!; @@ -610,8 +611,8 @@ namespace Content.Server.GameObjects.Components.Disposal break; } } - - bool IInteractHand.InteractHand(InteractHandEventArgs eventArgs) + + bool IsValidInteraction(ITargetedInteractEventArgs eventArgs) { if (!ActionBlockerSystem.CanInteract(eventArgs.User)) { @@ -624,11 +625,7 @@ namespace Content.Server.GameObjects.Components.Disposal Owner.PopupMessage(eventArgs.User, Loc.GetString("You can't reach there!")); return false; } - - if (!eventArgs.User.TryGetComponent(out IActorComponent? actor)) - { - return false; - } + // This popup message doesn't appear on clicks, even when code was seperate. Unsure why. if (!eventArgs.User.HasComponent()) { @@ -636,10 +633,43 @@ namespace Content.Server.GameObjects.Components.Disposal return false; } - UserInterface?.Open(actor.playerSession); return true; } + + bool IInteractHand.InteractHand(InteractHandEventArgs eventArgs) + { + if (!eventArgs.User.TryGetComponent(out IActorComponent? actor)) + { + return false; + } + // Duplicated code here, not sure how else to get actor inside to make UserInterface happy. + + if (IsValidInteraction(eventArgs)) + { + UserInterface?.Open(actor.playerSession); + return true; + } + + return false; + } + + void IActivate.Activate(ActivateEventArgs eventArgs) + { + if (!eventArgs.User.TryGetComponent(out IActorComponent? actor)) + { + return; + } + + if (IsValidInteraction(eventArgs)) + { + UserInterface?.Open(actor.playerSession); + } + + return; + } + + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { return TryDrop(eventArgs.User, eventArgs.Using);