82 lines
2.0 KiB
C#
82 lines
2.0 KiB
C#
using System.Collections.Generic;
|
|
using Godot;
|
|
|
|
public class TaskQueueComponent : Component
|
|
{
|
|
[Signal]
|
|
private delegate void StartInteraction(Entity entity, Entity targetEntity);
|
|
|
|
public Queue<Task> Queue;
|
|
|
|
public TaskQueueComponent()
|
|
{
|
|
Queue = new Queue<Task>();
|
|
|
|
Reset();
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
Queue.Clear();
|
|
}
|
|
|
|
public void Process(Entity entity, float delta)
|
|
{
|
|
if (Queue.Count == 0) return;
|
|
|
|
do
|
|
{
|
|
var currentTask = Queue.Peek();
|
|
|
|
if (currentTask.PerformTask(entity, this, delta))
|
|
Queue.Dequeue();
|
|
else
|
|
break;
|
|
} while (Queue.Count > 0);
|
|
}
|
|
|
|
public abstract class Task : Object
|
|
{
|
|
/// <summary>
|
|
/// Executes a Task on the specified entity.
|
|
/// </summary>
|
|
/// <returns>true when the Task is complete, false otherwise</returns>
|
|
public abstract bool PerformTask(Entity entity, TaskQueueComponent taskQueueComponent, float delta);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Makes an entity move towards a target (translation and or orientation).
|
|
/// </summary>
|
|
public class NavigationTask : Task
|
|
{
|
|
public NavigationPoint NavigationPoint;
|
|
public bool PlanningComplete = false;
|
|
|
|
public NavigationTask(NavigationPoint navigationPoint)
|
|
{
|
|
NavigationPoint = navigationPoint;
|
|
}
|
|
|
|
public override bool PerformTask(Entity entity, TaskQueueComponent taskQueueComponent, float delta)
|
|
{
|
|
return NavigationPoint.IsReached(entity.GlobalTransform);
|
|
}
|
|
}
|
|
|
|
public class InteractionTask : Task
|
|
{
|
|
public Entity TargetEntity;
|
|
|
|
public InteractionTask(Entity entity)
|
|
{
|
|
TargetEntity = entity;
|
|
}
|
|
|
|
public override bool PerformTask(Entity entity, TaskQueueComponent taskQueueComponent, float delta)
|
|
{
|
|
taskQueueComponent.EmitSignal("StartInteraction", entity, TargetEntity);
|
|
|
|
return true;
|
|
}
|
|
}
|
|
} |