using Robust.Shared.GameStates; using Robust.Shared.Serialization; namespace Content.Shared.Buckle.Components; 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 } [NetworkedComponent] [Access(typeof(SharedBuckleSystem))] public abstract class SharedStrapComponent : Component { /// /// The change in position to the strapped mob /// [DataField("position")] public StrapPosition Position { get; set; } = StrapPosition.None; /// /// The entity that is currently buckled here /// public readonly HashSet BuckledEntities = new(); /// /// The distance above which a buckled entity will be automatically unbuckled. /// Don't change it unless you really have to /// [DataField("maxBuckleDistance", required: false)] public float MaxBuckleDistance = 0.1f; /// /// Gets and clamps the buckle offset to MaxBuckleDistance /// public Vector2 BuckleOffset => Vector2.Clamp( BuckleOffsetUnclamped, Vector2.One * -MaxBuckleDistance, Vector2.One * MaxBuckleDistance); /// /// The buckled entity will be offset by this amount from the center of the strap object. /// If this offset it too big, it will be clamped to /// [DataField("buckleOffset", required: false)] [Access(Other = AccessPermissions.ReadWrite)] public Vector2 BuckleOffsetUnclamped = Vector2.Zero; } [Serializable, NetSerializable] public sealed class StrapComponentState : ComponentState { /// /// The change in position that this strap makes to the strapped mob /// public StrapPosition Position; public float MaxBuckleDistance; public Vector2 BuckleOffsetClamped; public HashSet BuckledEntities; public StrapComponentState(StrapPosition position, Vector2 offset, HashSet buckled, float maxBuckleDistance) { Position = position; BuckleOffsetClamped = offset; BuckledEntities = buckled; MaxBuckleDistance = maxBuckleDistance; } } [Serializable, NetSerializable] public enum StrapVisuals : byte { RotationAngle, State }