cirnogodot/Scripts/Components/Actors/ActivationProvider.cs

104 lines
2.7 KiB
C#
Raw Normal View History

2025-03-01 18:41:11 +01:00
using Cirno.Scripts.Components.FSM;
using Godot;
2025-03-01 18:02:11 +01:00
namespace Cirno.Scripts.Components.Actors;
public partial class ActivationProvider : Area2D
{
public bool Enabled { get; set; } = false;
private Selector _selector;
[Export]
public PackedScene SelectorScene { get; set; }
[Export]
private InputProvider _inputProvider;
[Export] private AudioStreamPlayer2D _errorSound;
[Signal]
public delegate void InteractableAreaEnteredEventHandler(Interactable interactable);
[Signal]
public delegate void InteractableAreaExitedEventHandler(Interactable interactable);
2025-03-01 18:41:11 +01:00
public void Init(ActorStateMachine actor)
2025-03-01 18:02:11 +01:00
{
if (SelectorScene is not null && _selector is null)
{
2025-03-01 18:41:11 +01:00
_selector = actor.CreateSibling<Selector>(SelectorScene, this.GlobalPosition);
2025-03-01 18:02:11 +01:00
_selector.Visible = false;
}
}
public void HandleInteraction()
{
if (_inputProvider.GetUseJustPressed())
{
TrySelect();
}
if (_inputProvider.GetScanJustPressed())
{
_selector.SelectNext();
}
}
private void TrySelect()
{
var selected = _selector.SelectedInteractable;
if (selected is null)
{
_errorSound?.Play();
return;
};
if (!selected.CanActivate())
{
_errorSound?.Play();
return;
};
bool success = selected.Activate();
if (success)
{
// Deselect and scan for next
_selector.RemoveInteractable(selected);
//_selector.SelectedInteractable = null;
//_selector.SelectNext();
}
else
{
_errorSound?.Play();
}
//var spaceState = GetWorld2D().DirectSpaceState;
//var query = PhysicsRayQueryParameters2D.Create(Vector2.Zero, )
}
private void _on_interaction_controller_area_entered(Area2D area)
{
if (!Enabled) return;
if (area.IsInGroup("Interactable") && area is Interactable interactable && interactable.CanActivate())
{
EmitSignal(nameof(InteractableAreaEntered), interactable);
if (_selector == null) return;
_selector.AddInteractable(interactable);
}
}
private void _on_interaction_controller_area_exited(Area2D area)
{
if (!Enabled) return;
if (area.IsInGroup("Interactable") && area is Interactable interactable)
{
EmitSignal(nameof(InteractableAreaExited), interactable);
if (_selector == null) return;
_selector.RemoveInteractable(interactable);
}
}
}