using System; using System.Threading.Tasks; using JetBrains.Annotations; using Robust.Shared.Analyzers; using Robust.Shared.GameObjects; using Robust.Shared.Map; namespace Content.Shared.Interaction { /// /// This interface gives components behavior when their entity is clicked on by a user with an object in their hand /// who is in range and has unobstructed reach of the target entity (allows inside blockers). This includes /// clicking on an object in the world as well as clicking on an object in inventory. /// [RequiresExplicitImplementation] public interface IInteractUsing { /// /// The interaction priority. Higher numbers get called first. /// /// Priority defaults to 0 int Priority => 0; /// /// Called when using one object on another when user is in range of the target entity. /// [Obsolete("Use InteractUsingMessage instead")] Task InteractUsing(InteractUsingEventArgs eventArgs); } public class InteractUsingEventArgs : EventArgs, ITargetedInteractEventArgs { public InteractUsingEventArgs(IEntity user, EntityCoordinates clickLocation, IEntity @using, IEntity target) { User = user; ClickLocation = clickLocation; Using = @using; Target = target; } public IEntity User { get; } public EntityCoordinates ClickLocation { get; } public IEntity Using { get; } public IEntity Target { get; } } /// /// Raised when a target entity is interacted with by a user while holding an object in their hand. /// [PublicAPI] public class InteractUsingEvent : HandledEntityEventArgs { /// /// Entity that triggered the interaction. /// public IEntity User { get; } /// /// Entity that the user used to interact. /// public IEntity Used { get; } /// /// Entity that was interacted on. /// public IEntity Target { get; } /// /// The original location that was clicked by the user. /// public EntityCoordinates ClickLocation { get; } public InteractUsingEvent(IEntity user, IEntity used, IEntity target, EntityCoordinates clickLocation) { User = user; Used = used; Target = target; ClickLocation = clickLocation; } } }