private async ValueTask <bool> HandleCheckName(ClientPlayer sender, string name) { if (name.Length > 10) { if (await sender.Client.ReportCheatAsync(RpcCalls.CheckName, "Client sent name exceeding 10 characters")) { return(false); } } if (string.IsNullOrWhiteSpace(name) || !name.All(TextBox.IsCharAllowed)) { if (await sender.Client.ReportCheatAsync(RpcCalls.CheckName, "Client sent name containing illegal characters")) { return(false); } } if (sender.Client.Name != name) { if (await sender.Client.ReportCheatAsync(RpcCalls.CheckName, "Client sent name not matching his name from handshake")) { return(false); } } RequestedPlayerName.Enqueue(name); return(true); }
private async ValueTask <bool> HandleSetName(ClientPlayer sender, string name) { if (Game.GameState == GameStates.Started) { if (await sender.Client.ReportCheatAsync(RpcCalls.SetColor, "Client tried to set a name midgame")) { return(false); } } if (sender.IsOwner(this)) { if (Game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.PlayerName == name)) { if (await sender.Client.ReportCheatAsync(RpcCalls.SetName, "Client sent name that is already used")) { return(false); } } if (sender.Client.Name != name) { if (await sender.Client.ReportCheatAsync(RpcCalls.SetName, "Client sent name not matching his name from handshake")) { return(false); } } } else { if (!RequestedPlayerName.Any()) { _logger.LogWarning($"Client sent {nameof(RpcCalls.SetName)} for a player that didn't request it"); return(false); } var expected = RequestedPlayerName.Dequeue(); if (Game.Players.Any(x => x.Character != null && x.Character != this && x.Character.PlayerInfo.PlayerName == expected)) { int i = 1; while (true) { string text = expected + " " + 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); } } PlayerInfo.PlayerName = name; return(true); }