+static int RenamePlayerOnServerThread(void *data_raw)
+{
+ struct RenamePlayerOnServerThreadData *data = data_raw;
+
+ RenamePlayerOnServer(data->player_name, data->player_uuid);
+
+ checked_free(data->player_name);
+ checked_free(data->player_uuid);
+ checked_free(data);
+
+ return 0;
+}
+
+static void RenamePlayerOnServerAsThread(void)
+{
+ struct RenamePlayerOnServerThreadData *data =
+ checked_malloc(sizeof(struct RenamePlayerOnServerThreadData));
+
+ data->player_name = getStringCopy(setup.player_name);
+ data->player_uuid = getStringCopy(setup.player_uuid);
+
+ ExecuteAsThread(RenamePlayerOnServerThread,
+ "RenamePlayerOnServer", data,
+ "rename player on server");
+}
+
+
+// ============================================================================
+// type name functions
+// ============================================================================
+
+static TreeInfo *type_name_node = NULL;
+static char type_name_last[MAX_PLAYER_NAME_LEN + 1] = { 0 };
+static int type_name_nr = 0;
+
+static int getPlayerNameColor(char *name)
+{
+ return (strEqual(name, EMPTY_PLAYER_NAME) ? FC_BLUE : FC_RED);
+}
+
+static void drawTypeNameText(char *name, struct TextPosInfo *pos,
+ boolean active)
+{
+ char text[MAX_PLAYER_NAME_LEN + 2] = { 0 };
+ boolean multiple_users = (game_status == GAME_MODE_PSEUDO_TYPENAMES);
+ int sx = (multiple_users ? amSX + pos->x : mSX + ALIGNED_TEXT_XPOS(pos));
+ int sy = (multiple_users ? amSY + pos->y : mSY + ALIGNED_TEXT_YPOS(pos));
+ int font_nr = (active ? FONT_ACTIVE(pos->font) : pos->font);
+ int font_width = getFontWidth(font_nr);
+
+ DrawBackgroundForFont(sx, sy, pos->width, pos->height, font_nr);
+
+ sprintf(text, "%s%c", name, (active ? '_' : '\0'));
+
+ pos->width = strlen(text) * font_width;
+ sx = (multiple_users ? amSX + pos->x : mSX + ALIGNED_TEXT_XPOS(pos));
+
+ DrawText(sx, sy, text, font_nr);
+}
+
+static void getTypeNameValues(char *name, struct TextPosInfo *pos, int *xpos)