mirror of
https://gitlab.com/MaddoScientisto/cirnogodot.git
synced 2026-06-01 11:15:33 +00:00
104 lines
No EOL
2.7 KiB
C#
104 lines
No EOL
2.7 KiB
C#
using Cirno.Scripts.Components.FSM;
|
|
using Godot;
|
|
|
|
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);
|
|
|
|
public void Init(ActorStateMachine actor)
|
|
{
|
|
if (SelectorScene is not null && _selector is null)
|
|
{
|
|
_selector = actor.CreateSibling<Selector>(SelectorScene, this.GlobalPosition);
|
|
_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);
|
|
}
|
|
}
|
|
} |