From 1a11b5f43ea026af66366431c49852975addf69c Mon Sep 17 00:00:00 2001 From: miniduikboot Date: Wed, 3 Apr 2024 21:18:08 +0200 Subject: [PATCH] Rework Color calculation loop to always terminate --- .../Net/Inner/Objects/InnerPlayerControl.cs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs index 5a7fbac..3426317 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs @@ -717,9 +717,23 @@ namespace Impostor.Server.Net.Inner.Objects { var expected = RequestedColorId.Dequeue(); - while (Game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.CurrentOutfit.Color == expected)) + for (var colorOffset = 0; colorOffset <= ColorsCount; colorOffset++) { - expected = (ColorType)(((byte)expected + 1) % ColorsCount); + var possibleColor = (ColorType)((byte)(expected + colorOffset) % ColorsCount); + if (!Game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.CurrentOutfit.Color == possibleColor)) + { + expected = possibleColor; + break; + } + + if (colorOffset == ColorsCount) + { + if (await sender.Client.ReportCheatAsync(RpcCalls.SetColor, CheatCategory.GameFlow, "Client sent SetColor but all colors are already in use")) + { + await SetColorAsync(expected); + return false; + } + } } if (color != expected) -- 2.39.5