using Cirno.Scripts.Components.Actors; using Cirno.Scripts.Components.Actors._3D; using Cirno.Scripts.Utils; using Godot; namespace Cirno.Scripts.Components.FSM._3DPlayer; public partial class Active : BaseState { public override PlayerState StateId => PlayerState.Active; private CharacterBody3D _player; [Export] private InputProvider _inputProvider; [Export] public PlayerAnimationProvider3D AnimationProvider { get; private set; } private IsoPlayerStorageModule Storage { get; set; } [Export] public PlayerDamageReceiver3D DamageReceiver { get; private set; } public override void Init(IStateMachine machine) { base.Init(machine); if (machine is IsoPlayerStateMachine sm) Storage = sm.Storage; DamageReceiver.Death += () => { ChangeState(PlayerState.Dead); }; DamageReceiver.HealthDecreased += (_, _, _) => { AnimationProvider.Blink(); }; DamageReceiver.ShieldDecreased += (_, _, _) => { AnimationProvider.PlayShieldAnimation(); }; DamageReceiver.Init(StateMachine); DamageReceiver.RefillHealth(); DamageReceiver.RefillShield(); } public override void EnterState() { base.EnterState(); MainObject.Show(); // enable sprite // enable crosshair //_crosshairProvider.Show(); AnimationProvider.ShowSprite(); DamageReceiver.Enabled = true; //_activationProvider.Enabled = true; //_interactionController.Enabled = true; _canOpenInventory = true; _inventoryCooldown = 0; } public override void ExitState() { base.ExitState(); AnimationProvider.SetAnimationSpeed(Vector2.Zero); // //_animationProvider.SetAnimation(Vector2.Zero); // _crosshairProvider.Hide(); // _hitboxSpriteProvider.Hide(); // DamageReceiver.Enabled = false; _canOpenInventory = true; // _activation_provider.Enabled = false; // _interactionController.Enabled = false; } public override void ProcessState(double delta) { base.ProcessState(delta); HandleInputHotkeys(delta); AnimationProvider.SetAnimationSpeed(new Vector2(MainObject.Velocity.X, MainObject.Velocity.Z)); AnimationProvider.SetAnimation(Storage.FacingDirection); } private bool _canOpenInventory = true; private double _inventoryCooldown; private void HandleInputHotkeys(double delta) { if (_canOpenInventory && _inputProvider.GetInventoryJustPressed()) { _canOpenInventory = false; GameStateManager.SetState(GameState.Inventory); return; } if (!_canOpenInventory) { _inventoryCooldown += delta; if (_inventoryCooldown >= 0.2) { _canOpenInventory = true; _inventoryCooldown = 0; } } if (_inputProvider.GetPauseJustPressed()) { GameStateManager.Instance.Pause(); } } private void InventoryDeferred() { GameStateManager.SetState(GameState.Inventory); } private void PauseDeferred() { GameStateManager.Instance.Pause(); } }