Просмотр полной версии : [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);
Идеально.
Вот немного переделал. как по мне проще команды в массив. а потом просто циклом вывести.
немножко оптимизации просто
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;
}
Добавить цикл это уже относится к разряду оптимизации?
Очень распространенная команда.
Не уверен,что из неё выйдет что-то стоющее.
А так,я понял,выше код оптимизированной версии,добавь в описание,а то будут юзать не оптимизированную.
Макросы не используются + код поправил.
и чем ты поправил код?
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) типа "уровень - строка" и в цикле перебирать все строки и показывать те, для которых уровень меньше или равен нужному. Но при таком подходе мало того, что цикл будет медленнее нескольких условий, так ещё и память будет расходоваться нерационально, т.к. в массиве размер всех строк должен быть одинаков.
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]);
}
}
То самое чувство, когда "оптимизировал" команду с помощью цикла, и считаешь себя богом скриптинга
На самом деле это не оптимизация, а скорее всего удобство. Чем копаться в 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)... Но это уже нагромождения ненужного и бесцельная растрата памяти.
В любом случае, все мои мысли уже передали выше..
Самый нормальный вариант - это использовать плагин 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;
}
Да, придётся каждую команду пометить флагом, но оно того стоит.
Самый нормальный вариант - это использовать плагин 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 */ }
/* 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 */ }
Что тут?
На другом форуме ради фана показывал вариант с скреплением массивов. На деле же, как мне кажется, это будет самый адекватный вариант в случае, когда команды для /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, с_какого_уровня, по_какой);
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot