using Cirno.Scripts.Components.Actors; using Cirno.Scripts.Weapons; using Godot; namespace Cirno.Scripts.Components.FSM._3DPlayer; public partial class PlayerGrazingModule3D : Area3D, IModule { [Export] public BulletOwner Owner { get; private set; } = BulletOwner.Player; [Export] public ActorResourceProvider Shield { get; private set; } private bool _enabled = false; public IStateMachine StateMachine { get; private set; } public bool Enabled { get => _enabled; set { if (_enabled == value) return; _enabled = value; } } public void EnterState(PlayerState state) { Enabled = true; this.AreaEntered += OnAreaEntered; } private void OnAreaEntered(Area3D area) { if (!Enabled) return; if (area is Bullet3D bullet) { if (!bullet.Enabled) return; if (bullet.IsGrazed) return; if (!bullet.BulletInfo.Grazeable) return; if (bullet.BulletOwner is BulletOwner.Player) return; bullet.Graze(); //bullet.IsGrazed = true; var baseGrazeValue = bullet.BulletInfo.GrazeValue; float grazeShield = baseGrazeValue * GlobalState.Instance.SessionSettings.DifficultyDamageMultiplier; Shield.CurrentResource += grazeShield; // check if it's grazed // check if it's grazeable // restore appropriate amount of shield } } public virtual void Init(IStateMachine machine) { StateMachine = machine; } public void ExitState(PlayerState state) { Enabled = false; this.AreaEntered -= OnAreaEntered; } public void Process(double delta) { } public void PhysicsProcess(double delta) { } }