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

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

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

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

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

Тип контента


Форумы

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

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

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


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

  • Начало

    Конец


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

  • Начало

    Конец


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

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

  1. В этом уроке я научу вас создавать простые двери, открываемые по команде. Таким же образом вы сможете потом ставить ворота и шлагбаумы. И начну я с фильтр скрипта Ingame Object Editor. (данный скрипт прилагается к учебнику). Почему именно он, когда предлагают много раз MTA Map Editor. Во-первых, это как один из простых способов расставить небольшое количество объектов, если ставить много объектов, на это уйдет больше времени, чем в MTA Map Editor. Во-вторых, это тоже было бы полезно знать. В-третьих, не нужно конвертировать код из map в pwn, все объекты будут в вашем моде вместе с этим фильтр скриптом. Доступ к его опциям имеет только RCON администратор, поэтому вам необходимо будет войти на сервер как RCON администратор. Начнем с создания двери. Войдите на сервер как RCON администратор. Итак, вот место куда мы, например, хотим поставить дверь. Мы можем поставить деревянную дверь с ID = 1491, это дверь, которая открывается когда ее толкаешь, но нам нет смысла сейчас ее ставить, потому что мы делаем закрытую дверь, которую нужно будет открыть по команде. Поставим дверь, например с ID = 1500. Итак, в чате пишем следующую команду /oadd 1500 door. Команда /oadd – добавляет новый объект, через пробел пишется ID объекта и далее имя объекта, любое. Итак, мы создали нашу дверь, но она оказалась в воздухе. Давайте ее опустим. Пишем следующую команду в чат: /omode m_z – эта команда позволит двигать дверь в двух направлениях (вверх или вниз). Дальше садимся на кнопку C и камера переключается на сам объект. Стрелками двигаем дверь вниз к полу. Итак, мы опустили дверь, мы можем снова нажать С, и встать в удобное вам место для обзора объекта и снова сесть. Дальше нам нужно повернуть дверь левее (исходя из рисунка). Пишем туже команду, но уже не m_z а m_xy. Это команда позволит двигать объект во все четыре стороны (вперед, назад, влево и вправо). Таким образом, двигаем дверь в дверной проем. Нам нужно записать куда-нибудь координаты этой двери в положении закрыто. Координаты этой двери находится в scriptfiles/oed/BREAD_OED.txt и выглядеть они будут следующим образом (чтобы не запутаться, после координат написано имя объекта, имеющего эти координаты, его мы не трогаем): 1500,371.234283,166.662429,1007.383850,0.000000,0.000000,0.000000,1Итак, мы записали координаты в безопасное место. А теперьповернем дверь в положение открыто. Чтобы повернуть дверь, мы все также используем команду /o_mode, только теперь вместо m_xy пишем r_z. И поворачиваем дверь в такое положение: Теперь снова записываем те же координаты двери в положении закрыто. В координатах ничего не изменилось, кроме предпоследней цифры. 1500,371.234283,166.662429,1007.383850,0.000000,0.000000,93.000000,1/o_mode r_z – позволяет нам вращать объект таким образом, чтобы дверь открывалась изакрывалась. Есть также r_xy – с помощью, которой уже вращаем дверь в другом направлении. Запомните m_z и m_xy – это перемещение по осям: z и xy, а r_z и r_xy – это вращение по тем же осям. Итак, мы получили координаты закрытой и открытой двери. Теперь мы можем удалить этот объект, т.к. у нас есть его координаты. Удаляем его командой /odel [имя объекта] в данном случае имя объекта – door, значит, пишем /odel door. Удаляем мы его для того, чтобы у нас не получилось 2 копии двери, т.к. одну дверь мы вставим в мод. Прежде чем приступить к делу объясню ниже приведенные цифры. Первая цифра означает ID модели, следующие 3 цифры это координаты положения объекта, далее идут 3 цифры это координаты вращения объекта, последняя цифра это видимость объекта. 1500,371.234283,166.662429,1007.383850,0.000000,0.000000,93.000000,1Итак, приступим к написанию команды. Сначала в начале скрипта мы объявляемглобальную переменную, например door. Затем внутри автовызываемой функции OnGameModeInit – мы присваиваем этой переменной, созданный объект. cpd = CreateObject(1500,371.234283,166.662429,1007.383850,0.000000,0.000000,0.000000,300.0);Видимость мы ставим 300.0, иначе вы будете видеть дверь, только подойдя к ней вплотную.Затем пишем две команды, одну для открытия двери, другую для закрытия: if(strcmp("/open", cmdtext, true, 10) == 0) { SetObjectRot(cpd,0.000000,0.000000,93.000000); return 1; } if(strcmp("/close", cmdtext, true, 10) == 0) { SetObjectRot(cpd,0.000000,0.000000,0.000000); return 1; }В функции мы указывает координаты вращения, т.к. мы будем вращать объект.Недостаток этого скрипта только в том, что дверь открывается мгновенно. Все из-за того, что в функции SetObjectRot которая устанавливает координаты вращения объекта, нет последнего аргумента speed, который есть в функции MoveObject. MoveObject – передвигает объекты в указанное место и так как у него есть аргумент speed, передвигает он объекты плавно. На его основе делают выдвижные двери. Так вот, давайте сделаем раздвижные двери. Естественно нашу дверь нужно подвинуть немного вперед в дверной проем, чтобы, когда дверь открывалась, ручки двери не торчали из стены. Т.е мы заново получаем координаты открытой и закрытой двери. И теперь мы из полученных координат берем координаты положения, а не координаты вращения. if(strcmp("/open", cmdtext, true, 10) == 0) { MoveObject (cpd,372.531341,166.374206,1007.370971,2.0); return 1; } if(strcmp("/close", cmdtext, true, 10) == 0) { MoveObject(cpd,371.238067,166.374206,1007.370971,2.0); return 1; }Вот в принципе и все. Автор Cloud
  2. Devin Coleman

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

    В этом уроке мы переходим к разбору третьего стиля диалога: DIALOG_STYLE_LIST. Давайте рассмотрим данный стиль диалога на следующем примере. Допустим нам нужно командой, вызвать меню со списком оружия на выбор. Создаем простейшую команду и внутрь ее пишем функцию вызова диалога. Так как это будет список, нам нужно использовать \n – переход на новую строчку. Т.е. мы пишем название пункта \n название пункта и снова \n. if (strcmp("/weaponlist", cmdtext, true, 10) == 0) { ShowPlayerDialog(playerid,0,DSL,"Список оружия»,«Кольт\nКольт с глушителем\nПустынный орел", "Выбор", "Отмена"); return 1; }Диалог будет выглядеть следующим образом:Перед тем как написать функцию для этого диалогового окна, давайте посмотрим на следующую конструкцию приведенную ниже. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == 0) { if(listitem == 1) //Если был выбран 1 пункт списка { //Выполнить этот код } if(listitem == 2) //Если был выбран 2 пункт списка { //Выполнить этот код } } return 1; }Вот так должен выглядеть код для данного стиля диалога. Тут мы проверяем значениеlistitem, т.е. пункта списка которого мы выберем в диалоге. listitem = 1 – это кольт, значит, в условную конструкцию listitem == 1 мы должны вписать функцию GivePlayerWeapon, чтобы дать оружие игроку. if(listitem == 1) //Если был выбран 1 пункт списка { GivePlayerWeapon(playerid,22,100); //Дать игроку кольт и 100 патронов }То же самое делаем и для остальных listitem. Вписываем ту же строчку, только вместо 22,пишем следующее: 23 – для кольта с глушителем, 24 – для пустынного орла (эти цифры, это ID модели этого оружия). ID модели смотрите на странице «ID оружия». Вообще, приведенный выше пример, очень схож с оператором switch, т.к. мы проверяем значение одного аргумента и в зависимости от этого значения выполняем действие. Тоесть, это все можно заменить на оператор switch, таким образом: public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == 0) { switch(listitem) { case 1: //Если был выбран 1 пункт списка { //Выполнить этот код } case 2: //Если был выбран 1 пункт списка { //Выполнить этот код } } } return 1; }Но все же, если вы хорошо не усвоите этот урок, лучше этим примером не пользоваться Автор Cloud
  3. В этом уроке мы переходим к разбору третьего стиля диалога: DIALOG_STYLE_LIST. Давайте рассмотрим данный стиль диалога на следующем примере. Допустим нам нужно командой, вызвать меню со списком оружия на выбор. Создаем простейшую команду и внутрь ее пишем функцию вызова диалога. Так как это будет список, нам нужно использовать \n – переход на новую строчку. Т.е. мы пишем название пункта \n название пункта и снова \n. if (strcmp("/weaponlist", cmdtext, true, 10) == 0) { ShowPlayerDialog(playerid,0,DSL,"Список оружия»,«Кольт\nКольт с глушителем\nПустынный орел", "Выбор", "Отмена"); return 1; }Диалог будет выглядеть следующим образом:Перед тем как написать функцию для этого диалогового окна, давайте посмотрим на следующую конструкцию приведенную ниже. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == 0) { if(listitem == 1) //Если был выбран 1 пункт списка { //Выполнить этот код } if(listitem == 2) //Если был выбран 2 пункт списка { //Выполнить этот код } } return 1; }Вот так должен выглядеть код для данного стиля диалога. Тут мы проверяем значениеlistitem, т.е. пункта списка которого мы выберем в диалоге. listitem = 1 – это кольт, значит, в условную конструкцию listitem == 1 мы должны вписать функцию GivePlayerWeapon, чтобы дать оружие игроку. if(listitem == 1) //Если был выбран 1 пункт списка { GivePlayerWeapon(playerid,22,100); //Дать игроку кольт и 100 патронов }То же самое делаем и для остальных listitem. Вписываем ту же строчку, только вместо 22,пишем следующее: 23 – для кольта с глушителем, 24 – для пустынного орла (эти цифры, это ID модели этого оружия). ID модели смотрите на странице «ID оружия». Вообще, приведенный выше пример, очень схож с оператором switch, т.к. мы проверяем значение одного аргумента и в зависимости от этого значения выполняем действие. Тоесть, это все можно заменить на оператор switch, таким образом: public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == 0) { switch(listitem) { case 1: //Если был выбран 1 пункт списка { //Выполнить этот код } case 2: //Если был выбран 1 пункт списка { //Выполнить этот код } } } return 1; }Но все же, если вы хорошо не усвоите этот урок, лучше этим примером не пользоваться Автор Cloud
  4. В этом уроке мы переходим к разбору второго стиля диалога: DIALOG_STYLE_INPUT. Работать с данным стилем диалога будет сложнее по сравнению с остальными стилями диалогов, т.к. тут есть поле ввода. Начнем с простого примера: мы командой вызовем диалоговое окно, введем текст и данный текст отправиться всем игрокам в чат. Имя игрока видно не будет, сообщение анонимное. Итак, приступим к созданию диалога: ShowPlayerDialog(playerid,0,DSI,"Отправить сообщение всем","Введите текст сообщения","ОК","Отмена");Данную строку я думаю, вы уже догадались, что ее нужно вписать внутрь готовой команды.Я все также использовал константу DSI из прошлого урока, чтобы не писать длинное название стиля диалога, поэтому не забудьте ее добавить в ваш скрипт. #define DSI DIALOG_STYLE_INPUTИтак, диалоговое окно мы создали, и оно будет выглядеть следующим образом.Приступим к написанию функции для этого диалога. Как и в прошлом уроке, внутрь функции OnDialogResponse, пишем условную конструкцию проверки на вызов диалога с ID = 0. Внутрь этой условной конструкции пишем еще одну, проверку на нажатие кнопки. Дальше внутри этой проверки будет еще одна проверка на то, что поле ввода у нас содержит какие-либо символы. Ведь мы же не можем отправить пустой текст. Условная конструкция будет такая: if(!strlen(inputtext)) { }else{ }Данную условную конструкцию мы пишем внутри условной конструкции if(response). Атеперь я вам объясню, что значит strlen и inputtext: Strlen – возвращает количество символов в строке. Inputtext – этот аргумент содержит в себе текст, который мы вводим в поле ввода. В общем, думаю, вам будет все понятно, посмотрев нижеприведенный готовый скрипт, но все же я вам кратко его объясню на всякий случай. Сначала идет проверка на вызов диалогового окна с ID = 0. Мы данное окно вызывали функцией ShowPlayerDailog(playerid,0…); - я специально выделил цифру, это dialogid. После проверки, внутри идет еще одна проверка на нажатие кнопки. Если нажата кнопка 1, т.е. кнопка «ОК», идет следующая проверка на то, что в поле ввода есть какой-либо текст. Если он есть, функция SendClientMessage отправляет в чат значение аргумента inputtext, т.е то что игрок введет в поле ввода диалогового окна. Если игрок не введет в поле ввода ничего, функция SendClientMessage отправит в чат сообщение с ошибкой, о том что текст сообщения не был введен в поле ввода. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == 0) { if(response) //Если была нажата 1 кнопка { if(!strlen(inputtext)){ //Если в поле не был введен текст при отправке SendClientMessage(playerid,COLOR_RED,"Вы не написали текст сообщения в поле ввода"); return 1; }else{ SendClientMessage(playerid,COLOR_WHITE,inputtext); } } } return 1; }Если вы поняли этот урок, тогда переходим к следующему. Автор Cloud
  5. В дальнейших уроках мы рассмотрим все типы диалогов и работу с ними. Для начала я ознакомлю вас со всеми диалогами, а затем в каждом уроке мы будем рассматривать по каждому типу диалога. Итак, приступим к теории. Диалоги бывают трех типов: 0 - DIALOG_STYLE_MSGBOX - обычный диалог с 2мя кнопками, 1 - DIALOG_STYLE_INPUT - диалог с полем для ввода, 2 - DIALOG_STYLE_LIST - список из нескольких элементов. Вызывается диалоговое окно функцией ShowPlayerDialog, структура функции такая: ShowPlayerDialog(playerid,<ID диалога>,<ID стиля>,<Название>,<Текст>,<Первая кнопка>,<Вторая>);Обычно, чтобы не запоминать цифры и не писать длинное название стилей диалогов, язаменяю их такими константами: #define DSL DIALOG_STYLE_LIST #define DSI DIALOG_STYLE_INPUT #define DSM DIALOG_STYLE_MSGBOXДля написания основного текста диалогового окна вы можете использовать:\b backspaсe \f Form feed \n переход на новую строку \r возврат каретки \' одиночная кавычка \" двойные кавычки \? вопросительный знак Итак, переходим к практике или к разбору первого стиля: DIALOG_STYLE_MSGBOX. Рассмотрим обычный пример: Мы вводим команду, и появляется диалоговое окно с запросом о подтверждении выполнения команды. Для начала мы напишем скрипт простейшей команды в автовызываемую функцию OnPlayerCommandText. if (strcmp("/test", cmdtext, true, 10) == 0) { return 1; }Затем с помощью функции ShowPlayerDialog мы вызовем данное диалоговое окно. Так каквызывать меню мы будем с помощью команды, то и пишем данную функцию, приведенную ниже внутри нее. ShowPlayerDialog(playerid,0,DSM,"Подтверждение","Вы точно хотите выполнить команду","Да","Нет");Цифра 0 – это идентификатор (ID) диалога, у каждого диалога свой ID. Послеидентификатора пишем название стиля диалога, но я заменил его константой, поэтому я написал DSM (DIALOG_STYLE_MSGBOX). После стиля пишем название диалога. Далее пишем текст диалога и название первой и второй кнопки. В общем, код будет выглядеть следующим образом: if (strcmp("/test", cmdtext, true, 10) == 0) { ShowPlayerDialog(playerid,0,DSM,"Подтверждение","Вы точно хотите выполнить команду","Да","Нет"); return 1; }Но данное диалоговое окно работать не будет, если мы не напишем для него функцию.Допустим, наша команда выдаст в чат всю информацию об игроке, т.е при нажатии кнопки «Да» все так и будет, но при нажатии кнопки «Нет», мы выдадим сообщение красным цветом о том что данная команда не была выполнена. Писать функцию диалогового окна мы будем в автовызываемой функции OnDialogResponse. Сначала внутри функции мы напишем условную конструкцию, которая будет проверять, что данное диалоговое окно было вызвано. Код условия такой: if(dialogid == 0) { }Условие проверяет: было ли вызвано диалоговое окно с ID = 0. Внутрь этой условнойконструкции добавляем еще одно условие: if(response) { }else{ }Условие проверяет, была ли нажата первая кнопка, если нажата вторая кнопка, товыполняется код после else. Внутри этой условной конструкции для первой кнопки мы пишем следующий код. if(response) { new string[128]; //Переменная с основным текстом диалога new plname[MAX_PLAYER_NAME]; //Переменная с именем игрока new money; //Переменные для хранения кол-ва наличных денег игрока new Float: health, Float: armor; //Переменные для хранения кол-ва здоровья и брони игрока GetPlayerName(playerid,plname,MAX_PLAYER_NAME); //Записываем имя игрока в переменную plname money = GetPlayerMoney(playerid); //Записываем деньги игрока в переменную money и т.д. GetPlayerHealth(playerid,health); GetPlayerArmour(playerid,armor); format(string,sizeof(string),”Игрок: %s(ID:%d). Деньги: %d $.\n Здоровье: %.2f\n Броня: %.2f”,plname,playerid,money,health,armor); ShowPlayerDialog(playerid,1,DSM,"Информация об игроке",string,"ОК",""); }else{Сначала мы создаем все необходимые переменные, а потом получаем данные и сразу же ихзаписываем их во всех переменные. Обратите внимание на функцию GetPlayerMoney, в скобках она имеет всего один аргумент (playerid), в отличие от других, и она возвращает количество денег игрока. Поэтому мы присваиваем переменной money, эту функцию, которая возвратит значение, которое и будет значением этой переменной. Еще обратите внимание на %.2f, я мог бы использовать просто %f, как показано в таблице. Точка и цифра означает, сколько чисел должно быть после запятой у десятичного числа. Дальше мы форматируем сообщение, после чего вызываем новое диалоговое окно с новым ID. Обратите внимание, что имя второй кнопки не указано, в таком случае, эта кнопка просто будет отсутствовать в диалоге. А вместо основного текста мы подставляем переменную string в которой уже есть готовое отформатированное сообщение. Вернемся к условию, если будет нажата вторая кнопка в первом диалоге, тут все просто без объяснений в else пишем: SendClientMessage(playerid,COLOR_RED,"Команда отменена");Вот в принципе и все, В следующем уроке мы рассмотрим другой стиль диалога. Переходимк следующему уроку. Автор Cloud
  6. Чтобы проверить игрока в радиусе, нам нужно написать в любом месте скрипта такую функцию: 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
  7. 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
  8. Проверка игрока в зоне. Чтобы проверить игрока в зоне, нам нужно написать в любом месте скрипта такую функцию: 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
  9. Итак, по сути, этот урок повторение и закрепление 11 урока. Сейчас я покажу, как выдавать Это, пожалуй, самый легкий урок из всех предыдущих. Расставить транспорт можно несколькими способами: Расстановка транспорта с помощью Samp Debug: Для начала запускаем Samp Debug из папки с GTA San Andreas. Как только все загрузится, вы появляетесь Карлом Джонсоном возле надписи Vinewood. Теперь с помощью команды /v вызываем нужную нам машину, например INFERNUS, для этого пишем в чате /v 411 и получаем машину. Если вы не знаете ID машины, которую хотите вызвать, введите /vmenu, и вы попадете в меню выбора транспорта. Садитесь в машину и паркуйте ее там, где вам нужно. После этого, не выходя из машины, вводите команду /save. В директории: Мои документы\GTA San Andreas User Files\Samp\ будет файл savedpositions.txt, с примерно таким содержанием: AddStaticVehicle(411, 322.5014, 303.6906, 999.1484, 269.1425, 0, 0);Функция AddStaticClass может использоваться только внутри автовызываемой функцииOnGameModeInit, в других функциях она работать не будет. Можно расставить транспорт с помощью фильтрскриптов, таких как cars. Данный скрипт прилагается к учебнику. Достаточно ввести ID транспорта, как команда, например /411 и вы окажетесь прямо в машине. Автор Cloud
  10. Итак, по сути, этот урок повторение и закрепление 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
  11. Что если нужно узнать, если определенное число в массиве или нет. Но функции поиска по массиву в 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
  12. Новая команда выглядит таким образом: public OnPlayerCommandText(playerid, cmdtext[]) { if (strcmp("/mycommand", cmdtext, true, 10) == 0) { return 1; } return 0; }strcmp – сравнивает два значения, в данном случае «/mycommand» с командой, которойигрок вводит в чат (cmdtext), cmdtext – это параметр в котором хранится текст команды, которую игрок ввел в чат. Значение true означает нечувствительность к регистру. Если мы напишем false, игрок должен будет соблюдать регистр букв при написании команды. Приведу пример простой команды с использованием оператора format из прошлого урока. if (strcmp("/afk", cmdtext, true, 10) == 0) { new pname[24],string[50]; GetPlayerName(playerid, pname, 24); format(string, sizeof(string), "-- %s Отошел от компьютера... ", pname); SendClientMessageToAll(0xFFFF00AA,string); return 1; }Тут все просто. Переходим к следующему уроку.. Автор Cloud
  13. Урок №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
  14. 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
  15. Данные операторы используются в циклах: 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
  16. 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
  17. 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
  18. Условные конструкции позволяют Вам посмотреть, удовлетворяют ли данные условиям, а затем в зависимости от результата выполнить код. Для того, чтобы работать с условными конструкциями, сначала нужно выучить операторы сравнения, с помощью которых ставится условие для определенной конструкции. В приведенной ниже таблице приведены все условные операторы и их применение. 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
  19. 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
  20. 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
  21. Инкремент прибивляет к значению переменной единицу. Декремент отнимает единицу от значения переменной. Допустим у нас есть одна переменная c значением по умолчанию = 25. new pawn = 25;Чтобы отнять от значения переменной единицу, мы пишем следующее: pawn--; //pawn равен 24Чтобы прибавить единицу к значению переменной, мы пишем следующее: pawn++; //pawn равен 26Когда мы прибавляем к значению переменной единицу при помощи инкремента, такимобразом мы инкрементируем переменную. Когда мы отнимает от значения переменной единицу при помощи декремента, таким образом мы декрементируем переменную. Запомните это! К переменной можно прибавить и отнять единицу не только с помощью инкремента и декремента. Но об этом в следующем уроке. Автор Cloud
  22. 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
  23. 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
  24. 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Все урок окончен.
  25. 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; }Вот и все! Удачи
×

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

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