shape1
shape2
shape3
shape4
shape7
shape8

Система АДМИН УРОВНЕЙ | bY BreaD |


Bread

Новичок
Пользователь
10.02.2017
0
7
0
В этом статье я расскажу как сделать админ систему по уровеню/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=":D" /> 
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; 
}
 

Sasha_Kassa

Новичок
Пользователь
10.02.2017
0
0
0
Спс, прям все как я хотел) С меня плюс! А как добавить в бд столбец допустим Admin и можно менять значение ибо лвл через бд

 
Последнее редактирование модератором:

Sasha_Kassa

Новичок
Пользователь
10.02.2017
0
0
0
Здравствуйте, выдает ошибки

C:\Users\Àäìèíèñòðàòîð\Desktop\FUNNYRP\gamemodes\funnyrp.pwn(31) : error 008: must be a constant expression; assumed zero
C:\Users\Àäìèíèñòðàòîð\Desktop\FUNNYRP\gamemodes\funnyrp.pwn(31) : error 009: invalid array size (negative, zero or out of bounds)
C:\Users\Àäìèíèñòðàòîð\Desktop\FUNNYRP\gamemodes\funnyrp.pwn(211) : error 001: expected token: ";", but found "if"
C:\Users\Àäìèíèñòðàòîð\Desktop\FUNNYRP\gamemodes\funnyrp.pwn(211) : error 029: invalid expression, assumed zero
C:\Users\Àäìèíèñòðàòîð\Desktop\FUNNYRP\gamemodes\funnyrp.pwn(223) : error 017: undefined symbol "Red"
C:\Users\Àäìèíèñòðàòîð\Desktop\FUNNYRP\gamemodes\funnyrp.pwn(224) : error 017: undefined symbol "Red"
Строки

new Player[MAX_PLAYERS][pInfo];
if (strcmp("/makeadmin", cmd, true) == ) // создаем командуif(!IsPlayerConnected(player)) return SendClientMessage(playerid,Red,"Игрок не онлайн!"); // если игрок, которого мы ввели после команды не онлайн ...
if(adminl > 5 || adminl < 0) return SendClientMessage(playerid,Red,"Нельзя больше 5 и меньше 0!"); // устанавливаем рамки уровней админки, в данном случае 5 уровней + 0лвл - игрок
Что делать? И кстати увас ошибка тут


Как тут надо?

Код:
public OnPlayerCommandText (срабатывает, когда игрок вводит команду) 
добавляем: 
Код 
new cmd[128],idx,tmp[128]; 
// это нам нужно, чтобы мочь писать команды, в которых присутствует пробелы, после которых идут ID, тексты и т.д. 
Код 
cmd = strtok(cmdtext, idx)
 

Bread

Новичок
Пользователь
10.02.2017
0
7
0
,

Первая решается так, добавь в последнец строке ;

 

Sasha_Kassa

Новичок
Пользователь
10.02.2017
0
0
0
@Bread,а остальные у меня оостались 2. 

C:\Users\Àäìèíèñòðàòîð\Desktop\FUNNYRP\gamemodes\funnyrp.pwn(214) : error 001: expected token: ";", but found "if"
C:\Users\Àäìèíèñòðàòîð\Desktop\FUNNYRP\gamemodes\funnyrp.pwn(214) : error 029: invalid expression, assumed zero
СТРОКА:

if (strcmp("/makeadmin", cmd, true) == ) // создаем команду
Тут скобка не лишняя?
 
Последнее редактирование модератором:

noname_idk

Гуру
Пользователь
19.07.2015
4 046
7
787
0
Скриптер
, замените на if(!strcmp(cmd, "/makeadmin", true))
 

ac1nve

Продвинутый
Пользователь
23.02.2016
591
231
0
Сложно назвать данные вырезки кода "системой".

 

Sasha_Kassa

Новичок
Пользователь
10.02.2017
0
0
0
@Elrmrnt-Kritik, в той же строке теперь одна ошибка 

Код:
C:\Users\Администратор\Desktop\FUNNYRP\gamemodes\funnyrp.pwn(214) : error 001: expected token: ";", but found "if"
 

ac1nve

Продвинутый
Пользователь
23.02.2016
591
231
0
,скиньте полностью команду. 

 

Sasha_Kassa

Новичок
Пользователь
10.02.2017
0
0
0
,

Код:
new cmd[128],idx,tmp[128]; // это нам нужно, чтобы мочь писать команды, в которых присутствует пробелы, после которых идут ID, тексты и т.д.
cmd = strtok(cmdtext, idx)


if(!strcmp(cmd, "/makeadmin", 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=":D" />
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; // завершаем команду} 
 

ac1nve

Продвинутый
Пользователь
23.02.2016
591
231
0


Код:
    if(strcmp(cmd, "/makeadmin", true) == 0)  // создаем команду
	{
	if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xFF0000FF, "Вы не rcon администратор");// узнаем, если игрок не ркон админ, playerid - id игрока, который ввел команду
	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=":D" />
	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; // завершаем команду
	}
 

Sasha_Kassa

Новичок
Пользователь
10.02.2017
0
0
0
, Одна ошибка все равно

Код:
C:\Users\Администратор\Desktop\FUNNYRP\gamemodes\funnyrp.pwn(214) : error 001: expected token: ";", but found "if"
 

noname_idk

Гуру
Пользователь
19.07.2015
4 046
7
787
0
Скриптер
, покажите несколько строк выше... 

 

Sasha_Kassa

Новичок
Пользователь
10.02.2017
0
0
0
@Elrmrnt-Kritik,

Код:
if(strcmp(cmdtext, "/stats", true) == 0)
{
ShowPlayerDialog(playerid, 100, DIALOG_STYLE_MSGBOX, "Ñòàòèñòèêà", "Ðàçðàáîòêà", "Îêåé", "Îòìåíà");
return 1;
}
if(strcmp(cmdtext, "/givemoney", true) == 0)
{
    if(IsPlayerAdmin(playerid))
{
GivePlayerMoney(playerid,1000000);
}
return true;
    }


new cmd[128],idx,tmp[128];
cmd = strtok(cmdtext, idx)

if(!strcmp(cmd, "/makeadmin", true)) // ñîçäàåì êîìàíäó 
 

noname_idk

Гуру
Пользователь
19.07.2015
4 046
7
787
0
Скриптер
, точку с запятой добавьте после cmd = strtok(cmdtext, idx)
 

Sasha_Kassa

Новичок
Пользователь
10.02.2017
0
0
0
@Elrmrnt-Kritik,У меня теперь unknown

server log

Loaded log file: "server_log.txt".
----------


SA-MP Dedicated Server
----------------------
v0.3e, (C)2005-2012 SA-MP Team


[16:20:48] weburl = "www.sa-mp.com"  (string)
[16:20:48] 
[16:20:48] Server Plugins
[16:20:48] --------------
[16:20:48]  Loading plugin: mysql
[16:20:48] 


  > MySQL plugin R7 successfully loaded.


[16:20:48]   Loaded.
[16:20:48]  Loaded 1 plugins.


[16:20:48] 
[16:20:48] Ban list
[16:20:48] --------
[16:20:48]  Loaded: samp.ban
[16:20:48] 
[16:20:48] 
[16:20:48] Filterscripts
[16:20:48] ---------------
[16:20:48]   Loading filterscript 'speedo.amx'...
[16:20:48]   Loading filterscript 'BusSystem.amx'...
[16:20:48]   Loading filterscript 'new.amx'...
[16:20:48]   Unable to load filterscript 'new.amx'.
[16:20:48]   Loaded 2 filterscripts.


[16:20:48] Script[gamemodes/funnyrp.amx]: Run time error 19: "File or function is not found"
[16:20:48] Number of vehicle models: 0

Хотя у меня должен мотоцикл загрузиться