diff --git a/Content.Client/GameObjects/Components/Mobs/BuckleComponent.cs b/Content.Client/GameObjects/Components/Mobs/BuckleComponent.cs index e22b23c0d0..0525ffaf5d 100644 --- a/Content.Client/GameObjects/Components/Mobs/BuckleComponent.cs +++ b/Content.Client/GameObjects/Components/Mobs/BuckleComponent.cs @@ -1,10 +1,12 @@ -using Content.Shared.GameObjects.Components.Mobs; +using Content.Client.GameObjects.Components.Strap; +using Content.Client.Interfaces.GameObjects.Components.Interaction; +using Content.Shared.GameObjects.Components.Mobs; using Robust.Shared.GameObjects; namespace Content.Client.GameObjects.Components.Mobs { [RegisterComponent] - public class BuckleComponent : SharedBuckleComponent + public class BuckleComponent : SharedBuckleComponent, IClientDraggable { private bool _buckled; @@ -19,5 +21,15 @@ namespace Content.Client.GameObjects.Components.Mobs } protected override bool Buckled => _buckled; + + bool IClientDraggable.ClientCanDropOn(CanDropEventArgs eventArgs) + { + return eventArgs.Target.HasComponent(); + } + + bool IClientDraggable.ClientCanDrag(CanDragEventArgs eventArgs) + { + return true; + } } } diff --git a/Content.Client/GameObjects/Components/Mobs/BuckleVisualizer2D.cs b/Content.Client/GameObjects/Components/Mobs/BuckleVisualizer2D.cs index 3dfe3d10a4..755439c753 100644 --- a/Content.Client/GameObjects/Components/Mobs/BuckleVisualizer2D.cs +++ b/Content.Client/GameObjects/Components/Mobs/BuckleVisualizer2D.cs @@ -17,7 +17,7 @@ namespace Content.Client.GameObjects.Components.Mobs return; } - if (!component.TryGetData(SharedStrapComponent.StrapVisuals.RotationAngle, out var angle)) + if (!component.TryGetData(StrapVisuals.RotationAngle, out var angle)) { return; } diff --git a/Content.Client/GameObjects/Components/Strap/StrapComponent.cs b/Content.Client/GameObjects/Components/Strap/StrapComponent.cs new file mode 100644 index 0000000000..eabb96b01c --- /dev/null +++ b/Content.Client/GameObjects/Components/Strap/StrapComponent.cs @@ -0,0 +1,22 @@ +#nullable enable +using Content.Shared.GameObjects.Components.Strap; +using Robust.Shared.GameObjects; + +namespace Content.Client.GameObjects.Components.Strap +{ + [RegisterComponent] + public class StrapComponent : SharedStrapComponent + { + public override StrapPosition Position { get; protected set; } + + public override void HandleComponentState(ComponentState? curState, ComponentState? nextState) + { + if (!(curState is StrapComponentState strap)) + { + return; + } + + Position = strap.Position; + } + } +} diff --git a/Content.Client/IgnoredComponents.cs b/Content.Client/IgnoredComponents.cs index 961e34eae8..ce60d6b7f5 100644 --- a/Content.Client/IgnoredComponents.cs +++ b/Content.Client/IgnoredComponents.cs @@ -115,7 +115,6 @@ "Utensil", "UnarmedCombat", "TimedSpawner", - "Strap", "NodeContainer", "PowerSupplier", "PowerConsumer", diff --git a/Content.Server/GameObjects/Components/Mobs/BuckleComponent.cs b/Content.Server/GameObjects/Components/Mobs/BuckleComponent.cs index 747737cea4..a943e8a438 100644 --- a/Content.Server/GameObjects/Components/Mobs/BuckleComponent.cs +++ b/Content.Server/GameObjects/Components/Mobs/BuckleComponent.cs @@ -22,7 +22,7 @@ using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Mobs { [RegisterComponent] - public class BuckleComponent : SharedBuckleComponent, IInteractHand + public class BuckleComponent : SharedBuckleComponent, IInteractHand, IDragDrop { #pragma warning disable 649 [Dependency] private readonly IEntitySystemManager _entitySystem; @@ -299,6 +299,11 @@ namespace Content.Server.GameObjects.Components.Mobs return TryUnbuckle(eventArgs.User); } + bool IDragDrop.DragDrop(DragDropEventArgs eventArgs) + { + return TryBuckle(eventArgs.User, eventArgs.Target); + } + [Verb] private sealed class BuckleVerb : Verb { diff --git a/Content.Server/GameObjects/Components/Strap/StrapComponent.cs b/Content.Server/GameObjects/Components/Strap/StrapComponent.cs index 97da26fce6..539c605a8b 100644 --- a/Content.Server/GameObjects/Components/Strap/StrapComponent.cs +++ b/Content.Server/GameObjects/Components/Strap/StrapComponent.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using Content.Server.GameObjects.Components.Mobs; -using Content.Server.GameObjects.EntitySystems; using Content.Server.Interfaces.GameObjects.Components.Interaction; using Content.Shared.GameObjects; using Content.Shared.GameObjects.Components.Strap; @@ -35,7 +34,7 @@ namespace Content.Server.GameObjects.Components.Strap public override StrapPosition Position { get => _position; - set + protected set { _position = value; Dirty(); @@ -150,6 +149,11 @@ namespace Content.Server.GameObjects.Components.Strap OccupiedSize = 0; } + public override ComponentState GetComponentState() + { + return new StrapComponentState(Position); + } + [Verb] private sealed class StrapVerb : Verb { diff --git a/Content.Shared/GameObjects/Components/Strap/SharedStrapComponent.cs b/Content.Shared/GameObjects/Components/Strap/SharedStrapComponent.cs index febdbbb3e8..4ec1463c1a 100644 --- a/Content.Shared/GameObjects/Components/Strap/SharedStrapComponent.cs +++ b/Content.Shared/GameObjects/Components/Strap/SharedStrapComponent.cs @@ -26,12 +26,27 @@ namespace Content.Shared.GameObjects.Components.Strap { public sealed override string Name => "Strap"; - public virtual StrapPosition Position { get; set; } + public sealed override uint? NetID => ContentNetIDs.STRAP; - [Serializable, NetSerializable] - public enum StrapVisuals + public abstract StrapPosition Position { get; protected set; } + } + + [Serializable, NetSerializable] + public sealed class StrapComponentState : ComponentState + { + public readonly StrapPosition Position; + + public StrapComponentState(StrapPosition position) : base(ContentNetIDs.BUCKLE) { - RotationAngle + Position = position; } + + public bool Buckled { get; } + } + + [Serializable, NetSerializable] + public enum StrapVisuals + { + RotationAngle } } diff --git a/Content.Shared/GameObjects/ContentNetIDs.cs b/Content.Shared/GameObjects/ContentNetIDs.cs index 566185c7e8..3d2dc7e9b3 100644 --- a/Content.Shared/GameObjects/ContentNetIDs.cs +++ b/Content.Shared/GameObjects/ContentNetIDs.cs @@ -59,6 +59,7 @@ public const uint BUCKLE = 1052; public const uint PROJECTILE = 1053; public const uint THROWN_ITEM = 1054; + public const uint STRAP = 1055; // Net IDs for integration tests. public const uint PREDICTION_TEST = 10001;