using Cirno.Scripts.Components.Actors; using Cirno.Scripts.Enums; using Godot; namespace Cirno.Scripts.Components.FSM.Enemy; public partial class Shooting : EnemyStateBase { public override EnemyState StateId => EnemyState.Shooting; [Export] public EnemyStorageModule StorageModule { get; private set; } [Export] public PlayerDetectionModule PlayerDetection { get; private set; } [Export] public GenericDamageReceiver DamageReceiver { get; private set; } [Export] public Weapon EquippedWeapon; private bool _isPlayerInRange = false; public override void EnterState() { base.EnterState(); GD.Print($"Entered {Name}"); //_isPlayerInRange = PlayerDetection.IsPlayerInRange(StorageModule.Root.EnemyResource.ViewRange); PlayerDetection.PlayerOutOfRange += PlayerDetectionOnPlayerOutOfRange; DamageReceiver.ChangeState(true); DamageReceiver.HealthProvider.ResourceDepleted += HealthProviderOnResourceDepleted; // PlayerDetection.SetRange(StorageModule.Root.EnemyResource.PlayerDetectionRange); // // _isPlayerInRange = PlayerDetection.IsPlayerInRange(StorageModule.Root.EnemyResource.PlayerDetectionRange); // // PlayerDetection.PlayerInRange += PlayerDetectionOnPlayerInRange; // // PlayerDetection.PlayerOutOfRange += PlayerDetectionOnPlayerOutOfRange; // // DamageReceiver.ChangeState(true); // // DamageReceiver.HealthProvider.ResourceDepleted += HealthProviderOnResourceDepleted; } private void HealthProviderOnResourceDepleted() { ChangeState(EnemyState.Dead); } private void PlayerDetectionOnPlayerOutOfRange() { StateMachine.SetState(EnemyState.Alert); } public override void ExitState() { base.ExitState(); GD.Print($"Exited {Name}"); PlayerDetection.PlayerOutOfRange -= PlayerDetectionOnPlayerOutOfRange; DamageReceiver.HealthProvider.ResourceDepleted -= HealthProviderOnResourceDepleted; DamageReceiver.ChangeState(false); } public override void PhysicsProcessState(double delta) { base.PhysicsProcessState(delta); if (PlayerDetection.IsPlayerInRange(StorageModule.Root.EnemyResource.ViewRange) && PlayerDetection.IsPlayerInSight()) { // SHOOT Shoot(); } else { StateMachine.SetState(EnemyState.Alert); } } private void Shoot() { if (EquippedWeapon == null) return; if (!PlayerDetection.LastKnownPlayerPosition.HasValue) return; var direction = ( PlayerDetection.LastKnownPlayerPosition.Value - MainObject.GlobalPosition).Normalized(); // Shoot at the player's last known position EquippedWeapon.ShootDirection = direction; StorageModule.FacingDirection = direction; EquippedWeapon.Shoot(); } }