cirnogodot/Scripts/Activables/ScriptableArea3D.cs

91 lines
2 KiB
C#
Raw Normal View History

2025-06-24 11:06:33 +02:00
using Cirno.Scripts.Interactables;
using Cirno.Scripts.Misc;
using Cirno.Scripts.Resources.Events;
2025-06-23 18:30:42 +02:00
using Godot;
using Godot.Collections;
namespace Cirno.Scripts.Activables;
2025-06-24 11:06:33 +02:00
public partial class ScriptableArea3D : Area3D, IActivable, IInteractable
2025-06-23 18:30:42 +02:00
{
[Export] public Array<EventResource> Events { get; set; } = [];
private EventResource CurrentEvent => Events[_currentEventIndex];
private int _currentEventIndex = 0;
private bool _started = false;
public override void _Ready()
{
foreach (var item in Events)
{
item.Init(this);
}
}
public void Start()
{
_started = true;
StartEvent(CurrentEvent);
}
private void StartEvent(EventResource eventResource)
{
eventResource.Start(this);
}
public override void _Process(double delta)
{
if (!_started) return;
CurrentEvent.UpdateEvent(delta);
if (!CurrentEvent.WaitForCompletion || CurrentEvent.IsComplete())
{
// This loops
_currentEventIndex++;
if (_currentEventIndex >= Events.Count)
{
// It's over
_started = false;
_currentEventIndex = 0;
return;
}
CurrentEvent.Start(this);
}
}
public bool Activate(ActivationType activationType = ActivationType.Toggle)
{
Start();
return true;
}
public void Toggle()
{
this.Activate();
}
public bool CanActivate()
{
return true;
}
2025-06-24 11:06:33 +02:00
public Vector2 GetGlobalPosition2D()
{
return new Vector2(this.GlobalPosition.X, this.GlobalPosition.Z);
}
public Vector2 GetScreenPosition()
{
if (CameraController3D.Instance is null)
{
return this.GetGlobalPosition2D();
}
return CameraController3D.Instance.UnprojectPosition(this.GlobalPosition);
}
2025-06-23 18:30:42 +02:00
}