From a519c0daed09dae4ff3dc0652fdd710579e82226 Mon Sep 17 00:00:00 2001 From: miniduikboot Date: Wed, 31 May 2023 22:13:29 +0200 Subject: [PATCH] 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. --- .../Net/Inner/Objects/InnerPlayerControl.cs | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs index b25f244..ed05367 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs @@ -513,36 +513,40 @@ namespace Impostor.Server.Net.Inner.Objects } else { - if (!RequestedPlayerName.Any()) + if (RequestedPlayerName.Any()) { - _logger.LogWarning($"Client sent {nameof(RpcCalls.SetName)} for a player that didn't request it"); - return false; - } + var expected = RequestedPlayerName.Dequeue(); - var expected = RequestedPlayerName.Dequeue(); - - if (Game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.PlayerName == expected)) - { - var i = 1; - while (true) + if (Game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.PlayerName == expected)) { - var text = expected + " " + i; - - if (Game.Players.All(x => x.Character == null || x.Character == this || x.Character.PlayerInfo.PlayerName != text)) + var i = 1; + while (true) { - expected = text; - break; + var text = expected + " " + i; + + if (Game.Players.All(x => x.Character == null || x.Character == this || x.Character.PlayerInfo.PlayerName != text)) + { + expected = text; + break; + } + + i++; } + } - i++; + if (name != expected) + { + _logger.LogWarning($"Client sent {nameof(RpcCalls.SetName)} with incorrect name"); + await SetNameAsync(expected); + return false; } } - - if (name != expected) + else { - _logger.LogWarning($"Client sent {nameof(RpcCalls.SetName)} with incorrect name"); - await SetNameAsync(expected); - return false; + if (await sender.Client.ReportCheatAsync(RpcCalls.SetName, $"Client sent {nameof(RpcCalls.SetName)} for a player that didn't request it")) + { + return false; + } } } -- 2.39.5