using System; using Cirno.Scripts.Components.Actors; using Godot; namespace Cirno.Scripts.Components.FSM.Player; public partial class Active : PlayerFSMState { private Vector2 _movementDirection { get; set; } private Vector2 _facingDirection { get; set; } [Export] public Sprite2D HitboxSprite { get; set; } [Export] private PlayerWeaponProvider _weaponProvider; [Export] private PlayerAnimationProvider _animationProvider; [Export] private InputProvider _inputProvider; private bool _isStrafing { get; set; } [Export] public int Speed { get; set; } = 45; [Export] public int StrafeSpeed { get; set; } = 35; public int MovementSpeed => _isStrafing ? StrafeSpeed : Speed; public override void Init(ActorStateMachine stateMachine) { base.Init(stateMachine); //_weaponProvider = stateMachine.GetNode("WeaponProvider"); //_animationProvider = stateMachine.GetNode("AnimationProvider"); _weaponProvider.Init(stateMachine); } public override void EnterState() { // enable sprite // enable crosshair GD.Print(this.State.ToString()); } public override void ExitState() { _animationProvider.SetAnimation(Vector2.Zero); } public override void PhysicsProcessState(double delta) { _stateMachine.Velocity = _movementDirection * MovementSpeed; _stateMachine.MoveAndSlide(); } public override void ProcessState(double delta) { _movementDirection = _inputProvider.GetMovementInput(); _isStrafing = _inputProvider.GetStrafePressed(); // Toggle visibility of the hitbox sprite based on strafing if (HitboxSprite != null) { HitboxSprite.Visible = _isStrafing; } var rightStickInput = _inputProvider.GetAimInput(); // Update Facing Direction if (!_isStrafing) { if (rightStickInput.Length() > 0.1f) // If the right stick is moved { _facingDirection = rightStickInput.Normalized(); } else if (_movementDirection != Vector2.Zero) // Fall back to movement direction { _facingDirection = _movementDirection; } } _animationProvider.SetAnimation(_stateMachine.Velocity); HandleShoot(); // FindInteractable(); // _crosshair.Position = CalculateCrosshairPosition(); } private void HandleShoot() { if (!_inputProvider.GetShootPressed()) return; _weaponProvider.Shoot(this._facingDirection); } }