GodotComponentTest/components/TaskQueueComponent.cs

91 lines
2.2 KiB
C#

using Godot;
using System;
using System.Collections.Generic;
using System.Diagnostics;
public class TaskQueueComponent : Component
{
public abstract class Task
{
public abstract bool PerformTask(Entity entity, float delta);
}
public class NavigationTask : Task
{
public NavigationComponent.NavigationPoint NavigationPoint;
public NavigationTask(NavigationComponent.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)
{
GD.Print("Interaction of " + entity + " with " + TargetEntity);
if (TargetEntity is Chest)
{
Chest chest = (Chest)TargetEntity;
chest.OnInteract();
}
return true;
}
}
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;
}
Task currentTask = Queue.Peek();
while (currentTask.PerformTask(entity, delta))
{
Queue.Dequeue();
if (Queue.Count == 0)
{
break;
}
currentTask = Queue.Peek();
if (currentTask is NavigationTask)
{
NavigationTask navigationTask = (NavigationTask)currentTask;
if (navigationTask != null && navigationTask.NavigationPoint.Flags ==
NavigationComponent.NavigationPoint.NavigationFlags.Orientation)
{
GD.Print("Current task is orientation task!");
}
}
}
}
}