Allow multiple SetName commands per CheckName

Some mods use SetName to set player-specific names, for example to set
player-specific roles. When Anticheat is disabled, this should be
allowed for feature-parity with officials.
This commit is contained in:
miniduikboot committed 2023-06-01 19:39:46 +02:00
1 parent 1f98102e5a
commit a519c0daed
1 file changed
+26 -22
@@ -513,36 +513,40 @@ namespace Impostor.Server.Net.Inner.Objects
} }
else else
{ {
if (!RequestedPlayerName.Any()) if (RequestedPlayerName.Any())
{ {
_logger.LogWarning($"Client sent {nameof(RpcCalls.SetName)} for a player that didn't request it"); var expected = RequestedPlayerName.Dequeue();
return false;
}
var expected = RequestedPlayerName.Dequeue(); if (Game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.PlayerName == expected))
if (Game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.PlayerName == expected))
{
var i = 1;
while (true)
{ {
var text = expected + " " + i; var i = 1;
while (true)
if (Game.Players.All(x => x.Character == null || x.Character == this || x.Character.PlayerInfo.PlayerName != text))
{ {
expected = text; var text = expected + " " + i;
break;
}
i++; if (Game.Players.All(x => x.Character == null || x.Character == this || x.Character.PlayerInfo.PlayerName != text))
{
expected = text;
break;
}
i++;
}
}
if (name != expected)
{
_logger.LogWarning($"Client sent {nameof(RpcCalls.SetName)} with incorrect name");
await SetNameAsync(expected);
return false;
} }
} }
else
if (name != expected)
{ {
_logger.LogWarning($"Client sent {nameof(RpcCalls.SetName)} with incorrect name"); if (await sender.Client.ReportCheatAsync(RpcCalls.SetName, $"Client sent {nameof(RpcCalls.SetName)} for a player that didn't request it"))
await SetNameAsync(expected); {
return false; return false;
}
} }
} }