using System; using JetBrains.Annotations; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Map; namespace Content.Shared.Interfaces.GameObjects.Components { /// /// This interface gives components a behavior when clicking on another object and no interaction occurs, /// at any range. /// public interface IAfterInteract { /// /// Called when we interact with nothing, or when we interact with an entity out of range that has no behavior /// void AfterInteract(AfterInteractEventArgs eventArgs); } public class AfterInteractEventArgs : EventArgs { public IEntity User { get; set; } public GridCoordinates ClickLocation { get; set; } public IEntity Target { get; set; } public bool CanReach { get; set; } } /// /// Raised when clicking on another object and no attack event was handled. /// [PublicAPI] public class AfterInteractMessage : EntitySystemMessage { /// /// If this message has already been "handled" by a previous system. /// public bool Handled { get; set; } /// /// Entity that triggered the attack. /// public IEntity User { get; } /// /// Entity that the User attacked with. /// public IEntity ItemInHand { get; set; } /// /// Entity that was attacked. This can be null if the attack did not click on an entity. /// public IEntity Attacked { get; } /// /// Location that the user clicked outside of their interaction range. /// public GridCoordinates ClickLocation { get; } /// /// Is the click location close enough to reach by the player? This does not check for obstructions, just that the target is within /// reach radius around the user. /// public bool CanReach { get; } public AfterInteractMessage(IEntity user, IEntity itemInHand, IEntity attacked, GridCoordinates clickLocation, bool canReach) { User = user; Attacked = attacked; ClickLocation = clickLocation; ItemInHand = itemInHand; CanReach = canReach; } } }