using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Pulling.Components; using Content.Shared.Pulling; using Content.Shared.Verbs; using Robust.Shared.GameObjects; using Robust.Shared.Localization; using Robust.Shared.Physics; namespace Content.Server.Pulling { [RegisterComponent] [ComponentReference(typeof(SharedPullableComponent))] public class PullableComponent : SharedPullableComponent { [Verb] public class PullingVerb : Verb { protected override void GetData(IEntity user, PullableComponent component, VerbData data) { data.Visibility = VerbVisibility.Invisible; if (user == component.Owner) { return; } if (!user.Transform.Coordinates.TryDistance(user.EntityManager, component.Owner.Transform.Coordinates, out var distance) || distance > SharedInteractionSystem.InteractionRange) { return; } if (!user.HasComponent() || !user.TryGetComponent(out IPhysBody? userPhysics) || !component.Owner.TryGetComponent(out IPhysBody? targetPhysics) || targetPhysics.BodyType == BodyType.Static) { return; } data.Visibility = VerbVisibility.Visible; data.Text = component.Puller == userPhysics.Owner ? Loc.GetString("pulling-verb-get-data-text-stop-pulling") : Loc.GetString("pulling-verb-get-data-text"); } protected override void Activate(IEntity user, PullableComponent component) { // There used to be sanity checks here for no reason. // Why no reason? Because they're supposed to be performed in TryStartPull. if (component.Puller == user) { EntitySystem.Get().TryStopPull(component); } else { EntitySystem.Get().TryStartPull(component.Owner, user); } } } } }