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