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

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

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

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

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

Тип контента


Форумы

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

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

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


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

  • Начало

    Конец


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

  • Начало

    Конец


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

Найдено: 2,041 результат

  1. Чтобы проверить игрока в радиусе, нам нужно написать в любом месте скрипта такую функцию: 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
  2. 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
  3. Проверка игрока в зоне. Чтобы проверить игрока в зоне, нам нужно написать в любом месте скрипта такую функцию: 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
  4. Итак, по сути, этот урок повторение и закрепление 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
  5. Что если нужно узнать, если определенное число в массиве или нет. Но функции поиска по массиву в 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
  6. Урок №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
  7. 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
  8. Данные операторы используются в циклах: 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
  9. 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
  10. 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
  11. Условные конструкции позволяют Вам посмотреть, удовлетворяют ли данные условиям, а затем в зависимости от результата выполнить код. Для того, чтобы работать с условными конструкциями, сначала нужно выучить операторы сравнения, с помощью которых ставится условие для определенной конструкции. В приведенной ниже таблице приведены все условные операторы и их применение. 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
  12. 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
  13. 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
  14. Инкремент прибивляет к значению переменной единицу. Декремент отнимает единицу от значения переменной. Допустим у нас есть одна переменная c значением по умолчанию = 25. new pawn = 25;Чтобы отнять от значения переменной единицу, мы пишем следующее: pawn--; //pawn равен 24Чтобы прибавить единицу к значению переменной, мы пишем следующее: pawn++; //pawn равен 26Когда мы прибавляем к значению переменной единицу при помощи инкремента, такимобразом мы инкрементируем переменную. Когда мы отнимает от значения переменной единицу при помощи декремента, таким образом мы декрементируем переменную. Запомните это! К переменной можно прибавить и отнять единицу не только с помощью инкремента и декремента. Но об этом в следующем уроке. Автор Cloud
  15. 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
  16. 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
  17. ByMeR_OK

    RussianNicks v0.2

    Плагин позволяет использовать русские никнеймы. Поддерживаемые версии: SA:MP Server 0.3c SA:MP Server 0.3c R2 RussianNicks.zip
  18. 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Все урок окончен.
  19. 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; }Вот и все! Удачи
  20. 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 включить в машине
  21. 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
  22. 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); } } }
  23. 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
  24. 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
  25. Здравствуйте сегодня я вам покажу как зделать вот такой 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
×

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

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