cirnogodot/Scripts/Interactables/AreaTrigger.cs

71 lines
1.6 KiB
C#
Raw Normal View History

2025-02-06 09:44:21 +01:00
using Godot;
namespace Cirno.Scripts.Interactables;
public partial class AreaTrigger : Area2D
{
2025-02-06 11:36:21 +01:00
[Export] public Node2D Target { get; set; }
2025-02-06 17:57:06 +01:00
[Export] public ActivationType ActivationType { get; set; } = Scripts.ActivationType.Toggle;
2025-02-06 09:44:21 +01:00
[Export] public bool OneTime { get; set; }
[Export] public bool DoNotActivateOnFirst { get; set; }
private int _activations = 0;
2025-02-13 16:10:22 +01:00
[Signal]
2025-03-03 10:58:20 +01:00
public delegate void ActivatedEventHandler();
private InteractionController _cachedPlayer;
2025-02-06 09:44:21 +01:00
2025-03-02 16:48:18 +01:00
private bool Activate()
2025-02-06 09:44:21 +01:00
{
if (_activations == 0 && DoNotActivateOnFirst)
{
_activations++;
return false;
}
if (OneTime && _activations > 0) return false;
2025-02-06 11:36:21 +01:00
2025-02-13 16:10:22 +01:00
if (Target != null)
2025-02-06 13:28:27 +01:00
{
2025-02-13 16:10:22 +01:00
if (Target is not IActivable target)
{
GD.PrintErr($"Target {Target.Name} is not activable");
return false;
}
target.Activate();
2025-02-06 13:28:27 +01:00
}
2025-02-13 16:10:22 +01:00
EmitSignal(nameof(Activated));
2025-02-06 09:44:21 +01:00
_activations++;
return true;
}
private void _on_area_entered(Area2D area)
{
if (area is not InteractionController player) return;
2025-03-03 10:58:20 +01:00
if (player.Enabled)
{
Activate();
}
else
{
_cachedPlayer = player;
_cachedPlayer.InteractionStarted += PlayerOnInteractionStarted;
}
}
private void PlayerOnInteractionStarted()
{
2025-03-02 16:48:18 +01:00
Activate();
2025-03-03 10:58:20 +01:00
if (_cachedPlayer != null)
{
_cachedPlayer.InteractionStarted -= PlayerOnInteractionStarted;
}
2025-02-06 09:44:21 +01:00
}
}