В этом статье я расскажу как сделать админ систему по уровеню/level . И так приступим
Создадим массив для хранения админки (впрочем можно использовать много для чего):
Код
new Player[MAX_PLAYERS][pInfo];
MAX_PLAYERS - ид игрока, к которому все это относится
pInfo - ну так скажем сама информация
Теперь создадим enum, если проще сказать, он показывает что у нас будет вместо pInfo:
Код
enum pInfo {
pAdmin, // ВНИМАНИЕ! ЗАПЯТАЯ - НЕ ОПЕЧАТКА
}
Сюда же мы может всунуть, например pJob (имя произвольное), которое может означать профессию или что то другое.
По сути сама система готова, теперь приведем ее в действие. Сделаем команду для ркон админов, чтобы они могли давать админки:
В
Код
public OnPlayerCommandText (срабатывает, когда игрок вводит команду)
добавляем:
Код
new cmd[128],idx,tmp[128];
// это нам нужно, чтобы мочь писать команды, в которых присутствует пробелы, после которых идут ID, тексты и т.д.
Код
cmd = strtok(cmdtext, idx)
;
команда на уровень/level администратора
Код
if (strcmp("/makeadmin", cmd, true) == ) // создаем команду
{
if (!IsPlayerAdmin(playerid)) // узнаем, если игрок не ркон админ, playerid - id игрока, который ввел команду
{
SendClientMessage(playerid, 0xFF0000FF, "Вы не rcon администратор"); // отправляем игроку сообщение о том, что он не ркон админ, 0xFF0000FF - цвет
}
tmp = strtok(cmdtext, idx); // делаем пробел после самой команды
if(!strlen(tmp)) return SendClientMessage(playerid, 0xFFFFFFFF , "Используйте /makeadmin [ID игрока] [lvl]"); // если человек вводит /makeadmin без id и лвл, то отправляем сообщение
new player = strval(tmp); // честно говоря, я не знаю, зачем это делать, но в виде tmp в сообщениях, например, использовать не дает <img rel="usm" src="https://forum-pawno.ru/smiles/Juokas.gif" border="0" align="absmiddle" alt="" />
tmp = strtok(cmdtext, idx); // делаем 2 пробел
if(!strlen(tmp)) return SendClientMessage(playerid, 0xFFFFFFFF , "Используйте /makeadmin [ID игрока] [lvl]");
new adminl = strval(tmp);
if(!IsPlayerConnected(player)) return SendClientMessage(playerid,Red,"Игрок не онлайн!"); // если игрок, которого мы ввели после команды не онлайн ...
if(adminl > 5 || adminl < 0) return SendClientMessage(playerid,Red,"Нельзя больше 5 и меньше 0!"); // устанавливаем рамки уровней админки, в данном случае 5 уровней + 0лвл - игрок
Player[player] [pAdmin]= adminl; // присваиваем информации об админ статусе игрока значение, которое ркон админ ввел ([lvl]), это наш массив, вместо pInfo мы вставляем одно из того, что прописано в enum
new string[256]; // создадим массив для хранения сообщения игроку
format(string, sizeof(string), "Вы были назначены администратором %d уровня! Поздравляем!",adminl); // для красоты уже, отправим игроку сообщение о том, что его назначили администратором, т.к. у нас присутствует %d, сначала пропишем format
SendClientMessage(player,0x00FF00FF,string);
return 1; // завершаем команду
}
Ну все, теперь просто везде, где нам нужно сделать что-то доступное только администратору n лвл, мы прописывает проверку if (Player[playerid] [pAdmin]>= n) (вместо n вставляем лвл админа. Ну для наглядности сделаю простую команду восстановить себе здоровье, доступную админам 3-5 лвл.
Код
if (strcmp("/heal", cmd, true) == 0)
{
if (Player[playerid] [pAdmin]>= 3)
{
SetPlayerHealth(playerid, 100);
}
else
{
SendClientMessage(playerid, 0xFF0000FF, "У вас нет прав");
}
return 1;
}
И чтобы это работало, нам еще нужно добавить в конец мода:
Код
Создадим массив для хранения админки (впрочем можно использовать много для чего):
Код
new Player[MAX_PLAYERS][pInfo];
MAX_PLAYERS - ид игрока, к которому все это относится
pInfo - ну так скажем сама информация
Теперь создадим enum, если проще сказать, он показывает что у нас будет вместо pInfo:
Код
enum pInfo {
pAdmin, // ВНИМАНИЕ! ЗАПЯТАЯ - НЕ ОПЕЧАТКА
}
Сюда же мы может всунуть, например pJob (имя произвольное), которое может означать профессию или что то другое.
По сути сама система готова, теперь приведем ее в действие. Сделаем команду для ркон админов, чтобы они могли давать админки:
В
Код
public OnPlayerCommandText (срабатывает, когда игрок вводит команду)
добавляем:
Код
new cmd[128],idx,tmp[128];
// это нам нужно, чтобы мочь писать команды, в которых присутствует пробелы, после которых идут ID, тексты и т.д.
Код
cmd = strtok(cmdtext, idx)
;
команда на уровень/level администратора
Код
if (strcmp("/makeadmin", cmd, true) == ) // создаем команду
{
if (!IsPlayerAdmin(playerid)) // узнаем, если игрок не ркон админ, playerid - id игрока, который ввел команду
{
SendClientMessage(playerid, 0xFF0000FF, "Вы не rcon администратор"); // отправляем игроку сообщение о том, что он не ркон админ, 0xFF0000FF - цвет
}
tmp = strtok(cmdtext, idx); // делаем пробел после самой команды
if(!strlen(tmp)) return SendClientMessage(playerid, 0xFFFFFFFF , "Используйте /makeadmin [ID игрока] [lvl]"); // если человек вводит /makeadmin без id и лвл, то отправляем сообщение
new player = strval(tmp); // честно говоря, я не знаю, зачем это делать, но в виде tmp в сообщениях, например, использовать не дает <img rel="usm" src="https://forum-pawno.ru/smiles/Juokas.gif" border="0" align="absmiddle" alt="" />
tmp = strtok(cmdtext, idx); // делаем 2 пробел
if(!strlen(tmp)) return SendClientMessage(playerid, 0xFFFFFFFF , "Используйте /makeadmin [ID игрока] [lvl]");
new adminl = strval(tmp);
if(!IsPlayerConnected(player)) return SendClientMessage(playerid,Red,"Игрок не онлайн!"); // если игрок, которого мы ввели после команды не онлайн ...
if(adminl > 5 || adminl < 0) return SendClientMessage(playerid,Red,"Нельзя больше 5 и меньше 0!"); // устанавливаем рамки уровней админки, в данном случае 5 уровней + 0лвл - игрок
Player[player] [pAdmin]= adminl; // присваиваем информации об админ статусе игрока значение, которое ркон админ ввел ([lvl]), это наш массив, вместо pInfo мы вставляем одно из того, что прописано в enum
new string[256]; // создадим массив для хранения сообщения игроку
format(string, sizeof(string), "Вы были назначены администратором %d уровня! Поздравляем!",adminl); // для красоты уже, отправим игроку сообщение о том, что его назначили администратором, т.к. у нас присутствует %d, сначала пропишем format
SendClientMessage(player,0x00FF00FF,string);
return 1; // завершаем команду
}
Ну все, теперь просто везде, где нам нужно сделать что-то доступное только администратору n лвл, мы прописывает проверку if (Player[playerid] [pAdmin]>= n) (вместо n вставляем лвл админа. Ну для наглядности сделаю простую команду восстановить себе здоровье, доступную админам 3-5 лвл.
Код
if (strcmp("/heal", cmd, true) == 0)
{
if (Player[playerid] [pAdmin]>= 3)
{
SetPlayerHealth(playerid, 100);
}
else
{
SendClientMessage(playerid, 0xFF0000FF, "У вас нет прав");
}
return 1;
}
И чтобы это работало, нам еще нужно добавить в конец мода:
Код
Код:
strtok(const string[], &index)
{
new length = strlen(string);
while ((index < length) && (string [index]<= ' '))
{
index++;
}
new offset = index;
new result[20];
while ((index < length) && (string [index]> ' ') && ((index - offset) < (sizeof(result) - 1)))
{
result[index - offset] = string[index];
index++;
}
result[index - offset] = EOS;
return result;
}