about summary refs log tree commit diff
path: root/src/engine/server/es_server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/server/es_server.c')
-rw-r--r--src/engine/server/es_server.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/engine/server/es_server.c b/src/engine/server/es_server.c
index 83c65548..855b1708 100644
--- a/src/engine/server/es_server.c
+++ b/src/engine/server/es_server.c
@@ -202,11 +202,38 @@ const char *server_clientname(int client_id)
 	return clients[client_id].name;
 }
 
+static int server_try_setclientname(int client_id, const char *name)
+{
+	int i;
+	for(i = 0; i < MAX_CLIENTS; i++)
+		if(i != client_id && clients[i].state >= SRVCLIENT_STATE_READY)
+		{
+			if(strcmp(name, clients[i].name) == 0)
+				return -1;
+		}
+
+	str_copy(clients[client_id].name, name, MAX_NAME_LENGTH);
+	return 0;
+}
+
 void server_setclientname(int client_id, const char *name)
 {
+	char nametry[MAX_NAME_LENGTH];
+	int i;
 	if(client_id < 0 || client_id > MAX_CLIENTS || clients[client_id].state < SRVCLIENT_STATE_READY)
 		return;
-	str_copy(clients[client_id].name, name, MAX_NAME_LENGTH);
+		
+	str_copy(nametry, name, MAX_NAME_LENGTH);
+	if(server_try_setclientname(client_id, nametry))
+	{
+		/* auto rename */
+		for(i = 1;; i++)
+		{
+			str_format(nametry, MAX_NAME_LENGTH, "(%d)%s", i, name);
+			if(server_try_setclientname(client_id, nametry) == 0)
+				break;
+		}
+	}
 }
 
 void server_setclientscore(int client_id, int score)