idle timeout
This commit is contained in:
parent
ad211433fb
commit
7e767d6dcb
|
@ -3,4 +3,6 @@ namespace TanksServer.GameLogic;
|
|||
public class PlayersConfiguration
|
||||
{
|
||||
public int SpawnDelayMs { get; set; }
|
||||
|
||||
public int IdleTimeoutMs { get; set; }
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -83,6 +83,8 @@ internal sealed class ControlsServer(ILogger<ControlsServer> logger, ILoggerFact
|
|||
_ => throw new ArgumentException("invalid message type")
|
||||
};
|
||||
|
||||
_player.LastInput = DateTime.Now;
|
||||
|
||||
switch (control)
|
||||
{
|
||||
case InputType.Forward:
|
||||
|
|
|
@ -14,4 +14,6 @@ internal sealed class Player(string name)
|
|||
public int Kills { get; set; }
|
||||
|
||||
public int Deaths { get; set; }
|
||||
|
||||
public DateTime LastInput { get; set; } = DateTime.Now;
|
||||
}
|
|
@ -16,7 +16,7 @@
|
|||
}
|
||||
},
|
||||
"ServicePointDisplay": {
|
||||
"Enable": false,
|
||||
"Enable": true,
|
||||
"Hostname": "172.23.42.29",
|
||||
"Port": 2342
|
||||
},
|
||||
|
@ -27,6 +27,7 @@
|
|||
"BulletSpeed": 8
|
||||
},
|
||||
"Players": {
|
||||
"SpawnDelayMs": 3000
|
||||
"SpawnDelayMs": 3000,
|
||||
"IdleTimeoutMs": 30000
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue