using Robust.Shared.GameObjects; using Robust.Shared.Maths; using Content.Shared.Physics; using Content.Shared.GameObjects.Components.Movement; using Content.Shared.GameObjects.EntitySystems; namespace Content.Server.GameObjects.Components.Movement { [RegisterComponent] public class ClimbingComponent : SharedClimbingComponent, IActionBlocker { private bool _isClimbing = false; private ClimbController _climbController = default; public override bool IsClimbing { get { return _isClimbing; } set { if (!value && Body != null) { Body.TryRemoveController(); } _isClimbing = value; Dirty(); } } /// /// Make the owner climb from one point to another /// public void TryMoveTo(Vector2 from, Vector2 to) { if (Body != null) { _climbController = Body.EnsureController(); _climbController.TryMoveTo(from, to); } } public void Update(float frameTime) { if (Body != null && IsClimbing) { if (_climbController != null && (_climbController.IsBlocked || !_climbController.IsActive)) { if (Body.TryRemoveController()) { _climbController = null; } } if (IsClimbing) { Body.WakeBody(); } if (!IsOnClimbableThisFrame && IsClimbing && _climbController == null) { IsClimbing = false; } IsOnClimbableThisFrame = false; } } public override ComponentState GetComponentState() { return new ClimbModeComponentState(_isClimbing); } } }