diff --git a/Program.cs b/Program.cs
index 16ffc9a..3f7f9cc 100644
--- a/Program.cs
+++ b/Program.cs
@@ -332,6 +332,15 @@ public class Program
static async Task HandleCreateLobbyAsync(ConnectedClient client, CreateLobby message)
{
+ // If the client supplied a fresh display name on the create call,
+ // adopt it as the connection's authoritative name. ClientHello-time
+ // names are stale because the handshake fires before the user has
+ // had a chance to type into the nickname field; without this
+ // override the server records the user as the prefab default
+ // ("Hrac") even when they typed a real name.
+ if (!string.IsNullOrWhiteSpace(message.DisplayName))
+ client.DisplayName = message.DisplayName.Trim();
+
var (lobby, joinCode, error) = await _lobbyManager.CreateLobbyAsync(
client.ClientUuid, client.DisplayName, message);
@@ -360,6 +369,11 @@ public class Program
static async Task HandleJoinLobbyAsync(ConnectedClient client, JoinLobby message)
{
+ // Mirror of HandleCreateLobbyAsync: adopt the freshly-typed name if
+ // the client supplied one. See that method's comment for rationale.
+ if (!string.IsNullOrWhiteSpace(message.DisplayName))
+ client.DisplayName = message.DisplayName.Trim();
+
var clientIp = client.Endpoint.Split(':')[0];
var (lobby, error) = await _lobbyManager.JoinLobbyAsync(
clientIp, client.ClientUuid, client.DisplayName, message.JoinCode, message.Password);
diff --git a/Protocol.cs b/Protocol.cs
index 887192c..7401ab6 100644
--- a/Protocol.cs
+++ b/Protocol.cs
@@ -423,6 +423,16 @@ public class CreateLobby : Message
public double PlayAreaRadius { get; set; } = 500; // metry
public int ImpostorCount { get; set; } = 1;
public int TaskCount { get; set; } = 5;
+ ///
+ /// Optional. If present, server uses this as the host's display name
+ /// (and updates the connection's stored DisplayName so subsequent
+ /// operations also use it). Client sends the live value from the
+ /// nickname input field, which avoids the ClientHello-time staleness:
+ /// the original ClientHello fired at TCP connection (long before the
+ /// user typed anything), so the server would otherwise see the prefab
+ /// default ("Hrac") for users who type their name and immediately host.
+ ///
+ public string? DisplayName { get; set; }
}
public class CreateLobbyResponse : Message
@@ -440,6 +450,12 @@ public class JoinLobby : Message
public override string Type => "JoinLobby";
public required string JoinCode { get; set; }
public string? Password { get; set; }
+ ///
+ /// Optional. If present, server uses this as the joiner's display name
+ /// instead of the ClientHello-time value. See CreateLobby.DisplayName
+ /// for the rationale (input-field commit race vs handshake-time name).
+ ///
+ public string? DisplayName { get; set; }
}
public class JoinLobbyResponse : Message