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

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

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

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

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

Тип контента


Форумы

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

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

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


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

  • Начало

    Конец


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

  • Начало

    Конец


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

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

  1. Mr.Brain

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

    Здравствуйте, дорогие пользователи GS-Games.Ru, надеюсь вам поможет эта статья иначе я просто напросто потрачу 15 минут своей жизни http://forum.gs-games.ru/public/style_emoticons/default/fuck[1].gif Пожалуй начнём... Для чего вообще требуется оптимизация кода? Оптимизированный код значительно снижает нагрузку на сервер, при онлайне 15-20 человек, конечно это будет не заметно, но при человек 100 тогда уже мод начнёт подлагивать.... 1. Первый вариант оптимизации, Допустим у нас стоит проверка на что-то: if(IsACop(playerid)) { SendClientMessage(playerid, -1, "Ты коп!!!11!!"); return 1; } SendClientMessage(playerid, -1, "Ты не коп!!11!"); Вот этот страшный код годфазера...Оптимизируем его: if(IsACop(playerid)) return SendClientMessage(playerid, -1, "Ты коп!!!11!!"); SendClientMessage(playerid, -1, "Ты не коп!!11!");Вот это незначительно, но снимает нагрузку на сервер))2. Второй способ: Будем оптимизировать OnDialogResponse Вместо кода: if(dialogid == 0) { } if(dialogid == 1) { } Вместо этого можно использовать switch: switch(dialogid) { case 0: case 1: }Тем самым мы так же облегчаем жизнь серверу http://forum.gs-games.ru/public/style_emoticons/default/smile.gif3. Третье самое распространённая ошибка в GF кодах: Не использование повторяющихся обстоятельств SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); SendClientMessageToAll(COLOR_WHITE," "); Хотя вместо этого можно сделать так: for(new i; i < 10; i++) SendClientMessageToAll(COLOR, " "); Спасибо за внимание, с Вами был ePZuz Специально для GS-Games.Ru При копирование материала ссылка на источник и указание автора обязательна! (с)GS-Games, GCMT
  2. Пишите какие уроки хотите увидеть в этом разделе и в течении 2 двух дней, тот манипуал который вы описали появится здесь... И самое главное всё подробно описывайте, если не будет подробного описания. То ваше сообщение не будет приниматься....
  3. Итак, по сути, этот урок повторение и закрепление 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
  4. Lexa

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

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

    SpeedHack

    В начало мода вставьте: forward Anticheat(); в любое место в моде вставить: public Anticheat() { for(new i = 0; i < GetMaxPlayers(); i++) // Цикл, проверяем всех игроков онлайн { if(IsPlayerConnected(i)) // проверяем подключен ли { if(GetSpeedKM(i) > 260) //Максимальная скорость { SendClientMessage(i, COLOR_LIGHTRED, "Вы кикнуты, причина Speedhack"); // пишем месег Kick(i); // кикаем его } } return 1; } stock GetSpeedKM(playerid) // проверяет скорость { new Float:PosX, Float:PosY, Float:PosZ, Float:PlayerSpeedDistance; GetVehicleVelocity(GetPlayerVehicleID(playerid), PosX, PosY, PosZ); PlayerSpeedDistance = floatmul(floatsqroot(floatadd(floatadd(floatpower( PosX, 2), floatpower(PosY, 2)), floatpower(PosZ, 2))), 170.0); new spe = floatround(PlayerSpeedDistance * 1); return spe; } в public OnGameModeInit SetTimer("Anticheat",2000,1);
  7. Сабвуфер для "Эллегии"[RUS]Автор: [iSS]jumboОписание можно прочесть по ссылке ниже:А я всего сделал перевод для этого скрипта...Скачать: ESubwoofers.pwnESubwoofers.rar
  8. Если вы хорошо поняли прошлый урок, то без труда освоите и этот, поскольку инклуды очень похожие, просто имена функций немного отличаются, но выполняют они одну и ту же функцию. Файл Dini.inc нужно скопировать в папку include в директории с редактором Pawno. В начале вашего скрипта обязательно нужно объявить этот инклуд, также как объявляется инклуд a_samp. Итак, приступим к разбору основных функций mxINI: dini_Create(“filename.ini”); //Создает файл с именем filename.ini в папке scriptfiles. dini_Remove(“filename.ini”); //Удаляет файл dini_Exists(“filename.ini”); //Проверяет, существует ли данный файл (для оператора if)Запись данных в файл: dini_Set(“filename.ini”, "имя ключа", "текст"); // Эта функция записывает текст в ключ. dini_IntSet(“filename.ini”, "имя ключа", "текст"); // Эта функция записывает целое число в ключ. dini_FloatSet(“filename.ini”, "имя ключа", 123456 ); // Эта функция записывает десятичное число в ключ. dini_BoolSet(“filename.ini”, "имя ключа", 3.1416 ); // Эта функция записывает логическое значение в ключ.Чтение данных из файла dini_Get(“filename.ini”, "имя ключа", "текст"); // Эта функция получает текст из ключа. dini_Int(“filename.ini”, "имя ключа", "текст"); // Эта функция получает целое число из ключа. dini_Float(“filename.ini”, "имя ключа", 123456 ); // Эта функция получает десятичное из ключа. dini_Bool(“filename.ini”, "имя ключа", 3.1416 ); // Эта функция получает логическое значение из ключа.Остальные функции dini_Unset(“filename.ini”, "имя ключа"); // Отменяет последнее установленное число на ключ dini_Isset(“filename.ini”, "имя ключа"); // Проверяет было ли установлено данное значение в ключ(для оператора if)Инклуд mxINI это по сути упрощенный инклуд Dini, поэтому они особо не отличаются. Но mxINI не умеет удалять файлы, как это может Dini. Поэтому можно пользоваться mxINI для чтения и записи, а Dini для удаления файлов. В приведенном ниже примере я взял за основу пример из прошлого урока и переделал его под использование Dini. new string[255], PlayerName[32]; new Float:health, money; GetPlayerName(playerid,PlayerName,32); format(string,64,”%s.ini”,PlayerName); new iniFile = dini_Create(string); //Открываем файл dini_Get(iniFile, "Name", PlayerName); //Узнаем имя игрока и записываем его в переменную dini_Int (iniFile, "Money", money); // Узнаем количество денег и записываем в переменную dini_Float(iniFile, "Health", health); // Узнаем количество здоровья и записываем в переменную GivePlayerMoney(playerid,money); SetPlayerHealth(playerid,health);Т.е. переименовал название функции на имена функций Dini.Автор Cloud
  9. В этом уроке я расскажу, как научится работать с include – mxINI. На момент написания этого урока последняя актуальная версия инклуда 0.5. Прежде чем приступить к изучению инклуда, рекомендую его скачать. На основе этого инклуда в основном делают регистрацию на сервере. В этом уроке я не буду показывать вам, как написать простейшую регистрацию на сервере, а всего лишь объясню, как с помощью mxINI происходит запись и чтение из файла. Думаю, выяснив, как работает данный инклуд, вы сами сможете написать простую регистрацию, возможно даже на диалогах, так как урок с диалогами вы уже проходили. Файл mxINI.inc нужно скопировать в папку include в директории с редактором Pawno. В начале вашего скрипта обязательно нужно объявить этот инклуд, также как объявляется инклуд a_samp. Итак, приступим к разбору основных функций mxINI: ini_createFile(“filename.ini”); //Создает файл с именем filename.ini в папке scriptfiles. ini_openFile(“filename.ini”); //Открывает файл ini_closeFile(ID открытого файла); //Закрывает файлЗапись данных в файл: ini_setString(ID файла, "имя ключа", "текст"); // Эта функция записывает текст в ключ. ini_setInteger(ID файла, "имя ключа", 123456 ); // Эта функция записывает целое число в ключ. ini_setFloat(ID файла, "имя ключа", 3.1416 ); // Эта функция записывает десятичное число в ключ.Чтение данных из файла ini_getString(ID файла, "имя ключа", <имя переменной>); // Эта функция записывает текст в переменную из файла. ini_getInteger(ID файла, "имя ключа", <имя переменной>); // Эта функция записывает целое число в переменную из файла. ini_getFloat(ID файла, "имя ключа", <имя переменной>); // Эта функция записывает десятичное число в переменную из файла.Запись в файлДавайте для простого примере с помощью команды, запишем данные игрока: имя, деньги и количество здоровья. Сначала мы создаем 2 переменные, где у нас будут храниться имя игрока и отформатированное сообщение. new string[255], PlayerName[32]; GetPlayerName(playerid,PlayerName,32); format(string,64,”%s.ini”,PlayerName); new iniFile = ini_createFile(string);После переменных мы узнаем имя игрока функцией GetPlayerName. Дальшеформатируем строку, как будет называться файл в который будет производиться запись. В данном случае файл будет называться по имени игрока. Дальше создаем переменную IniFile, которая будет создавать данный файл. Перед тем как записать количество денег и здоровья игрока, нужно сначала их узнать: new money = GetPlayerMoney(playerid); new Float:health = GetPlayerHealth(playerid);Теперь пишем проверку, если файл выдаст ошибку, открыть файл снова. if(iniFile < 0) iniFile = ini_openFile(string);Дальше записываем данные в файл и закрываем его: ini_setString(iniFile, "Name", PlayerName); //Записываем имя игрока ini_setInteger(iniFile, "Money", money); //Записываем количество денег ini_setFloat(iniFile, "Health", health); //Записываем количество здоровья ini_closeFile(iniFile); //Закрываем файлВот так производится запись данных в файл. Запись в файле будет выглядеть примерноследующим образом: Name = Player Money = 1000 Health = 100.0Чтение из файлаЧтение из файла ничем не сложнее записи, все аналогично. Только тут не нужно проверок, условий: if{iniFile < 0), и в переменной iniFile мы не создаем, а уже открываем созданный нами файл. Весь код будет выглядеть следующим образом: new string[255], PlayerName[32]; new Float:health, money; GetPlayerName(playerid,PlayerName,32); format(string,64,”%s.ini”,PlayerName); new iniFile = ini_openFile(string); //Открываем файл ini_getString(iniFile, "Name", PlayerName); //Узнаем имя игрока и записываем его в переменную ini_getInteger(iniFile, "Money", money); // Узнаем количество денег и записываем в переменную ini_getFloat(iniFile, "Health", health); // Узнаем количество здоровья и записываем в переменную ini_closeFile(iniFile); //Закрываем файл GivePlayerMoney(playerid,money); SetPlayerHealth(playerid,health);
  10. В этом уроке я научу вас создавать простые двери, открываемые по команде. Таким же образом вы сможете потом ставить ворота и шлагбаумы. И начну я с фильтр скрипта 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
  11. 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
  12. В этом уроке мы переходим к разбору второго стиля диалога: 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
  13. В дальнейших уроках мы рассмотрим все типы диалогов и работу с ними. Для начала я ознакомлю вас со всеми диалогами, а затем в каждом уроке мы будем рассматривать по каждому типу диалога. Итак, приступим к теории. Диалоги бывают трех типов: 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
  14. Чтобы проверить игрока в радиусе, нам нужно написать в любом месте скрипта такую функцию: 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
  15. 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
  16. Проверка игрока в зоне. Чтобы проверить игрока в зоне, нам нужно написать в любом месте скрипта такую функцию: 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
  17. Итак, по сути, этот урок повторение и закрепление 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
  18. Что если нужно узнать, если определенное число в массиве или нет. Но функции поиска по массиву в 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
  19. Урок №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
  20. 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
  21. Данные операторы используются в циклах: 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
  22. 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
  23. 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
  24. Условные конструкции позволяют Вам посмотреть, удовлетворяют ли данные условиям, а затем в зависимости от результата выполнить код. Для того, чтобы работать с условными конструкциями, сначала нужно выучить операторы сравнения, с помощью которых ставится условие для определенной конструкции. В приведенной ниже таблице приведены все условные операторы и их применение. 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
  25. 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
×

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

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