#nullable enable using System; using Content.Shared.GameObjects.Components.Buckle; using Content.Shared.Interfaces.GameObjects.Components; using Content.Shared.Utility; using Robust.Shared.GameObjects; using Robust.Shared.Serialization; namespace Content.Shared.GameObjects.Components.Strap { public enum StrapPosition { /// /// (Default) Makes no change to the buckled mob /// None = 0, /// /// Makes the mob stand up /// Stand, /// /// Makes the mob lie down /// Down } public abstract class SharedStrapComponent : Component, IDragDropOn { public sealed override string Name => "Strap"; public sealed override uint? NetID => ContentNetIDs.STRAP; bool IDragDropOn.CanDragDropOn(DragDropEventArgs eventArgs) { if (!eventArgs.Dragged.TryGetComponent(out SharedBuckleComponent? buckleComponent)) return false; bool Ignored(IEntity entity) => entity == eventArgs.User || entity == eventArgs.Dragged || entity == eventArgs.Target; return eventArgs.Target.InRangeUnobstructed(eventArgs.Dragged, buckleComponent.Range, predicate: Ignored); } public abstract bool DragDropOn(DragDropEventArgs eventArgs); } [Serializable, NetSerializable] public sealed class StrapComponentState : ComponentState { public StrapComponentState(StrapPosition position) : base(ContentNetIDs.BUCKLE) { Position = position; } /// /// The change in position that this strap makes to the strapped mob /// public StrapPosition Position { get; } } [Serializable, NetSerializable] public enum StrapVisuals { RotationAngle } [Serializable, NetSerializable] public abstract class StrapChangeMessage : ComponentMessage { /// /// Constructs a new instance of /// /// The entity that had its buckling status changed /// The strap that the entity was buckled to or unbuckled from /// True if the entity was buckled, false otherwise protected StrapChangeMessage(IEntity entity, IEntity strap, bool buckled) { Entity = entity; Strap = strap; Buckled = buckled; } /// /// The entity that had its buckling status changed /// public IEntity Entity { get; } /// /// The strap that the entity was buckled to or unbuckled from /// public IEntity Strap { get; } /// /// True if the entity was buckled, false otherwise. /// public bool Buckled { get; } } [Serializable, NetSerializable] public class StrapMessage : StrapChangeMessage { /// /// Constructs a new instance of /// /// The entity that had its buckling status changed /// The strap that the entity was buckled to or unbuckled from public StrapMessage(IEntity entity, IEntity strap) : base(entity, strap, true) { } } [Serializable, NetSerializable] public class UnStrapMessage : StrapChangeMessage { /// /// Constructs a new instance of /// /// The entity that had its buckling status changed /// The strap that the entity was buckled to or unbuckled from public UnStrapMessage(IEntity entity, IEntity strap) : base(entity, strap, false) { } } }