idle timeout

This commit is contained in:
Vinzenz Schroeter 2024-04-12 14:28:57 +02:00
parent ad211433fb
commit 7e767d6dcb
5 changed files with 27 additions and 9 deletions

View file

@ -3,4 +3,6 @@ namespace TanksServer.GameLogic;
public class PlayersConfiguration
{
public int SpawnDelayMs { get; set; }
public int IdleTimeoutMs { get; set; }
}

View file

@ -6,9 +6,10 @@ internal sealed class SpawnQueue(
IOptions<PlayersConfiguration> options
)
{
private ConcurrentQueue<Player> _queue = new();
private ConcurrentDictionary<Player, DateTime> _spawnTimes = new();
private readonly ConcurrentQueue<Player> _queue = new();
private readonly ConcurrentDictionary<Player, DateTime> _spawnTimes = new();
private readonly TimeSpan _spawnDelay = TimeSpan.FromMilliseconds(options.Value.SpawnDelayMs);
private readonly TimeSpan _idleTimeout = TimeSpan.FromMilliseconds(options.Value.IdleTimeoutMs);
public void EnqueueForImmediateSpawn(Player player)
{
@ -24,13 +25,23 @@ internal sealed class SpawnQueue(
public bool TryDequeueNext([MaybeNullWhen(false)] out Player player)
{
if (!_queue.TryDequeue(out player))
return false; // no one on queue
if (player.LastInput + _idleTimeout < DateTime.Now)
{
// player idle
_queue.Enqueue(player);
return false;
}
var now = DateTime.Now;
if (_spawnTimes.GetOrAdd(player, DateTime.MinValue) <= now)
return true;
if (_spawnTimes.GetOrAdd(player, DateTime.MinValue) > now)
{
// spawn delay
_queue.Enqueue(player);
return false;
}
_queue.Enqueue(player);
return false;
return true;
}
}