PDA

Просмотр полной версии : [CMD] /ahelp



gangzone.ini
22.09.2014, 01:19
/ahelp - команды администрации
Если Вы 1 уровень, Вам покажет только для 1 уровня, если Вы 2-ой уровень, Вам покажет для 1 и 2-ого уровня и т.д

#define COLOR_ORANGE 0xB8860BFF
#define COLOR_YELLOW 0xFFFF00AA

if(strcmp(cmd, "/ahelp", true) == 0)
{
if(PlayerInfo[playerid][pAdmin] >= 1) SendClientMessage(playerid,COLOR_YELLOW,"Доступные команды:"),SendClientMessage(playerid,COLOR_ORANGE,"1 уровень: /test");
if(PlayerInfo[playerid][pAdmin] >= 2) SendClientMessage(playerid,COLOR_ORANGE,"2 уровень: /test");
if(PlayerInfo[playerid][pAdmin] >= 3) SendClientMessage(playerid,COLOR_ORANGE,"3 уровень: /test");
if(PlayerInfo[playerid][pAdmin] >= 4) SendClientMessage(playerid,COLOR_ORANGE,"4 уровень: /test");
if(PlayerInfo[playerid][pAdmin] == 5) SendClientMessage(playerid,COLOR_ORANGE,"5 уровень: /test");
return true;
}

Salvacore
22.09.2014, 01:30
if(strcmp(cmd, "/ahelp", true) == 0)
{
if(PlayerInfo[playerid][pAdmin] >= 1)
{
SendClientMessage(playerid,0xFFFF00AA,"Доступные команды:");
SendClientMessage(playerid,0xB8860BFF,"1 уровень: /test");
}
if(PlayerInfo[playerid][pAdmin] >= 2)
SendClientMessage(playerid,0xB8860BFF,"2 уровень: /test");
if(PlayerInfo[playerid][pAdmin] >= 3)
SendClientMessage(playerid,0xB8860BFF,"3 уровень: /test");
if(PlayerInfo[playerid][pAdmin] >= 4)
SendClientMessage(playerid,0xB8860BFF,"4 уровень: /test");
if(PlayerInfo[playerid][pAdmin] == 5)
SendClientMessage(playerid,0xB8860BFF,"5 уровень: /test");
return 1;
}

gangzone.ini
22.09.2014, 01:47
if(strcmp(cmd, "/ahelp", true) == 0)
{
if(PlayerInfo[playerid][pAdmin] >= 1)
{
SendClientMessage(playerid,0xFFFF00AA,"Доступные команды:");
SendClientMessage(playerid,0xB8860BFF,"1 уровень: /test");
}
if(PlayerInfo[playerid][pAdmin] >= 2)
SendClientMessage(playerid,0xB8860BFF,"2 уровень: /test");
if(PlayerInfo[playerid][pAdmin] >= 3)
SendClientMessage(playerid,0xB8860BFF,"3 уровень: /test");
if(PlayerInfo[playerid][pAdmin] >= 4)
SendClientMessage(playerid,0xB8860BFF,"4 уровень: /test");
if(PlayerInfo[playerid][pAdmin] == 5)
SendClientMessage(playerid,0xB8860BFF,"5 уровень: /test");
return 1;
}
А чем лучше ?)

Salvacore
22.09.2014, 03:39
А чем лучше ?)
Макросы не используются + код поправил.

Valera_Trefilov
22.09.2014, 22:41
new CMD_TEXT[6][64] = {
"/test", "/test", "/test", "/test", "/test"
};

if(strcmp(cmd, "/ahelp", true) == 0)
{
new stringf[64];
for(new i=1; i <= 5; i++)
{
if(PlayerInfo[playerid][pAdmin] < i) continue;
else format(stringf, 64, "%i уровень: %s",i,CMD_TEXT[i]),SendClientMessage(playerid, 0xB8860BFF, stringf);
if(i == 1) SendClientMessage(playerid,0xFFFF00AA,"Доступные команды:");
}
return 1;
}

Salvacore
22.09.2014, 22:56
stringf?
Можно кстати оператор sizeof заюзать.
+ это не удобно.

Valera_Trefilov
22.09.2014, 23:01
Вот немного переделал. как по мне проще команды в массив. а потом просто циклом вывести.
немножко оптимизации просто


new CMD_TEXT[6][64] = {
"/test", "/test", "/test", "/test", "/test"
};

if(strcmp(cmd, "/ahelp", true) == 0)
{
new stringf[64];
for(new i=1; i <= 5; i++)
{
if(i == 1) SendClientMessage(playerid,0xFFFF00AA,"Доступные команды:");
if(PlayerInfo[playerid][pAdmin] == i) format(stringf, 64, "%i уровень: %s",i,CMD_TEXT[i]),SendClientMessage(playerid, 0xB8860BFF, stringf);
else break;
}
return 1;
}


stringf?
Можно кстати оператор sizeof заюзать.
+ это не удобно.

Salvacore
22.09.2014, 23:55
Вот немного переделал. как по мне проще команды в массив. а потом просто циклом вывести.
немножко оптимизации просто


new CMD_TEXT[6][64] = {
"/test", "/test", "/test", "/test", "/test"
};

if(strcmp(cmd, "/ahelp", true) == 0)
{
new stringf[64];
for(new i=1; i <= 5; i++)
{
if(i == 1) SendClientMessage(playerid,0xFFFF00AA,"Доступные команды:");
if(PlayerInfo[playerid][pAdmin] == i) format(stringf, 64, "%i уровень: %s",i,CMD_TEXT[i]),SendClientMessage(playerid, 0xB8860BFF, stringf);
else break;
}
return 1;
}


if(PlayerInfo[playerid][pAdmin] == i) format(stringf, 64, "%i уровень: %s",i,CMD_TEXT[i]),SendClientMessage(playerid, 0xB8860BFF, stringf);
Идеально.

MR_BEN
25.09.2014, 17:43
Вот немного переделал. как по мне проще команды в массив. а потом просто циклом вывести.
немножко оптимизации просто


new CMD_TEXT[6][64] = {
"/test", "/test", "/test", "/test", "/test"
};

if(strcmp(cmd, "/ahelp", true) == 0)
{
new stringf[64];
for(new i=1; i <= 5; i++)
{
if(i == 1) SendClientMessage(playerid,0xFFFF00AA,"Доступные команды:");
if(PlayerInfo[playerid][pAdmin] == i) format(stringf, 64, "%i уровень: %s",i,CMD_TEXT[i]),SendClientMessage(playerid, 0xB8860BFF, stringf);
else break;
}
return 1;
}


Добавить цикл это уже относится к разряду оптимизации?

Eliano
30.09.2014, 21:55
Очень распространенная команда.
Не уверен,что из неё выйдет что-то стоющее.
А так,я понял,выше код оптимизированной версии,добавь в описание,а то будут юзать не оптимизированную.

Unreal
03.10.2014, 23:49
Макросы не используются + код поправил.
и чем ты поправил код?


new CMD_TEXT[6][64] = {
"/test", "/test", "/test", "/test", "/test"
};

if(strcmp(cmd, "/ahelp", true) == 0)
{
new stringf[64];
for(new i=1; i <= 5; i++)
{
if(PlayerInfo[playerid][pAdmin] < i) continue;
else format(stringf, 64, "%i уровень: %s",i,CMD_TEXT[i]),SendClientMessage(playerid, 0xB8860BFF, stringf);
if(i == 1) SendClientMessage(playerid,0xFFFF00AA,"Доступные команды:");
}
return 1;
}


Вот немного переделал. как по мне проще команды в массив. а потом просто циклом вывести.
немножко оптимизации просто


new CMD_TEXT[6][64] = {
"/test", "/test", "/test", "/test", "/test"
};

if(strcmp(cmd, "/ahelp", true) == 0)
{
new stringf[64];
for(new i=1; i <= 5; i++)
{
if(i == 1) SendClientMessage(playerid,0xFFFF00AA,"Доступные команды:");
if(PlayerInfo[playerid][pAdmin] == i) format(stringf, 64, "%i уровень: %s",i,CMD_TEXT[i]),SendClientMessage(playerid, 0xB8860BFF, stringf);
else break;
}
return 1;
}

это уже параноя.
Люди это обычный /ahelp, незачем так глубоко входить в роль.

Salvacore
03.10.2014, 23:52
и чем ты поправил код?




это уже параноя.
Люди это обычный /ahelp, незачем так глубоко входить в роль.

Ну владелец RLS так и скажет.

Alanchick
05.01.2016, 18:23
Ну зачеееем?
Для чего switch?
Ну не тяжело же

switch(PlayerInfo[playerid][pAdmin])
{
case 1:
case 2:
case 3:
....
}

А еще лучше массив юзать.

Daniel_Cortez
05.01.2016, 18:42
Ну зачеееем?
Для чего switch?
Ну не тяжело же

switch(PlayerInfo[playerid][pAdmin])
{
case 1:
case 2:
case 3:
....
}

А еще лучше массив юзать.
Со switch будут показаны команды только для админов своего уровня, без предыдущих.

Alanchick
05.01.2016, 19:19
А если так?


switch(PlayerInfo[playerid][pAdmin])
{
case 1:
case 1,2:
case 1..3:
case 1..4:
case 1..5:
}
Будет муторнее, но более оптимизированнее, разве не так?

Daniel_Cortez
05.01.2016, 19:55
А если так?


switch(PlayerInfo[playerid][pAdmin])
{
case 1:
case 1,2:
case 1..3:
case 1..4:
case 1..5:
}
Будет муторнее, но более оптимизированнее, разве не так?
Вы хоть проверяли этот код? И дело даже не в том, что нет действий после case, можете просто поставить "{}".

Alanchick
05.01.2016, 20:04
Прошу прощения.
Действительно, сглупил.
Ну а если, к примеру, в case 3 вставить команды 1, 2 и 3 лвл'ов?
Я думаю switch будет в любом случае оптимизированнее проверок.
Или не?

Daniel_Cortez
05.01.2016, 20:15
Прошу прощения.
Действительно, сглупил.
Ну а если, к примеру, в case 3 вставить команды 1, 2 и 3 лвл'ов?
Я думаю switch будет в любом случае оптимизированнее проверок.
Или не?
Если понадобится изменить перечень команд для одного из уровней админки, в /ahelp придётся редактировать код сразу в нескольких местах вместо одного. Только зря потеряете время.

Массив тоже не вариант. У одного уровня админки может быть 2-3 команды, а у другого - список из нескольких строк (SCM). Эту проблему можно решить, сделав перечисление (enum) типа "уровень - строка" и в цикле перебирать все строки и показывать те, для которых уровень меньше или равен нужному. Но при таком подходе мало того, что цикл будет медленнее нескольких условий, так ещё и память будет расходоваться нерационально, т.к. в массиве размер всех строк должен быть одинаков.

123
02.08.2016, 10:36
new CMD_TEXT[6][64] = {
"/test", "/test", "/test", "/test", "/test"
};

if(strcmp(cmd, "/ahelp", true) == 0)
{
new stringf[64];
for(new i=1; i <= 5; i++)
{
if(PlayerInfo[playerid][pAdmin] < i) continue;
else format(stringf, 64, "%i уровень: %s",i,CMD_TEXT[i]),SendClientMessage(playerid, 0xB8860BFF, stringf);
if(i == 1) SendClientMessage(playerid,0xFFFF00AA,"Доступные команды:");
}
return 1;
}

То самое чувство, когда "оптимизировал" команду с помощью цикла, и считаешь себя богом скриптинга

$continue$
02.08.2016, 19:20
На самом деле это не оптимизация, а скорее всего удобство. Чем копаться в SendClientMessange при добавление новой команды.
Пожалуй, если бы я писал сейчас мод я так и реализовал бы /ahelp:


const MAX_LEN_COMMANDS = 32;
const MAX_SERVER_COMMANDS = 5;




enum e_ADMIN_COMMANDS_INFO
{
e_name_admin_command[MAX_LEN_COMMANDS],
e_lvl_admin
}
static const admin_commands[MAX_SERVER_COMMANDS][e_ADMIN_COMMANDS_INFO] =
{
{ "/ahelp", 1 },
{ "/spec", 1 },
{ "/skick", 2 },
{ "/mute", 2 },
{ "/goto", 3 }
};


CMD:ahelp(playerid)
{
if(0 == PlayerInfo[playerid][pAdmin]) return 0;
for(new i = 0; i < MAX_SERVER_COMMANDS; i++)
{
if(admin_commands[i][e_lvl_admin] > PlayerInfo[playerid][pAdmin]) continue;
printf("Название команды: %s | Уровень админки: %d", admin_commands[i][e_name_admin_command], admin_commands[i][e_lvl_admin]);
}
}


То самое чувство, когда "оптимизировал" команду с помощью цикла, и считаешь себя богом скриптинга

123
03.08.2016, 07:00
На самом деле это не оптимизация, а скорее всего удобство. Чем копаться в SendClientMessange при добавление новой команды.
Пожалуй, если бы я писал сейчас мод я так и реализовал бы /ahelp:


const MAX_LEN_COMMANDS = 32;
const MAX_SERVER_COMMANDS = 5;




enum e_ADMIN_COMMANDS_INFO
{
e_name_admin_command[MAX_LEN_COMMANDS],
e_lvl_admin
}
static const admin_commands[MAX_SERVER_COMMANDS][e_ADMIN_COMMANDS_INFO] =
{
{ "/ahelp", 1 },
{ "/spec", 1 },
{ "/skick", 2 },
{ "/mute", 2 },
{ "/goto", 3 }
};


CMD:ahelp(playerid)
{
if(0 == PlayerInfo[playerid][pAdmin]) return 0;
for(new i = 0; i < MAX_SERVER_COMMANDS; i++)
{
if(admin_commands[i][e_lvl_admin] > PlayerInfo[playerid][pAdmin]) continue;
printf("Название команды: %s | Уровень админки: %d", admin_commands[i][e_name_admin_command], admin_commands[i][e_lvl_admin]);
}
}


Собственно где удобство? Или меняешь команду прямиком в /ahelp, или лезешь в массив и меняешь там. Причем в конкретно этой реализации, в любой более-менее полной админ-системе игроку зафлудит чат, можно конечно скрепить команды в диалог или выводить с помощью SendClientMessange, проверяя длину (ведь команды никак не вместятся в один SendClientMessange)... Но это уже нагромождения ненужного и бесцельная растрата памяти.

В любом случае, все мои мысли уже передали выше..

ziggi
03.08.2016, 11:53
Самый нормальный вариант - это использовать плагин Pawn.CMD и его функции CmdArray:PC_GetCommandArray(), PC_GetArraySize(CmdArray:arr), PC_GetCommandName(CmdArray:arr, index, dest[], size = sizeof dest). Только так эту команду можно автоматизировать.

UPD. Набросал пример:

#include <a_samp>
#include <Pawn.CMD>

enum (<<=1) {
CMD_USER = 1,
CMD_ADMIN_1,
CMD_ADMIN_2,
CMD_ADMIN_3,
CMD_ADMIN_4,
CMD_ADMIN_5,
};

public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
if (!IsPlayerHasAdminFlag(playerid, flags)) {
SendClientMessage(playerid, -1, "У вас недостаточно прав для выполнения этой команды.");
return 1;
}
return 1;
}

flags:ban(CMD_ADMIN_5);
cmd:ban(playerid, params[])
{
return 1;
}

flags:kick(CMD_ADMIN_4);
cmd:kick(playerid, params[])
{
return 1;
}

flags:ahelp(CMD_ADMIN_1);
cmd:ahelp(playerid, params[])
{
new
CmdArray:cmds,
cmds_count,
cmd_name[32],
flags;

cmds = PC_GetCommandArray();
cmds_count = PC_GetArraySize(cmds);

for (new i = 0; i < cmds_count; i++) {
PC_GetCommandName(cmds, i, cmd_name);
flags = PC_GetFlags(cmd_name);

if (IsPlayerHasAdminFlag(playerid, flags)) {
SendClientMessage(playerid, -1, cmd_name);
}
}
return 1;
}

stock IsPlayerHasAdminFlag(playerid, flags)
{
if ( (flags & CMD_ADMIN_5) && PlayerInfo[playerid][pAdmin] < 5
|| (flags & CMD_ADMIN_4) && PlayerInfo[playerid][pAdmin] < 4
|| (flags & CMD_ADMIN_3) && PlayerInfo[playerid][pAdmin] < 3
|| (flags & CMD_ADMIN_2) && PlayerInfo[playerid][pAdmin] < 2
|| (flags & CMD_ADMIN_1) && PlayerInfo[playerid][pAdmin] < 1
) {
return 0;
}
return 1;
}

Да, придётся каждую команду пометить флагом, но оно того стоит.

iWors
31.10.2016, 16:05
Самый нормальный вариант - это использовать плагин Pawn.CMD и его функции CmdArray:PC_GetCommandArray(), PC_GetArraySize(CmdArray:arr), PC_GetCommandName(CmdArray:arr, index, dest[], size = sizeof dest). Только так эту команду можно автоматизировать.

UPD. Набросал пример:

#include <a_samp>
#include <Pawn.CMD>

enum (<<=1) {
CMD_USER = 1,
CMD_ADMIN_1,
CMD_ADMIN_2,
CMD_ADMIN_3,
CMD_ADMIN_4,
CMD_ADMIN_5,
};

public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
if (!IsPlayerHasAdminFlag(playerid, flags)) {
SendClientMessage(playerid, -1, "У вас недостаточно прав для выполнения этой команды.");
return 1;
}
return 1;
}

flags:ban(CMD_ADMIN_5);
cmd:ban(playerid, params[])
{
return 1;
}

flags:kick(CMD_ADMIN_4);
cmd:kick(playerid, params[])
{
return 1;
}

flags:ahelp(CMD_ADMIN_1);
cmd:ahelp(playerid, params[])
{
new
CmdArray:cmds,
cmds_count,
cmd_name[32],
flags;

cmds = PC_GetCommandArray();
cmds_count = PC_GetArraySize(cmds);

for (new i = 0; i < cmds_count; i++) {
PC_GetCommandName(cmds, i, cmd_name);
flags = PC_GetFlags(cmd_name);

if (IsPlayerHasAdminFlag(playerid, flags)) {
SendClientMessage(playerid, -1, cmd_name);
}
}
return 1;
}

stock IsPlayerHasAdminFlag(playerid, flags)
{
if ( (flags & CMD_ADMIN_5) && PlayerInfo[playerid][pAdmin] < 5
|| (flags & CMD_ADMIN_4) && PlayerInfo[playerid][pAdmin] < 4
|| (flags & CMD_ADMIN_3) && PlayerInfo[playerid][pAdmin] < 3
|| (flags & CMD_ADMIN_2) && PlayerInfo[playerid][pAdmin] < 2
|| (flags & CMD_ADMIN_1) && PlayerInfo[playerid][pAdmin] < 1
) {
return 0;
}
return 1;
}

Да, придётся каждую команду пометить флагом, но оно того стоит.


/* 1 */ public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
/* 2 */ {
/* 3 */ if (!IsPlayerHasAdminFlag(playerid, flags)) {
/* 4 */ SendClientMessage(playerid, -1, "У вас недостаточно прав для выполнения этой команды.");
/* 5 */ return 1; // тут
/* 6 */ }
/* 7 */ return 1;
/* 8 */ }

ziggi
31.10.2016, 18:24
/* 1 */ public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
/* 2 */ {
/* 3 */ if (!IsPlayerHasAdminFlag(playerid, flags)) {
/* 4 */ SendClientMessage(playerid, -1, "У вас недостаточно прав для выполнения этой команды.");
/* 5 */ return 1; // тут
/* 6 */ }
/* 7 */ return 1;
/* 8 */ }

Что тут?

DeimoS
31.10.2016, 21:43
На другом форуме ради фана показывал вариант с скреплением массивов. На деле же, как мне кажется, это будет самый адекватный вариант в случае, когда команды для /ahelp хранятся именно в массиве.


А теперь я покажу вам немного магии

Описание команд для каждого уровня в отдельном массиве (ВАЖНО что бы они всегда стояли вместе и в такой же последовательности)

new acmd_list__moderator1[] =
{
"1 Уровень:\n\
команда 1 - описание\n\
команда 2 - описание\n\
команда 3 - описание\n\
команда 4 - описание\n\
команда 5 - описание\n\
команда 6 - описание\n\
команда 7 - описание\n\
команда 8 - описание\n\
команда 9 - описание\n\
команда 10 - описание\n"
};

new acmd_list__moderator2[] =
{
"2 Уровень:\n\
команда 1 - описание\n\
команда 2 - описание\n\
команда 3 - описание\n\
команда 4 - описание\n\
команда 5 - описание\n\
команда 6 - описание\n\
команда 7 - описание\n\
команда 8 - описание\n\
команда 9 - описание\n\
команда 10 - описание\n"
};

new acmd_list__moderator3[] =
{
"3 Уровень:\n\
команда 1 - описание\n\
команда 2 - описание\n\
команда 3 - описание\n\
команда 4 - описание\n\
команда 5 - описание\n\
команда 6 - описание\n\
команда 7 - описание\n\
команда 8 - описание\n\
команда 9 - описание\n\
команда 10 - описание\n"
};

new acmd_list__administrator1[] =
{
"4 Уровень:\n\
команда 1 - описание\n\
команда 2 - описание\n\
команда 3 - описание\n\
команда 4 - описание\n\
команда 5 - описание\n\
команда 6 - описание\n\
команда 7 - описание\n\
команда 8 - описание\n\
команда 9 - описание\n\
команда 10 - описание\n"
};

new acmd_list__administrator2[] =
{
"5 Уровень:\n\
команда 1 - описание\n\
команда 2 - описание\n\
команда 3 - описание\n\
команда 4 - описание\n\
команда 5 - описание\n\
команда 6 - описание\n\
команда 7 - описание\n\
команда 8 - описание\n\
команда 9 - описание\n\
команда 10 - описание\n"
};

new acmd_list__developer[] =
{
"6 Уровень:\n\
команда 1 - описание\n\
команда 2 - описание\n\
команда 3 - описание\n\
команда 4 - описание\n\
команда 5 - описание\n\
команда 6 - описание\n\
команда 7 - описание\n\
команда 8 - описание\n\
команда 9 - описание\n\
команда 10 - описание\n"
};

Макрос чисто для удобства

#define admin_commands_list acmd_list__moderator1

Превращаем отдельные массивы в один большой (отобразить его можно вызовом первого массива - "acmd_list__moderator1")

public OnGameModeInit()
{
acmd_list__moderator1[sizeof(acmd_list__moderator1)-1] = '\n';// Заменяем нуль-символы массивов на спец.символ переноса строки
acmd_list__moderator2[sizeof(acmd_list__moderator2)-1] = '\n';// Тем самым убирая "границы" между двумя массивами
acmd_list__moderator3[sizeof(acmd_list__moderator3)-1] = '\n';// И когда сервер начнёт обрабатывать массив, выводя все символы до первого нуль-символа
acmd_list__administrator1[sizeof(acmd_list__administrator1)-1] = '\n';// Он найдёт его только в последнем массиве
acmd_list__administrator2[sizeof(acmd_list__administrator2)-1] = '\n';//Следовательно, выведет содержимое всех массивов сразу
acmd_list__developer[sizeof(acmd_list__developer)-1] = '\0';
return 1;
}


Отображаем данные игроку

if(!strcmp(cmd, "/ahelp", true) || !strcmp(cmd, "/ah", true))
{
if (!PlayerInfo[playerid][pAdmin]) return 1;
ShowPlayerDialog(playerid, 675, DIALOG_STYLE_MSGBOX, "Админ-Команды", admin_commands_list, "Ок", "");
return 1;
}

Если нужно, например, вывести с 1 по 3 уровень, просто делаем так:

if(!strcmp(cmd, "/ahelp", true) || !strcmp(cmd, "/ah", true))
{
if (!PlayerInfo[playerid][pAdmin]) return 1;
acmd_list__moderator3[sizeof(acmd_list__moderator3)-1] = '\0';// Вновь возвращаем нуль-символ в конец третьего массива
ShowPlayerDialog(playerid, 675, DIALOG_STYLE_MSGBOX, "Админ-Команды", admin_commands_list, "Ок", "");// Отображаем все данные с 1 по 3-ий массив
acmd_list__moderator3[sizeof(acmd_list__moderator3)-1] = '\n';// Вновь возвращаем символ переноса строки
return 1;
}

То же самое можно провернуть, например, если нужно отобразить только 5-ий уровень

if(!strcmp(cmd, "/ahelp", true) || !strcmp(cmd, "/ah", true))
{
if (!PlayerInfo[playerid][pAdmin]) return 1;
acmd_list__administrator2[sizeof(acmd_list__administrator2)-1] = '\0';// Возвращаем нуль-символ для пятого массива (дабы данные из 6-го массива не попали в диалог)
ShowPlayerDialog(playerid, 675, DIALOG_STYLE_MSGBOX, "Админ-Команды", acmd_list__administrator2, "Ок", "");// Отображаем массив с пятым уровнем
acmd_list__administrator2[sizeof(acmd_list__administrator2)-1] = '\n';// И опять возвращаем символ переноса строки
return 1;
}

И не нужно никакое форматирование использовать.

- - - Добавлено - - -

Можно для удобства такой говнокод написать

stock ShowAdminList(playerid, lower_level = 1, top_level = 6)
{
if(!(1 <= lower_level <= 6))
return 0;

if(!(1 <= top_level <= 6))
return 0;

switch(top_level)
{
case 1: acmd_list__moderator1[sizeof(acmd_list__moderator1)-1] = '\0';
case 2: acmd_list__moderator2[sizeof(acmd_list__moderator2)-1] = '\0';
case 3: acmd_list__moderator3[sizeof(acmd_list__moderator3)-1] = '\0';
case 4: acmd_list__administrator1[sizeof(acmd_list__administrator1)-1] = '\0';
case 5: acmd_list__administrator2[sizeof(acmd_list__administrator2)-1] = '\0';
}

switch(lower_level)
{
case 1: ShowPlayerDialog(playerid, 675, DIALOG_STYLE_MSGBOX, "Админ-Команды", acmd_list__moderator1, "Ок", "");
case 2: ShowPlayerDialog(playerid, 675, DIALOG_STYLE_MSGBOX, "Админ-Команды", acmd_list__moderator2, "Ок", "");
case 3: ShowPlayerDialog(playerid, 675, DIALOG_STYLE_MSGBOX, "Админ-Команды", acmd_list__moderator3, "Ок", "");
case 4: ShowPlayerDialog(playerid, 675, DIALOG_STYLE_MSGBOX, "Админ-Команды", acmd_list__administrator1, "Ок", "");
case 5: ShowPlayerDialog(playerid, 675, DIALOG_STYLE_MSGBOX, "Админ-Команды", acmd_list__administrator2, "Ок", "");
case 6: ShowPlayerDialog(playerid, 675, DIALOG_STYLE_MSGBOX, "Админ-Команды", acmd_list__developer, "Ок", "");
}
switch(top_level)
{
case 1: acmd_list__moderator1[sizeof(acmd_list__moderator1)-1] = '\n';
case 2: acmd_list__moderator2[sizeof(acmd_list__moderator2)-1] = '\n';
case 3: acmd_list__moderator3[sizeof(acmd_list__moderator3)-1] = '\n';
case 4: acmd_list__administrator1[sizeof(acmd_list__administrator1)-1] = '\n';
case 5: acmd_list__administrator2[sizeof(acmd_list__administrator2)-1] = '\n';
}
return 1;
}
И выводить так:

if(!strcmp(cmd, "/ahelp", true) || !strcmp(cmd, "/ah", true))
return ShowAdminList(playerid, 1, PlayerInfo[playerid][pAdmin]);//Выведет все команды с 1 уровня по тот, который у админа
// В самой функции уже встроена проверка на уровень, поэтому в команде дополнительные проверки не обязательны
То бишь

ShowAdminList(playerid, с_какого_уровня, по_какой);