public void QueueAgent(Node2D agent, Vector2 targetLocation, Action <Godot.Collections.Array <Vector2> > callback) { if (navQueue.ContainsKey(agent)) { return; } var queueItem = new NavQueueItem() { Target = targetLocation, Callback = callback }; navQueue.Add(agent, queueItem); }
public void CalculatePaths(object userData) { while (run) { if (navQueue.Count > 0) { Node2D nextAgent = navQueue.Keys.First(); NavQueueItem queueItem = navQueue[nextAgent]; Vector2[] points; if (LastAgent != null && IsInstanceValid(LastAgent) && LastTarget.Round() == queueItem.Target.Round() && LastAgent.GlobalPosition.DistanceTo(nextAgent.GlobalPosition) < 256) { points = LastPath; } else { GD.Print("Calculating."); points = GetSimplePath(nextAgent.GlobalPosition, queueItem.Target); } var newPath = new Godot.Collections.Array <Vector2>(); foreach (Vector2 point in points) { newPath.Add(point); } navQueue.Remove(nextAgent); LastAgent = nextAgent; LastTarget = queueItem.Target; LastPath = points; queueItem.Callback(newPath); } } pathThread.CallDeferred("WaitToFinish"); }