#nullable enable using System; using Content.Shared.GameObjects.Components.Strap; using Content.Shared.GameObjects.EntitySystems; using Content.Shared.GameObjects.EntitySystems.ActionBlocker; using Content.Shared.GameObjects.EntitySystems.EffectBlocker; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.ComponentDependencies; using Robust.Shared.GameObjects.Components; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Physics; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; namespace Content.Shared.GameObjects.Components.Buckle { public abstract class SharedBuckleComponent : Component, IActionBlocker, IEffectBlocker, IDraggable, ICollideSpecial { public sealed override string Name => "Buckle"; public sealed override uint? NetID => ContentNetIDs.BUCKLE; /// /// The range from which this entity can buckle to a . /// [ViewVariables] public float Range { get; protected set; } public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); serializer.DataReadWriteFunction("range", SharedInteractionSystem.InteractionRange / 1.4f, value => Range = value, () => Range); } /// /// True if the entity is buckled, false otherwise. /// public abstract bool Buckled { get; } public EntityUid? LastEntityBuckledTo { get; set; } public bool IsOnStrapEntityThisFrame { get; set; } public bool DontCollide { get; set; } public abstract bool TryBuckle(IEntity user, IEntity to); [ComponentDependency] protected IPhysicsComponent? Body; bool ICollideSpecial.PreventCollide(IPhysBody collidedwith) { if (collidedwith.Entity.Uid == LastEntityBuckledTo) { IsOnStrapEntityThisFrame = true; return Buckled || DontCollide; } return false; } bool IActionBlocker.CanMove() { return !Buckled; } public override void Initialize() { base.Initialize(); Owner.TryGetComponent(out Body); } bool IActionBlocker.CanChangeDirection() { return !Buckled; } bool IEffectBlocker.CanFall() { return !Buckled; } bool IDraggable.CanDrop(CanDropEventArgs args) { return args.Target.HasComponent(); } bool IDraggable.Drop(DragDropEventArgs args) { return TryBuckle(args.User, args.Target); } } [Serializable, NetSerializable] public sealed class BuckleComponentState : ComponentState { public BuckleComponentState(bool buckled, int? drawDepth, EntityUid? lastEntityBuckledTo, bool dontCollide) : base(ContentNetIDs.BUCKLE) { Buckled = buckled; DrawDepth = drawDepth; LastEntityBuckledTo = lastEntityBuckledTo; DontCollide = dontCollide; } public bool Buckled { get; } public EntityUid? LastEntityBuckledTo { get; } public bool DontCollide { get; } public int? DrawDepth; } [Serializable, NetSerializable] public enum BuckleVisuals { Buckled } [Serializable, NetSerializable] public abstract class BuckleChangeMessage : 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 BuckleChangeMessage(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 BuckleMessage : BuckleChangeMessage { /// /// 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 BuckleMessage(IEntity entity, IEntity strap) : base(entity, strap, true) { } } [Serializable, NetSerializable] public class UnbuckleMessage : BuckleChangeMessage { /// /// 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 UnbuckleMessage(IEntity entity, IEntity strap) : base(entity, strap, false) { } } }