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

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

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

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

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

Тип контента


Форумы

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

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

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


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

  • Начало

    Конец


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

  • Начало

    Конец


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

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

  1. Что если нужно узнать, если определенное число в массиве или нет. Но функции поиска по массиву в 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
  2. Урок №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
  3. 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
  4. Данные операторы используются в циклах: for, while, do-while. Оператор break завершает работу цикла, а оператор continue, пропускает оставшееся действие цикла и повторяется снова. Рассмотрим два оператора в действии. У нас есть цикл for из прошлого урока: new point; while(point<=5) { point++; SendClientMessage(playerid,0x33AA33AA,"Привет"); }Начнем с оператора break, он завершает работу цикла. Давайте внутри цикла поставимтакое условие: если point = 3, цикл завершает работу. new point; while(point<=5) { if(point==3) { break; } point++; SendClientMessage(playerid,0x33AA33AA,"Привет");} В этом примере в чат выведется сообщение с текстом «Привет» вместо 6 раз, всего 3, потому что цикл повторится только 3 раза. Теперь об операторе continue. Для начала в том же примере мы переместим инкрементированную переменную point внутрь условной конструкции, перед самим оператором continue. new point; while(point<=5) { point++; if(point==3) { continue; } SendClientMessage(playerid,0x33AA33AA,"Привет"); }В данном примере сообщение с текстом «Привет» выведется в чат игроку не 6 а 5 раз. Всепотому что, когда переменная point становится равной 3, переменная инкрементируется и становится равной 4, но текст с сообщением не выводится, потому что оператор continue пропускает оставшееся действие цикла и повторяет его снова, т.е. все что под оператором уже не выполняется. Автор Cloud
  5. Devin Coleman

    Урок №8 – Цикл For

    new point; while(point<=5) { point++; SendClientMessage(playerid,0x33AA33AA,"Привет"); }Сейчас я покажу как превратить цикл while в цикл for.Итак, конструкция цикла For следующая: for(переменная; условие; операция с переменной-счетчиком) { }Итак, для того чтобы цикл while превратить в цикл for, нужно:1. Переменную point с которой будет проводится операция вписать первой в скобки. 2. Далее через точку с запятой написать условие из цикла while. 3. Последним пишем инкрементированную переменную. 4. А функцию SendClientMessage оставляем на месте в теле цикла. Вот результат: for(new point; point<=5; point++) { SendClientMessage(playerid,0x33AA33AA,"Привет"); }Автор Cloud
  6. Devin Coleman

    Урок №7 – Цикл while и do-while

    Цикл While– повторяет свою функцию бесконечно до тех пор пока его условие выполняется. Если его условие не будет выполняться, цикл прекращает работу. Цикл выглядит следующим образом: new point; while(point<=5) { point++; SendClientMessage(playerid,0x33AA33AA,"Привет"); }В данном примере, цикл будет выполняться до тех пор пока значение переменной pointменьше или равно 5. Принцип работы вышеуказанного цикла: 1. Проверяем условие: 0 < 5, условие выполняется, а за ним цикл. 2. Инкрементируем переменную point (добавляем к ее значению единицу). 3. Выводим в чат сообщение с текстом «Привет». 4. Повторяем цикл. 5. Проверяем условие: 1 < 5, условие выполняется, а за ним цикл, и так далее по кругу. В данном примере, сообщение с текстом «Привет» выведется в чат игроку 6 раз. Цикл do while выполняет свои функции с точностью да наооборот. Вот пример того же цикла: new point; do { point++; SendClientMessage(playerid,0x33AA33AA,"Привет"); } while(point<=5)Данный цикл выполняет свою функцию и только потом проверяет условие. Если условиевыполняется, цикл повторяется. Принцип работы вышеуказанного цикла: 1. Инкрементируем переменную point (добавляем к ее значению единицу). 2. Выводим в чат сообщение с текстом «Привет». 3. Проверяем условие: 1 < 5, условие выполняется. 4. Повторяем цикл и так по кругу. В данном примере, сообщение с текстом «Привет» выведется в чат игроку 5 раз. Вот в принципе все о данном цикле, все не так уж и сложно. Автор Cloud
  7. Условные конструкции позволяют Вам посмотреть, удовлетворяют ли данные условиям, а затем в зависимости от результата выполнить код. Для того, чтобы работать с условными конструкциями, сначала нужно выучить операторы сравнения, с помощью которых ставится условие для определенной конструкции. В приведенной ниже таблице приведены все условные операторы и их применение. If – это условный оператор, в скобках перед оператором пишется условие. После скобок точка с запятой не ставится. В фигурных скобках пишется код, если условие выполнится, если условие не выполнится, код также не выполнится. Else – это также условный оператор, но он выполняет свои функции только в том случае если условие в if не выполнилось. Тоесть, оператор if можно назвать как оператор «если», а еlse как оператор «иначе». Давайте поставим простейшее условие: Например, у нас есть две переменные с разными значениями. new samp = 12; new pawn = 8;Теперь поставим такое условие: Если переменная samp равна переменной pawn, то даемигроку денег, если не равна, то отнимаем у игрока деньги. if (samp == pawn) //если samp равно pawno { GivePlayerMoney(playerid,1000); //даем игроку 1000$ }else{ GivePlayerMoney(playerid,-1000); //отбираем у игрока 1000$ }Условия могут быть как одноуровневыми, так и многоуровневыми. Одноуровневое условие,это обычное условие (которое приведено выше), а многоуровневое, это то условие (которое приведено ниже), внутри которого есть еще одно или несколько вложенных условий. При построении многоуровневых условий, пишите код лесенкой, чтобы потом не запутаться в большом количестве условий, пишется это так: if(IsPlayerConnected(playerid)) //если игрок подключен к серверу { if (samp == pawn) //если samp равно pawno { GivePlayerMoney(playerid,1000); //даем игроку 1000$ }else{ GivePlayerMoney(playerid,-1000); //отбираем у игрока 1000$ } }else{ //если игрок не подключен к серверу //выполнить другой код } Автор Cloud
  8. Devin Coleman

    Урок №5 – Массивы

    Массив – это виртуальная таблица, т.е большое место для хранения большого количества данных. Массивы бывают одномерный, двумертными и трехмерными. Запомните, что в массиве вы не можете использовать последнюю строку или столбец. Одномерный массив – это один столбец, разбитый на указанное в квадратных скобках количество ячеек. Одномерный массив объявляется следующим образом: new pawn[5] = {347,782,632,437,721}; //одномерный массив целочисленного типаПоскольку массив эта виртуальная таблица, сейчас я научу вас обращаться к определеннойячейке данной таблицы и получать из нее данные или наоборот записывать в нее данные. Массив, как и любая переменная тоже может быть: целочисленным, вещественным, логическим и строковым. Последние два мне встречать не доводилось. new Float:pawn[5] = {347.24,782.35,632.67,437.32,721.73}; //одномерный массив вещественного типаИтак, чтобы обратиться к ячейке со значением 782, вы пишете ссылку на нее. Ссылка будетвыглядеть следующим образом: //в квадратных скобках пишем номер ячейки к которой обращаемся pawn[1]Не забываем, что отсчет ячеек начинается с 0, поэтому в квадратных скобках стоит единица.Теперь мы можем делать все что угодно с данным значением, например прибавим к ему любую цифру или прибавим значение из любой другой ячейки: pawn[1] += 2.4; //значение в ячейке pawn1 станет 784.9 pawn[1] += pawn[0]; //значение в ячейке pawn1 станет 1129.59Двумерный массив – это виртуальная таблица, состоящая из множества строк и столбцов.Первая цифра указывает количество строк, вторая цифра количество столбцов. Столбец и строка 0 тоже учитывается. Объявляется двумерный массив следующим образом: new pawn[3] = { //двумерный массив целочисленного типа {347,782,632}, {437,721,572}, {168,472,828} }Чтобы обратиться к определенной ячейке, например к ячейке со значением 828, нам нужнонаписать такую ссылку: //в квадратных скобках пишем номер ячейки к которой обращаемся pawn[2][2]Тоесть в скобках мы указываем 2 строка, 2 столбец где находится эта ячейка. Если мы хотимобратиться к ячейке с цифрой 437, мы указывает в скобках 1 строка, 0 столбец. А дальше мы можем делать со значением ячейки все что угодно. С Трехмерными массивами я не разу не встречался, но думаю в новом издании учебника я смогу объяснить вам как с ним работать, хотя вам я думаю врятли он будет нужен. Кроме обычных массивов есть массив enum. Эта хранилище переменных, т.е. данный массив хранит не какие-либо значения, а сами переменные. По другому его можно назвать массив переменных. Массив объявляется таким образом: enum pawn { pMoney, pAdmin }Чтобы обратится к переменной, нужно создать еще одну переменную, которая поможет намс этой задачей: new samp[MAX_PLAYERS][pawn];С MAX_PLAYERS в названии переменной мы уже знакомы, а во вторых скобках указываетсяназвание массива. Итак, чтобы обратиться к переменной из массива, мы пишем такую строчку: samp[playerid][pMoney];Теперь вы можете изменять значение переменной в массиве, как вам вздумается, напримерприбавим к значению переменой pMoney 100. samp[playerid][pMoney] += 100; Автор Cloud
  9. Devin Coleman

    Урок №4 Математика в Pawn

    Переменные целочисленного и вещественного типа, могут принимать различные числовые значения. Со значениями переменных можно проводить различные математические операции. Для этого есть операторы: сложения, вычитания, деления и умножения, которые приведены ниже: В привиденных выше примерах, указаны имена 3 переменных. При сложениизначений переменных, переменная pawn – это первое слагаемое, переменная samp – это второе слагаемое. Переменная result – это сумма слагаемых. Допустим у нас уже есть эти переменные, для переменных pawn и samp мы уже присвоили значения, а в переменной result будет сумма слагаемых. new pawn = 25; new samp = 5; new result;Вот примеры математических операций по приведенной выше таблице, тут все просто: result = pawn += samp; //переменная result = 30 result = pawn -= samp; //переменная result = 20 result = pawn *= samp; //переменная result = 110 result = pawn /= samp; //переменная result = 5Прошу обратить внимание. Если вы пытаетесь сложить, вычесть, делить или умножитьцелое число и десятичное число, переменная с результатом должна быть вещественного типа. new Float:pawn = 25.9; new samp = 5; new Float:result;Также прошу обратить внимание, на то что, переменная с результам должна быть всегдавпереди, т.е. мы не можем сначала сложить, а потом только поставить знак равно и переменную result. pawn += samp = result; //это неправильно, result должен быть впередиТут все очень просто, поэтому переходим к следующему уроку. Автор Cloud
  10. Инкремент прибивляет к значению переменной единицу. Декремент отнимает единицу от значения переменной. Допустим у нас есть одна переменная c значением по умолчанию = 25. new pawn = 25;Чтобы отнять от значения переменной единицу, мы пишем следующее: pawn--; //pawn равен 24Чтобы прибавить единицу к значению переменной, мы пишем следующее: pawn++; //pawn равен 26Когда мы прибавляем к значению переменной единицу при помощи инкремента, такимобразом мы инкрементируем переменную. Когда мы отнимает от значения переменной единицу при помощи декремента, таким образом мы декрементируем переменную. Запомните это! К переменной можно прибавить и отнять единицу не только с помощью инкремента и декремента. Но об этом в следующем уроке. Автор Cloud
  11. Devin Coleman

    Урок №2 Константы

    Урок №2 - Константы Константы – это неизменяемые переменные. Константа объявляется следующим образом: #define PAWN 25Таким образом, мы создали простую константу. Константы очень удобно использовать длязамены сложных параметров, таких как color, в котором указывается HEX-код цвета в виде «0xAFAFAFAA», гораздо удобнее написать COLOR_GREY, вместо этого сложного кода. #define COLOR_GREY 0xAFAFAFAA //серый #define COLOR_GREEN 0x33AA33AA //зеленый #define COLOR_RED 0xAA3333AA //красный #define COLOR_YELLOW 0xFFFF00AA //желтый #define COLOR_WHITE 0xFFFFFFAA //белый #define COLOR_BLUE 0x0000BBAA //синий #define COLOR_ORANGE 0xFF9900AA //оранжевыйВ стандартном инклуде a_samp уже есть много стандартных констант, которые можноиспользовать в скрипте. Ниже приведены константы лимитов сервера. Данные константы обычно используются в циклах for. #define MAX_PLAYER_NAME 24 //лимит символов игрока #define MAX_PLAYERS 500 //лимит игроков на сервере #define MAX_VEHICLES 2000 //лимит транспорта на сервере #define MAX_OBJECTS 400 //лимит объектов на сервере #define MAX_MENUS 128 //лимит меню на сервере #define MAX_3DTEXT_GLOBAL 1024 //лимит глобальных 3D текстов на сервере #define MAX_3DTEXT_PLAYER 1024 //лимит 3D текстов для игрока на сервере #define MAX_PICKUPS 2048 //лимит пикаповНиже я привел пример использования одной из констант. Этот скрипт будет простовыполняться для всех игроков. Пример использования: for(new i=0; i<MAX_PLAYERS; i++) { //выполнить код }А следующие ниже приведенные константы используются в функции OnPlayerState. Этоконстанты состояний игрока. Они используются в условиях, если параметр newstate равен одному из эти значений (0-9). #define PLAYER_STATE_NONE 0 // #define PLAYER_STATE_ONFOOT 1 //игрок ест #define PLAYER_STATE_DRIVER 2 //игрок управляет машиной #define PLAYER_STATE_PASSENGER 3 //игрок сидит в машине как пассажир #define PLAYER_STATE_EXIT_VEHICLE 4 //игрок выходит из машины #define PLAYER_STATE_ENTER_VEHICLE_DRIVER 5 //игрок входит в машину как водитель #define PLAYER_STATE_ENTER_VEHICLE_PASSENGER 6 //игрок входит в машину как пассажир #define PLAYER_STATE_WASTED 7 //игрок в розыске #define PLAYER_STATE_SPAWNED 8 //игрок появился в точке возрождения #define PLAYER_STATE_SPECTATING 9 //игрок спектаторНиже я привел простой пример использования одной из констант. Этот скрипт должен бытьвнутри функции OnPlayerState. Я поставил условие, если игрок не управляет машиной, выполнить код. Пример использования: if(newstate != PLAYER_STATE_DRIVER) //если игрок не управляет машиной { //выполнить код }Чтобы не запоминать id каждого оружия в инклуде есть константы оружия. Вместо цифр выможете использовать имена оружия, которые показаны в константах. Если вы хотите дать игроку какое-либо оружие, функцией GivePlayerWeapon мы пишем обычно такую строчку: GivePlayerWeapon(playerid,22,100);Если вы не помните id оружия, вы можете написать так: GivePlayerWeapon(playerid,WEAPON_COLT45,100);Ниже приведены константы всего оружия: #define WEAPON_BRASSKNUCKLE 1 #define WEAPON_GOLFCLUB 2 #define WEAPON_NITESTICK 3 #define WEAPON_KNIFE 4 #define WEAPON_BAT 5 #define WEAPON_SHOVEL 6 #define WEAPON_POOLSTICK 7 #define WEAPON_KATANA 8 #define WEAPON_CHAINSAW 9 #define WEAPON_DILDO 10 #define WEAPON_DILDO2 11 #define WEAPON_VIBRATOR 12 #define WEAPON_VIBRATOR2 13 #define WEAPON_FLOWER 14 #define WEAPON_CANE 15 #define WEAPON_GRENADE 16 #define WEAPON_TEARGAS 17 #define WEAPON_MOLTOV 18 #define WEAPON_COLT45 22 #define WEAPON_SILENCED 23 #define WEAPON_DEAGLE 24 #define WEAPON_SHOTGUN 25 #define WEAPON_SAWEDOFF 26 #define WEAPON_SHOTGSPA 27 #define WEAPON_UZI 28 #define WEAPON_MP5 29 #define WEAPON_AK47 30 #define WEAPON_M4 31 #define WEAPON_TEC9 32 #define WEAPON_RIFLE 33 #define WEAPON_SNIPER 34 #define WEAPON_ROCKETLAUNCHER 35 #define WEAPON_HEATSEEKER 36 #define WEAPON_FLAMETHROWER 37 #define WEAPON_MINIGUN 38 #define WEAPON_SATCHEL 39 #define WEAPON_BOMB 40 #define WEAPON_SPRAYCAN 41 #define WEAPON_FIREEXTINGUISHER 42 #define WEAPON_CAMERA 43 #define WEAPON_PARACHUTE 46 #define WEAPON_VEHICLE 49 #define WEAPON_DROWN 53 #define WEAPON_COLLISION 54Константы очень удобно использоваться, чтобы вынести в начало скрипта, все частоиспользуемые значения переменных или параметров функций. Например, во многих скриптах часто используется такая константа. #define MAX_POINTS 25 new massive[MAX_POINTS][3] = {Она обычна, используется для массивов и указывает количество строк в массиве, какпоказано на примере выше. Также можно встретить в некоторых скриптах такие константы: #define ACCOUNT “%s.ini”Они предназначены для систем регистрации, т.е. показывают путь до файла, в которыйпроизводится запись. Так что у констант широкое применение. Теперь переходим к следующему уроку. Автор Cloud
  12. Devin Coleman

    Урок №1 - переменные

    Урок №1 - Переменные Переменные – это места где вы можете хранить данные. Имена переменных чувствительны к регистру, поэтому переменные Pawn и PAWN, разные переменные. Переменные могут быть разных типов. Целочисленный тип переменной может хранить в себе только целые числа. Вы не можете использовать десятичные числа с нулем на конце (1.0, 2.0 и т.д.) так как это все равно считается технически не целым числом. Чтобы объявить (создать) целочисленную переменную, нужно написать: new pawn;Таким образом мы создали целочисленную переменную с именем Pawn. При созданииновой переменной ей можно присвоить значение по умолчанию. Чтобы присвоить значение переменной pawn, нужно написать следующее: new pawn = 25;Переменная вещественного типа может хранить в себе только десятичные числа.Объявляется она следующим образом: new Float:pawn = 25.3;Таким образом мы создали вещественную переменную и присвоили ей значение.Переменная логического типа может принимать только два значения: истина (true) – эквивалентна 1 и ложь (false) – эквивалентна 0. По умолчанию данный тип переменной принимает значение false. Объявляется переменная следующим образом: new bool:pawn = true;Таким образом мы создали логическую переменную и присвоили ее значение true.Также переменные могут быть глобальными и локальными. Глобальные переменные объявляются в начале скрипта и они доступны всему скрипту, т. е. обратиться к переменной можно из любой автовызываемой функции. Локальные переменные объявляются в теле автовызываемой функции и они доступны только в внутри этой функции, из другой функции скрипта, ее вызвать нельзя. new pawn; // это глобальная переменная public OnGameModeInit() { new samp; // это локальная переменная return 1; }Строка – это место для хранения букв или символов. Строки должны быть помещены вмассив, так как каждая ячейка может содержать букву. Чтобы объявить строковую переменную, нужно написать следущее: new pawn[5] = “samp”;Таким образом мы создали строковую переменную и присвоили ей значение «samp». Числов квадратных скобках означает количество ячеек выделенное для строки. Почему 5 ячеек, когда слово состоит из 4 букв, потому что вы должны указать экстра-ячейку для идентификатора строки – 0. Тоесть цифра в квадратных скобках всегда больше значения переменной на единицу. Переменные могут быть предназначены как для всех игроков, так и для конкретного игрока. Если мы хотим сделать переменную индивидуальной для каждого игрока, то мы пишем так, пишу для всех типов переменных: new pawn[MAX_PLAYERS] = 25; //переменная целочисленного типа для каждого игрока new Float:pawn[MAX_PLAYERS] = 25.4; //переменная вещественного типа для каждого игрока new bool:pawn[MAX_PLAYERS] = true; //переменная логического типа для каждого игрокаMAX_PLAYERS означает, что переменная будет использоваться для всех игроков, т.е. длякаждого игрока у переменной свое значение. Если точнее, то у разных игроков разные значения этой переменной. new pawn[MAX_VEHICLES] = 25; //переменная целочисленного типа для каждого транспорта new Float:pawn[MAX_VEHICLES] = 25.4; //переменная вещественного типа для каждого транспорта new bool:pawn[MAX_VEHICLES] = true; //переменная логического типа для каждого транспортаMAX_VEHICLES означает, что переменная будет использоваться для всего транспорта, т.е.для каждого транспорта у переменной свое значение. Чтобы обратиться к такой переменной нужно написать следующее, пишу пример для обоих вариантов: pawn[playerid] = 5; // устанавливаем значение переменной для игрока на 5 pawn[vehicleid] = 5; // устанавливаем значение переменной для транспорта на 5Автор Cloud
  13. ByMeR_OK

    RussianNicks v0.2

    Плагин позволяет использовать русские никнеймы. Поддерживаемые версии: SA:MP Server 0.3c SA:MP Server 0.3c R2 RussianNicks.zip
  14. ByMeR_OK

    Античит на оружие

    Сейчас я расскажу как создать эффективный анти-чит на оружие. Начнем. Для начало добавим массивчики. new Weapons[MAX_PLAYERS][47];Теперь в OnPlayerConnect for(new i=0;i<47;i++) Weapons[playerid][i]=0;//обнулениеДальше в OnPlayerStateChange добавляем следующие чтоб анти-чит не сработал при посадке например в самолет. if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER) { new model = GetVehicleModel(GetPlayerVehicleID(playerid)); switch(model) { case 592,577,511,512,520,593,553,476,519,460,513,548,425,417,487,488,497,563,447,469: Weapons[playerid][46]= 1; case 457: Weapons[playerid][2]= 1; case 596,597,598,599: Weapons[playerid][25]= 1; } }Теперь проверка можете поставить ее под таймер ну или как вам удобно. new weap = GetPlayerWeapon(playerid); if(weap != 0 && !Weapons[playerid][weap] && weap != 40) { //Действие например кик Kick(playerid); }Теперь макрос выдачи оружия. stock GiveWeapon(player,weapid,ammo); { Weapons[player][weapid]= 1; GivePlayerWeapon(player,weapid,ammo); return ; }Теперь нужно заменить все GivePlayerWeapon на GiveWeapon можете делать вручную а можете поставить макрос. #define GivePlayerWeapon GiveWeaponВсе урок окончен.
  15. ByMeR_OK

    Анти побег из тюрьмы

    Всем привет! Вот простая как бы проверка , для того чтобы игрок не сбежал из тюрьмы Что она делает: Если игрок сидит в КПЗ , и будет читерить , то есть сбежит из клетки то через некоторое время его вернет в клетку. Чтобы поставить ее ко всем forward добавьте : forward UpdateJailZone();Затем в public OnGameModeInit добавьте таймер: SetTimer("UpdateJailZone",5000,1);//Он сработает через 5 секундИ затем куда-нибудь в конец мода добавьте следующий паблик: public UpdateJailZone() { for(new i; i < GetMaxPlayers(); i++) { if(IsPlayerConnected(i)) { if(PlayerInfo[i][pJailed] == 1)//Вот тут идет проверка на то если игрок сидит в КПЗ { if(!IsPlayerInRangeOfPoint(6.0, i, 264.6288,77.5742,1001.0391))//Тут идет проверка если игрок не находится в заданных координатах { new string[128]; new name[MAX_PLAYER_NAME]; GetPlayerName(i, name, sizeof(name)); SetPlayerInterior(i, 6);//И если его там нет , то его телепортирует в 6 интерьер , то есть клетка кпз SetPlayerPos(i,264.6288,77.5742,1001.0391);//И в телепортирует в эти координаты , измените если у вас другие SendClientMessage(i,COLOR_RED,"* Я че то не понял , у тебя срок , куда пошёл , а ну назад!"); format(string, 256, "*Сервер: %s попытался сбежать из КПЗ , проверьте его!",name);//Ну понятно , сообщение для администраторов ABroadCast(COLOR_YELLOW,string,1); } } } } return 1; }Вот и все! Удачи
  16. ByMeR_OK

    Античит на Fly Hack

    Автор: Hawkins В public OnPlayerUpdate(playerid) Вставляем этот код if(!IsPlayerInAnyVehicle(playerid)) { new animlib[30], animname[30];//переменные GetAnimationName(GetPlayerAnimationIndex(playerid), animlib, sizeof(animlib), animname, sizeof(animname));//проверка на анимацию new Float:posx, Float:posy, Float:posz;//переменные GetPlayerPos(playerid, posx, posy, posz);//проверка на координаты if(posz >= 2)//Если posz равен либо больше 2 метров, то.... { if(strcmp(animlib, "SWIM", true) == 0 && strcmp(animname, "SWIM_crawl", true) == 0)//проверяем на анимацию, если все верно то.... { new plname[MAX_PLAYER_NAME];//переменная new string[256];//string GetPlayerName(playerid, plname, sizeof(plname));//узнаем имя игрока format(string,sizeof(string),"%s был кикнут. Причина: Fly Hack",plname);//имя мы бьем через format SendClientMessageToAll(0xFFFFFFFF, string);//показываем всем игрокам Kick(playerid);//кикаем игрока } } } Внимание: античит не срабатывает, если Fly включить в машине
  17. ByMeR_OK

    Античит на healcar

    Приветствую всех блаблабла... решил написать готовое решение про античит на починку автомобиля где нибудь выше я лично всегда в инклуд их пишу... new VehicleHealth[i] = 1000.0;в public OnGameModeInit() for(new i=1;i<MAX_VEHICLES;i++) VehicleHealth[i] = 1000.0;если у вас не имеется посекундного келбака добавляем туда же ( OnGameModeInit ) SetTimer("Checkhpcar", 1000, true);далее #define PNSCS 9 new Float:PnSC[ PNSCS ][ 3 ] = { {720.2800,-457.2757,16.3359}, {-1421.1030,2584.5122,55.8433}, {-99.8468,1118.1559,19.7417}, {2063.5869,-1831.5231,13.5469}, {-2425.7590,1021.3259,50.3977}, {1974.2336,2162.3240,11.0703}, {487.1933,-1738.4077,11.1189}, {1025.2147,-1024.2096,32.1016}, {-1904.1440,283.5843,41.0469} }; stock IsPlayerAtPnSpray( playerid ) { if( !GetPlayerInterior( playerid ) ) return false; for(new i = 0; i < PNSCS; i++) { if(IsPlayerInRangeOfPoint( playerid , 15.0, PnSC[i][0], PnSC[i][1], PnSC[i][2] )) { return true; } } return false; } forward Checkhpcar(); public Checkhpcar() { new vehhl, vehid, str[MAX_PLAYER_NAME]; for(new i;i<MAX_GetMaxPlayers();i++) { vehid = GetPlayerVehicleID(i); if( !vehid ) { continue; } GetVehicleHealth(vehid, vehhl); if( VehicleHealth[vehid] >= vehhl ) { VehicleHealth[vehid] = vehhl; continue; } if( !IsPlayerAtPnSpray(i) ) { GetPlayerName(i, str,sizeof str); format(str, sizeof(str), "[Античит]%s повысил машине здоровье(Было %f, Стало %f)", str,VehicleHealth[vehid],vehhl); SendClientMessageToAll( COLOR_GREY, str );//ну тут ставим что хотим SetVehicleHealth(vehid, VehicleHealth[vehid] ); //я решил ставить машине столько хп сколько и было } VehicleHealth[vehid] = vehhl; }далее в public OnVehicleSpawn(vehicleid) VehicleHealth[vehicleid] = 1000.0;если в механиком пополняете хп или так далее у вас в моде где то используется VehicleHealth[ТУТ ид авто типо] = 1000.0;функция для определения координат пейнспрейАвтор урока TAP04eGG
  18. ByMeR_OK

    Anti NOP RemovePlayerFromVehicle

    В конец мода. public AntiRemovePlayerFromVehicle(playerid) { new playeridname[MAX_PLAYER_NAME]; new strings[64]; GetPlayerName(playerid,playeridname, sizeof(playeridname)); if (GetPlayerState(playerid) == 2)//В авто { format(strings, sizeof(strings), "%s кикнут. Причина: NOP RemovePlayerFromVehicle (Sobeit)",playeridname); SendClientMessageToAll(COLOR_LIGHTRED, strings); Kick(playerid);// Так как может быть и баг(10% случаев) то просто кикаем, а не баним } }Сразу после каждой функции в вашем моде RemovePlayerFromVehicle SetTimerEx("AntiRemovePlayerFromVehicle" , 2800, false, "i", playerid);//Это таймер на проверку на позицию читера в авто 2800 примерно дается на вылет чела из авто, если он всё еще там, то выполняем действие В функции собейта есть NOP RemovePlayerFromVehicle это дает человеку то что его не выкидывает из авто. Урок сам по себе легкий, и не состовляет труда вставить его в мод, Автор: Misha. Если вы сам читер то. public AntiRemovePlayerFromVehicle(playerid) { new playeridname[MAX_PLAYER_NAME]; new strings[64]; GetPlayerName(playerid,playeridname, sizeof(playeridname)); if (GetPlayerState(playerid) == 2)//IN CAR { if (PlayerInfo[playerid][pAdmin] >= 1) { SendClientMessageToAll(COLOR_YELLOW,"На этом сервере админы читеры"); } else { format(strings, sizeof(strings), "%s кикнут. Причина: NOP RemovePlayerFromVehicle (Sobeit)",playeridname); SendClientMessageToAll(COLOR_LIGHTRED, strings); Kick(playerid); } } }
  19. ByMeR_OK

    Анти NOP PutPlayerInVehicle

    Это поможет избавится от читеров которые включили NOP NopPutPlayerInVehicle то есть не посадишь их в авто Для начала в любое место мы засунем callback forward AntiNopPutPlayerInVehicle(playerid); public AntiNopPutPlayerInVehicle(playerid) { new name[MAX_PLAYER_NAME],string[128]; GetPlayerName(playerid,name,MAX_PLAYER_NAME); if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT) { format(string,sizeof string,"%s кикнут. Причина: NOP PutPlayerInVehicle",name); SendClientMessageToAll(0xAFAFAFAA, string); Kick(playerid); } }Для удобства вот функция меняете PutPlayerInVehicle на PutPlayerInVehicleEx stock PutPlayerInVehicleEx(playerid,vehicleid,mesto) { PutPlayerInVehicle(playerid,vehicleid,mesto); SetTimerEx("AntiNopPutPlayerInVehicle" , 350, false, "i", playerid); } Автор: TAP04eGG
  20. ByMeR_OK

    Анти NOP SetPlayerPos

    Это решение поможет ещё чуть сильнее усложнить жизнь читерам, а именно палить NOP SetPlayerPos. Куда нибудь в конец мода копируем: forward AntiNOPSetPlayerPos(playerid, Float:x, Float:y, Float:z); public AntiNOPSetPlayerPos(playerid, Float:x, Float:y, Float:z) { new string[128]; if(!IsPlayerInRangeOfPoint(playerid, 3.0, x, y, z)) { format(string, sizeof(string), "%s[%d] кикнут. Причина: NOP SetPlayerPos", PlayerName(playerid), playerid); return SendClientMessageToAll(0xFF0000AA, string); } return 1; }Ну и сама функция (Заменить все SetPlayerPos у себя в моде, на SetPlayerPosAC): stock SetPlayerPosAC(playerid, Float:x, Float:y, Float:z) { SetPlayerPos(playerid, x, y, z); SetTimerEx("AntiNOPSetPlayerPos", 500, false, "ifff", playerid, x, y, z); // Где 500, это время в миллисекундах когда будет производиться проверка на нахождение игрока. // Если у вас кикает всех подряд, увеличивайте это время return 1; }Если у кого нету функции PlayerName: stock PlayerName(playerid) { new Name[MAX_PLAYER_NAME]; GetPlayerName(playerid, Name, sizeof(Name)); return Name; } Автор: eFFect
  21. Здравствуйте сегодня я вам покажу как зделать вот такой TextDraw LvL, Respect Начнем: В начало мода, где все "new" добавляем это: new Text:InfoTextDraw; После чего ищем "public OnPlayerDisconnect" и добавляем это: TextDrawHideForPlayer(playerid, InfoTextDraw);(Добавлять его нужно в самом начале) Далее ищем "public OtherTimer()" и после "if(IsPlayerConnected(i))" добавляем if(gPlayerLogged[i] == 1) { TextDrawHideForPlayer(i, InfoTextDraw); format(string,sizeof(string),"LVL: %d~n~Respect: %d/%d",PlayerInfo[i][pLevel],PlayerInfo[i][pExp],levelexp); InfoTextDraw = TextDrawCreate(502.000000,3.000000,string); TextDrawAlignment(InfoTextDraw,0); TextDrawBackgroundColor(InfoTextDraw,0x000000ff); TextDrawFont(InfoTextDraw,1); TextDrawLetterSize(InfoTextDraw,0.399999,1.000000); TextDrawColor(InfoTextDraw,0xffffffff); TextDrawSetOutline(InfoTextDraw,1); TextDrawSetProportional(InfoTextDraw,1); TextDrawSetShadow(InfoTextDraw,1); TextDrawShowForPlayer(i, InfoTextDraw); } Автор урока: аkion
  22. Lexa

    Заснуть дома

    Ко все new new spit[MAX_PLAYERS]; new Ustalost[MAX_PLAYERS];ко всем forward forward IsAtSleepPlace(playerid);Ко всем командам: if(!strcmp(cmdtext, "/sleep", true)) // { if(IsPlayerConnected(playerid)) { if(gPlayerLogged[playerid] == 0) { SendClientMessage(playerid, COLOR_GREY, " Сначала нужно залогиниться !"); return 1; } for(new i = 0; i < sizeof(HouseInfo); i++) { if(!PlayerToPoint(50, playerid,HouseInfo[i][hExitx], HouseInfo[i][hExity], HouseInfo[i][hExitz]) && HouseInfo[i][hWorld] == GetPlayerVirtualWorld(playerid) && !IsAtSleepPlace(playerid) && !IsPlayerInAnyVehicle(playerid)) { SendClientMessage(playerid,COLOR_GREY,"Здесь нельзя поспать (Можно в домах,некоторых помойках,под некоторыми мостами,в мотелях,переходах,подворотнях)"); return 1; } } if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER) { SendClientMessage(playerid,COLOR_GREY,"За рулём спать собрался чтоли? А ну иди на пассажирское место!"); return 1; } if(spit[playerid] != 1) { SendClientMessage(playerid,COLOR_GREY,"Вы легли поспать,ваш сон будет примерно 3 минуты"); SendActionMessage(playerid,30.0,"лёг спать"); SetPlayerCameraPos(playerid, 2000,-2000,2000); SetPlayerCameraLookAt(playerid, 2000,-2000,2000); SetTimerEx("prosnutsa", 180000, false, "i", playerid); ApplyAnimation(playerid,"CRACK","crckidle2",4.1,0,1,1,1,1); spit[playerid] = 1; Ustalost[playerid] = 0; } else { SendClientMessage(playerid, COLOR_GREY, " Вы уже спите !"); return 1; } } return 1; }Далее,где enum hInfoдобавляем: hWorld,Далее добавим паблик,лучше в самый конец мода public IsAtSleepPlace(playerid) { if(IsPlayerConnected(playerid)) { if(PlayerToPoint(6.0,playerid,861.8582,-1380.4661,15.7779) || PlayerToPoint(6.0,playerid,1075.9895,-1826.3264,14.0319)) { return 1; } else if(PlayerToPoint(6.0,playerid,1191.6880,-1736.3153,13.6672) || PlayerToPoint(6.0,playerid,2111.8286,-1994.2130,13.3239)) { return 1; } else if(PlayerToPoint(6.0,playerid,2139.1306,-2036.4802,8.3623) || PlayerToPoint(8.0,playerid,1938.4232,-1985.6976,13.1402)) { return 1; } else if(PlayerToPoint(5.0,playerid,1937.2020,-1968.5782,13.0773) || PlayerToPoint(8.0,playerid,1884.7308,-1945.0990,13.1423)) { return 1; } else if(PlayerToPoint(6.0,playerid,1864.4152,-1967.8810,13.1388) || PlayerToPoint(10.0,playerid,1689.5800,-1975.1376,8.8253)) { return 1; } else if(PlayerToPoint(8.0,playerid,1764.8883,-1931.1603,13.1615) || PlayerToPoint(6.0,playerid,1721.4628,-1473.6381,13.1436)) { return 1; } else if(PlayerToPoint(8.0,playerid,2113.7390,920.1079,10.5255) || PlayerToPoint(6.0,playerid,-1327.7218,2678.8723,50.0625)) { return 1; } else if(PlayerToPoint(8.0,playerid,656.4265,-559.8610,16.5015) || PlayerToPoint(6.0,playerid,656.3797,-570.4138,16.5015)) { return 1; } else if(PlayerToPoint(8.0,playerid,1605.4766,-1515.3605,13.1733) || PlayerToPoint(6.0,playerid,1315.5934,-864.4917,39.1719) || PlayerToPoint(6,playerid,1521.2664,-1016.6686,23.9486)) { return 1; } else if(PlayerToPoint(8.0,playerid,860.2096,-970.2845,35.5127) || PlayerToPoint(6.0,playerid,-39.5028,-2493.9001,36.2409)) { return 1; } else if(PlayerToPoint(8.0,playerid,-33.4615,-2490.5251,36.2427) || PlayerToPoint(6.0,playerid,-27.3743,-2487.0615,36.2436)) { return 1; } else if(PlayerToPoint(8.0,playerid,-18.1828,-2493.8157,36.2308) || PlayerToPoint(6.0,playerid,-16.8900,-2496.3503,36.2479)) { return 1; } else if(PlayerToPoint(8.0,playerid,-14.7589,-2500.5281,36.2456) || PlayerToPoint(6.0,playerid,-4.5188,-2520.3516,36.2498)) { return 1; } else if(PlayerToPoint(8.0,playerid,-9.7642,-2523.4021,36.2500) || PlayerToPoint(6.0,playerid,-13.3824,-2525.3677,36.2537)) { return 1; } else if(PlayerToPoint(8.0,playerid,-17.9037,-2527.8225,36.2526) || PlayerToPoint(6.0,playerid,24.3956,-2646.8835,40.0578)) { return 1; } else if(PlayerToPoint(8.0,playerid,-267.7636,-1632.8037,4.7641) || PlayerToPoint(6.0,playerid,-607.5358,-1075.1150,23.1155) || PlayerToPoint(20.0,playerid,274.9913,1956.8008,17.6406)) { return 1; } else if(PlayerToPoint(8.0,playerid,-601.1035,-1066.0096,22.9978) || PlayerToPoint(6.0,playerid,-594.9907,-1057.6005,22.9655)) { return 1; } else if(PlayerToPoint(8.0,playerid,-588.9382,-1049.1849,22.9331) || PlayerToPoint(6.0,playerid,-582.3942,-1041.1062,23.1991)) { return 1; } else if(PlayerToPoint(8.0,playerid,-576.9140,-1033.4305,23.3980) || PlayerToPoint(6.0,playerid,-89.4542,1229.1079,19.3180) || PlayerToPoint(6.0,playerid,-47.8544,1309.4165,11.6390)) { return 1; } } return 0; }
  23. if(strcmp(cmd, "/home", true) == 0) { if(IsPlayerConnected(playerid)) { if(PlayerInfo[playerid][pPhousekey] != 255) { SetPlayerCheckpoint(playerid,HouseInfo[PlayerInfo[playerid][pPhousekey]][hEntrancex], HouseInfo[PlayerInfo[playerid][pPhousekey]][hEntrancey], HouseInfo[PlayerInfo[playerid][pPhousekey]][hEntrancez], 4.0); GameTextForPlayer(playerid, "~w~Waypoint set ~r~Home", 5000, 1); gPlayerCheckpointStatus[playerid] = CHECKPOINT_HOME; } else { GameTextForPlayer(playerid, "~w~You are homeless", 5000, 1); } } return 1; }
  24. ByMeR_OK

    Создание Кафе в диалогах

    Сначало добавляим ко всем new: new kafe;Потом добавляем в public OnGameModeInit() вот это: kafe = CreatePickup(1239,1274,1949.8828,-1984.9989,13.5469);// место нахождение пикапа кафе.Потом идём в public OnDialogResponse и добавим туда: if(dialogid == 534)// заместо 1 можно поставить любую другую цифру { if(response) { if(listitem == 0) { SetPlayerHealth(playerid,100); GivePlayerMoney(playerid,-500); PlayerPlaySound(playerid, 1150, 0.0, 0.0, 0.0); } if(listitem == 1) { SetPlayerHealth(playerid,100); GivePlayerMoney(playerid,-600); PlayerPlaySound(playerid, 1150, 0.0, 0.0, 0.0); } if(listitem == 2) { SetPlayerHealth(playerid,100); GivePlayerMoney(playerid,-450); PlayerPlaySound(playerid, 1150, 0.0, 0.0, 0.0); } if(listitem == 3) { SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DRINK_BEER); PlayerPlaySound(playerid, 1150, 0.0, 0.0, 0.0); GivePlayerMoney(playerid,-320); } if(listitem == 4) { SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DRINK_WINE); PlayerPlaySound(playerid, 1150, 0.0, 0.0, 0.0); GivePlayerMoney(playerid,-1000); } if(listitem == 5) { SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DRINK_SPRUNK); PlayerPlaySound(playerid, 1150, 0.0, 0.0, 0.0); GivePlayerMoney(playerid,-200); } if(listitem == 6) { SetPlayerSpecialAction(playerid,SPECIAL_ACTION_SMOKE_CIGGY); PlayerPlaySound(playerid, 1150, 0.0, 0.0, 0.0); GivePlayerMoney(playerid,-750); } } return 1; }Потом идём в public OnPlayerPickUpPickup добавляем туда вот это: if(pickupid == kafe)// можно использовать любую другую цифру. { ShowPlayerDialog(playerid,534, DIALOG_STYLE_LIST, "Кафе", "Пелемени ($500)\nCалатик ($600)\nШашлык ($450)\nПиво ($320)\nВино ($1000)\nСпранк ($200)\nСигареты ($750)", "Купить", "Отмена"); } return 1; }
  25. XuPypg

    Ограничитель скорости

    Всем привет! Вот выкладываю урок по созданию ограничителя скорости И так мы начинаем В начало мода добавляем #define MAX_SPEEDO 0.6 // Максимально допустимая скорость. #define SLOW_FACTOR 0.9 // На сколько будет сбавляться скорость при превышении порога. forward Timer(); new Limiter[MAX_PLAYERS]; new limtimer;В public OnPlayerConnect добавляем Limiter[playerid] = 0;В public OnPlayerCommandText добавляем if (strcmp("/limiter", cmdtext, true) == 0) { for(new i=0;i<MAX_PLAYERS;i++) { if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER) { if(Limiter[playerid] == 0) { SendClientMessage(playerid,0xAA3333AA,"Ограничитель скорости включен."); SendClientMessage(playerid,0xAA3333AA,"Что бы выключить используйте /offlimiter."); limtimer = SetTimer("Timer",1000,1); Limiter[playerid] = 1; } else { SendClientMessage(playerid ,COL OR_G REY, "Огр анич ител ь скорости уже включен."); } return 1; } SendClientMessage(playerid, COLOR_GRAD2, " Вы не в машине!"); return 1; } } if (strcmp("/offlimiter", cmdtext, true) == 0) { if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER) { if(Limiter[playerid] == 1) { KillTimer(limtimer); SendClientMessage(playerid,0xAA3333AA,"Ограничитель скорости выключен."); Limiter[playerid] = 0; return 1; } else { SendClientMessage(playerid,COL OR_G REY, "Огр анич ител ь скорости не включен."); return 1; } } SendClientMessage(playerid, COLOR_GRAD2, "Вы не в машине!"); return 1; }В public OnPlayerStateChange добавляем if(newstate == PLAYER_STATE_ONFOOT) {Ниже добавляем KillTimer(limtimer); Limiter[playerid] = 0;Создаем новый паблик в конец мода public Timer() { new Float:x,Float:y,Float:z,veh; for(new i; i<MAX_PLAYERS; i++) { veh=GetPlayerVehicleID(i); GetVehicleVelocity(veh,x,y,z); if((x > MAX_SPEEDO || x < -MAX_SPEEDO) || (y > MAX_SPEEDO || y < -MAX_SPEEDO)) { SetVehicleVelocity(veh,x*SLOW_FACTOR,y*SLOW_FACTOR,z); } } } На этом наш урок законченВсем спасибо за внимание Автор урока: KaspeR Ставим плюсиГ
×

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

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