cirnogodot/Scripts/Components/Actors/ActivationProvider.cs

109 lines
2.8 KiB
C#
Raw Normal View History

2025-03-01 18:41:11 +01:00
using Cirno.Scripts.Components.FSM;
2025-03-09 21:58:25 +01:00
using Cirno.Scripts.Interactables;
2025-03-01 18:41:11 +01:00
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; }
2025-06-12 18:03:55 +02:00
[Export] private InputProvider _inputProvider;
2025-03-01 18:02:11 +01:00
[Export] private AudioStreamPlayer2D _errorSound;
2025-03-09 21:58:25 +01:00
//[Signal]
//public delegate void InteractableAreaEnteredEventHandler(Interactable interactable);
2025-03-01 18:02:11 +01:00
2025-03-09 21:58:25 +01:00
//[Signal]
//public delegate void InteractableAreaExitedEventHandler(Interactable interactable);
2025-03-01 18:02:11 +01:00
2025-03-05 10:55:14 +01:00
public void Init(CharacterBody2D 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())
{
2025-03-28 12:26:34 +01:00
if (!TrySelect())
{
_selector.SelectNext();
}
return;
2025-03-01 18:02:11 +01:00
}
if (_inputProvider.GetScanJustPressed())
{
_selector.SelectNext();
}
}
2025-03-28 12:26:34 +01:00
private bool TrySelect()
2025-03-01 18:02:11 +01:00
{
var selected = _selector.SelectedInteractable;
if (selected is null)
{
_errorSound?.Play();
2025-03-28 12:26:34 +01:00
return false;
2025-03-01 18:02:11 +01:00
};
if (!selected.CanActivate())
{
_errorSound?.Play();
2025-03-28 12:26:34 +01:00
return true;
2025-03-01 18:02:11 +01:00
};
2025-04-24 16:40:51 +02:00
bool success = selected.Activate(ActivationType.Use);
2025-03-01 18:02:11 +01:00
if (success)
{
// Deselect and scan for next
2025-03-28 12:26:34 +01:00
_selector.SelectNext();
//_selector.RemoveInteractable(selected);
2025-03-01 18:02:11 +01:00
}
else
{
_errorSound?.Play();
}
2025-03-28 12:26:34 +01:00
return true;
2025-03-01 18:02:11 +01:00
//var spaceState = GetWorld2D().DirectSpaceState;
//var query = PhysicsRayQueryParameters2D.Create(Vector2.Zero, )
}
private void _on_interaction_controller_area_entered(Area2D area)
{
if (!Enabled) return;
2025-03-09 21:58:25 +01:00
if (area.IsInGroup("Interactable") && area is IInteractable interactable && interactable.CanActivate())
2025-03-01 18:02:11 +01:00
{
2025-03-09 21:58:25 +01:00
//EmitSignal(nameof(InteractableAreaEntered), interactable);
2025-03-01 18:02:11 +01:00
if (_selector == null) return;
_selector.AddInteractable(interactable);
}
}
private void _on_interaction_controller_area_exited(Area2D area)
{
//if (!Enabled) return;
2025-03-09 21:58:25 +01:00
if (area.IsInGroup("Interactable") && area is IInteractable interactable)
2025-03-01 18:02:11 +01:00
{
2025-03-09 21:58:25 +01:00
//EmitSignal(nameof(InteractableAreaExited), interactable);
2025-03-01 18:02:11 +01:00
if (_selector == null) return;
_selector.RemoveInteractable(interactable);
}
}
}