using System; using System.Collections.Concurrent; using Godot; public partial class QueueManager : Node { public static ConcurrentQueue LogQueue = new(); public static ConcurrentQueue ActionQueue = new(); public static ConcurrentQueue<(Sector, GameObject)> SectorReassignQueue = new(); private readonly int sectorReassignQueueRateLimit = 500; public override void _Process(double delta) { while (LogQueue.TryDequeue(out string text)) { GD.Print(text); } while (ActionQueue.TryDequeue(out Action action)) { action(); } int sectorReassignQueueProcessed = 0; while ( !GameManager.Singleton.simulating && sectorReassignQueueProcessed++ < sectorReassignQueueRateLimit && SectorReassignQueue.TryDequeue(out var item) ) { var (sector, gameObject) = item; gameObject.CurrentSector.GameObjects.Remove(gameObject); sector.GameObjects.Add(gameObject); gameObject.AssignSector(sector); } } }