using Content.Shared.Construction.EntitySystems; using Content.Shared.Tools; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Construction.Components { [RegisterComponent, Access(typeof(AnchorableSystem))] public sealed class AnchorableComponent : Component { [DataField("tool", customTypeSerializer: typeof(PrototypeIdSerializer))] public string Tool { get; private set; } = "Anchoring"; [DataField("snap")] [ViewVariables(VVAccess.ReadWrite)] public bool Snap { get; private set; } = true; /// /// Base delay to use for anchoring. /// [ViewVariables(VVAccess.ReadWrite)] [DataField("delay")] public float Delay = 1f; } public abstract class BaseAnchoredAttemptEvent : CancellableEntityEventArgs { public EntityUid User { get; } public EntityUid Tool { get; } /// /// Extra delay to add to the do_after. /// Add to this, don't replace it. /// Output parameter. /// public float Delay { get; set; } = 0f; protected BaseAnchoredAttemptEvent(EntityUid user, EntityUid tool) { User = user; Tool = tool; } } public sealed class AnchorAttemptEvent : BaseAnchoredAttemptEvent { public AnchorAttemptEvent(EntityUid user, EntityUid tool) : base(user, tool) { } } public sealed class UnanchorAttemptEvent : BaseAnchoredAttemptEvent { public UnanchorAttemptEvent(EntityUid user, EntityUid tool) : base(user, tool) { } } public abstract class BaseAnchoredEvent : EntityEventArgs { public EntityUid User { get; } public EntityUid Tool { get; } protected BaseAnchoredEvent(EntityUid user, EntityUid tool) { User = user; Tool = tool; } } /// /// Raised just before the entity's body type is changed. /// public sealed class BeforeAnchoredEvent : BaseAnchoredEvent { public BeforeAnchoredEvent(EntityUid user, EntityUid tool) : base(user, tool) { } } /// /// Raised when an entity with an anchorable component is anchored. Note that you may instead want the more /// general . This event has the benefit of having user & tool information, /// as a result of interactions mediated by the . /// public sealed class UserAnchoredEvent : BaseAnchoredEvent { public UserAnchoredEvent(EntityUid user, EntityUid tool) : base(user, tool) { } } /// /// Raised just before the entity's body type is changed. /// public sealed class BeforeUnanchoredEvent : BaseAnchoredEvent { public BeforeUnanchoredEvent(EntityUid user, EntityUid tool) : base(user, tool) { } } /// /// Raised when an entity with an anchorable component is unanchored. Note that you will probably also need to /// subscribe to the more general , which gets raised BEFORE this one. This /// event has the benefit of having user & tool information, whereas the more general event may be due to /// explosions or grid-destruction or other interactions not mediated by the . /// public sealed class UserUnanchoredEvent : BaseAnchoredEvent { public UserUnanchoredEvent(EntityUid user, EntityUid tool) : base(user, tool) { } } }