PDA

Просмотр полной версии : [Вопрос] Как реализовать /members на mysql до конца



wolfnex
05.12.2020, 18:26
Всем привет. Сделал команду /members, но не могу доделать расширенный функционал. Нужно сделать так, что бы при выборе офлайн/онлайн игрока в диалоге, появлялся еще один диалог с подгрузкой других данных о нём. Не приходит в голову как реализовать. HELP!
На данный момент так реализовано.
CMD:members(playerid, params[]) {
if(player_info[playerid][pMember] < 1) return SendClientMessage(playerid, COLOR_GREY, "Вы не уполномочены использовать эту команду.");
new query[43 + 2 + 1];
format(query, sizeof query, "SELECT * FROM `players` WHERE `Member` = '%d'", player_info[playerid][pMember]);
mysql_tquery(dbHandle, query, "CheckMembers", "i", playerid);
return 1;
}
public CheckMembers(playerid) {
new string[256], msgitem[256];
strins(msgitem, "№\tname\t\tstatus\n", strlen(msgitem), 14);
for(new i = 0, j; i < cache_num_rows(); i++) {
j++;
cache_get_value_name(i, "Name", player_info[i][pName], MAX_PLAYER_NAME);
format(string, sizeof(string), "%d.\t%s\t%s\n", j, player_info[i][pName], (IsPlayerConnected(i)) ? ("Online") : ("Offline"));
strins(msgitem, string, strlen(msgitem), strlen(string));
}
ShowPlayerDialog(playerid, DIALOG_ID_NONE, DIALOG_STYLE_TABLIST_HEADERS, "Члены организации:", msgitem, "Хорошо", "Отмена");
return 1;
}

UPD: попил пивка и пришла мысль по решению. всем спасибо, сделал то что нужно.

Shaolinka
05.12.2020, 22:55
Всем привет. Сделал команду /members, но не могу доделать расширенный функционал. Нужно сделать так, что бы при выборе офлайн/онлайн игрока в диалоге, появлялся еще один диалог с подгрузкой других данных о нём. Не приходит в голову как реализовать. HELP!
На данный момент так реализовано.
CMD:members(playerid, params[]) {
if(player_info[playerid][pMember] < 1) return SendClientMessage(playerid, COLOR_GREY, "Вы не уполномочены использовать эту команду.");
new query[43 + 2 + 1];
format(query, sizeof query, "SELECT * FROM `players` WHERE `Member` = '%d'", player_info[playerid][pMember]);
mysql_tquery(dbHandle, query, "CheckMembers", "i", playerid);
return 1;
}
public CheckMembers(playerid) {
new string[256], msgitem[256];
strins(msgitem, "№\tname\t\tstatus\n", strlen(msgitem), 14);
for(new i = 0, j; i < cache_num_rows(); i++) {
j++;
cache_get_value_name(i, "Name", player_info[i][pName], MAX_PLAYER_NAME);
format(string, sizeof(string), "%d.\t%s\t%s\n", j, player_info[i][pName], (IsPlayerConnected(i)) ? ("Online") : ("Offline"));
strins(msgitem, string, strlen(msgitem), strlen(string));
}
ShowPlayerDialog(playerid, DIALOG_ID_NONE, DIALOG_STYLE_TABLIST_HEADERS, "Члены организации:", msgitem, "Хорошо", "Отмена");
return 1;
}

UPD: попил пивка и пришла мысль по решению. всем спасибо, сделал то что нужно.

strins не учитывает размер массива, поэтому может записать за пределы. В сети есть исправленная версия(если я не ошибаюсь именно на этом портале).
Ну или можешь сей код:

strins(msgitem, "№\tname\t\tstatus\n", strlen(msgitem), 14);
Расписать по-другому:

new msgitem[256] = "№\tname\t\tstatus\n";

А тут заменить на strcat:

strins(msgitem, string, strlen(msgitem), strlen(string));

WRONG:
https://i.imgur.com/iLsHTZZ.png

Ты пытаешься получить ID найденных полей, но не игроков. В данном случае нужна будет функция, получающая ID игрока по нику.

Я тут чота такое набросал:

stock GetPlayerIDByName(const name[])
{
new playerid = INVALID_PLAYER_ID;

sscanf(name, "u", playerid);

return playerid;
}


Как использовать думаю разберёшься. Да и советую прочитать мануал Daniel'a Cortez'a о выделении памяти, (https://pro-pawn.ru/showthread.php?13388-%D0%9F%D0%BE%D0%B4%D1%81%D1%87%D1%91%D1%82-%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0-%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D0%B9-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8) а то вот такое вот не годиться:
https://i.imgur.com/jdIFawR.png