PHP код:
CMD:members(playerid, params[])
{
new family = PlayerInfo[playerid][pMember];
if (family == 0)
family = PlayerInfo[playerid][pLeader];
if (family == 0)
return SendClientMessage(playerid, COLOR_GREY, !"Вы не состоите ни в одной из банд/мафий/фракций.");
static const fmt_str[] = "\n{FFFFFF}%s | ID: %d | %s[%d]";
// Расчёт размера буфера для форматирования.
const buffer_size = sizeof(fmt_str)
+ (-2 + MAX_PLAYER_NAME)
+ (-2 + 5) // ID игрока, в будущих версиях SA:MP значение MAX_PLAYERS
// может увеличиться вплоть до 65535 (5 символов).
+ (-2 + 20)// Максимальная длина названия ранга - 20 символов (?)
// (если больше или меньше, ставьте своё значение).
+ (-2 + 2);// Номер ранга - не больше 10 (2 символа).
// Расчёт макс. количества строк в диалоге.
const MAX_ENTRIES = 2048 / buffer_size;
// Первая часть строки string будет упакованной, поэтому strcat
// будет автоматически упаковывать новые строки при добавлении их к string.
// Благодаря этому в string можно будет вместить в 4 раза больше текста.
static const first_str[] = !"Сотрудники Online:";
new string[buffer_size * MAX_ENTRIES];
string = first_str;
new string_len = sizeof(first_str) - 1;
new buffer[buffer_size];
// Проходим по всем игрокам и "запоминаем" нужных.
new players[MAX_ENTRIES], players_count = 0;
foreach(new i: Player)
{
//if (!IsAValidPlayer(i))
if (0 == gPlayerLogged[i])
continue;
if (PlayerInfo[i][pMember] != family)
continue;
players[players_count++] = i;
}
// Теперь в цикле проверяем ранги от 10 до 1.
if (players_count == 0)
goto show_dialog;
for (new rank = 11, x, i; --rank != 0;)
{
// Проходим по всем кэшированным игрокам.
for (x = -1; ++x < players_count;)
{
// Если у игрока искомый ранг - добавляем новую строку в диалог.
if ((i = players[x]) != rank)
continue;
format(
buffer, sizeof(string), fmt_str,
//PlayerInfo[i][pName], i,
//PlayerInfo[i][pRankName], PlayerInfo[i][pRank]
buffer, i, RankName(playerid), PlayerInfo[i][pRank]
);
// Добавить сформатированный результат к строке string
// и подсчитать её длину после добавления.
string_len += strcat(string, buffer);
// Если в организации много игроков и в string не хватает
// свободного места для новой строки - переходим к показу диалога.
if (string_len + sizeof(buffer) < sizeof(string))
continue;
goto show_dialog;
}
}
show_dialog:
//return SPD(playerid, 0, DSM, !"{00BFFF}Работники", string, !"Закрыть", !"");
return ShowPlayerDialog(
playerid, 0, DIALOG_STYLE_MSGBOX,
!"{00BFFF}Работники", string, !"Закрыть", !""
);
}