Перейти к содержанию

Поиск сообщества

Показаны результаты для тегов 'урок'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип контента


Форумы

  • Информационный раздел
    • Новости
    • Полезности для Игроков
    • Black List
    • Предложения по улучшению форума
    • Жалоба на модератора/администратора.
    • Наш гарант-сервис!
    • Помощь (F.A.Q)
    • Заявки
  • Pawn скриптинг
    • Готовые решения
    • Изучаем язык pawn
    • Вопросы по скриптингу
    • Ошибки при компилировании
    • Вопросы/проблемы по маппингу
    • Ошибки при запуске серверов
    • Модификации
  • CR:MP
    • Моды
    • Скрипты
    • Маппинг
    • Команды
    • IDs
    • Плагины/инклуды
    • Функции
    • Ваши сервера
  • SA:MP
    • Моды
    • Скрипты
    • Маппинг
    • Команды
    • IDs
    • Плагины/инклуды
    • Функции
    • Ваши сервера
  • Прочее
    • Разработки ПО
    • WEB-Разработки
    • Photoshop
    • Стол заказов
    • Флейм/Оффтоп/Общение
    • Проблемы с программным обеспечением
    • Другие темы по PAWN/GTA
    • Портфолио
    • Архив
    • Прочее файлы портала

Группы продуктов

  • Услуги портала
  • Исполнители от PAWNO-CRMP.RU
  • Школа

Категории

  • Для игроков
    • GRAND THEFT AUTO
    • CLEO
    • SAMPFUNCS
  • CR:MP
    • Мод
    • Скрипты
    • Плагины/инклуды
  • SA:MP
    • Моды
    • Скрипты
    • Плагины/инклуды
  • Модификации
    • Пакет модификаций (мод-пак)
    • Автомобили
    • Скины
    • Объекты
    • Разное
  • Прочее
    • Разработки ПО
    • WEB-Разработки
    • PSD
    • Прочее файлы

Блоги

  • Блог разработчика

Поиск результатов в...

Поиск контента, содержащего...


Дата создания

  • Начало

    Конец


Дата обновления

  • Начало

    Конец


Фильтр по количеству...

Регистрация

  • Начало

    Конец


Группа


Skype


Discord


ВК


Ник в игре


Род занятий


Балл

Найдено: 44 результата

  1. Вот сама функция: Create3DTextLabel(text[], color, Float:X, Float:Y, Float:Z, Float:DrawDistance, virtualworld, testLOS) Разберём по подробнее. 1) text[] - Сам текст,текст который будет отображатся 3D,используется в "Текст" 2) color - цвет 3D текста,к примеру COLOR_GREEN 3) Float:X, Float:Y, Float:Z - координаты X,Y,Z - Вы можете снять их командой /save - это 3 первые координаты,пример -1973.1282,115.5741,30.5167 4) Float:DrawDistance - расстояние на котором будет виден 3D текст к примеру 15.0 5) virtualworld - виртуальный мир в котором будет отображаться 3D текст 6) testLOS - если 0 будет виден сквозь объекты,если 1 то нет! Ну а теперь пример: Create3DTextLabel("Ваш текст", COLOR_YELLOW, -1973.1282,115.5741,30.5167, 15.0 , 0, 1); Думаю вы это знаете но всё же 3D text всегда у нас в public OnGameModeInit
  2. 1.Ко всем New добавим new MyObj; // Тут своё название плаката new MyObj1; new MyObj2; 2.В public CreateObjects() или в OnGameModeInit добавим 3 рекламный Щиты (можно и 100 щитов ) MyObj = CreateObject(7910, -1933.23, 560.34, 41.20, 0.00, 0.00, 180.00); MyObj1 = CreateObject(2586, -1990.26, 201.39, 27.36, 0.00, 0.00, 180.00); MyObj2 = CreateObject(7910, -1941.66, 560.34, 47.78, 0.00, 0.00, -180.00); SetObjectMaterialText(MyObj, "{FFA500}Добро пожаловать{FFA500} на сервер:", 0, OBJECT_MATERIAL_SIZE_512x512, "Tahoma", 35, 1, 0xFFFF0000, 0xFF000000, OBJECT_MATERIAL_TEXT_ALIGN_CENTER); SetObjectMaterialText(MyObj1, "{46bbaa}тут ваше название сервера", 0, OBJECT_MATERIAL_SIZE_512x512, "Tahoma", 35, 1, 0xFFFF0000, 0xFF000000, OBJECT_MATERIAL_TEXT_ALIGN_CENTER); SetObjectMaterialText(MyObj2, "{009966}Форум сервера: {46bbaa}URL адрес форума", 0, 140, "Tahoma", 35, 1, 0xFFFF0000, 0xFF000000, OBJECT_MATERIAL_TEXT_ALIGN_CENTER); 3.там где[ MyObj = Добавим обьект* у вас должно получится так : MyObj = CreateObject(7910, -1933.23, 560.34, 41.20, 0.00, 0.00, 180.00); Оптимизированный код: new MyObj = CreateObject(7910, -1933.23, 560.34, 41.20, 0.00, 0.00, 180.00); SetObjectMaterialText(MyObj, " {FFA500}Добро пожаловать{FFA500} на сервер: ", 0, OBJECT_MATERIAL_SIZE_512x512, "Tahoma", 35, 1, 0xFFFF0000, 0xFF000000, OBJECT_MATERIAL_TEXT_ALIGN_CENTER);
  3. Параметры: GetNearestVehicle(playerid, Float:distance) playerid - id игрока, по отношению к которому будем искать автомобиль distance - радиус в котором будем искать автомобиль Сама функция: Функция довольно таки полезна при создании таких команд как открытие/закрытие автомобиля, ремонта автомобиля и т.д и т.п.
  4. В паблике OnPlayerConnect пишем следующее: swith(random(2)) // число означает кол-во песен снизу. { case 0: PlayAudioStreamForPlayer(playerid,"ссылка на песню"); // ваша песня 1 case 1: PlayAudioStreamForPlayer(playerid,"ссылка на песню"); // ваша песня 2 } После в паблике OnPlayerSpawn добавляем строку: StopAudioStreamForPlayer(playerid); // выключение музыки когда игрок зареспаунился. В OnPlayerConnect: PlayAudioStreamForPlayer(playerid,"ваша ссылка на песню"); В OnPlayerSpawn(playerid): StopAudioStreamForPlayer(playerid);
  5. 1.Ко всем new вставляем: new Nick_Name;//имя авто/игрока 2.Теперь сделаем саму машину: Идем в public OnGameModeInit и добавляем: Nick_Name = AddStaticVehicle(id авто,координаты авто, цвет1, цвет2); 3.Далее идем в public OnPlayerStateChange и добавляем: new vehicleid = GetPlayerVehicleID(playerid); if(newstate == PLAYER_STATE_DRIVER && oldstate == PLAYER_STATE_ONFOOT) { if(vehicleid ==Nick_Name) { if(strcmp(PlayerName(playerid), "Nick_Name", true) != 0) { RemovePlayerFromVehicle(playerid); SendClientMessage(playerid, 0xB50F00AA, "Ваш текст."); } 4.Если вы хотите добавить одну или более машин, то следует вот что: if(vehicleid ==Nick_Name)//Вместо слов Nick_Name пишите, то что вы указали в new { if(strcmp(PlayerName(playerid), "Nick_Name", true) != 0) { RemovePlayerFromVehicle(playerid); SendClientMessage(playerid, 0xB50F00AA, "Ваш текст"); } } } 5.В любом вместе вставить: stock PlayerName(playerid) { new PlrName[MAX_PLAYER_NAME]; GetPlayerName(playerid,PlrName,sizeof(PlrName)); return PlrName; }
  6. Система Фулл Доступ расписана на то, чтобы введённые в поле игроки могли использовать те или иные команды. Начнём с создания переменной: new FD[][MAX_PLAYER_NAME] = {"Nick_Name", "Nick_Name", "Nick_Name", "Nick_Name"}; // эта переменная сохраняет ники игроков, которые мы введём и которым будет разрешена та команда, в которой будет стоять проверка на Фулл Доступ Далее идём в конец мода и вставляем вот такой Сток: stock FDCheck(playerid) { for(new i = 0; i < sizeof(FD); i++) // создание переменной "i", обыкновенный цикл, не вижу ничего сложного, если кто не понимает "Циклы", советую смотреть начальные уроки Pawn, в будущем может быть выпущу тему с разъяснением { if (!strcmp(NamePlayer[playerid], FD[i], false)) return true; // теперь идёт проверка, если данный ник не соответствует нику из ФД, доступ запрещается, переменные NamePlayer поменять на свою(Переменная ника игрока) } return false; // ретурн } Теперь самое интересное, идём к любой команде, примером может быть команда /makeadmin, /setadmin и др. и вставляем проверку на ФД: if(!FDCheck(playerid)) return 1;
  7. DayPlays

    урок server.cfg

    server.cfg - это файл конфигурации сервера, который позволяет вам изменять установки вашего sa-mp сервера, как, например, его имя узла, filterscripts или плагинов для загрузки или даже пароль, который вы хотите установить.Этот файл необходим для каждого сервера и должен быть расположен в каталоге сервера рядом с сервером приложений. Правильная установка:
  8. Плюсы: Система основных и гостевых серверов. Удобно для владельцев нескольких серверов. Защита от в3лома админов (если злоумышленник узнает пароль на гостевом сервере и его алогин, то он не сможет войти. Пароль от админки одинаковый на всех серверах. Ставить/Снимать/Повышать админов находясь далеко от компьютера, с мобильного устройства, управление через сайт (исходники ПУ пока не предоставляю, в .php файлах быдлокод). Организация уровней админки на гостевых серверах. Можно синхронизировать с вашим ЛК, мониторингом, и т.д. Минусы: На владельцев только одного сервера, хватило бы простого значения в переменной админки. Для кого как... Теория После ввода пароля в /alogin, отправляется HTTP запрос на наш гейт, гейт решает выдавать ли пользователю админку, вернет ошибки или уровень админки, даже дело за модом. Если у игрока пароль "255", записываем в его таблицу пароль, который он ввел. Если у игрока нет админки - вернем "NO", При неверном пароле, возвращаем ошибку "PI", если игрок пытался авторизоваться на гостевом сервере, не сбив IP адрес на основном, выдаем ошибку "IC", пройдя эти проверки, вернем нужный лвл админки, в зависимости от сервера. У меня такая система: 1 lvl основа, 1 гостевой. 2 lvl основа, 1 гостевой. 3 lvl основа, 2 гостевой. 4 lvl основа, 2 гостевой. 5 lvl основа, 2 гостевой. 6 lvl основа, 4 гостевой. 7 и выше - не меняется. Далее мод вернет ошибку, или установит лвл админки. Практика Нам понадобится: 1. Любой хостинг с MySQL, PHP 2. Сам сервер с готовым модом Работы на хостинге: Нам надо придумать секретный ключ, пусть это будет "effre4f45f43d" Создам таблицу и БД на хостинге, вот дамп таблицы: Создадим гейт atest.php: И напишите простой ПУ для управления у админами. Перейдем в Pawn код: Для начала, создадим в массиве PlayerInfo переменную "pBeAdmin", заменяем получение и запись в нее из обычного MySQL поля "pAdmin". Объявим переменные: new PlayerAlogin[MAX_PLAYERS]; // эту обновлять при OnPlayerConnect new serveridthis = 2; //а тут храним номер сервера Сделаем команду /alogin: CMD:alogin(playerid, params[]) { if(!AcceptWrite(playerid)) return 1; //залогинился ли игрока if(PlayerAlogin[playerid]) return ShowPlayerDialog(playerid,DIALOGINFO,0,"Админ авторизация","{6347AA}Вы уже отправили запрос","Закрыть","");//если запрос еще не обработан ShowPlayerDialog(playerid,153,DIALOG_STYLE_PASSWORD,"Админ авторизация","Введите пароль\n\nПароль должен состоять из латинских букв и цифр\n\tразмером от 6 до 15 символов","Вход","Отмена"); return 1; } В OnDialogResponse: Создадим паблик: Всё готово. Код может затребовать функции, которых нету в некоторых модах, их можно написать самим, или заменить на свои. Автор: Голубь
  9. Доброго времени суток, на связи RASSVET. Сегодня поговорим на такую тему, как : архитектура Вашего проекта. Если же Вы пишите свой мод с нуля, или же хотите более красиво и компактно построить свой код, то Вы по адресу. Не знаю почему, но лично мне не нравится работать с дерективами препроцессора, иначе говоря, с хуками. "Но как же тогда мы будем прятать весь наш код в инклудах?" Спросите Вы, но на самом деле всё очень просто. Давайте я покажу пример: И теперь в нашем моде, благодаря двум строкам мы имеем функционал на один диалог. Таким способом, мы можем обращаться к любому паблику. Данный способ научит Вас более бережно и уважительно относится к своему коду. Так же, Вы всегда можете найти именно то, что Вам нужно. Ведь таким образом, Вы имеете возможность в один include помещать целые системы.. Буду рад ответить на Ваши вопросы, задавайте их ниже, с Вами был RASSVET
  10. Здравствуйте уважаемые друзья,вот и пришел тот момент когда я выкладываю свой 2-ой урок pawn-скриптинга. Ну что-ж,начнем. В предыдущем уроке мы рассмотрели что за файлы в папке с сервером,теперь поговорим о самом главном - Для этого нам придется открыть свой мод ( .pwn ) Для этого мы заходим в папку с сервером - ищем папку pawno,далее заходим в программу "Pawno",и тут у нас открывается окошко где ничего нету - не проблема: В левом верхнем углу есть кнопка - File,жмем на нее и после жмем Open,у нас вышло окно - Указываем путь к самому серверу,а именно: Server\gamemodes\server.pwn. После когда мы открыли,у нас появляются много непонятных строк,и что же нам с вами делать? Ответ: Учить. Первое что нам бросается в глаза это #include - и #define. Что такое #include: 1. Знак # означает - подключение. 2. После слова #include - У нас идет слово: #include test. Test - это само название инклуда,сам инклуд хранится в папке pawno\includes. 3. В инклуде хранятся часть данных такие как - Маппинг,цвета, и другое. 4. Чтобы подключить инклуд вам стоит всего-лишь поместить инклуд в папку ( pawno\include. ) и вписать в начало мода ( #include Название Инклуда ) и конечно же скомпилировать. Что такое #define: 1. Знак # - подключение. 2. define упрощает работу скриптерам,а именно - в define можно хранить цвета т.к в pawno цвета формата: 0x00... Пример: #define COLOR_YELLOW 0x0.... ( 0x0.... - сам код цвета. ) Чтобы использовать #define - впишите в текст,пример: "sendclientmessage(playerid,COLOR_YELLOW,"Текст"); Теперь текст будет такого цвета который мы написали ( COLOR_YELLOW ). А так же в #define можно хранить диалоги - пример: #define DIALOG_HELP "1" ( 1 - Текст который будет содержаться в диалоге. ) А как именно #define использовать в диалоге - Ответ: когда мы написали нужный текст на месте "1" мы можем вставить его в код - Пример: ShowPlayerDialo(playerid,DIALOG_HELP ( название диалога с #define ).DIALOG_STYLE_INPUT,"Да","Нет");. В #define можно хранить и еще информацию,пример: #define SITE "Сюда Адресс сайта",чтобы подключить #define вам стоит просто в сообщение написать название #define - "SITE",пример: Наш форум "SITE" - и будет высвечиваться текст который вы написали вместо "Сюда Адресс сайта." ( можно это использовать не только для адресса и для имени главного администратора,ну вообщем используйте с фантазией ) И так,мы разобрали #include & #define - теперь идем ниже,там видим Forward: Форвард используется для создания public'a например: Forward test(playerid); // Запоминаем название и значение Форварда - на данный момент у нас test(playerid) Паблик: public test(playerid) // Пишем название Форварда и значение - public test(playerid) { // функция - например SendClientMessage. return 1; // Переход. } // Заставить использовать паблик можно так - ищем место где будет использоваться этот паблик,и вписываем test(playerid); Что я этим хочу сказать - Форварды используются для public'ov но я советую создавать stock т.к для stock'ov не надо создавать Форварды. А так же в моде есть стандартные паблики и самописные. Теперь о Stock'ax которые хранятся в конце модов: Чтобы создавать сток нам не надо опять делать Форвард - просто стоит написать код: stock test(playerid); // Сам Stock { // Тут пишем свою функцию. } // Закрывем вот и готов наш Stock - думаю проблем вам не составит его написать. Теперь поговорим о самих public'ax.
  11. Автор: Jam999 Всем привет! Сегодня я покажу, как сделать систему репорта. Начнем. Я буду использовать макросы: #define SPD ShowPlayerDialog Для начала создадим команду report: CMD:report(playerid) { SPD(playerid, 1, DIALOG_STYLE_INPUT, "{FFFFFF}Связь с администрацией", "{FFFFFF}Введите ваш вопрос/ID нарушителя:", "Отправить", "Закрыть"); return true; } Описание: SPD - ShowPlayerDialog playerid - ID игрока DIALOG_STYLE_INPUT - стиль диалога "{FFFFFF}Связь с администрацией" - Заглавление диалога "{FFFFFF}Введите ваш вопрос/ID нарушителя:" - Текст в диалоге "Отправить" - 1 кнопка "Закрыть" - 2 кнопка Дальше мы переходим в OnDialogResponse: public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { return true; } Для удобства сделаем следующие действия: public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { switch(dialogid) { case 1: { } return true; }
  12. Доброго времени суток, сегодня на связи RASSVET. Открыв первую страницу данного раздела, я наткнулся на одну тему, где говорилось "ЗАПУСК МОДА НА ЛОКАЛЬНУЮ СЕТЬ". Ознакомившийся с данной темой, не нашёл ни одного слова про базу данных, так давайте с Вами сейчас и разберёмся, как подключается база данных! ЫЫЫ.mp4
  13. Начну с того, что написал всё через DC_CMD и switch, это не так сложно Начинаем с команды непосредственно /radio. CMD:radio(playerid,params[]) { ShowPlayerDialog(playerid,150,DIALOG_STYLE_LIST,"Включить радио","[1] Europa Plus\n[2] Radio Record\n[3] Radio PremiuM\n[4] Radio ZaycevFM\n","Выбрать","Отмена"); } Этим действием мы: Создаём команду, и при её вводе показываем игроку (playerid) диалог в стиле "LIST" и ID диалога, после называем диалог "Включить радио" и расписываем все радио, которые хотим видеть в нашем диалоге.(В моём случае это: "[1] Europa Plus\n[2] Radio Record\n[3] Radio PremiuM\n[4] Radio ZaycevFM\n") P.S.\n - разделяет наши радио.Последнее кнопки, у меня "Выбрать" и "Отмена".С этим разобрались, идём далее. В OnDialogResponse пишем: switch(dialogid) { case 150: { switch(listitem) { case 1: PlayAudioStreamForPlayer(playerid,"https://www.europaplus.ru/online/player.php?q=128"); case 2: PlayAudioStreamForPlayer(playerid,"https://radiorecord.ru:9000/record.ogg.m3u"); case 3: PlayAudioStreamForPlayer(playerid,"https://listen.rpfm.ru:9000/premium128"); case 4: PlayAudioStreamForPlayer(playerid,"https://radio.zaycev.fm:9002/ZaycevFM"); } SendClientMessage(playerid,COLOR_LIGHT,"Вы включили радио и надели наушники.Для выключения используйте команду /stopradio"); SetPlayerAttachedObject(playerid, 3, 19424, 2,0.05,0.0,0.0,90.0,360.0,270.0); return 1; } } Я думаю вы сможете найти про "Switch" и "Case" в другом уроке... В общем: Мы создаём case: и вводим в него все действия, которые хотим сделать, по тому же принципу я писал /anim. После мы пишем игроку что он включил радио, и накидываем на него наушники(Их координаты взял от куда то, это не сам к сожалению...). И ещё одна команда: CMD:radiostop(playerid,params[]) { if(!IsValidObject(3)) return SendClientMessage(playerid,COLOR_LIGHT,"Вы не включали радио"); RemovePlayerAttachedObject(playerid, 3); StopAudioStreamForPlayer(playerid); SendClientMessage(playerid,COLOR_LIGHT,"Вы сняли наушники и выключил плеер."); return 1; } Автор:Daniel Shormus
  14. Здравствуйте, уважаемые пользователи форума. В этой теме расскажу Вам, как добавить 3D номер на автомобиль, чтобы в дальнейшем для него работала функция "SetVehicleNumberPlate". Нам понадобится: TXD Workshop любой версии(5.0 у меня) ZModeler(226 build 981 у меня) 1. Берём любую модель, я буду работать с BMW X6. 1.1. Создадим для неё папку, в моём случае "Модель и текстуры", туда переместим dff и txd модели. 1.2. Открываем TXD Workshop > Open txd > указываем наш txd, перед нами откроются текстуры этой модели 1.2. Нажимаете кнопку Export > Export all textures to bitmaps > указываете папку, которую создавали ранее, у меня это "Модель и текстуры". Если у вас не появился список с выбором типа текстур, нажмите еще раз на "Export". 2. Переходим по пути: папка с игрой/models/generic 2.1. Открываем через TXD Workshop файл "vehicle.txd", в списке ищем "carplate", нажимаем Export, в этот раз, нужно, чтобы открылось сразу окошко с выбором пути или просто, в том окошке выберите "TGA", сохраняем в удобное для вас место, я сохраню на РС, но название должно остаться "carplate", теперь можем закрыть TXD Workshop. 3. Открываем ZModeler, дальше нажимаем: Опции > Настройки > Сервисы (жмём на плюсик) > Пути к текстурам. Добавляете путь, по которому сохраняли все текстуры модельки, у меня это папка "Модель и текстуры" , ставите галочку "Использовать", применить и ок. 3.1. Добавляем модель авто, для этого: либо Файл > Импортировать, либо листок с синей стрелочкой 3.2. В окне импорта выбираем нашу модель, в "Параметры GTA SA" "Текстуры" поставьте на "BMP" и нажимайте "Импорт" (если у вас не доступна кнопка импорт, значит модель заблокирована, в интернете есть уроки, как разблокировать) 3.3. Мы импортировали нашу модель, теперь настроим вид в 1 окне просмотра модели поставим вид "Изометрия", во втором оставим "3D", у меня номера уже в текстуре, я просто наверх наложу карплату, у вас их может вообще не быть, поэтому сначала нужно будет добавить табличку с регионом, а номер можно будет не писать. 3.4. Добавим нашу текстуру, для этого нажимаем на красный шар вверху 3.5. В открывшемся окне нажимаем на листок с синим шариком, называем текстуру "carplate" (как и сохраняли из workshop), в цветах ставим везде 255. В "Слои текстур" нажимаем на "...", в открывшемся окне нажимаем "Загрузить", выбираем нашу текстуру и нажимаем "Ок" и еще раз "Ок" 4. Меняем вид на "Спереди", жмём Создать > Поверхность > Сетка и создаём примерный размер номера (потом отредактируем) 4.1. Ничего не трогая, нажимаем снова на тот красный шарик, выбираем наш материал и жмём "Применить к выделенному" и нажимаем "Ок" 4.2. Включаем "Режим выделенного" (фон текста станет рыжим) и нажимаем Создать > Копию и нажимаем на наш номер, который мы создали, это для номера сзади, временно выключим копию, чтобы она нам не мешала 4.3. Выключаем режим выделенного, нажимаем Выделение > Кликом и ПКМ кликаем по нашему номеру (Всё делается в окошке с видом "Спереди", 3D не трогаем!!), он загорится рыжим и мы включаем снова режим выделенного, теперь нажимаем Модификации > Переместить, вверху у нас есть оси по которым перемещаем, включаете их и перемещаете как нужно, так же, рекомендую включить вид "Справа", и смотреть в 3D, как будет спереди выглядеть и справа, чтобы прикрепить ровно Я уже сделал, на скриншоте можете видеть, что у меня получилось, но, выглядит это не красиво и в игре будет не реалистично, потому что размер не тот, что нужно. Сейчас его изменим. 4.4. Нажимаете Модификации > Масштабировать, для удобства можете включить вид "Спереди" и изменяете точно также, по осям В итоге, всё это подровняв, у меня что-то получилось, теперь, давайте закинем наш номер в передний бампер, для этого, нажимаем на плюсик в нашей модели, и пробуем включать и выключать разные детали, пока не доберемся до бампера, у меня он называется "bump_front_dummy", в основном, примерно так он называется во всех моделях. Теперь перетаскиваем наш номер туда, но перед этим, лучше измените название с "Surface", на, например, "carplate" и "carplate2", потому что насколько я знаю, может возникнуть баг, если оставить с таким названием. Переместили, всё, в принципе, у нас передний бампер и номер готов, нам только нужно их объединить P. S. На скриншоте "Surface", но я уже изменил, просто забыл. Теперь нам нужно поработать с номером на заднем бампере, работа идентичная, только нужно развернуть. Напишу позже, потому что скоро ухожу. Автор темы: SCRIPTMAN Перед тем, чтобы написать тему, я проверил в игре и это работает. При копировании на другие порталы указывайте автора
  15. Чуваки сто делать? Я купил мод Just RP за 100р И там не сохраняються аккаунты в базе данных Игроки играть не могут
  16. Добрый день, господа! Сегодня я кратко опишу Map Construction. Map Construction для CR-MP практически ничем не отличается от Map Construction для SA-MP. Управление в данной программе довольно простое и удобное. Клавиши: Камера: ПКМ(Правая кнопка мыши)-ОБЯЗАТЕЛЬНО нажать при управление камерой W-Впред S-Назад D-Вправо A-Влево СКМ(Средняя кнопка мыши)-Впред, назад. Объекты: ЛКМ(Левая кнопка мыши)-Выбрать объект. Insert-Добавить объект Delete-Удалит выбранный объект 1-Двигать объект по осям Z и X 2-Двигать объект по оси Z 3-Вращать объект по оси R-Z 4-Вращать объект по осям R-X и R-Y ctrl+c-Сделать копию объекта Раздел "OBJECT": Используя этот раздел, вы можете добавлять различного вида объекты на Вашу карту или интерьер. Клавиша INSERT. Add - добавить объект в меню; Delete - удалить объект из меню; Rename- переименовать объект (изменится только в этом меню). Подраздел "ADD": Availible object - названия и ID объектов; Search for - поиск объекта; Description/name - название/описание объекта; Ide number - ID объекта; Add - добавить объект в меню; Exit - покинуть меню выбора. Теперь перейдем к разделу "MOVEMENT": 1. Двигать объект по осям Ox, Oz.. 2. Двигать объект по оси Oz. 3. Вращение объекта по осям R-Z. 4. Вращать объект по осям R-X и R-Y IDE- ID объекта. Coordinates-Координаты выбранного объекта Rotation - положение объекта на плоскости (оси Ox, Oy, Oz). Вращение объекта на плоскости (оси Ox, Oy, Oz). Двигать объект по оси. Этот раздел Вам очень пригодится, когда нужно будет двигать объект медленно. Nudge power-Так сказать скорость для движение объекта(Работает только при использование данного раздела) Управление объектам по X и Z осям Верхний раздели Import .pwn-Импортировать объекты из мода Import Paste- Добавит скопированный код объектов Show code-Посмотреть на коды объектов (Export.pwn-Экспортировать объект(Тип файла всегда .pwn)) (Rebuild-Обновить) (Типы сохранение кода) Clear ALL-Удалит весь добавленный объект Undo-Назад Insert Object-Добавит объект Duplicate-Сделать копию выбранного объекта(Кнопка: ctrl+c-Сделать копию объекта) Delete-Удалит выбранный объект(Кнопка:Delete-Удалит объект) Test-Тест маппинг либо интерьера Спасибо что прочитали! Старался сделать по максимуму понятным Прошу прощение если в словах будет ошибки! Автор:Sultan Ссылка:Тыкай Есть вопросы? Задавайте!
  17. Приветствую форумчане и тех кто хочет научиться PAWN скриптингу. Рекомендую ознакомиться с данным учебником ( *клик* ). И после этого приступать к ознакомлению написания различных комманд. Так-же рекоменду не копировать готовую комманду, а писать самому(подсматривая), никто не запрещает вам подсматривать, пишите, запоминайте, и у вас все получится. И так приступим к написанию команды. Для начала ищем данную строку: enum pInfo Вот к примеру мой pInfo enum pInfo { pLogged, pPLogged, pChar, pBan, pWarn, pMute, pScore, pExp, pCash, pDrugs, pMember, pLeader, pBank, pHouse, pHouseCash, pRegister, pSex, pFight, pHistory, pZakon, pRang, pPhone, pPhoneBalance, pWatch, pMemberSkin, pHospital, pCar, pCarCvet1, pCarCvet2, pPassport, pLogin, pWanted, pDostup, pAdmin } Смотрим что идет последним(без разницы, главное правильно вписать, без так скажем ошибок). Запятую выделил красным(т.е до этого код был таким): enum pInfo { pLogged, pPLogged, pAdmin, pChar, pBan, pWarn, pMute, pScore, pExp, pCash, pDrugs, pMember, pLeader, pBank, pHouse, pHouseCash, pRegister, pSex, pFight, pHistory, pZakon, pRang, pPhone, pPhoneBalance, pWatch, pMemberSkin, pHospital, pCar, pCarCvet1, pCarCvet2, pPassport, pLogin, pWanted Dostup } Надеюсь понятно объяснил =). И так приступим к написанию самого кода. В самом конце мода пишем: CMD:makeadmin(playerid,params[]) { if(PlayerInfo[playerid][pAdmin] >= 8) // Условие: если игрок администратор 8 уровня {// то выполнить этот код if(sscanf(params, "dd", params[0], params[1])) return SCM(playerid, COLOR_ORANGE, "[!]Введите: /makeadmin [id] [lvl]"); // тут мы пишем параметры для самого кода PlayerInfo[params[0]][pAdmin] = params[1]; // Тут админка выдалась игроку }// закрыли код new string[128]; /* стринг( для того что бы форматировать и вывести сообщение в чат, максимальный размер сообщения в чате 128) */ format(string, sizeof(string), "%s назначил вас администратором %d уровня", GN(playerid), params[1]); // Сообщение, выведится игроку которому выдали админку SCM(params[0], COLOR_ORANGE, string); // SCM(SendClientMessage - выводит сообщение игроку) return 1; } Чуть не забыл, сделайте дефайн для SendClientMessage: #define SCM SendClientMessage Всем спасибо за просмотр, надеюсь изъяснил правильно.
  18. Приветствую форумчане и тех кто хочет научиться PAWN скриптингу. Рекомендую ознакомиться с данным учебником ( *клик* ). И после этого приступать к ознакомлению написания различных команд. Так-же рекомендую не копировать готовую команду, а писать самому(подсматривая), никто не запрещает вам подсматривать, пишите, запоминайте, и у вас все получится. И так, после небольшого вступления, мы начинаем :) Это самое элементарное что только можно сделать - очистка чата. Ну что, погнали? Первым что нужно сделать - это написать этот код и разобрать его: CMD:cc(playerid,params[]) // CMD:name_command(arguments) - думаю тут понятно { for(new a; a <= 100; a++) // цикл for() { SCM(playerid, -1, ""); // цикл будет выполнять этот код, столько раз, сколько мы написали } return ToAll(-1,"[X]Администрация очистила игровой чат"); // после завершения цикла. В чате выйдет это сообщение. } Самое главное здесь - цикл for. Именно он делает всю работу. Давайте разберем его подробнее: for(new a; a <= 100; a++) { // code... } Вот к примеру первым идет в скобках - переменная. Объявляем мы ее при помощи new далее идет имя: for(new a;...) { // code... } Имя может быть любым, хоти такое: for(new Vasya_Pupkin;...) { // code... } Далее условие выполнение цикла, в данном случае, если переменная "a" ровна или меньше 100, то мы эту переменную увеличиваем до этого числа. for(new a; a <= 100; a++) { // code... } Даже объясню еще проще: for (объявление переменной, условие, увеличение) } // и ваш код } Теперь вернемся к нашему коду: CMD:cc(playerid,params[]) // CMD:name_command(arguments) - думаю тут понятно { for(new a; a <= 100; a++) // цикл for() { SCM(playerid, -1, ""); // цикл будет выполнять этот код, столько раз, сколько мы написали } return ToAll(-1,"[X]Вы очистили игровой чат"); // после завершения цикла. В чате выйдет это сообщение. } Видим что если наша переменная ровна или меньше ( <= ) 100, то цикл выполнит код внутри фигурных скобок, т.е в данном случае накидает 100 пустых сообщений в чат, тем самым текст который написали игроки - уйдет за границы и сотрется =). "Ну, а зачем после цикла for ты написал "return ToAll(-1,"[X]Вы очистили игровой чат");" - спросите Вы. Действительно, ведь я мог написать просто банальное: "return 1". Но нам нужно вывести оповещение о том что мы очистили чат, что бы игроки не думали: "-Почему пропал текст из чата?". Спасибо за внимание друзья. Надеюсь я Вам чем то помог. Объяснил как мог, можно было еще больше разжевать эту картину, но думаю обойдемся и без этого =). Автор: я, @Mike_World.
  19. Сегодня мы с вами напишем систему АТМ для сервера с возможностью создания из игры. Система на MySQL! Командный процессор DC_CMD! [1] Ко всем define: #define MAX_ATM 1000 // максимальное количество банкоматов. #define dbank 4 // ID диалога АТМ. [2] Ко всем переменным new: new TOTALATM; // Всего АТМ new BankObject; // объект АТМ [3] Ко всем enum: enum BDATA { bID, Float:bX, Float:bY, Float:bZ, Float:bRX, Float:bRY, Float:bRZ } new bInfo[MAX_ATM][BDATA]; [4] Теперь ко всем командам добавим: CMD:atm(playerid, params[]) { new Float:POS[3]; // Переменные для записи позиции персонажа! GetPlayerPos(playerid, POS[0], POS[1], POS[2]); // Узнаем позицию персонажа и записываем их в POS. BankObject = CreateObject(2942,POS[0]+2, POS[1], POS[2],0,0,270); // Создаем объект АТМ. EditObject(playerid, BankObject); // Назначаем переменной BankObject функцию редактирования объекта. SetPVarInt(playerid, "bEDIT", 1); // Установим число 1 в переменную игрока. return true; } [5] Далее переходим в public OnPlayerEditObject (если его нет создайте): if(response == EDIT_RESPONSE_FINAL) // Если игрок нажал на иконку сохранить. { if(GetPVarInt(playerid, "bEDIT") == 1) // Проверяем переменную игрока на число 1. { new query[200]; // Переменная для запроса. mysql_format(mysql, query, sizeof(query), "INSERT INTO `ATM` (`bID`, `bX`, `bY`, `bZ`, `bRX`, `bRY`, `bRZ`) VALUES ('%d', '%f', '%f', '%f', '%f', '%f', '%f')", TOTALATM, fX, fY, fZ, fRotX, fRotY, fRotZ); mysql_tquery(mysql, query, "", ""); // Запрос на БД. bInfo[TOTALATM][bX] = fX; // Записываем позицию объекта(x) в переменную bX. bInfo[TOTALATM][bY] = fY; // Записываем позицию объекта(y) в переменную bY. bInfo[TOTALATM][bZ] = fZ; // Записываем позицию объекта(z) в переменную bZ. TOTALATM++; Create3DTextLabel("Банкомат\nНажмите {529b43}'Y'", -1, fX, fY, fZ, 10.0, 0, 1); // Создаем 3D текст у банкомата SendClientMessage(playerid, -1, "Банкомат успешно создан!"); // Если все прошло успешно выводим текст. } } if(response == EDIT_RESPONSE_CANCEL) // Если игрок нажал на ESC { if(GetPVarInt(playerid, "bEDIT") == 1) // Проверяем переменную игрока на число 1. { DestroyObject(BankObject); // Удаляем АТМ. SendClientMessage(playerid, -1, "Банкомат удален!"); // Если все прошло успешно выводим текст. DeletePVar(playerid, "bEDIT"); // Обнуляем переменную игрока. } } [6] В конец мода или там где у вас находится загрузка данных: stock LoadAtm() return mysql_function_query(mysql, "SELECT * FROM `ATM` ORDER BY `ATM`.`bID` ASC ", false, "OnAccountBank",""); // stock для загрузки ATM. forward OnAccountBank(playerid); public OnAccountBank(playerid) { new rows, fields;// Создаем переменные для выгрузки кол-во строк-граф cache_get_data(rows, fields);// Выгружаем примечание не выгружает если выключено кзширование new i = 0;// Переменная для хранения временного new temp[128]; if(rows)// Проверка есть ли строчки в таблице. { for(new idx = 1; idx <= rows; idx++) { cache_get_row(i, 0, temp), bInfo[idx][bID] = strval(temp); // Загружаем 1 строчку БД. cache_get_row(i, 1, temp), bInfo[idx][bX] = floatstr(temp); // Загружаем 2 строчку БД. cache_get_row(i, 2, temp), bInfo[idx][bY] = floatstr(temp); // Загружаем 3 строчку БД. cache_get_row(i, 3, temp), bInfo[idx][bZ] = floatstr(temp); // Загружаем 4 строчку БД. cache_get_row(i, 4, temp), bInfo[idx][bRX] = floatstr(temp); // Загружаем 5 строчку БД. cache_get_row(i, 5, temp), bInfo[idx][bRY] = floatstr(temp); // Загружаем 6 строчку БД. cache_get_row(i, 6, temp), bInfo[idx][bRZ] = floatstr(temp); // Загружаем 7 строчку БД. TOTALATM++, i++; CreateObject(2942, bInfo[idx][bX], bInfo[idx][bY], bInfo[idx][bZ], bInfo[idx][bRX], bInfo[idx][bRY], bInfo[idx][bRZ]); // Создаем АТМ. Create3DTextLabel("Банкомат\nНажмите {529b43}'Y'", -1, bInfo[idx][bX], bInfo[idx][bY], bInfo[idx][bZ], 10.0, 0, 1); // Создаем 3D текст. } } return printf("[Система АТМ]: Было загружено - %d", TOTALATM); // Показываем сколько банкоматов было загружено. } [7] Теперь public OnGameModeInit(): LoadAtm(); И так с созданием АТМ и его загрузкой мы закончили. Теперь собственно сделаем чтобы банкомат работал:) [1] В public OnPlayerKeyStateChange: if(newkeys == KEY_YES) // если игрок нажал на Y { for(new b = 1; b <= TOTALATM; b++) { if(IsPlayerInRangeOfPoint(playerid, 1.0, bInfo[b][bX], bInfo[b][bY], bInfo[b][bZ])) // Проверяем стоит ли игрок рядом с банкоматом. Если да то выводим диалог ниже :) { ShowPlayerDialog(playerid, dbank, DIALOG_STYLE_LIST, "{FFFFFF}Банкомат", "{529b43}[1] {ffffff}Баланс\n{529b43}[2] {ffffff}Снять наличные\n{529b43}[3] {ffffff}Внести наличные", "Войти", "Выйти"); } } return true; } [2] В public OnDialogResponse: switch(dialogid) { case dbank: { if(!response) return true; // Игрок нажал на вторую кнопку! switch(listitem) { case 0: // Игрок выбрал первый пункт! { new string[50]; // Переменная которая хранит длину текста! format(string,sizeof(string),"{FFFFFF}Баланс: {529b43}%d {FFFFFF}р.", pInfo[playerid][BankAccount]); SendClientMessage(playerid, -1, string); ShowPlayerDialog(playerid, dbank, DIALOG_STYLE_LIST, "{FFFFFF}Банкомат", "{529b43}[1] {ffffff}Баланс\n{529b43}[2] {ffffff}Снять наличные\n{529b43}[3] {ffffff}Внести наличные", "Далее", "Выйти"); } case 1: // Игрок выбрал второй пункт! { ShowPlayerDialog(playerid, dbank+1, DIALOG_STYLE_INPUT, "{FFFFFF}Банкомат{529b43} [Снять наличные]", "{ffffff}Введите сумму которую хотите снять:", "Снять", "Выйти"); } case 2: // Игрок выбрал третий пункт! { ShowPlayerDialog(playerid, dbank+2, DIALOG_STYLE_INPUT, "{FFFFFF}Банкомат{529b43} [Внести наличные]", "{ffffff}Введите сумму которую хотите внести:", "Внести", "Выйти"); } } } case dbank+1: { if(!response) return ShowPlayerDialog(playerid, dbank, DIALOG_STYLE_LIST, "{FFFFFF}Банкомат", "{529b43}[1] {ffffff}Баланс\n{529b43}[2] {ffffff}Снять наличные\n{529b43}[3] {ffffff}Внести наличные", "Далее", "Выйти"); if(strval(inputtext) > pInfo[playerid][BankAccount]) // Проверяем хватает ли денег в банке. Если нет выводим диалог и текст! { ShowPlayerDialog(playerid, dbank+1, DIALOG_STYLE_INPUT, "{FFFFFF}Банкомат{529b43} [Снять наличные]", "{ffffff}Введите сумму которую хотите снять:", "Снять", "Выйти"); return SendClientMessage(playerid, -1, "Недостаточно средств!"); } pInfo[playerid][BankAccount] -= strval(inputtext); pInfo[playerid][Money] += strval(inputtext); GivePlayerMoney(playerid, strval(inputtext)); } case dbank+2: { if(!response) return ShowPlayerDialog(playerid, dbank, DIALOG_STYLE_LIST, "{FFFFFF}Банкомат", "{529b43}[1] {ffffff}Баланс\n{529b43}[2] {ffffff}Снять наличные\n{529b43}[3] {ffffff}Внести наличные", "Далее", "Выйти"); if(strval(inputtext) > pInfo[playerid][Money]) // проверяем хватает ли денег у игрока. Если нет то выводим диалог и текст! { ShowPlayerDialog(playerid, dbank+2, DIALOG_STYLE_INPUT, "{FFFFFF}Банкомат{529b43} [Внести наличные]", "{ffffff}Введите сумму которую хотите внести:", "Внести", "Выйти"); return SendClientMessage(playerid, -1, "Недостаточно средств!"); } pInfo[playerid][BankAccount] += strval(inputtext); GivePlayerMoney(playerid, -strval(inputtext)); } } Теперь нам нужно создать БД для АТМ. Создаем таблицу и называем ее ATM и далее делаем как на фото: Ну вот и все, система АТМ готова. Обзор клац P.S: pInfo[playerid][bankAccount], pInfo[playerid][Money] и запрос mysql нужно заменить на свое чтобы не было ошибок!
  20. Доброго времени суток - дорогие друзья. Сегодня я более подробно постараюсь вам объяснить функцию которая вам поможет сделать команду на кнопку ( Как QuickBinder - для SA:MP ) И так. Приступим.. 1. Первым делом на нужна сама команда - готовая или же новая. Пример для новичков: if (strcmp("/icoder", cmdtext, true, 10) == 0) { // Сюда можно поставить функцию SendClientMessage,Исключительно для Теста. return 1; } 2. После того как мы создали команду или же готовую команду которую мы хотим перевести на кнопку - то следуем в: public OnPlayerKeyStateChange И вставляем код: if (newkeys == ID) // Где слово ID - Там должен стоять ID Вашей кнопки,узнать ID кнопки можно внизу { OnPlayerCommandText(playerid,"/icoder"); //Где написано слово "/icoder" - Туда вставляем название команды которую вы сделали или же взяли готовую. } 3. После,всем известно что имеется процесс DC_CMD и ZCMD - так что приведем пример на DC_CMD & ZCMD. Пример DC_CMD: if (newkeys == ID) // Где слово ID - Там должен стоять ID Вашей кнопки,узнать ID кнопки можно внизу { cmd:icoder(playerid, "");. } Но если у вас ZCMD вам придется использовать код через - cmd_cmdname(playerid, cmdparams) 4. Вызов команды на кнопку - в определенном месте Пример: if (newkeys == ID) // Где слово ID - Там должен стоять ID Вашей кнопки,узнать ID кнопки можно внизу { if(PlayerInfo[playerid][pPassport] >= 1) return SendClientMessage(playerid,COLOR_WHITE,"У вас уже есть пасспорт!"); // Пример функции } else if(PlayerToPoint(playerid,Координаты)) OnPlayerCommandText(playerid,"/icoder"); } Думаю вы все поняли,и вопросов и ошибок у вас не будет - теперь ID'ы Клавиш. ID Кнопка используемая пешком Кнопка используемая в машине 1 TAB ALT GR / LCTRL / NUM0 2 C H / CAPSLOCK 4 LCTRL / LMB LALT 8 SPACE W 16 ENTER ENTER 32 LSHIFT S 64 - E 128 RMB SPACE 256 - Q 320✝ NUM1 / MMB 2 512 NUM1 / MMB 2 / NUMPAD + 1024 LALT - 2048 NUM8✝✝ NUM8 4096 NUM2✝✝ NUM2 8192 NUM4 NUM4 16384 NUM6 NUM6 65536 Y Y 131072 N N 262144 H H Есть ошибки? Сообщи - исправим. На этом я заканчиваю свой урок,спасибо за внимание - P.S Если хотите научиться чему-нибудь но этого урока на форуме нету? Просто напиши в тему какой урок ты бы хотел видеть и я напишу тебе его в подробностях. Автор урока: !#Bush :) ( Я ) Время создания урока: 20 минут.
  21. Данная функция работает некорректно. Для замены текстур нам понадобятся программы: Map Construction и txdworkshop - Ищем текстуру для объекта. Сайт с текстурами (клик) - Так же текстуру можно взять с понравившегося вам объекта при помощи Map Construction - Находим нужную нам текстуру, наводим курсор и нажимаем SHOW CODE. [spoiler=Текстуры] Нам нужны Model ID, TXD Name и Texture Name. Копируем их. [spoiler=Код выбранной текстуры] - Открываем наш мод. Составим код по примеру: SetObjectMaterial(CreateObject(ID OBJECT, X, Y, Z, rX, rY,rZ) , Index Model, Model ID, "TXD Name", "Texture Name", Color); Вставляем координаты нашего объекта. Сolor ставим 0. (Если хотите наложить цвет, то используйте RGB цвета.) SetObjectMaterial(CreateObjectCreateObject(19379, 52.92, 1853.46, 25.50, 0.00, 0.00, 90.00) , Index Model, Model ID, "TXD Name", "Texture Name", 0); Model ID, TXD Name и Texture Name заменяем на найденные на сайте. У данного объекта 1 текстура, ставим Index Model - 0. SetObjectMaterial(CreateObject(19379, 52.92, 1853.46, 25.50, 0.00, 0.00, 90.00), 0, 18202, "w_towncs_t", "husdr", 0); Если в Map Construction нет названия текстуры, поступаем так: id твоего объекта 4030, открываем C:\Games\GTA Criminal Russia\data\maps там открываем любой файл с расширением .ide с помощью Notepad => жмём "найти" бинокль => В открывшемся окне выбираем "Найти в файлах" => В строку "Найти" вписываем свой id объекта т.е. 4030, со строки Заменить на: всё убираем, если есть что то, в строке Фильтры тоже самое всё убираем, в строке Папка: пишем путь: C:\Games\GTA Criminal Russia\data\maps, всё как на скрине: [spoiler=Скрин] и жмём "Найти все" после завершения поиска появится результат: [spoiler=Скрин] подчёркнуто красным это .dff синим .txd Далее: копируем название текстуры, открываем txdworkshop, идём C:\Games\GTA Criminal Russia\models\gamemod.img (тут может быть что ваша текстура может находиться в gamemod.img, gta_int.img или в gta3.img) открываем "TXD Name" находим нужное название текстуры "Texture Name" далее вписываем всё в код показанный выше. SetObjectMaterial(CreateObject(ID OBJECT, X, Y, Z, rX, rY,rZ) , Index Model, Model ID, "TXD Name", "Texture Name", Color); Если что не понятно спрашивайте.
  22. Для того, чтобы найти в моде пропущенную скобку, нам понадобиться: ActivePerl (x86(32) и x64) Скрипт Brackets Устанавливаем ActivePerl, затем разархивируем архив с скриптом Brackets в папку Perl, которая создалась при установке ActivePerl. Теперь как проверить мод: Берем мод (именно исходник .pwn) и кидаем его в папку Perl. После этого открываем GUI в папке Perl, в левом верхнем углу мы наблюдаем кнопку "Open File" и указываем путь до нашего исходника, после того как вы указали путь, он просканирует ваш мод и покажет вам: Кол-во закрытых скобок Кол-во открытых скобок Если где-то не хватает какой-либо скобки, он покажет в каком месте.
  23. ShowPlayerDialog - данная функция показывает диалоговое окно определенному игроку. Параметры: (playerid, dialogid, style, caption[], info[], button1[], button2[]) playerid ID игрока, которому будет показан диалог. dialogid Уникальный ID диалога. Используется в OnDialogResponse. При значении, равном -1, любой текущий диалог будет скрыт с экрана игрока. style Стиль диалогового окна. caption[] Заголовок окна. info[] Текст самого диалога. Можно использовать \n для перевода строки и \t для табуляции. button1[] Название первой (левой) кнопки диалога. button2[] Название второй (правой) кнопки. Теперь о стилях диалоговых окон.
  24. Очень много вопросов на эту тему, хотя, если воспользоваться поиском, то ответов ни чуть не меньше. Ищем в моде public OnPlayerKeyStateChange и добавляем в него: if(newkeys & KEY_WALK) { OnPlayerCommandText(playerid,"/com"); } Теперь, нажав на клавишу ALT сработает действие команды /com ID клавиш можно посмотреть тут
×
×
  • Создать...