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 { Task currentTask = Queue.Peek(); if (currentTask.PerformTask(entity, this, 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, TaskQueueComponent taskQueueComponent, 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, 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; } } }