using System; using System.Threading.Tasks; using JetBrains.Annotations; using Robust.Shared.Analyzers; using Robust.Shared.GameObjects; using Robust.Shared.Map; namespace Content.Shared.Interfaces.GameObjects.Components { /// /// 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. /// Task InteractUsing(InteractUsingEventArgs eventArgs); } public class InteractUsingEventArgs : EventArgs, ITargetedInteractEventArgs { public IEntity User { get; set; } public EntityCoordinates ClickLocation { get; set; } public IEntity Using { get; set; } public IEntity Target { get; set; } } /// /// Raised when being clicked on or "attacked" by a user with an object in their hand /// [PublicAPI] public class InteractUsingMessage : HandledEntityEventArgs { /// /// Entity that triggered the attack. /// public IEntity User { get; } /// /// Entity that the User attacked with. /// public IEntity ItemInHand { get; } /// /// Entity that was attacked. /// public IEntity Attacked { get; } /// /// The original location that was clicked by the user. /// public EntityCoordinates ClickLocation { get; } public InteractUsingMessage(IEntity user, IEntity itemInHand, IEntity attacked, EntityCoordinates clickLocation) { User = user; ItemInHand = itemInHand; Attacked = attacked; ClickLocation = clickLocation; } } }