using Cirno.Scripts.Enums; using Godot; namespace Cirno.Scripts.Components.FSM.Enemy._3D; public partial class Idle : EnemyStateBase3D { public override EnemyState StateId => EnemyState.Idle; [Export] public EnemyStorage3D Storage { get; private set; } [Export] public PlayerDetection3D PlayerDetection { get; private set; } [Export] public bool DebugEnabled { get; set; } = false; private bool _isPlayerInRange = false; public override void EnterState() { base.EnterState(); PlayerDetection.SetRange(Storage.Root.EnemyResource.PlayerDetectionRange); _isPlayerInRange = PlayerDetection.IsPlayerInRange(Storage.Root.EnemyResource.ViewRange); PlayerDetection.PlayerInRange += PlayerDetectionOnPlayerInRange; PlayerDetection.PlayerOutOfRange += PlayerDetectionOnPlayerOutOfRange; // player detection // damage receiver will be a module GD.Print("Entered Idle"); } public override void ExitState() { base.ExitState(); PlayerDetection.PlayerInRange -= PlayerDetectionOnPlayerInRange; PlayerDetection.PlayerOutOfRange -= PlayerDetectionOnPlayerOutOfRange; // DamageReceiver.HealthProvider.ResourceDepleted -= HealthProviderOnResourceDepleted; // // DamageReceiver.HealthProvider.ResourceDecreased -= HealthProviderOnResourceDecreased; // DamageReceiver.ChangeState(false); } private void HealthProviderOnResourceDepleted() { ChangeState(EnemyState.Dead); } private void HealthProviderOnResourceDecreased(float oldvalue, float newvalue, float maxvalue) { Storage.AiState = AiState.Enabled; ChangeState(EnemyState.Alert); } private void PlayerDetectionOnPlayerInRange() { _isPlayerInRange = true; GD.Print("Player In Range"); } private void PlayerDetectionOnPlayerOutOfRange() { _isPlayerInRange = false; } public override void PhysicsProcessState(double delta) { base.PhysicsProcessState(delta); if (Storage.AiState is AiState.Enabled && _isPlayerInRange) { if (PlayerDetection.IsPlayerInSight()) { GD.Print("Moving to alert"); StateMachine.SetState(EnemyState.Alert); } } if (DebugEnabled) { DebugDraw3D.DrawText(MainObject.GlobalPosition - new Vector3(0,16,0), "Idle"); } } public override void ProcessState(double delta) { base.ProcessState(delta); } }