#nullable enable using System; using Content.Server.GameObjects.EntitySystems; using Content.Shared.GameObjects.Components.Buckle; using Content.Shared.GameObjects.Components.Movement; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Maths; using Robust.Shared.Players; using Robust.Shared.Timing; namespace Content.Server.GameObjects.Components.Movement { [RegisterComponent] [ComponentReference(typeof(SharedClimbingComponent))] public class ClimbingComponent : SharedClimbingComponent { [Dependency] private readonly IGameTiming _gameTiming = default!; public override bool IsClimbing { get => base.IsClimbing; set { if (_isClimbing == value) return; base.IsClimbing = value; if (value) { StartClimbTime = IoCManager.Resolve().CurTime; EntitySystem.Get().AddActiveClimber(this); OwnerIsTransitioning = true; } else { EntitySystem.Get().RemoveActiveClimber(this); OwnerIsTransitioning = false; } Dirty(); } } protected override bool OwnerIsTransitioning { get => base.OwnerIsTransitioning; set { if (value == base.OwnerIsTransitioning) return; base.OwnerIsTransitioning = value; Dirty(); } } public override void HandleMessage(ComponentMessage message, IComponent? component) { base.HandleMessage(message, component); switch (message) { case BuckleMessage msg: if (msg.Buckled) IsClimbing = false; break; } } /// /// Make the owner climb from one point to another /// public void TryMoveTo(Vector2 from, Vector2 to) { if (Body == null) return; var velocity = (to - from).Length; if (velocity <= 0.0f) return; Body.ApplyLinearImpulse((to - from).Normalized * velocity * 400); OwnerIsTransitioning = true; Owner.SpawnTimer((int) (BufferTime * 1000), () => { if (Deleted) return; OwnerIsTransitioning = false; }); } public void Update() { if (!IsClimbing || _gameTiming.CurTime < TimeSpan.FromSeconds(BufferTime) + StartClimbTime) { return; } if (!IsOnClimbableThisFrame && IsClimbing) IsClimbing = false; } public override ComponentState GetComponentState(ICommonSession player) { return new ClimbModeComponentState(_isClimbing, OwnerIsTransitioning); } } }