На одном проекте, в разработке которого я принимал участие, тоже смастерили подобную функцию. Но в моем случае выбор дополнительных аккаунтов был по email-адресу. Грубо говоря - на скольких никах привязан один и тот же email - эти аккаунты принадлежат одному человеку, и он может менять их прямо во время игры.
Схема работы проста: ищем аккаунты, сохраняем нынешний (под которым человек играет в данный момент), меняем ник, убиваем персонажа, загружаем новый аккаунт.
Вот примерная реализация:
1) Команда смены персонажа.
if (strcmp(cmd, "/chacc", false) == 0)
{
new query[70+128];
format(query,sizeof(query),"SELECT * FROM `accounts` WHERE `Mail` = '%s' LIMIT 3",PlayerInfo[playerid][Mail],PlayerInfo[playerid][ID]);
mysql_tquery(1,query,"AccountsCheck","i",playerid);
return 1;
}
2) Функция, в которую приходит результат запроса из БД.
forward AccountsCheck(playerid);
public AccountsCheck(playerid)
{
new rows,fields,string[200],str3[100],n[24];
cache_get_data(rows,fields);
if(!rows) return ShowPlayerDialog(playerid,13200,DIALOG_STYLE_MSGBOX,"{00A2FF}Аккаунты","У вас нет дополнительных аккаунтов","Ок","Отмена");
for(new i=0;i<rows;i++)
{
cache_get_field_content(i,"Name",n,1,24);
cache_get_field_content(i,"Name",accname
[playerid],1,24);
format(str3,sizeof(str3),"{00a2ff}Аккаунт: {ffffff}%s",n); strcat(str3,"\n");
strcat(string,str3);
}
ShowPlayerDialog(playerid,53,DIALOG_STYLE_LIST,"{00A2FF}Аккаунты",string,"Выбрать","Отмена");
string = ""; str3 = ""; n = "";
return 1;
}
3) Диалог выбора персонажа.
Код:
if(dialogid == 53)
{
if(!response) return 1;
if(!strcmp(accname[listitem][playerid],Name(playerid))) return 1;
SaveAccount(playerid);
SetPlayerName(playerid,accname[listitem][playerid]);
plname[playerid] = accname[listitem][playerid];
SetPVarInt(playerid,"Logged",0);
ForceClassSelection(playerid); //отправим игрока, который ввёл эту команду, на выбор класса
SetPlayerHealth(playerid,0);//убиваем его
new string[120+24];
format(string,sizeof(string),"{00a2ff}Вы переключились на Ваш дополнительный аккаунт {ff0000}%s",Name(playerid));
SendClientMessage(playerid,-1,string);
}