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

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

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

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

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

Тип контента


Форумы

  • Информационный раздел
    • Новости портала
    • Техническая поддержка
    • Приватный форум
  • CRMP 0.3е
    • Помощь по Скриптингу
    • Ошибки
    • Готовые сервера
    • Дополнительные скрипты
    • Мануалы/Уроки
    • Модификации
    • Поиск
    • Архив Вопросов/Проблем/Ошибок
    • Файловый архив
    • Другое
  • SAMP/CRMP 0.3.7
    • Помощь по Скриптингу
    • Ошибки
    • Готовые сервера
    • Плагины
    • Поиск
    • Документация
  • Другое
    • Флейм

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

Поиск результатов, которые содержат...


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

  • Начало

    Конец


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

  • Начало

    Конец


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

Найдено: 1,434 результата

  1. Итак, в этом уроке вы научитесь делать карты в MTA. Для начала скачаем саму MTA и установим: http://zebra.og-serv...mtasa-1.0.5.exe В установке MTA нет ничего сложного. После установки запускаем её и ждём окончания загрузки. Может выскочить окошко, что нужно обновление, отказываемся. Слева видим пункты меню и тыкаем на "Map Editor". Ждём когда загрузится. После загрузки появится окошко с предложением обучения. Нажимаем "Skip" (то есть пропустить). Начнём работу. Управляем камерой мышкой + кнопки W, A, S, D. Чтобы быстро лететь, удерживая пробел и кнопки полёта. Чтобы медленно лететь Alt и кнопки полёта. Устанавливаем камеру на какое-нибудь положение и нажимаем кнопку F. Сверху по-середине и слева внизу появились кнопки. Чтобы поставить объект, кликаем мышкой на кнопку и рисунком коробки. Мы переключимся в режим выбирания объекта. Слева список объектов. Всех объектов! Так дело не пойдёт, вверху открываем список категорий и выбираем нужную. Чтобы посмотреть на объект, кликаем один раз по названию объекта. Чтобы его выбрать - два раза. Если вы передумали ставить объект, внизу есть кнопка "Canel". А теперь, попробуем поставить какой-нибудь объект. Кликаем два раза на название и видем, что мышка взяла объект, как собачка свою косточку и таскает за собой. Мышкой точное положение объекта врядли с первого раза поставишь. Так вот, выбираем примерное положение на кликаем левой кнопкой мыши один раз. Теперь можно двигать объект клавишами-стрелками. Чтобы быстро его двигать пробел + стрелки. Чтобы медленно Alt + стрелки. Чтобы повернуть объект, Ctrl + стрелки влево-вправо. Чтобы изменить другой угол Ctrl + стрелки вверх вниз. А вот чтобы изменить высоту, в MTA сочитания клавиш нет, так что кликаем два раза на объект и сами подбираем нужную высоту (координата Z). Чтобы клонировать объект Ctrl + клик по объекту. Чтобы удалить - клавиша Delete. После установки первого объекта, ставим второй. Опять открываем список, выбираем нужный объект, подгоняем координаты. Может вы поставили такой маленький объект, что курсор его не видет? Нажимаем на клавишу E (русск. "у"). Выключается так же. Теперь как ставить тачки. Ответ: почти так же, как и объекты, просто выбираем другой пунк в меню (который внизу слева) на которой нарисована машина. И так же выбираем категорию, потом так же ставим. Мышкой ставить тачку проще, чем объект. Но координату угла Y советую не менять, так как в сампе её нету. Чтобы перейти в режим теста, нажмите на клавишу F5. После того, как вы на грув (я так думаю ) поставили объекты и транспорт, сохраняем нашу первую созданную карту. Для этого переходим в фиксированное положение камеры и нажимаем на верхней панели кнопку с дискетой. Набираем название, сохраняем. А теперь самое интересное. Конвентирование объектов в самп. Заходим в папку с МТА в папки: \server\mods\deathmatch\resources\"название вашей сохранённой карты". Теперь открываем файл с расширением ".map", который там находится, блокнотом. Выделяем всё (Ctrl+a) и копируем (Ctrl+C). Заходим на сайт http://www.convertffs.com/ и в "Paste here" вставляем то что вы скопировали из файла map. Настройки input установятся автоматически, а вот Output надо немножко поднастроить. Это зависит от стримера. Если никого нет - CreateObject. Для машин AddStaticVehicle. Потом нажимаем на кнопку "Convert" и получившийся код вставляем в мод/фильтскрипт (паблик OnGameModeInit). Вот и весь урок. Желаю удачи в создании карт! Автор урока -EvgeN 1137. Если будут вопросы - задавайте сюда.
  2. Mr.Brain

    Создание Бинда В Pawno

    Здравствуйте, в этом уроке будет описано, как сделать бинд с помощью павн скриптинга. Для начала откроем любой мод. После нажмём CTRL+F и в появившееся окно вставляем public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)После этого идём в конец паблика и вставляем: if (newkeys == KEY_CROUCH) { OnPlayerCommandText(playerid,"/comanda"); }Теперь разберем все по порядку.KEY_CROUCH - Это кнопка H(р), на это кнопку часто назначают открытие ворот Какая клавиша как обозначается можно узнать здесь: Быстрое и лёгкое нахождение клавиш /comanda - Это ваша любая команда которую вы хотите назначит на эту кнопку Так же есть второй вариант. Так же находим паблик, только теперь вставляем: if (newkeys == KEY_CROUCH) { SendAllClientMessage(playerid,COLOR_GREEEN, "Всем привет!"); }То есть теперь при нажатии клавиши H(р), будет всем игрокам писаться сообщение "Всем привет!"
  3. Всё естественно, что идеальной антирекламы нету как и нету идеального ничего в жизни, всё относительно. Вот пример хорошей антирекламы всех чатов. Ставим данную проверку в паблики OnPlayerCommandText и в OnPlayerText PHP код: new word[256],Index;while(Index < strlen(cmdtext)){word = strtok(cmdtext,Index);if(checkbanan(word)==1 && тут_ваша_проверка_на_админа){banan(playerid,cmdtext);return 0;}} дальше идём в любое свободное место в моде, и объявляем нашу проверку стоками: PHP код: stock checkbanan(word[]) { if( strlen(word)>21) return 0; if( strfind(word,".", true)==-1) return 0; new ip[5][256],index; ip[0] = strtok2(word,index,'.'); ip[1] = strtok2(word,index,'.'); ip[2] = strtok2(word,index,'.'); if(strfind(word,":",true)>0){ ip[3] = strtok2(word,index,':'); ip[4] = strtok2(word,index); } else { ip[3] = strtok2(word,index); valstr(ip[4],0); } if(!IsNumeric2(ip[0])||!IsNumeric2(ip[1])||!IsNumeric2(ip[2])||!IsNumeric2(ip[3])||!IsNumeric2(ip[4]) ||!strlen(ip[0])||!strlen(ip[1])||!strlen(ip[2])||!strlen(ip[3])||!strlen(ip[4]) ||(strval(ip[0])==192&&strval(ip[1])==168) ||(strval(ip[0])==172&&strval(ip[1])>=16&&strval(ip[1])<=31) ||strval(ip[0])==10||(strval(ip[0])==127&&strval(ip[1])==0&&strval(ip[2])==0&&strval(ip[3])==1)) return 0; return 1; } strtok2(string[],&idx,seperator = ' ') { new ret[128], i = 0, len = strlen(string); while(string[idx] == seperator && idx < len) idx++; while(string[idx] != seperator && idx < len) { ret[i] = string[idx]; i++; idx++; } while(string[idx] == seperator && idx < len) idx++; return ret; } stock IsNumeric2(string[]) { for (new i = 0, j = strlen(string); i < j; i++) if (string[i] > '9' || string[i] < '0') return 0; return 1; } stock banan(playerid,bantext[]) { new name[MAX_PLAYER_NAME],string[256];GetPlayerName(playerid,name,24); format(string, 256, "[%d]%s рекламит сервер и забанен за рекламу, введёный им IP: %s",playerid,name,bantext); SendClientMessageToAll(COLOR_YELLOW,string);//это уже сами измените как хотите, зависит от вашего мода и фантазии Ban(playerid); } Вот и всё, очень просто и защита неплохая впринципе!
  4. serega1111

    [Урок] Создание радио на 0.3D

    Приветствую вас пользователи форума, на днях задался вопросом, как урасиво реализовать функции радио в sa-mp 0.3D, и у меня получилось следующее: В начало мода ко всем #define надо добавить PHP код: #define RADIO 3000//Где 3000 это ID диалога Далее мы находим паблик public OnPlayerStateChange(playerid, newstate, oldstate) и вствляем в него: PHP код: if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER) PlayAudioStreamForPlayer(playerid, "http://somafm.com/tags.pls");//если человек в авто то начинает играть радио сюда свое радио, у меня стоит стандатрное if(oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER) StopAudioStreamForPlayer(playerid);//если человек вышел из транспорта, то радио выключается // Добавляем команду /radio PHP код: //Добавляем команду "/radio" if(!strcmp(cmdtext, "/radio", true)) return ShowPlayerDialog(playerid, RADIO, DIALOG_STYLE_LIST, "Выбирите Радио волну:","0-Зайцев FM\n1-Европа +\n2-Maks FM\n3-MeGa Radio\n4-Love Radio\n5-ICE FM\n6-D-FM\n7-Record FM\nОтключить радио", "Ok", "Выход"); Находим паблик public OnPlayerKeyStateChange(playerid, newkeys,oldkeys) и вставляем в него: PHP код: if (newkeys == 262144) OnPlayerCommandText(playerid,"/radio"); //262144 - это id клавиши R Находим паблик public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) и внего вписываеш: PHP код: if(dialogid == RADIO) { if( response) { switch( listitem) { case 0: PlayAudioStreamForPlayer(playerid,"http://www.zaycev.fm:9001/rnb/ZaycevFM(128)"); case 1: PlayAudioStreamForPlayer(playerid,"http://webcast.emg.fm:55655/europaplus128.mp3"); case 2: PlayAudioStreamForPlayer(playerid,"http://radio.maks-fm.ru:8000/maksfm128.m3u"); case 3: PlayAudioStreamForPlayer(playerid,"http://megaradio.radiotelek.ru/megaradio.m3u"); case 4: PlayAudioStreamForPlayer(playerid,"http://stream01.rambler.ru/love64.mp3"); case 5: PlayAudioStreamForPlayer(playerid,"http://icefm.ru/etc/live.m3u"); case 6: PlayAudioStreamForPlayer(playerid,"http://w02-cn01.akadostream.ru:8000/dinamitfm48.mp3"); case 7: PlayAudioStreamForPlayer(playerid,"http://w02-cn01.akadostream.ru:8000/radiorecord128.mp3"); case 8: StopAudioStreamForPlayer(playerid); } } } На счет багов, ошибках пишите в этой теме.
  5. serega1111

    [Урок]Создание статуса

    Здраствуйте хочю поведать новичкам(чаще всего)как же всётаки привезать машину не к фракции не по порядковому номеру а по переменным,и так начнём,рассмотрим пример на машинах грув стрита(покажу как добавить машины и привезать их по переменной к фракции) 1)к forward'ам добавить: PHP код: forward IsAGrooveCar(carid); к new добавить PHP код: new GroveCar[2]; теперь добавляем машины в public OnGameModeInit(скину из своего мода) PHP код: AddStaticVehicleEx(600,2487.8506,-1681.2094,13.0448,2.8373,86,86, 60000); AddStaticVehicleEx(600,2491.5459,-1681.2618,13.0490,359.6013,86,86, 60000); AddStaticVehicleEx(492,2516.4478,-1671.8979,13.6814,62.0043,86,86, 60000); AddStaticVehicleEx(492,2510.7803,-1687.7375,13.3418,45.3245,86,86, 60000); AddStaticVehicleEx(492,2506.0259,-1694.2249,13.3317,0.0002,86,86, 60000); AddStaticVehicleEx(492,2506.6377,-1651.8461,13.4621,317.3195,86,86, 60000); AddStaticVehicleEx(500,2467.2190,-1655.0046,13.4315,90.4295,86,86, 60000); AddStaticVehicleEx(487,2529.4441,-1678.7546,20.1231,5.9486,86,86, 60000); AddStaticVehicleEx(500,2473.1929,-1655.0105,13.4399,91.4332,86,86, 60000); машины мы добавили,но они не привязаны к фракции,перед первой машиной пишим GroveCar[0] = ,перед последней GroveCar[1],получится вот так PHP код: GroveCar[0] = AddStaticVehicleEx(600,2487.8506,-1681.2094,13.0448,2.8373,86,86, 60000); AddStaticVehicleEx(600,2491.5459,-1681.2618,13.0490,359.6013,86,86, 60000); AddStaticVehicleEx(492,2516.4478,-1671.8979,13.6814,62.0043,86,86, 60000); AddStaticVehicleEx(492,2510.7803,-1687.7375,13.3418,45.3245,86,86, 60000); AddStaticVehicleEx(492,2506.0259,-1694.2249,13.3317,0.0002,86,86, 60000); AddStaticVehicleEx(492,2506.6377,-1651.8461,13.4621,317.3195,86,86, 60000); AddStaticVehicleEx(500,2467.2190,-1655.0046,13.4315,90.4295,86,86, 60000); AddStaticVehicleEx(487,2529.4441,-1678.7546,20.1231,5.9486,86,86, 60000); GroveCar[1] = AddStaticVehicleEx(500,2473.1929,-1655.0105,13.4399,91.4332,86,86, 60000); теперь создаём паблик PHP код: public IsAGrooveCar(carid) { if(( carid >= GroveCar[0]) && (carid <= GroveCar[1])) { return 1; } return 0; } в этом паблике машины грув стрита от GroveCar[0] до GroveCar[1],продожаем,необходимо сделать проверку на фракцию при входе в машину идём в public OnPlayerStateChange и добавляем PHP код: if(IsAGrooveCar(newcar)) { if( PlayerInfo[playerid][pMember] == 13||PlayerInfo[playerid][pLeader] == 13) { } else { SendClientMessage(playerid,COLOR_GREY," Вы не из Grove Street"); RemovePlayerFromVehicle(playerid); printf("TEST29");} } 13 - номер фракции,меняем на свободный.Вот и всё) Это привязка машин по переменным
  6. Mr.Brain

    [All] Оптимизация кода

    Здравствуйте, дорогие пользователи GS-Games.Ru, надеюсь вам поможет эта статья иначе я просто напросто потрачу 15 минут своей жизни http://forum.gs-games.ru/public/style_emoticons/default/fuck[1].gif Пожалуй начнём... Для чего вообще требуется оптимизация кода? Оптимизированный код значительно снижает нагрузку на сервер, при онлайне 15-20 человек, конечно это будет не заметно, но при человек 100 тогда уже мод начнёт подлагивать.... 1. Первый вариант оптимизации, Допустим у нас стоит проверка на что-то: if(IsACop(playerid)) { SendClientMessage(playerid, -1, "Ты коп!!!11!!"); return 1; } SendClientMessage(playerid, -1, "Ты не коп!!11!"); Вот этот страшный код годфазера...Оптимизируем его: if(IsACop(playerid)) return SendClientMessage(playerid, -1, "Ты коп!!!11!!"); SendClientMessage(playerid, -1, "Ты не коп!!11!");Вот это незначительно, но снимает нагрузку на сервер))2. Второй способ: Будем оптимизировать OnDialogResponse Вместо кода: if(dialogid == 0) { } if(dialogid == 1) { } Вместо этого можно использовать switch: switch(dialogid) { case 0: case 1: }Тем самым мы так же облегчаем жизнь серверу http://forum.gs-games.ru/public/style_emoticons/default/smile.gif3. Третье самое распространённая ошибка в GF кодах: Не использование повторяющихся обстоятельств SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); Хотя вместо этого можно сделать так: for(new i; i < 10; i++) SendClientMessageToAll(COLOR, " "); Спасибо за внимание, с Вами был ePZuz Специально для GS-Games.Ru При копирование материала ссылка на источник и указание автора обязательна! (с)GS-Games, GCMT
  7. Пишите какие уроки хотите увидеть в этом разделе и в течении 2 двух дней, тот манипуал который вы описали появится здесь... И самое главное всё подробно описывайте, если не будет подробного описания. То ваше сообщение не будет приниматься....
  8. Итак, по сути, этот урок повторение и закрепление 11 урока. Сейчас я покажу, как выдавать Это, пожалуй, самый легкий урок из всех предыдущих. Расставить транспорт можно несколькими способами: Расстановка транспорта с помощью Samp Debug: Для начала запускаем Samp Debug из папки с GTA San Andreas. Как только все загрузится, вы появляетесь Карлом Джонсоном возле надписи Vinewood. Теперь с помощью команды /v вызываем нужную нам машину, например INFERNUS, для этого пишем в чате /v 411 и получаем машину. Если вы не знаете ID машины, которую хотите вызвать, введите /vmenu, и вы попадете в меню выбора транспорта. Садитесь в машину и паркуйте ее там, где вам нужно. После этого, не выходя из машины, вводите команду /save. В директории: Мои документы\GTA San Andreas User Files\Samp\ будет файл savedpositions.txt, с примерно таким содержанием: AddStaticVehicle(411, 322.5014, 303.6906, 999.1484, 269.1425, 0, 0);Функция AddStaticClass может использоваться только внутри автовызываемой функцииOnGameModeInit, в других функциях она работать не будет. Можно расставить транспорт с помощью фильтрскриптов, таких как cars. Данный скрипт прилагается к учебнику. Достаточно ввести ID транспорта, как команда, например /411 и вы окажетесь прямо в машине. Автор Cloud
  9. Lexa

    Проверка на алкоголь

    Вот команда для законников: if(strcmp(cmd,"/bh",true)==0) { if(IsPlayerConnected(playerid)) { new leader = PlayerInfo[playerid][pLeader]; new member = PlayerInfo[playerid][pMember]; if(member==1 || member==2 || member==3 || leader==1 || leader==2 || leader==3)// проверка на фракцию. { tmp = strtok(cmdtext, idx); if(!strlen(tmp)) { SendClientMessage(playerid, COLOR_GREY, "*Используйте: /bh [ид игрока]"); return 1; } giveplayerid = ReturnUser(tmp); if(IsPlayerConnected(giveplayerid)) { if(giveplayerid != INVALID_PLAYER_ID) { if (ProxDetectorS(8.0, playerid, giveplayerid)) { GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer)); GetPlayerName(playerid, sendername, sizeof(sendername)); new text1[20]; if(GetPlayerDrunkLevel(giveplayerid) > 0) { text1 = "| Пьян."; } else { text1 = "| Трезв."; } format(string, sizeof(string), "|__________ %s Проверен на алкоголь__________|", giveplayer); SendClientMessage(playerid, COLOR_WHITE, string); format(string, sizeof(string), "%s.", text1); SendClientMessage(playerid, COLOR_GREY, string); format(string, sizeof(string), "* %s Проверил на алкоголь %s", sendername ,giveplayer); ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE); } else { SendClientMessage(playerid, COLOR_RED, "** Игрок далеко от вас!"); return 1; } } } else { SendClientMessage(playerid, COLOR_RED, "** Этот игрок не в игре !"); return 1; } } else { SendClientMessage(playerid, COLOR_RED, "** Вы не законник!"); return 1; } } return 1; }
  10. Краткое руководство по настройке плагина от Инкогнито: 1. Скачаем архив с плагинами и инклюдом. 2. Помещаем папку plugins в папку с вашим сервером 3. Помещаем инклюд streamer.inc в папку с павно, с помощью котрого идет компиляция вашего мода. 4. Открываем ваш мод и в самое начало кода (шапку) вставляем 3 строки. Дефайны упрощают работу с стримером, вам не нужно будет переименовывать функции для добавления новых объектов. #include <streamer> #define CreateObject CreateDynamicObject #define MoveObject MoveDynamicObject 5. Нажимаем клавишу F5, происходит компилирование мода. 6. Приступаем к редактированию server.cfg для подключения плагина во время запуска сервера. Если вы используете оперативную систему поколения linux, то вам нужно ввести в конец вашего server.cfg строку plugins streamer.soЕсли же вы используете оперативную систему поколения windows, то в server.cfg достаточно ввести plugins streamer Лимиты:Стример позволяет использовать до 399 объектов вокруг игрока Автор: Elfuego streamer.rar
  11. ByMeR_OK

    SpeedHack

    В начало мода вставьте: forward Anticheat(); в любое место в моде вставить: public Anticheat() { for(new i = 0; i < GetMaxPlayers(); i++) // Цикл, проверяем всех игроков онлайн { if(IsPlayerConnected(i)) // проверяем подключен ли { if(GetSpeedKM(i) > 260) //Максимальная скорость { SendClientMessage(i, COLOR_LIGHTRED, "Вы кикнуты, причина Speedhack"); // пишем месег Kick(i); // кикаем его } } return 1; } stock GetSpeedKM(playerid) // проверяет скорость { new Float:PosX, Float:PosY, Float:PosZ, Float:PlayerSpeedDistance; GetVehicleVelocity(GetPlayerVehicleID(playerid), PosX, PosY, PosZ); PlayerSpeedDistance = floatmul(floatsqroot(floatadd(floatadd(floatpower( PosX, 2), floatpower(PosY, 2)), floatpower(PosZ, 2))), 170.0); new spe = floatround(PlayerSpeedDistance * 1); return spe; } в public OnGameModeInit SetTimer("Anticheat",2000,1);
  12. Сабвуфер для "Эллегии"[RUS]Автор: [iSS]jumboОписание можно прочесть по ссылке ниже:А я всего сделал перевод для этого скрипта...Скачать: ESubwoofers.pwnESubwoofers.rar
  13. Если вы хорошо поняли прошлый урок, то без труда освоите и этот, поскольку инклуды очень похожие, просто имена функций немного отличаются, но выполняют они одну и ту же функцию. Файл Dini.inc нужно скопировать в папку include в директории с редактором Pawno. В начале вашего скрипта обязательно нужно объявить этот инклуд, также как объявляется инклуд a_samp. Итак, приступим к разбору основных функций mxINI: dini_Create(“filename.ini”); //Создает файл с именем filename.ini в папке scriptfiles. dini_Remove(“filename.ini”); //Удаляет файл dini_Exists(“filename.ini”); //Проверяет, существует ли данный файл (для оператора if)Запись данных в файл: dini_Set(“filename.ini”, "имя ключа", "текст"); // Эта функция записывает текст в ключ. dini_IntSet(“filename.ini”, "имя ключа", "текст"); // Эта функция записывает целое число в ключ. dini_FloatSet(“filename.ini”, "имя ключа", 123456 ); // Эта функция записывает десятичное число в ключ. dini_BoolSet(“filename.ini”, "имя ключа", 3.1416 ); // Эта функция записывает логическое значение в ключ.Чтение данных из файла dini_Get(“filename.ini”, "имя ключа", "текст"); // Эта функция получает текст из ключа. dini_Int(“filename.ini”, "имя ключа", "текст"); // Эта функция получает целое число из ключа. dini_Float(“filename.ini”, "имя ключа", 123456 ); // Эта функция получает десятичное из ключа. dini_Bool(“filename.ini”, "имя ключа", 3.1416 ); // Эта функция получает логическое значение из ключа.Остальные функции dini_Unset(“filename.ini”, "имя ключа"); // Отменяет последнее установленное число на ключ dini_Isset(“filename.ini”, "имя ключа"); // Проверяет было ли установлено данное значение в ключ(для оператора if)Инклуд mxINI это по сути упрощенный инклуд Dini, поэтому они особо не отличаются. Но mxINI не умеет удалять файлы, как это может Dini. Поэтому можно пользоваться mxINI для чтения и записи, а Dini для удаления файлов. В приведенном ниже примере я взял за основу пример из прошлого урока и переделал его под использование Dini. new string[255], PlayerName[32]; new Float:health, money; GetPlayerName(playerid,PlayerName,32); format(string,64,”%s.ini”,PlayerName); new iniFile = dini_Create(string); //Открываем файл dini_Get(iniFile, "Name", PlayerName); //Узнаем имя игрока и записываем его в переменную dini_Int (iniFile, "Money", money); // Узнаем количество денег и записываем в переменную dini_Float(iniFile, "Health", health); // Узнаем количество здоровья и записываем в переменную GivePlayerMoney(playerid,money); SetPlayerHealth(playerid,health);Т.е. переименовал название функции на имена функций Dini.Автор Cloud
  14. В этом уроке я расскажу, как научится работать с include – mxINI. На момент написания этого урока последняя актуальная версия инклуда 0.5. Прежде чем приступить к изучению инклуда, рекомендую его скачать. На основе этого инклуда в основном делают регистрацию на сервере. В этом уроке я не буду показывать вам, как написать простейшую регистрацию на сервере, а всего лишь объясню, как с помощью mxINI происходит запись и чтение из файла. Думаю, выяснив, как работает данный инклуд, вы сами сможете написать простую регистрацию, возможно даже на диалогах, так как урок с диалогами вы уже проходили. Файл mxINI.inc нужно скопировать в папку include в директории с редактором Pawno. В начале вашего скрипта обязательно нужно объявить этот инклуд, также как объявляется инклуд a_samp. Итак, приступим к разбору основных функций mxINI: ini_createFile(“filename.ini”); //Создает файл с именем filename.ini в папке scriptfiles. ini_openFile(“filename.ini”); //Открывает файл ini_closeFile(ID открытого файла); //Закрывает файлЗапись данных в файл: ini_setString(ID файла, "имя ключа", "текст"); // Эта функция записывает текст в ключ. ini_setInteger(ID файла, "имя ключа", 123456 ); // Эта функция записывает целое число в ключ. ini_setFloat(ID файла, "имя ключа", 3.1416 ); // Эта функция записывает десятичное число в ключ.Чтение данных из файла ini_getString(ID файла, "имя ключа", <имя переменной>); // Эта функция записывает текст в переменную из файла. ini_getInteger(ID файла, "имя ключа", <имя переменной>); // Эта функция записывает целое число в переменную из файла. ini_getFloat(ID файла, "имя ключа", <имя переменной>); // Эта функция записывает десятичное число в переменную из файла.Запись в файлДавайте для простого примере с помощью команды, запишем данные игрока: имя, деньги и количество здоровья. Сначала мы создаем 2 переменные, где у нас будут храниться имя игрока и отформатированное сообщение. new string[255], PlayerName[32]; GetPlayerName(playerid,PlayerName,32); format(string,64,”%s.ini”,PlayerName); new iniFile = ini_createFile(string);После переменных мы узнаем имя игрока функцией GetPlayerName. Дальшеформатируем строку, как будет называться файл в который будет производиться запись. В данном случае файл будет называться по имени игрока. Дальше создаем переменную IniFile, которая будет создавать данный файл. Перед тем как записать количество денег и здоровья игрока, нужно сначала их узнать: new money = GetPlayerMoney(playerid); new Float:health = GetPlayerHealth(playerid);Теперь пишем проверку, если файл выдаст ошибку, открыть файл снова. if(iniFile < 0) iniFile = ini_openFile(string);Дальше записываем данные в файл и закрываем его: ini_setString(iniFile, "Name", PlayerName); //Записываем имя игрока ini_setInteger(iniFile, "Money", money); //Записываем количество денег ini_setFloat(iniFile, "Health", health); //Записываем количество здоровья ini_closeFile(iniFile); //Закрываем файлВот так производится запись данных в файл. Запись в файле будет выглядеть примерноследующим образом: Name = Player Money = 1000 Health = 100.0Чтение из файлаЧтение из файла ничем не сложнее записи, все аналогично. Только тут не нужно проверок, условий: if{iniFile < 0), и в переменной iniFile мы не создаем, а уже открываем созданный нами файл. Весь код будет выглядеть следующим образом: new string[255], PlayerName[32]; new Float:health, money; GetPlayerName(playerid,PlayerName,32); format(string,64,”%s.ini”,PlayerName); new iniFile = ini_openFile(string); //Открываем файл ini_getString(iniFile, "Name", PlayerName); //Узнаем имя игрока и записываем его в переменную ini_getInteger(iniFile, "Money", money); // Узнаем количество денег и записываем в переменную ini_getFloat(iniFile, "Health", health); // Узнаем количество здоровья и записываем в переменную ini_closeFile(iniFile); //Закрываем файл GivePlayerMoney(playerid,money); SetPlayerHealth(playerid,health);
  15. В этом уроке я научу вас создавать простые двери, открываемые по команде. Таким же образом вы сможете потом ставить ворота и шлагбаумы. И начну я с фильтр скрипта Ingame Object Editor. (данный скрипт прилагается к учебнику). Почему именно он, когда предлагают много раз MTA Map Editor. Во-первых, это как один из простых способов расставить небольшое количество объектов, если ставить много объектов, на это уйдет больше времени, чем в MTA Map Editor. Во-вторых, это тоже было бы полезно знать. В-третьих, не нужно конвертировать код из map в pwn, все объекты будут в вашем моде вместе с этим фильтр скриптом. Доступ к его опциям имеет только RCON администратор, поэтому вам необходимо будет войти на сервер как RCON администратор. Начнем с создания двери. Войдите на сервер как RCON администратор. Итак, вот место куда мы, например, хотим поставить дверь. Мы можем поставить деревянную дверь с ID = 1491, это дверь, которая открывается когда ее толкаешь, но нам нет смысла сейчас ее ставить, потому что мы делаем закрытую дверь, которую нужно будет открыть по команде. Поставим дверь, например с ID = 1500. Итак, в чате пишем следующую команду /oadd 1500 door. Команда /oadd – добавляет новый объект, через пробел пишется ID объекта и далее имя объекта, любое. Итак, мы создали нашу дверь, но она оказалась в воздухе. Давайте ее опустим. Пишем следующую команду в чат: /omode m_z – эта команда позволит двигать дверь в двух направлениях (вверх или вниз). Дальше садимся на кнопку C и камера переключается на сам объект. Стрелками двигаем дверь вниз к полу. Итак, мы опустили дверь, мы можем снова нажать С, и встать в удобное вам место для обзора объекта и снова сесть. Дальше нам нужно повернуть дверь левее (исходя из рисунка). Пишем туже команду, но уже не m_z а m_xy. Это команда позволит двигать объект во все четыре стороны (вперед, назад, влево и вправо). Таким образом, двигаем дверь в дверной проем. Нам нужно записать куда-нибудь координаты этой двери в положении закрыто. Координаты этой двери находится в scriptfiles/oed/BREAD_OED.txt и выглядеть они будут следующим образом (чтобы не запутаться, после координат написано имя объекта, имеющего эти координаты, его мы не трогаем): 1500,371.234283,166.662429,1007.383850,0.000000,0.000000,0.000000,1Итак, мы записали координаты в безопасное место. А теперьповернем дверь в положение открыто. Чтобы повернуть дверь, мы все также используем команду /o_mode, только теперь вместо m_xy пишем r_z. И поворачиваем дверь в такое положение: Теперь снова записываем те же координаты двери в положении закрыто. В координатах ничего не изменилось, кроме предпоследней цифры. 1500,371.234283,166.662429,1007.383850,0.000000,0.000000,93.000000,1/o_mode r_z – позволяет нам вращать объект таким образом, чтобы дверь открывалась изакрывалась. Есть также r_xy – с помощью, которой уже вращаем дверь в другом направлении. Запомните m_z и m_xy – это перемещение по осям: z и xy, а r_z и r_xy – это вращение по тем же осям. Итак, мы получили координаты закрытой и открытой двери. Теперь мы можем удалить этот объект, т.к. у нас есть его координаты. Удаляем его командой /odel [имя объекта] в данном случае имя объекта – door, значит, пишем /odel door. Удаляем мы его для того, чтобы у нас не получилось 2 копии двери, т.к. одну дверь мы вставим в мод. Прежде чем приступить к делу объясню ниже приведенные цифры. Первая цифра означает ID модели, следующие 3 цифры это координаты положения объекта, далее идут 3 цифры это координаты вращения объекта, последняя цифра это видимость объекта. 1500,371.234283,166.662429,1007.383850,0.000000,0.000000,93.000000,1Итак, приступим к написанию команды. Сначала в начале скрипта мы объявляемглобальную переменную, например door. Затем внутри автовызываемой функции OnGameModeInit – мы присваиваем этой переменной, созданный объект. cpd = CreateObject(1500,371.234283,166.662429,1007.383850,0.000000,0.000000,0.000000,300.0);Видимость мы ставим 300.0, иначе вы будете видеть дверь, только подойдя к ней вплотную.Затем пишем две команды, одну для открытия двери, другую для закрытия: if(strcmp("/open", cmdtext, true, 10) == 0) { SetObjectRot(cpd,0.000000,0.000000,93.000000); return 1; } if(strcmp("/close", cmdtext, true, 10) == 0) { SetObjectRot(cpd,0.000000,0.000000,0.000000); return 1; }В функции мы указывает координаты вращения, т.к. мы будем вращать объект.Недостаток этого скрипта только в том, что дверь открывается мгновенно. Все из-за того, что в функции SetObjectRot которая устанавливает координаты вращения объекта, нет последнего аргумента speed, который есть в функции MoveObject. MoveObject – передвигает объекты в указанное место и так как у него есть аргумент speed, передвигает он объекты плавно. На его основе делают выдвижные двери. Так вот, давайте сделаем раздвижные двери. Естественно нашу дверь нужно подвинуть немного вперед в дверной проем, чтобы, когда дверь открывалась, ручки двери не торчали из стены. Т.е мы заново получаем координаты открытой и закрытой двери. И теперь мы из полученных координат берем координаты положения, а не координаты вращения. if(strcmp("/open", cmdtext, true, 10) == 0) { MoveObject (cpd,372.531341,166.374206,1007.370971,2.0); return 1; } if(strcmp("/close", cmdtext, true, 10) == 0) { MoveObject(cpd,371.238067,166.374206,1007.370971,2.0); return 1; }Вот в принципе и все. Автор Cloud
  16. Devin Coleman

    Урок №22 – Запись в файл

    В этом уроке мы переходим к разбору третьего стиля диалога: DIALOG_STYLE_LIST. Давайте рассмотрим данный стиль диалога на следующем примере. Допустим нам нужно командой, вызвать меню со списком оружия на выбор. Создаем простейшую команду и внутрь ее пишем функцию вызова диалога. Так как это будет список, нам нужно использовать \n – переход на новую строчку. Т.е. мы пишем название пункта \n название пункта и снова \n. if (strcmp("/weaponlist", cmdtext, true, 10) == 0) { ShowPlayerDialog(playerid,0,DSL,"Список оружия»,«Кольт\nКольт с глушителем\nПустынный орел", "Выбор", "Отмена"); return 1; }Диалог будет выглядеть следующим образом:Перед тем как написать функцию для этого диалогового окна, давайте посмотрим на следующую конструкцию приведенную ниже. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == 0) { if(listitem == 1) //Если был выбран 1 пункт списка { //Выполнить этот код } if(listitem == 2) //Если был выбран 2 пункт списка { //Выполнить этот код } } return 1; }Вот так должен выглядеть код для данного стиля диалога. Тут мы проверяем значениеlistitem, т.е. пункта списка которого мы выберем в диалоге. listitem = 1 – это кольт, значит, в условную конструкцию listitem == 1 мы должны вписать функцию GivePlayerWeapon, чтобы дать оружие игроку. if(listitem == 1) //Если был выбран 1 пункт списка { GivePlayerWeapon(playerid,22,100); //Дать игроку кольт и 100 патронов }То же самое делаем и для остальных listitem. Вписываем ту же строчку, только вместо 22,пишем следующее: 23 – для кольта с глушителем, 24 – для пустынного орла (эти цифры, это ID модели этого оружия). ID модели смотрите на странице «ID оружия». Вообще, приведенный выше пример, очень схож с оператором switch, т.к. мы проверяем значение одного аргумента и в зависимости от этого значения выполняем действие. Тоесть, это все можно заменить на оператор switch, таким образом: public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == 0) { switch(listitem) { case 1: //Если был выбран 1 пункт списка { //Выполнить этот код } case 2: //Если был выбран 1 пункт списка { //Выполнить этот код } } } return 1; }Но все же, если вы хорошо не усвоите этот урок, лучше этим примером не пользоваться Автор Cloud
  17. В этом уроке мы переходим к разбору второго стиля диалога: DIALOG_STYLE_INPUT. Работать с данным стилем диалога будет сложнее по сравнению с остальными стилями диалогов, т.к. тут есть поле ввода. Начнем с простого примера: мы командой вызовем диалоговое окно, введем текст и данный текст отправиться всем игрокам в чат. Имя игрока видно не будет, сообщение анонимное. Итак, приступим к созданию диалога: ShowPlayerDialog(playerid,0,DSI,"Отправить сообщение всем","Введите текст сообщения","ОК","Отмена");Данную строку я думаю, вы уже догадались, что ее нужно вписать внутрь готовой команды.Я все также использовал константу DSI из прошлого урока, чтобы не писать длинное название стиля диалога, поэтому не забудьте ее добавить в ваш скрипт. #define DSI DIALOG_STYLE_INPUTИтак, диалоговое окно мы создали, и оно будет выглядеть следующим образом.Приступим к написанию функции для этого диалога. Как и в прошлом уроке, внутрь функции OnDialogResponse, пишем условную конструкцию проверки на вызов диалога с ID = 0. Внутрь этой условной конструкции пишем еще одну, проверку на нажатие кнопки. Дальше внутри этой проверки будет еще одна проверка на то, что поле ввода у нас содержит какие-либо символы. Ведь мы же не можем отправить пустой текст. Условная конструкция будет такая: if(!strlen(inputtext)) { }else{ }Данную условную конструкцию мы пишем внутри условной конструкции if(response). Атеперь я вам объясню, что значит strlen и inputtext: Strlen – возвращает количество символов в строке. Inputtext – этот аргумент содержит в себе текст, который мы вводим в поле ввода. В общем, думаю, вам будет все понятно, посмотрев нижеприведенный готовый скрипт, но все же я вам кратко его объясню на всякий случай. Сначала идет проверка на вызов диалогового окна с ID = 0. Мы данное окно вызывали функцией ShowPlayerDailog(playerid,0…); - я специально выделил цифру, это dialogid. После проверки, внутри идет еще одна проверка на нажатие кнопки. Если нажата кнопка 1, т.е. кнопка «ОК», идет следующая проверка на то, что в поле ввода есть какой-либо текст. Если он есть, функция SendClientMessage отправляет в чат значение аргумента inputtext, т.е то что игрок введет в поле ввода диалогового окна. Если игрок не введет в поле ввода ничего, функция SendClientMessage отправит в чат сообщение с ошибкой, о том что текст сообщения не был введен в поле ввода. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == 0) { if(response) //Если была нажата 1 кнопка { if(!strlen(inputtext)){ //Если в поле не был введен текст при отправке SendClientMessage(playerid,COLOR_RED,"Вы не написали текст сообщения в поле ввода"); return 1; }else{ SendClientMessage(playerid,COLOR_WHITE,inputtext); } } } return 1; }Если вы поняли этот урок, тогда переходим к следующему. Автор Cloud
  18. В дальнейших уроках мы рассмотрим все типы диалогов и работу с ними. Для начала я ознакомлю вас со всеми диалогами, а затем в каждом уроке мы будем рассматривать по каждому типу диалога. Итак, приступим к теории. Диалоги бывают трех типов: 0 - DIALOG_STYLE_MSGBOX - обычный диалог с 2мя кнопками, 1 - DIALOG_STYLE_INPUT - диалог с полем для ввода, 2 - DIALOG_STYLE_LIST - список из нескольких элементов. Вызывается диалоговое окно функцией ShowPlayerDialog, структура функции такая: ShowPlayerDialog(playerid,<ID диалога>,<ID стиля>,<Название>,<Текст>,<Первая кнопка>,<Вторая>);Обычно, чтобы не запоминать цифры и не писать длинное название стилей диалогов, язаменяю их такими константами: #define DSL DIALOG_STYLE_LIST #define DSI DIALOG_STYLE_INPUT #define DSM DIALOG_STYLE_MSGBOXДля написания основного текста диалогового окна вы можете использовать:\b backspaсe \f Form feed \n переход на новую строку \r возврат каретки \' одиночная кавычка \" двойные кавычки \? вопросительный знак Итак, переходим к практике или к разбору первого стиля: DIALOG_STYLE_MSGBOX. Рассмотрим обычный пример: Мы вводим команду, и появляется диалоговое окно с запросом о подтверждении выполнения команды. Для начала мы напишем скрипт простейшей команды в автовызываемую функцию OnPlayerCommandText. if (strcmp("/test", cmdtext, true, 10) == 0) { return 1; }Затем с помощью функции ShowPlayerDialog мы вызовем данное диалоговое окно. Так каквызывать меню мы будем с помощью команды, то и пишем данную функцию, приведенную ниже внутри нее. ShowPlayerDialog(playerid,0,DSM,"Подтверждение","Вы точно хотите выполнить команду","Да","Нет");Цифра 0 – это идентификатор (ID) диалога, у каждого диалога свой ID. Послеидентификатора пишем название стиля диалога, но я заменил его константой, поэтому я написал DSM (DIALOG_STYLE_MSGBOX). После стиля пишем название диалога. Далее пишем текст диалога и название первой и второй кнопки. В общем, код будет выглядеть следующим образом: if (strcmp("/test", cmdtext, true, 10) == 0) { ShowPlayerDialog(playerid,0,DSM,"Подтверждение","Вы точно хотите выполнить команду","Да","Нет"); return 1; }Но данное диалоговое окно работать не будет, если мы не напишем для него функцию.Допустим, наша команда выдаст в чат всю информацию об игроке, т.е при нажатии кнопки «Да» все так и будет, но при нажатии кнопки «Нет», мы выдадим сообщение красным цветом о том что данная команда не была выполнена. Писать функцию диалогового окна мы будем в автовызываемой функции OnDialogResponse. Сначала внутри функции мы напишем условную конструкцию, которая будет проверять, что данное диалоговое окно было вызвано. Код условия такой: if(dialogid == 0) { }Условие проверяет: было ли вызвано диалоговое окно с ID = 0. Внутрь этой условнойконструкции добавляем еще одно условие: if(response) { }else{ }Условие проверяет, была ли нажата первая кнопка, если нажата вторая кнопка, товыполняется код после else. Внутри этой условной конструкции для первой кнопки мы пишем следующий код. if(response) { new string[128]; //Переменная с основным текстом диалога new plname[MAX_PLAYER_NAME]; //Переменная с именем игрока new money; //Переменные для хранения кол-ва наличных денег игрока new Float: health, Float: armor; //Переменные для хранения кол-ва здоровья и брони игрока GetPlayerName(playerid,plname,MAX_PLAYER_NAME); //Записываем имя игрока в переменную plname money = GetPlayerMoney(playerid); //Записываем деньги игрока в переменную money и т.д. GetPlayerHealth(playerid,health); GetPlayerArmour(playerid,armor); format(string,sizeof(string),”Игрок: %s(ID:%d). Деньги: %d $.\n Здоровье: %.2f\n Броня: %.2f”,plname,playerid,money,health,armor); ShowPlayerDialog(playerid,1,DSM,"Информация об игроке",string,"ОК",""); }else{Сначала мы создаем все необходимые переменные, а потом получаем данные и сразу же ихзаписываем их во всех переменные. Обратите внимание на функцию GetPlayerMoney, в скобках она имеет всего один аргумент (playerid), в отличие от других, и она возвращает количество денег игрока. Поэтому мы присваиваем переменной money, эту функцию, которая возвратит значение, которое и будет значением этой переменной. Еще обратите внимание на %.2f, я мог бы использовать просто %f, как показано в таблице. Точка и цифра означает, сколько чисел должно быть после запятой у десятичного числа. Дальше мы форматируем сообщение, после чего вызываем новое диалоговое окно с новым ID. Обратите внимание, что имя второй кнопки не указано, в таком случае, эта кнопка просто будет отсутствовать в диалоге. А вместо основного текста мы подставляем переменную string в которой уже есть готовое отформатированное сообщение. Вернемся к условию, если будет нажата вторая кнопка в первом диалоге, тут все просто без объяснений в else пишем: SendClientMessage(playerid,COLOR_RED,"Команда отменена");Вот в принципе и все, В следующем уроке мы рассмотрим другой стиль диалога. Переходимк следующему уроку. Автор Cloud
  19. Чтобы проверить игрока в радиусе, нам нужно написать в любом месте скрипта такую функцию: public PlayerToPoint(Float:radi, playerid, Float:x, Float:y, Float:z) { if(IsPlayerConnected(playerid)) { new Float:oldposx, Float:oldposy, Float:oldposz; new Float:tempposx, Float:tempposy, Float:tempposz; GetPlayerPos(playerid, oldposx, oldposy, oldposz); tempposx = (oldposx -x); tempposy = (oldposy -y); tempposz = (oldposz -z); if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi))) { return 1; } } return 0; }Также в начале скрипта ее нужно объявить. Так делается с любой новой автовызываемойфункцией. У каждой новой автовызываемой функции обязательно должен быть свой forward. forward PlayerToPoint(Float:radi, playerid, Float:x, Float:y, Float:z);В отличие от проверки в зоне или кубе тут достаточно получить 1 раз координату ивручную вписать радиус. Написав автовызываемую функцию PlayerToPoint мы можем ставить такие условия: if(PlayerToPoint(3.0,playerid, 72.1256, 1544.2145, 15.7742)) { }Эту проверку можно поместить, например, внутри команды.Вот в принципе и все! Автор Cloud
  20. forward IsPlayerInCube(playerid, Float:xmin, Float:ymin, Float:zmin, Float:xmax, Float:ymax, Float:zmax);Теперь мы можем ставить такие условия: if(IsPlayerInCube(playerid, 72.1256, 1544.2145, 15.7742, 75.2350, 1546.3352, 16.4206)) { }Эту проверку можно поместить, например, внутри команды. Теперь о том, как правильнополучить все 4 координаты, указанные в скобках функции. Синтаксис условия такой: if(IsPlayerInCube (playerid,Xmin,Ymin,Zmin,Xmax,Ymax,Zmax))Итак, встаем в левый нижний угол создаваемой вами зоны, получаем координаты командойsave. Далее встаем в правый верхний угол и снова получаем координаты. Допустим, мы уже получили вот такие координаты: AddPlayerClass(0,2021.0109,1343.0779,10.8130,256.6816,0,0,0,0,0,0); AddPlayerClass(0,2038.6593,1343.9640,10.3990,180.1545,0,0,0,0,0,0);Нужные нам координаты, я выделил цветом, т.е. это все координаты X и Y. Берем из этихкоординат минимальную X-координату - 2021.0109. Ставим ее первой в скобках, затем через запятую минимальную Y-координату - 1343.0779 и минимальную Z-координату – 10.3990. Дальше то же самое, но уже максимальные координаты. Должно получиться так: if(IsPlayerInCube(playerid, 2021.0109, 1343.0779, 10.3990, 2038.6593, 1343.9640,10.8130))Вот в принципе и все! Автор Cloud
  21. Проверка игрока в зоне. Чтобы проверить игрока в зоне, нам нужно написать в любом месте скрипта такую функцию: public IsPlayerInArea(playerID, Float:data[4]) { new Float:X, Float:Y, Float:Z; GetPlayerPos(playerID, X, Y, Z); if(X >= data[0] && X <= data[2] && Y >= data[1] && Y <= data[3]) { return 1; } return 1; }Также в начале скрипта ее нужно объявить. Так делается с любой новой автовызываемойфункцией. У каждой новой автовызываемой функции обязательно должен быть свой forward. forward IsPlayerInArea(playerID, Float:data[4]);Теперь мы можем ставить такие условия: if(IsPlayerInArea(playerid,-36.5483,-57.9948,-17.2655,-49.2967)) { }Эту проверку можно поместить, например, внутри команды. Теперь о том, как правильнополучить все 4 координаты, указанные в скобках функции. Синтаксис условия такой: if(IsPlayerInArea(playerid,Xmin,Ymin,Xmax,Ymax))Итак, встаем в левый нижний угол создаваемой вами зоны, получаем координаты командойsave. Далее встаем в правый верхний угол и снова получаем координаты. Допустим, мы уже получили вот такие координаты: AddPlayerClass(0,2021.0109,1343.0779,10.8130,256.6816,0,0,0,0,0,0); AddPlayerClass(0,2038.6593,1343.9640,10.3990,180.1545,0,0,0,0,0,0);Нужные нам координаты, я выделил цветом, т.е. это все координаты X и Y. Берем из этихкоординат минимальную X-координату - 2021.0109. Ставим ее первой в скобках, затем через запятую минимальную Y-координату - 1343.0779. Дальше то же самое, но уже максимальные координаты. Должно получиться так: if(IsPlayerInArea(playerid, 2021.0109, 1343.0779, 2038.6593, 1343.9640))Вот в принципе и все! Автор Cloud
  22. Итак, по сути, этот урок повторение и закрепление 11 урока. Сейчас я покажу, как выдавать в чат всем игрокам сообщение о входе или выходе игрока на сервере. Для начала создадим две константы. #define COLOR_GREEN 0x33AA33AA //ЗЕЛЕНЫЙ #define COLOR_RED 0xAA3333AA //КРАСНЫЙСоздаем их, чтобы не писать HEX-код цвета, которым будет выделено сообщение мы будемписать имя константы вместо кода. Теперь пишем скрипт сообщения, когда игрок подключился к серверу, скрипт приведен ниже: public OnPlayerConnect(playerid) { new plname[MAX_PLAYER_NAME]; new string[40]; GetPlayerName(playerid,plname,24); format(string,sizeof(string),"*** %s присоединился . (ID:%d)",plname,playerid); SendClientMessageToAll(COLOR_GREEN,string); return 1; }Для вас сделать сообщение о входе игрока на сервер, думаю, не составит труда, потому чтотут все понятно. Переходим к другой части скрипта – «Сообщение о выходе игрока из сервера» (по причинам). Рассмотрим автовызываемую функцию OnPlayerDisconnect. public OnPlayerDisconnect(playerid, reason) { return 1; }Reason – это причина отключения от сервера. Данный параметр может принимать 3значения: 0 – принудительно отключился по причине ошибки клиента или иной другой ошибки. 1 – покинул игру самостоятельно, 2 – был кикнут администратором. Для того чтобы правильно выдать сообщение, тут нам нужен оператор switch, а проверять значение мы будем у параметра reason. Если вы хорошо поняли 9 урок, думаю, вам тут все будет понятно. В зависимости от значения параметра reason, в чат будет выдаваться всем игрокам определенное сообщение с указанием причины отключения игрока. Скрипт будет выглядеть следующим образом: public OnPlayerDisconnect(playerid, reason) { new string[64], plname[25]; switch(reason) { case 0: { GetPlayerName(playerid,plname,24); format(string,sizeof(string), "*** %s вылетел с сервера.(ID:%d)",plname,playerid); SendClientMessageToAll(COLOR_RED,string); } case 1: { GetPlayerName(playerid,plname,24); format(string,sizeof(string), "*** %s решил уйти . (ID:%d)",plname,playerid); SendClientMessageToAll(COLOR_RED,string); } case 2: { GetPlayerName(playerid,plname,24); format(string,sizeof(string), " %s кикнут (ID:%d) ",plname,playerid); SendClientMessageToAll(COLOR_RED,string); } } return 1; }Итак, я думаю тут у вас не возникнет сложностей, то переходим к следующему уроку. Автор Cloud
  23. Что если нужно узнать, если определенное число в массиве или нет. Но функции поиска по массиву в Pawn нет. Что делать? Поможет только перебор значений. Для этого нам нужен сам массив и цикл for. Вы уже знакомы с массивами и циклами из прошлых уроков. Сейчас я на простом примере покажу, как сделать перебор значений в массиве. И при появлении совпадения, должен выполниться скрипт. Допустим у нас есть большой одномерный массив со всеми ID машин, т.е только легкового транспорта. Но сначала нам нужна новая автовызываемая функция, допустим, она будет называться IsPlayerInAuto. В скобках пишем два параметра – playerid и vehicleid. Функция будет выглядеть следующим образом: public IsPlayerInAuto(playerid,vehicleid) { return 0; }Внутрь этой функции добавляем одномерный массив. public IsPlayerInAuto(playerid,vehicleid) { new IsCarA[141] = { 445,602,416,485,568,429,433,499,424,536,496,504,422,609,498,401,575,518,402, 541,482,431,438,457,527,483,524,415,542,589,437,532,480,596,599,597,598,578, 486,507,562,585,427,419,587,490,528,533,544,407,565,455,530,526,466,604,492, 474,588,434,502,503,494,579,545,411,546,559,508,571,400,517,410,551,500,418, 572,423,414,516,582,467,443,470,404,603,600,413,426,436,547,489,441,594,564, 479,534,432,505,442,440,475,543,605,495,567,428,405,535,458,580,439,561,409, 560,550,506,601,574,566,549,420,459,576,525,531,408,583,451,558,552,540,491, 412,478,421,529,555,456,554,477}; return 0; }У нас есть параметр vehicleid надо присвоить ему id машины в которой сидит игрок. Подмассивом добавляем такую строку: vehicleid = GetPlayerVehicleID(playerid);После этой строки пишем проверку на нахождение игрока в любом транспорте. Функцияпроверки называется IsPlayerInVehicle – проверяет игрока, находится ли он в любом транспорте. Внутри этой условной конструкции пишем цикл for. if(IsPlayerInVehicle(playerid,vehicleid)) { for(new i = 0; i < 141; i++) { if(GetVehicleModel(vehicleid) == IsCarA[i]) { return true; } } }141 – это количество ячеек в массиве. Ставим такое условие если ID машины в которойсидит игрок, равен значению в ячейке массива. Цикл перебирает каждую ячейку и как только находится совпадение условие выполняется. Принцип работы этого цикла следующий: 1. Допустим, игрок сидит в машине Infernus. GetVehicleModel – становится равным 411. Цикл проверяет ячейку ссылка, на которую IsCarA[0], потому что i по умолчанию равно 0. А IsCarA[0] = 445. 2. 445 не равно 411, условие не выполняется и цикл повторяется. 3. Цикл проверяет следующую ячейку ссылка на которую IsCarA[1], а она = 602. 4. 602 не равно 411, условие не выполняется и цикл повторяется. 5. Так продолжается по кругу пока i не станет равным 65. А IsCarA[65] = 411. 6. Условие выполняется, так как 411 = 411. Код функции проверки будет выглядеть в целом так: public IsPlayerInAuto(playerid,vehicleid) { new IsCarA[141] = { 445,602,416,485,568,429,433,499,424,536,496,504,422,609,498,401,575,518,402, 541,482,431,438,457,527,483,524,415,542,589,437,532,480,596,599,597,598,578, 486,507,562,585,427,419,587,490,528,533,544,407,565,455,530,526,466,604,492, 474,588,434,502,503,494,579,545,411,546,559,508,571,400,517,410,551,500,418, 572,423,414,516,582,467,443,470,404,603,600,413,426,436,547,489,441,594,564, 479,534,432,505,442,440,475,543,605,495,567,428,405,535,458,580,439,561,409, 560,550,506,601,574,566,549,420,459,576,525,531,408,583,451,558,552,540,491, 412,478,421,529,555,456,554,477}; return 0; } vehicleid = GetPlayerVehicleID(playerid); if(IsPlayerInVehicle(playerid,vehicleid)) { for(new i = 0; i < 141; i++) { if(GetVehicleModel(vehicleid) == IsCarA[i]) { return true; } } } return 0; }Но он не будет работать если его не вызвать в нужный момент. Также не забудьте, указатьдля него forward в начале скрипта, т.е объявить данную функцию как новую. forward IsPlayerInAuto(playerid,vehicleid);Проверку можно вызвать, например, с помощью команды. Для начала создаем переменнуюgetthecar, которая будет хранить ID машины, в которую сел игрок. Затем пишем такое условие: new getthecar; if(IsPlayerInAuto(playerid,getthecar)){ }Т.е. игрок садится в машину. Переменная Getthecar – принимает значение ID машины, вкоторую сел игрок и это значение отправляет в функцию IsPlayerInAuto. А функция начинает перебор значений до тех пор пока не найдет совпадения. Перебор происходит моментально. После перебора значений, результат возвращается и если есть совпадение, то условие выполняется. Автор Cloud
  24. Урок №11 – Форматирование строки с помощью format и printf В этом уроке я покажу как передавать значение переменных в строку, т.е вы научитесь форматировать строку с помощью format и printf. Рассмотрим их работу на примере приведенном ниже: public OnPlayerConnect(playerid) { new plname[MAX_PLAYER_NAME]; new string[40]; GetPlayerName(playerid,plname,24); format(string, sizeof(string),”%s – Добро пожаловать на наш сервер!”,plname); SendClientMessage(playerid,0xFFFF00AA,string); return 1; }Для передачи значений переменных в текст сообщения используется оператор format.Скрипт писать нужно в автовызываемой функции OnPlayerConnect, т.к. она вызывается, как только игрок подключается к серверу. Для начала мы создаем две переменных, одна будет хранить имя игрока(plname), а другая текст сообщения(string). Дальше функцией GetPlayerName получаем имя игрока, и записывает имя в переменную plname. Теперь пишем функцию format. В скобках пишем имя переменной, в которой будет храниться текст отформатированного сообщения. Дальше через запятую пишем sizeof(string) и текст сообщения. Последним ставим имя переменной, из которой будет взято значение. %s – это строка, в которую передается значение из строковой переменной plname в данном примере. Нельзя указывать переменную другого типа для строки. При форматировании сообщения придется пользоваться не только строкой, но и другими типами. %b Бинарный тип %c Символьный тип %d, %i Целочисленный тип %f Число с плавающей точкой %s Строка Теперь функцией SendClientMessage, выводим текст в чат, только вместо текста сообщения пишем имя переменной, в которой хранится текст сообщения, т.е. string. Усовершенствуем наш пример. Допустим кроме имени игрока, нам нужно показать его ID. В целом наш пример остается тем же, за исключением оператора format. format(string, sizeof(string),”%s – Добро пожаловать на наш сервер! (ID: %d)”,plname,playerid);В выше указанном примере показано, мы передаем значение переменной plname в %s, азначение playerid в %d. Если мы поменяем местами имена переменных, это будет неправильно, так как мы не можем передать строке %s числовое значение в переменной playerid, а целочисленному типу %d мы не можем передать строку, это разные типы. Вот еще один вариант форматирования, тут переставлены местами и типы и переменные. format(string, sizeof(string),” (ID: %d) Добро пожаловать на наш сервер! - %s”,playerid,plname);В принципе тут все более менее понятно. Ну а теперь о printf. С printf все немного проще, тутестественно ненужно никакой переменной string. Если в вышеуказанном примере использовать printf вместо format, Скрипт будет выглядеть следующим образом: 1 printf(”(ID: %d) Добро пожаловать на наш сервер! - %s”,playerid,plname); Но это всего лишь бессмысленный пример, но зато он показывает, как используется printf. В завершении этого урока, я просто покажу вам правильный пример использования printf. public OnPlayerConnect(playerid) { new plname[MAX_PLAYER_NAME]; GetPlayerName(playerid,plname,24); printf(”(ID: %d) Добро пожаловать на наш сервер! - %s”,playerid,plname); return 0; }Я думаю тут все более менее понятно, если вы разобрались, то можете переходить кследующему уроку. Автор Cloud
  25. Devin Coleman

    Урок №10 – Оператор Switch

    Оператор проверяет значение переменной в условии и в зависимости от ее значения выполняет соответствующий код. В приведенном ниже примере идет проверка для трех значений 0,1 и 2. switch(point) { case 0: { SendClientMessage(playerid,0xFFFF00AA,”Переменная point = 0”); } case 1: { SendClientMessage(playerid,0xFFFF00AA,”Переменная point = 1”); } case 2: { SendClientMessage(playerid,0xFFFF00AA,”Переменная point = 2”); } }Если point будет равен 0, значит в чат выведется сообщение с текстом «Переменная point =0» и так далее. Тут все очень просто! Автор Cloud
×

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.