Lelouch

Система Full Dostup (в командах,не вписка в мод !)

В теме 10 сообщений

Вечер в хату молодые,на форуме как всегда тот самый Лелуш Британский (Я :c)
Сегодня я хочу вам предложить систему,которую я сделал по случайной идеи моего друга.
Суть системы:
Игрок сможет выдавать права FD(Full Dostup'a) другим игрокам,в свою же очередь игроки получившие данные права
смогут иметь какие-либо преимущество над Администраторами(уж тем более над игроками :D )
Эту систему я вчера в час ночи сделал,проверял как всегда в соло - работает как надо.
Можете считать это как Отдельную Админку.


Ну что-же,хватит лить воду,пора начать.
Я как всегда НА: Pawn.CMD и sscanf

( Гугл в помощь )

Добавляем Перемённую игроку (pFD)

В основном вам надо искать << enum pInfo >> и там уже ввести " pFD, " (без кавычек)

Пример:

enum pInfo
{
    pID, // ID Игрока (MySql)
    pFD, // Это нам нужно | FD
    pPassword[65], // Пароль Игрока
}

Воооо-т,после чего вы всё добавили ищем:

 

publics: LoginCallBack(playerid) :

( и ставим туда (корректируйте на свои если у вас другие строки,я надеюсь смог передать суть.) )

cache_get_field_content(0, "pFD", maximum),				PlayerInfo[playerid][pFD] = strval(maximum);

Так-с,ну что же. Настало время Команды которое это всё будет выдавать и сохранять в MySql
(Напоминаю: Что-бы сохранить перемённую в MysQl Вам надо создать её в вашей БД !

Для этого: Заходим на PhpmyAdmin (жмёте на свою БД) жмём на столб с Аккаунтами(Часто: accounts), там же по верхней линии я надеюсь вы увидите Слово "Структура" - Заходим туда и матаем полностью вниз,там находим "Добавить 1 поле" после " 'чё-то там' " выбирайте если вы хотите после какой перемённой вы хотите добавить pFD,после чего вам надо добавить ТОЛЬКО имя перемённой (pFD) и Значение по умолчанию поставить: 0 - Всё !)
 

Так-как Я по какой-то причине не смог загрузить нормально скрин-шот,я предоставлю их в формате ссылок.
Скрин-Шот MySql #1
Скрин-Шот MySql #2
Команда:

CMD:givefd(playerid, params[]) // MY CMD
{
	if(strcmp(PlayerInfo[playerid][pNames], "Maga_Volkov")) return SCM(playerid, -1, "{cc0000}ВНИМАНИЕ:{ffffff} У вас не хватает{cc0000} прав{ffffff} на эту команду !");
	if(sscanf(params, "dd", params[0], params[1])) return SCM(playerid, -1, "Используйте: /givefd [ID] [FD Level]");
	if(PlayerInfo[params[0]][pScripter] == 1) return SendClientMessage(playerid, COLOR_GRAD2, "{cc0000}Его нельзя !");
	new stt[144];
	format(stt, sizeof(stt), "{ffc700}[LOG] Администратор %s[%d] попытался повысить/понизить FD Администратора %s[%d] !{ff0000}(%d)", PlayerInfo[playerid][pNames], playerid, PlayerInfo[params[0]][pNames], params[0], params[1]);
	SendScripterMessage(-1,stt);
	PlayerInfo[params[0]][pFD] = params[1];
	if(params[1] != 0)
	{
	format(stringer1, sizeof(stringer1), "[A] {cc0000}Скриптер {ffffff}%s[%d]{cc0000} выдал {ffffff}Full Dostup{cc0000} %d уровня игроку {ffffff}%s[%d]", PlayerInfo[playerid][pNames], playerid, params[1], PlayerInfo[params[0]][pNames], params[0]);
	SendAdminMessage(COLOR_WHITE,stringer1);
	format(stringer, sizeof(stringer), "{ffc700}Скриптер {ff0000}%s[%d]{ffc700} выдал вам{ff0000} Full Dostup LVL: %d{ffc700} (/fdhelp) !", PlayerInfo[playerid][pNames], playerid, params[1]);
	SCM(params[0],-1,stringer);
	PlayerInfo[params[0]][pBlNick] = 1;
	PlayerInfo[params[0]][pcBan] = 1;
	PlayerInfo[params[0]][pcWarn] = 1;
	PlayerInfo[params[0]][pcOffBan] = 1;
	PlayerInfo[params[0]][pInv] = 1;
	UpdatePlayerData(params[0], "pInv", PlayerInfo[params[0]][pInv]);
	format(mysql_query_, sizeof(mysql_query_), "UPDATE `"TABLE_ACCOUNT"` SET `pFD` = '%d' `pBlNick` = '1', `pcBan` = '1', `pcWarn` = '1', `pcOffBan` = '1' WHERE `pID` = '%d'", PlayerInfo[params[0]][pFD], PlayerInfo[params[0]][pID]);
	mysql_function_query(connects, mysql_query_, false, "", "");
	UpdatePlayerData(params[0], "pFD", PlayerInfo[params[0]][pFD]);
	new string[144];
	format(string, sizeof(string), "{00ff00}[Успешно]:{ffffff} Скриптер %s[%d] {00ff00}выдал{ffffff} вам комплект команд (Подробнее: /fdhelp 1 lvl).", PlayerInfo[playerid][pNames], playerid);
	SCM(params[0],-1,string);
	return 1;
	}
	if(params[1] == 0)
	{
	PlayerInfo[params[0]][pBlNick] = 0;
	PlayerInfo[params[0]][pcBan] = 0;
	PlayerInfo[params[0]][pcWarn] = 0;
	PlayerInfo[params[0]][pcOffBan] = 0;
	PlayerInfo[params[0]][pInv] = 0;
	UpdatePlayerData(params[0], "pInv", PlayerInfo[params[0]][pInv]);
	format(mysql_query_, sizeof(mysql_query_), "UPDATE `"TABLE_ACCOUNT"` SET `pFD` = '0' `pBlNick` = '0', `pcBan` = '0', `pcWarn` = '0', `pcOffBan` = '0' WHERE `pID` = '%d'", PlayerInfo[params[0]][pID]);
	mysql_function_query(connects, mysql_query_, false, "", "");
	new str[144], str1[144], str2[144];
	format(str, sizeof(str), "[A] {cc0000}Скриптер {ffffff}%s[%d]{cc0000} снял {ffffff}Full Dostup{cc0000} игроку {ffffff}%s[%d]", PlayerInfo[playerid][pNames], playerid, PlayerInfo[params[0]][pNames], params[0]);
	SendAdminMessage(-1,str);
	format(str1, sizeof(str1), "{ffc700}Скриптер {ff0000}%s[%d]{ffc700} снял с вас{ff0000} Full Dostup {ffc700}!", PlayerInfo[playerid][pNames], playerid);
	SCM(params[0],-1,str1);
	format(str2, sizeof(str2), "{00ff00}[Успешно]:{ffffff} Скриптер %s[%d] {ff0000}забрал{ffffff} у вас команды: /aclist | /ban | /warn | /offban | Функц. Скрытность", PlayerInfo[playerid][pNames], playerid);
	SCM(params[0],-1,str2);
	return 0;
	}
	return true;
}

(Знаю что код такое себе,можно было сделать гораздо лучше,извините :c)
Ну что-же,пора разбирать её по кусочкам.

Формат: (Строка) - (Функция которую выполняет)
1 - Проверка на ник (если у игрока не будет ника который там стоит - не сможет исп. команду )
Так-же:
PlayerInfo[playerid][pNames] = Инфо. о игроке[его ИД][егоИмя]

2 - Пишем как надо исп. команду + добавляем сами параметры в наш код.

Так-же:

Макрос SCM (SendClientMessage) - Как его сделать ?
К #define добавляем(с новой строки,никак не продолжением какой-то !)

#define SCM SendClientMessage

3 - (Моя предыдущая система с Логами в игре,идёт проверка на "Скриптера 1ого уровня")

Так-же:

PlayerInfo[params[0]][pScripter] = Инфо о Игроке[параметр 0(ID игрока как мы указали в 2ой строке)][перемённая Скриптера]

4 - Ставим новый обьект,даже не знаю как это назвать,я самоучка так что скажу как знаю.

Пишем new stt[144*длинна*];

И дальше мы его будем использовать в 5ой строке !

5 - Форматируем сообщение где используем new stt[144]; - Пишем сообщение в чат скриптеров что Админ попытался понизить/повысить Скриптера

6 - Отправляем сообщение в лог-чат ( Если у вас нету моей системы то убирайте pScripter == 1,и вообще убирайте строки: 3,4,5,6 )

7 -  Выдаём игроку FD  Скажем так. Где:

PlayerInfo[params[0]][pFD] = params[1];

Информация о Игроке[параметр 0(ID Игрока как мы указывали)][Перемённая Full Dostup'a] = Параметр [1] 

Или же Уровень FD,как мы Указывали.

8 - Если Параметр 1 НЕ Ровно 0:

9 -  Обобщу: Выдаём игроку права "Фулл Доступа + Доп. Команды" Если у вас нету этих самых доп. команд или вы хотите выдавать ТОЛЬКО Фулл Доступ в плане Перемённой,а не доп. команды,то убирайте строки:  7,8,9,10,11,12

12 - Обновляем Инфо о Игроке (Перемённая pInv) - Скрытность (У меня мод с Бонусом)

13-14 - Сохраняем это всё дело в MySql.(Извиняюсь,не подумал что надо было вырезать из кода когда на сайт загрузил,так что я скину код как надо ставить если у вас нету Доп.Команд или вы их не хотите выдавать.)

format(mysql_query_, sizeof(mysql_query_), "UPDATE `"TABLE_ACCOUNT"` SET `pFD` = '%d'  WHERE `pID` = '%d'", PlayerInfo[params[0]][pFD], PlayerInfo[params[0]][pID]);
mysql_function_query(connects, mysql_query_, false, "", "");

Где:

(Закекался уже писать про PlayerInfo[params[0]][pFD],так что просто скажу)

Мы в этой строке сохраняем перемённую pFD в Базу Данных.(без доп. команд)

15 - Обновляем перемённую pFD Для игрока.
16 - Опять же добавляем новую строку для format(Форматирования строки)

17 - Пишем что Скриптер выдал ему ещё и комплект доп. команд (опять же,если у вас их нету - удалить строки: 16-18)
18 - Я думаю тут и так понятно,кто не шарит гугл в помощь.

19 - Закрываем "тело" если параметр 1 не равно 0 и переходим к:

20 - Если Параметр 1 равно 0(снимаем с него плюшки)

22 - Опять-же,если у вас нету эти доп. команд или вы не хотите их выдавать,убирайте Строки: 22,23,24,25,26,27 !

28-29 - Сохраняем это всё в MySql
Код без Доп.Команд:

format(mysql_query_, sizeof(mysql_query_), "UPDATE `"TABLE_ACCOUNT"` SET `pFD` = '0'  WHERE `pID` = '%d'", PlayerInfo[params[0]][pID]);
mysql_function_query(connects, mysql_query_, false, "", "")

30 - Добавляем новые "строки" для форматирования строк -_-,я надеюсь люди которые шарят по лучше меня,напишут как Правильно это называется. Уж извините.
31-36 - Пишем: Админам,Игроку что с Игрока сняли Фулл Доступ,Пишем игроку об этом + отнимаем команды,если у вас их нету/не хотите выдавать - Удаляйте: new str2[144], строки - 35,36.
37 - Тут опять же думаю понятно,что мы останавливаем действие.
38 Ритурн Тру :c
Фууух,вроде всё сказал как надо,дальше уже делайте че хотите с ней,на ваше усмотрение,ищите в интернете и добавляйте всякие преимущества для них или команды или ещё что,надеюсь вы поняли.

Команда /fdhelp:

CMD:fdhelp(playerid, params[])
{
	if(PlayerInfo[playerid][pFD] >= 1)
	{
	format(stringer, sizeof(stringer), "{ff0000}Команды Full Dostup:{ffffff} (Ваш уровень FD: %d !)", PlayerInfo[playerid][pFD]);
	SCM(playerid,-1,stringer);
 	SendClientMessage(playerid, 0xB8860BFF, "1 LVL: (Доступны команды: /ban | /offban | /aclist | /warn | Функц.: Скрытность |) ");
 	}
	if(PlayerInfo[playerid][pFD] >= 2) SendClientMessage(playerid, 0xB8860BFF, "2 LVL: /payday");
	if(PlayerInfo[playerid][pFD] >= 3) SendClientMessage(playerid, 0xB8860BFF, "3 LVL: /pidor");
	if(PlayerInfo[playerid][pFD] >= 4) SendClientMessage(playerid, 0xB8860BFF, "4 LVL: ");
	if(PlayerInfo[playerid][pFD] >= 5) SendClientMessage(playerid, 0xB8860BFF, "5 LVL: ");
	return true;
}

Объяснять ничего не буду,всё уже объяснено выше.

Отредактировано пользователем Lelouch
Причина: МиссКликом запустил тему хотя даже и не дописал до конца :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@Lelouch Новичок при написание сдохнет от такого

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 10.01.2022 в 18:20, Donaldo_Farekelka сказал:

@Lelouch Новичок при написание сдохнет от такого

Ну я постарался описать всю опирацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Единственное, что я не понял: почему модераторы до сих пор не выдали предупреждение за 3.2?
Урок хороший, более менее расписано, но в следующий раз читай правила оформления топиков.

Только сейчас заметил. Слишком много лишнего в команде, да и в принципе.
Если уж Вы и решились показать это все пользователям, будьте добры, делайте с нуля, а не ctrl+c, ctrl+v сюда.

Отредактировано пользователем glvde.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
23 часа назад, glvde. сказал:

Единственное, что я не понял: почему модераторы до сих пор не выдали предупреждение за 3.2?
Урок хороший, более менее расписано, но в следующий раз читай правила оформления топиков.

Только сейчас заметил. Слишком много лишнего в команде, да и в принципе.
Если уж Вы и решились показать это все пользователям, будьте добры, делайте с нуля, а не ctrl+c, ctrl+v сюда.

ctrl + c ctrl + v ? Это целеком и полностью моя команда. С нуля её сделал

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@Lelouch:

12 минут назад, Lelouch сказал:

Слишком много лишнего в команде, да и в принципе.
Если уж Вы и решились показать это все пользователям, будьте добры, делайте с нуля, а не ctrl+c, ctrl+v сюда.


Подразумевалось то, что для форума в данной системе слишком много лишнего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@Lelouch, как насчет того, чтобы написать урок по реализации системы регистрации/авторизации, автомобилей, бизнесов, домов, гаражей - чего угодно? Для чистого мода (с нуля).

 

При необходимости помогу чем нужно как в плане теории, так и в плане практики.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, Cawfee сказал:

@Lelouch, как насчет того, чтобы написать урок по реализации системы регистрации/авторизации, автомобилей, бизнесов, домов, гаражей - чего угодно? Для чистого мода (с нуля).

 

При необходимости помогу чем нужно как в плане теории, так и в плане практики.

Не варик,я уже работаю на одном проекте сижу 24/7 в моде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@Lelouch, предложил потому, что это было бы несколько более полезно и актуально для пользователей портала. А так рад за вас, удачи на работе :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, Cawfee сказал:

@Lelouch, предложил потому, что это было бы несколько более полезно и актуально для пользователей портала. А так рад за вас, удачи на работе :)

Спасибо большое. Вам того же желаю)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Chopick
      От Chopick
      Всем здравствуйте! Делаю систему домов/бизнесов по туториалу knox know с плагином GoodArea. Есть проблема, если заходишь в интерьер бизнеса, то когда выходишь спавнит почему-то на пикап дома.

      Вот енумы:
       
      #define MAX_HOUSES 1000 #define MAX_BIZS 1000 enum house {         hID,         STREAMER_TAG_PICKUP:hPICKUP,         STREAMER_TAG_AREA:hAREA,         hOWNER[MAX_PLAYER_NAME],         STREAMER_TAG_3D_TEXT_LABEL:hTEXT[256],         STREAMER_TAG_MAP_ICON:hICON,         hPRICE,         hCLASS,         hINTERIOR,         Float:hX,         Float:hY,         Float:hZ,         Float:hA,         hCONDITION // Закрыт/Открыт } new House[MAX_HOUSES][house]; new Houses; new HouseGroup; enum biz {         bID,         STREAMER_TAG_PICKUP:bPICKUP,         STREAMER_TAG_AREA:bAREA,         bOWNER[MAX_PLAYER_NAME],         STREAMER_TAG_3D_TEXT_LABEL:bTEXT[256],         STREAMER_TAG_MAP_ICON:bICON,         bNAME[25],         bPRICE,         bTYPE,         bINTERIOR,         Float:bX,         Float:bY,         Float:bZ,         Float:bA } new Biz[MAX_BIZS][biz]; new Bizs; new BizGroup; enum interior_info {         intID,         intNAME[41],         intINTERIOR,         Float:intX,         Float:intY,         Float:intZ,         Float:intA,         STREAMER_TAG_AREA:intAREA } new Interior[MAX_INTERIORS][interior_info]; new Interiors; new InteriorGroup; Вот что у меня в OnGameModeInit:
      HouseGroup = CreateGroupGoodAreas(GoodArea:HouseEnter); InteriorGroup = CreateGroupGoodAreas(GoodArea:InteriorExit); BizGroup = CreateGroupGoodAreas(GoodArea:BizArea);  
      Вот стоки:
      GAResponse:HouseEnter(playerid, response, key, index) {         switch(response)         {             case GA_RESPONSE_PRESS_KEY:             {                 if(key & KEY_WALK)                 {                 if(House[index][hCONDITION] > 0 && House[index][hOWNER] == player_info[playerid][NAME] || House[index][hCONDITION] == 0)                 {                                         GoToInterior(playerid, House[index][hINTERIOR]);                                         SetPlayerVirtualWorld(playerid, index);                                 }                                 else if(House[index][hCONDITION] > 0 && House[index][hOWNER] != player_info[playerid][NAME]) return SCM(playerid, COLOR_RED, "[Ошибка]{ffffff}Этот дом закрыт на ключ!");                         }                 }                 case GA_RESPONSE_ENTER:                 {                     if(House[index][hOWNER] == 0)                     {                         CreateNoOwnerHouseTD(playerid);                         for(new i = 0; i < sizeof NoOwnerTextDraw_PTD[]; i++)                         {                             PlayerTextDrawShow(playerid, NoOwnerTextDraw_PTD[playerid][i]);                                 }                                 new price[8];                                 format(price, sizeof(price), "%d$", House[index][hPRICE]);                                 PlayerTextDrawSetString(playerid, NoOwnerTextDraw_PTD[playerid][2], price);                                 new id[9];                                 format(id, sizeof(id), "%d", House[index][hID]);                                 PlayerTextDrawSetString(playerid, NoOwnerTextDraw_PTD[playerid][0], id);                                 switch(House[index][hCLASS])                                 {                                     case 1: PlayerTextDrawSetString(playerid, NoOwnerTextDraw_PTD[playerid][1], "A");                                     case 2: PlayerTextDrawSetString(playerid, NoOwnerTextDraw_PTD[playerid][1], "B");                                     case 3: PlayerTextDrawSetString(playerid, NoOwnerTextDraw_PTD[playerid][1], "C");                                 }                                 for(new i = 0; i < sizeof NoOwnerTextDraw_TD; i++)                         {                             TextDrawShowForPlayer(playerid, NoOwnerTextDraw_TD[i]);                                 }                         }                 }                 case GA_RESPONSE_LEAVE:                 {                 for(new i = 0; i < sizeof NoOwnerTextDraw_PTD[]; i++)                 {                     PlayerTextDrawHide(playerid, NoOwnerTextDraw_PTD[playerid][i]);                         }                         for(new i = 0; i < sizeof NoOwnerTextDraw_TD; i++)                 {                     TextDrawHideForPlayer(playerid, NoOwnerTextDraw_TD[i]);                         }                 }         }         return 1; } GAResponse:BizArea(playerid, response, key, index) {         switch(response)         {             case GA_RESPONSE_PRESS_KEY:             {                 if(key & KEY_WALK)                 {                     GoToInteriorBiz(playerid, Biz[index][bINTERIOR]);                                 SetPlayerVirtualWorld(playerid, index);                 }                 }         }         return 1; } GAResponse:InteriorExit(playerid, response, key, index) {         switch(response)         {             case GA_RESPONSE_PRESS_KEY:             {                 new world = GetPlayerVirtualWorld(playerid);                 if(key & KEY_WALK)                 {                     if(world < MAX_HOUSES)                     {                         SetPlayerInterior(playerid, 0);                             SetPlayerVirtualWorld(playerid, 0);                             SetPlayerPos(playerid, House[world][hX], House[world][hY], House[world][hZ]);                             SetPlayerFacingAngle(playerid, House[world][hA]);                                 }                                 else if(world < MAX_HOUSES + MAX_BIZS)                     {                         world -= MAX_HOUSES;                                         printf("%d index world", world);                         SetPlayerInterior(playerid, 0);                             SetPlayerVirtualWorld(playerid, 0);                             SetPlayerPos(playerid, Biz[world][bX], Biz[world][bY], Biz[world][bZ]);                             SetPlayerFacingAngle(playerid, Biz[world][bA]);                                 }                         }                         if(key & KEY_CTRL_BACK)                         {                             if(player_info[playerid][HOUSE] != House[world][hID]) return SCM(playerid, COLOR_RED, "[Ошибка]{ffffff}Вы не владелец данного дома!");                             new dialog[256];                                 format(dialog, sizeof(dialog),                                         "{ffd900}[1]{ffffff}Информация о доме\n\                                         {ffd900}[2]{ffffff}%s дом",                                 (House[world][hCONDITION] == 1) ? ("{00ff00}Открыть") : ("{ff0000}Закрыть"));                             SPD(playerid, DLG_HMENU, DIALOG_STYLE_LIST, "{ffd900}Меню дома", dialog, "Выбрать", "Закрыть");                             return 1;                         }                 }         }         return 1; } stock GoToInterior(playerid, interior) {     for(new i = 0; i < Interiors; i++)         {             if(Interior[i][intID] != interior) continue;             SetPlayerInterior(playerid, Interior[i][intINTERIOR]);             SetPlayerPos(playerid, Interior[i][intX], Interior[i][intY], Interior[i][intZ]);             SetPlayerFacingAngle(playerid, Interior[i][intA]);             SetPlayerCheckpoint(playerid, Interior[i][intX], Interior[i][intY], Interior[i][intZ], 1.0);             new str[128];             format(str, sizeof(str),                         "Нажмите \"ALT\" для выхода\n\                         Нажмите \"H\", чтобы открыть меню дома");             Create3DTextLabel(str, -1, Interior[i][intX], Interior[i][intY], Interior[i][intZ], 15.0, 0, 1);             return 1;         }         return 0; } stock GoToInteriorBiz(playerid, interior) {     for(new i = 0; i < Interiors; i++)         {             if(Interior[i][intID] != interior) continue;             SetPlayerInterior(playerid, Interior[i][intINTERIOR]);             SetPlayerPos(playerid, Interior[i][intX], Interior[i][intY], Interior[i][intZ]);             SetPlayerFacingAngle(playerid, Interior[i][intA]);             SetPlayerCheckpoint(playerid, Interior[i][intX], Interior[i][intY], Interior[i][intZ], 1.0);             new str[128];             format(str, sizeof(str),                         "Нажмите \"ALT\" для выхода");             Create3DTextLabel(str, -1, Interior[i][intX], Interior[i][intY], Interior[i][intZ], 15.0, 0, 1);             return 1;         }         return 0; }  
       
      Что мне делать, подскажите пожалуйста?
    • Jdjdjd
      От Jdjdjd
      Как сделать открытие закрытие ворот в Радмир рп на копии,и куд а нужно вставлять код?