using System.Threading.Tasks; using JetBrains.Annotations; using Robust.Shared.Map; using Robust.Shared.Utility; 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 sealed class InteractUsingEventArgs : EventArgs, ITargetedInteractEventArgs { public InteractUsingEventArgs(EntityUid user, EntityCoordinates clickLocation, EntityUid @using, EntityUid target) { User = user; ClickLocation = clickLocation; Using = @using; Target = target; } public EntityUid User { get; } public EntityCoordinates ClickLocation { get; } public EntityUid Using { get; } public EntityUid Target { get; } } /// /// Raised when a target entity is interacted with by a user while holding an object in their hand. /// [PublicAPI] public sealed class InteractUsingEvent : HandledEntityEventArgs { /// /// Entity that triggered the interaction. /// public EntityUid User { get; } /// /// Entity that the user used to interact. /// public EntityUid Used { get; } /// /// Entity that was interacted on. /// public EntityUid Target { get; } /// /// The original location that was clicked by the user. /// public EntityCoordinates ClickLocation { get; } public InteractUsingEvent(EntityUid user, EntityUid used, EntityUid target, EntityCoordinates clickLocation) { // Interact using should not have the same used and target. // That should be a use-in-hand event instead. // If this is not the case, can lead to bugs (e.g., attempting to merge a item stack into itself). DebugTools.Assert(used != target); User = user; Used = used; Target = target; ClickLocation = clickLocation; } } }