Search the Community
Showing results for tags 'Урок'.
-
В этом топике будет приведен пример добавления некоторых методов в стандартное API RageMP, основной целью этого действа является сокращение кода и ускорение разработки в будущих скриптах. Пример: // За место этого: mp.players.forEach(_player => { _player.outputChatBox("Hello!!!"); }); //Можно будет использовать удобное сокращенное: mp.players.BroadcastMessage("Hello!!!"); Начнём. Создаем в каталоге 'packages/keker' файл 'new-api.js', и сразу же объявим его в 'packages/keker/index.js' добавив туда строку: require('./new-api'); Теперь начнем добавлять наш код в 'new-api.js', начнем с методов для работы с векторами, точнее для вычисления дистанции между ними: mp.Vector3.Distance = function (v1, v2){ return Math.abs(Math.sqrt(Math.pow((v2.x - v1.x),2) + Math.pow((v2.y - v1.y),2)+ Math.pow((v2.z - v1.z),2))); } // функция вычисляющая расстояние между двумя точками в пространстве X;Y;Z; mp.Vector3.Distance2D = function (v1, v2){ return Math.abs(Math.sqrt(Math.pow((v2.x - v1.x),2) + Math.pow((v2.y - v1.y),2))); } // функция вычисляющая расстояние между двумя точками на плоскости X;Y; Теперь их можно вызывать в любом месте вашего кода. Пример: let distance = mp.Vector3.Distance(player.position, player.veh.position); // Вернет расстояние от игрока до его машины в пространстве X;Y;Z let distance = mp.Vector3.Distance2D(player.position, player.veh.position); // Вернет расстояние от игрока до его машины в горизонтальной плоскости X;Y; Теперь добавим в 'new-api.js' методы broadcast'a сообщений и удобного спавна машин: mp.players.BroadcastMessage = function(s, v, d, c){ if(typeof v == 'undefined'){ // если функция вызвана с 1 параметром BroadcastMessage("Wellcome!!!"); this.forEach( player => { player.outputChatBox(s); }); } else if( typeof v == 'string'){ // если функция вызвана с параметром цвета BroadcastMessage("Wellcome!!!", "#ddd"); this.forEach(player => { player.outputChatBox("<font color='"+v+"'>"+s+"</font>"); }); } else if(typeof v == 'object' && typeof d == 'number'){ // если функция вызвана с параметром радиуса действия BroadcastMessage("Wellcome!!!", new mp.Vector3(0, 0, 0), 50); this.forEach(player => { if(Math.pow((player.position.x - v.x), 2) + Math.pow((player.position.y - v.y), 2) + Math.pow((player.position.z - v.z), 2) < Math.pow(d, 2)){ // проверяем находится ли игрок в заданом радиусе if(typeof c == 'string') { // если функция вызвана со всеми параметрами BroadcastMessage("Wellcome!!!", new mp.Vector3(0, 0, 0), 50, "#ddd"); player.outputChatBox("<font color='"+c+"'>"+s+"</font>"); } else { player.outputChatBox(s); } } }); } } // функция выводящая сообщение в чат либо всем игрокам онлайн, либо игрокам находящимся в определенном радиусе, так же позволяет задать цвет текста mp.vehicles.Spawn = function(m, x, y, z){ if(typeof x == 'number' && typeof y == 'number' && typeof z == 'number'){ return this.new(mp.joaat(m), new mp.Vector3(x, y, z)); } else if(typeof x == "object") { return this.new(mp.joaat(m), x); } } // Спавн транспорта в заданной точке, либо по координатам X;Y;Z, возвращает созданый транспорт Их вызов в дальнейшем будет выглядеть так: //за место этого довольно маштабного кода: mp.players.forEach(_player => { _player.outputChatBox("<font color='#ddd'>Hello!!!</font>"); }); // Теперь можно использовать это, эти несколько вариантов mp.players.BroadcastMessage("Hello!!!"); // Разошлет сообщение всем игрокам сервера mp.players.BroadcastMessage("Hello!!!", "#ddd"); // Разошлет сообщение всем игрокам сервера, цвет текста будет #ddd mp.players.BroadcastMessage("Hello!!!", player.position, 50); // Разошлет сообщение всем игрокам в радиусе 50м от текущего, Local Chat mp.players.BroadcastMessage("Hello!!!", player.position, 50, "red"); // Разошлет сообщения всем игрокам в радиусе 50м от текущего, цвет текста красный // Удобный спавн траспорта // За место этого: let veh = mp.vehicles.new(mp.joaat('sultanrs'), new mp.Vector3(200, 14, 25)); // Теперь можно использовать это: let veh = mp.vehicles.Spawn('sultanrs', 200, 14, 25); // Создаст транспорт в указаных координатах, и вернет его в переменную veh //или это: let pos = player.postion; pos.x += 2; let veh = mp.vehicles.Spawn('sultanrs', pos); // Создаст транспорт в указанной точке и вернет его Ну и пару методов для работы с игроком, можно как добавить в 'new-api.js' это: mp.events.add({"playerJoin": player => { player.TeleportTo = function(x, y, z){ if(typeof x == 'object'){ // если первый параметр является вектором this.position = x; } else if(typeof x == 'number' && typeof y == 'number' && typeof z == 'number'){ // если координаты заданы по отдельности this.position = new mp.Vector3(x, y, z); } } // функция телепорта игрока к заданой точке, либо по координатам X;Y;Z; player.Message = function(s, c){ if(typeof s == 'string' && typeof c == 'string'){ // если задан цвет this.outputChatBox("<font color='"+с+"'>"+s+"</font>"); } else if (typeof s == 'string'){ this.outputChatBox(s); } } // функция для быстрой отправки сообщения игроку в чат, с возможностью задать цвет текста } }); Либо вставить код от сюда в 'packages/keker/evens/common.js', вызов этих методов будет выглядеть так: // Телепорт игрока player.TeleportTo(player.veh.position.x-2, player.veh.position.y, player.veh.postion.z); // Телепортирует игрока к точке сбоку от его машины let pos = player.veh.position; pos.x -= 2 player.TeleportTo(pos); // сделает тоже самое только сдесь в функцию передается вектор а не координаты // Удобный вывод сообщений игроку, с возможностью задать цвет текста player.Message("Hello!!!"); // Отправит сообщение в чат игроку player.Message("Hello!!!", "#ddd"); // Отправит сообщение в чат игроку, цвет текста #ddd Ну вот и все, надеюсь, что кому нибудь пригодится!
-
HTML Урок №1 - Введение Предисловие В связи со скорым (я надеюсь) выходом версии 0.2, в которой нам обещали клиентскую часть, я решил написать несколько уроков посвященных HTML и CSS. Это мой первый урок, так скажем проба пера, сильно не серчайте. Пожалуй, приступим. Содержание: Что такое HTML? Базовая структура документа Создание вашей первой HTML страницы 1. Что такое HTML? HTML (от англ. HyperText Markup Language — «язык гипертекстовой разметки») — стандартизированный язык разметки документов во Всемирной паутине. Большинство веб-страниц содержат описание разметки на языке HTML. Язык разметки использует теги для определения содержания. Например, вот так выглядит элемент параграфа: <p>Я параграф</p> Он состоит из открывающего тега <p> и закрывающего тега </p> и содержания, в данном случае он содержит текст "Я параграф". 2.Базовая структура документа Теги <html></html> - указывает программе просмотра страниц, что это HTML документ. Теги <head></head> - определяет место, где помещается различная информация не отображаемая в теле документа. Здесь располагается тег названия документа и теги для поисковых машин. Теги <body></body> - определяет видимую часть документа. Базовая структура HTML документа выглядит следующим образом: <html> <head></head> <body></body> </html> 3.Создание вашей первой HTML страницы Теги <title></title> - определяет заголовок документа. Писать HTML разметку можно в любом текстовом редакторе, вы можете использовать обычный блокнот. Создадим файл, назовем его "index.html", заметьте что расширение файла .html обязательно. Далее откроем файл любым текстовым редактором, и добавим в него базовую структуру документа, которую мы рассмотрели выше. Между тегами <head></head> напишем текст "Hello World!". Также добавим теги <title></title> между открывающим и закрывающим тегами элемента head. В итоге у нас должно получиться вот так: <html> <head> <title>Заголовок</title> </head> <body> Hello World! </body> </html> Послесловие На этом введение в язык гипертекстовой разметки HTML закончено, прошу оставлять ваши отзывы, замечания и пожелания. Буду рад услышать всех. Спасибо за внимание. Для самостоятельного изучения: http://htmlacademy.ru
-
Всем доброго времени суток! Я уже неоднократно упоминал на сервере дискорда о такой штуке, как ESLint. Кто-то относится скептически, кто-то поддерживает, а кто-то и вовсе пропускает мимо. Сегодня постараемся разобраться что это за монстр, да и нужен ли он вообще? Теория Для чего это все? На самом деле все очень просто! ESLint поможет привести ваш код к общему стилю. "Что в этом такого? Я и сам могу писать весь свой код в едином стиле" ответите вы, но не все так просто. Каждому человеку свойственно ошибаться или проявлять невнимательность, особенно после долгой работы над кодом. ESLint крайне необходим при работе в команде. Зачем? Да опять же, все очень просто! Кто-то привык ставить в конце точку с запятой, кто-то нет, кто-то максимум пишет 80 символов в строку, кто-то 120, а кто-то громоздит вообще сколько душе угодно. В конечно итоге - ваш код или код вашей команды может превратиться в сплошную кашу, а вам это нужно? Если вы и дальше считаете, что вам это нужно - просто закройте статью. Практика Теперь когда вы знаете, что такое ESLint и зачем он нужен - давайте начнем его использовать? Для того, чтобы это сделать - не нужно каких-то особых усилий, достаточно установить пакет используя пакетный менеджер npm. npm install eslint --save-dev Установили, отлично, что теперь? Теперь нам нужно создать файл в котором мы будем прописывать наши правила о "правильном коде". Для этого достаточно создать в директории файл .eslintrc.js (так же возможно варианты просто .eslitrc и .eslintrc.json, читайте подробнее на официальном сайте). После создания файла - нам нужно сконфигурировать наш конфиг, я приведу простой пример. Е сли вам нужно что-то особенное или заточенное под что-то конкретное - вы можете без проблем найти необходимую документацию все на том же официальном сайте. .eslintrc.js: module.exports = { // Среды - среды, в которых ваши .js файлы будут запущены. Каждая среда предоставляет определенный набор предопределенных глобальных переменных. 'env': { 'node': true, 'es6': true }, 'extends': 'eslint:recommended', // Здесь таятся наши правила. 'rules': { // Каждое правило принимает тип оповещения о себе (2 или error, 1 или warn, 0 или off(не оповещать)) и непосрественно сами аргументы для правида. // Правило обеспечивает согласованный стиль отступов. В данном примере 4 пробела. 'indent': [2, 4], // оповещать как ошибку // Правило обеспечивает последовательное использование точек с запятой. 'semi': [2, 'always'], // оповещать как ошибку // Правило обеспечивает согласованный стиль привязки для блоков. 'brace-style': [2, '1tbs'], // оповещать как ошибку // Правило направлено на устранение неиспользуемых переменных, функций и параметров функций. 'no-unused-vars': [1], // оповещать как предупреждение // Разрешим вывод в консоль (используйте это правило только при разработке). 'no-console': [0] } }; Полный список всех правил вы можете найти здесь. Окей, установили, настроили, что дальше? Дальше нам необходимо проверить все наши .js файлы на наличие ошибок или предупреждений. Ниже я приведу пример простого .js файла, чтобы нагляднее было видно где есть ошибки, а где их нет. Для того, чтобы проверить файлы необходимо просто запустить команду: node ./node_modules/eslint/bin/eslint test.js Где test.js - имя вашего файла, соответственно. Пример файла: function Foo() { console.log('Foo') } function Fooo() { console.log('Fooo'); } Запустив ESLint вы должны увидеть что-то вроде этого: 1:10 warning 'Foo' is defined but never used no-unused-vars 2:1 error Opening curly brace does not appear on the same line as controlling statement brace-style 3:1 error Expected indentation of 4 spaces but found 2 indent 3:21 error Missing semicolon semi 6:10 warning 'Fooo' is defined but never used no-unused-vars Все справедливо и все по делу. Я не буду разбирать каждую ошибку, но если вы пройдетесь по коду в соответствии с нашими правилами, то вы увидите, что ESLint говорит нам справедливые вещи. И это все? Нет, это не все. Я думаю многие из вас согласятся, что такой вариант проверки неудобен, т.к. он требует постоянного запуска команды из окна терминала (консоли), что не очень-то и удобно. А есть выход? Да, конечно выход есть! На сегодняшний день многие современные текстовые редакторы обеспечивают проверку вашего кода, используя ваши правила ESLint. Visual Studio Code: https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint Atom: https://github.com/AtomLinter/linter-eslint Notepad++ https://sourceforge.net/projects/notepad-linter/ Я не буду писать полный список, т.к. вы сможете сами без проблем найти поддержку ESLint для вашего редактора в гугле. Заключение После прочтения данной статьи у вас сформировались базовые понятия о том, что такое ESLint и зачем это нужно. Я надеюсь, что для кого-то из вас эта статья была полезна и, возможно, все таки убедит вас в том, что его использования крайне важно. Спасибо за внимание! Я надеюсь, что вы не напрасно потратили свое время.
-
Всем доброго времени суток, в данной статье я хотел бы немного рассказать о Yarn. Если вы знаете, что это такое и используете, либо твердо решили для себя, что не будете использовать Yarn, то можете просто закрыть данную статью. Предусловие Yarn - это пакетный менеджер, разработанный компанией Facebook, на стадии его разработки так же подключились Google, Exponent и Tilde. Почему стоит использовать Yarn? Файл yarn.lock В файле package.json, с помощью которого Yarn и npm отслеживают зависимости, номера версий не указываются точно, вместо этого задается их диапазон. Таким образом, вы можете задать определенную основную или вспомогательную версию, при этом позволяя npm установить последний патч с исправлениями каких-либо багов. В идеальном мире семантического версионирования, релизы с патчами не содержат коренных изменений. Но, к сожалению, в реальности это не всегда верно. Стратегия, выбранная npm может привести к тому, что на двух машинах с идентичными файлами package.json будут установлены различные версии пакетов, что может привести к появлению багов. Чтобы избежать несоответствия версий, установленная версия закрепляется в файле блокировки. При каждом добавлении модуля создается файл yarn.lock. Таким образом вы можете гарантировать, что на другой машине будет установлен тот же самый пакет; при этом у нас сохраняется диапазон допустимых версий в файле package.json. В npm команда npm shrinkwrap так же генерирует файл блокировки, а команда npm install считывает его до чтения package.json, также как Yarn сначала читает yarn.lock. Разница состоит в том, что Yarn всегда автоматически обновляет yarn.lock, а в npm это надо делать вручную. Параллельная установка Независимо от того, устанавливается ли пакет с помощью npm или Yarn, при этом решается серия задач. В npm эти задачи выполняются последовательно и отдельно для каждого пакета, это значит, что пока пакет не установлен полностью, следующий пакет будет ждать. В Yarn эти операции выполняются параллельно, что улучшает производительность. Для сравнения я установил пакет express с помощью npm и Yarn, не используя кэш, файлы shrinkwrap или lock; всего в установке 42 файла. npm: 9 секунд Yarn: 1.37 секунд Я не поверил своим глазам. Повторение дало такие же результаты. Затем я установил gulp со 195 зависимостями. npm: 11 секунд Yarn: 7.81 секунд Кажется, что разница зависит от количества устанавливаемых пакетов, в любом случае Yarn быстрее. Yarn или npm: различия в интерфейсе командной строки Кроме функциональных отличий, в Yarn также отличаются команды. Некоторые команды npm удалены, некоторые модифицированы, а пара интересных команд добавлена. yarn global В отличие от npm, где глобальные операции выполняются за счет опции -g или --global, команды Yarn нуждаются в префиксе global. Также как и в npm, специфические для проекта зависимости глобально не устанавливаются. Префикс global работает только с командами yarn add, yarn bin, yarn ls и yarn remove. За исключением yarn add, все эти команды идентичны своим эквивалентам в npm. Документация global. yarn install Команда npm install устанавливает все зависимости из файла package.json и позволяет вам добавлять новые пакеты. Команда yarn install только устанавливает зависимости, перечисленные в файле yarn.lock или package.json, именно в таком порядке. Документация yarn install Документация npm install yarn add [–dev] Аналогично npm install <package>, команда yarn add <package> добавляет пакет и устанавливает зависимости. Как видно из названия команды, она добавляет зависимости, это означает автоматическое сохранение ссылки на пакет в файле package.json, также как это делается в npm с флагом --save. Флаг --dev в Yarn добавляет зависимости для разработки, также как флаг --save-dev в npm. Документация yarn add Документация npm install yarn licenses [ls|generate-disclaimer] На момент написания в npm нет эквивалента этой команды. Yarn licenses lsвыводит список лицензий всех установленных в проекте пакетов, а yarn licenses generate-disclaimer генерирует дисклеймер, содержащий текст всех лицензий всех пакетов в проекте. Некоторые лицензии требуют включать текст лицензии в ваш проект, поэтому этот инструмент весьма полезен. Документация yarn licenses yarn why Эта команда смотрит в граф зависимостей и выясняет, почему указанный пакет установлен в вашем проекте. Возможно, вы сами добавили его, а, может, это зависимость установленного вами пакета. Команда yarn why помогает вам с этим разобраться. Документация yarn why yarn upgrade Эта команда обновляет пакеты до последней версии, соответствующей диапазону из package.json вместо установки точных версий из yarn.lock. Чтобы добиться того же в npm, вам надо последовательно выполнить: rm -rf node_modules npm install Эту команду не надо путать с npm update, обновляющей пакеты до самой свежей версии. Документация yarn upgrade yarn generate-lock-entry Команда yarn generate-lock-entry генерирует файл yarn.lock на основе зависимостей из package.json. Это похоже на npm shrinkwrap. Эту команду следует использовать с осторожностью, так как файл блокировки генерируется и обновляется автоматически при добавлении и обновлении зависимостей с помощью yarn add и yarn upgrade. Документация yarn generate-lock-entry Документация npm shrinkwrap Стабильность и надежность А что, если шумиха вокруг Yarn преждевременна? В первый же день релиза появилось много сообщений о проблемах, но темпы решения проблем поражают. Это показывает серьезную работу по обнаружению и исправлению багов. Если смотреть на количество и типы проблем, Yarn кажется стабильным для большинства пользователей, но он может не подойти для каких-то отдельных случаев. Учтите, что несмотря на то, что пакетный менеджер может быть очень важен для вашего проекта, это всего лишь пакетный менеджер. Если возникают проблемы, то переустановка пакетов не должна быть сложной, также как и возврат к npm. Перспективы Возможно, вы опасаетесь повторения истории с Node.js и io.js. Напомню, что io.js был форком Node.js, созданным несколькими основными разработчиками после разногласий по поводу управления проектом. Меньше, чем через год, обе команды пришли к соглашению, io.js был слит с Node.js и прекращен. Независимо от того, кто был прав, это обогатило Node.js новыми функциями. Я вижу схожие паттерны между npm и Yarn. Хотя Yarn это не форк, он исправляет некоторые из недостатков npm. Разве будет плохо, если npm учтет это и попросит Facebook, Google и остальных разработчиков Yarn улучшить npm? Хотя об этом слишком рано пока говорить, но я надеюсь, что так и произойдет. В любом случае, будущее Yarn выглядит светлым. Сообщество проявляет интерес к появлению нового пакетного менеджера. К сожалению, пока отсутствует дорожная карта проекта, поэтому я не знаю, какие сюрпризы Yarn готовит для нас. Заключение По умолчанию Yarn набирает больше очков, чем npm. У нас есть файл блокировки, установка пакетов быстра, как никогда и они все автоматически сохраняются в package.json. Последствия установки и использования Yarn минимальны — вы можете попробовать его только в одном проекте, чтобы увидеть, подходит он вам или нет. Это делает Yarn превосходной заменой npm. Я мог бы однозначно рекомендовать попробовать Yarn в каком-нибудь проекте, раньше или позже. Если вы осторожны в установке и использовании новых программ, подождите пару месяцев. В конце концов, npm проверен в боевых условиях, а в мире разработки программного обеспечения это немаловажно. Если же вы замечали, что вам приходиться ждать окончания установки пакетов npm, то вам самое время ознакомиться с руководством по переходу на Yarn. Пару слов от себя Yarn устанавливает пакеты гораздо быстрее, чем npm. Если в вашем проекте более одного разработчика, то используя Yarn вы может быть уверенны в том, что у всех разработчиков будут установлены пакеты одинаковых версий, что исключит возможность некорректной работы кода из-за версии пакета. Официальный сайт: https://yarnpkg.com/ Источники: https://habrahabr.ru, http://prgssr.ru
-
- 3
-
-
- Урок
- JavaScript
-
(and 2 more)
Tagged with:
-
Данная статья является первой часть курса уроков по JavaScript. В ней будут рассмотрены основные моменты языка JavaScript. В данной статье мы познакомимся с основными элементами языка JavaScript, к ним относятся: Базовые типы: строки, числа, логические переменные. Операторы. Массивы. Функции. Регулярные выражения. Циклы. 1. Базовые типы let variableName; // объявление новой перемнной с именем 'variableName' let str = ‘Hello world!!’; // строка let a = 1; // целое число let b = 1.3; // дробное число let boolTrue = true; // истина let bollFalse = false; // ложь const myConst = 5; // объявление const задаёт константу, то есть переменную, которую нельзя менять myConst = 10; // ошибка, константу имзенить нельзя 2. Операторы 2.1. Арифметические К арифметическим оператором относятся: + (сложение) - (вычитаение) * (умножение) / (деление) % (остаток от деления) let a = 1; let b = 2; let c = a + b; // 3 let d = c * 2; // 6 let e = d / 3; // 2 let f = e % 2; // 0 let g = 1.5; let h = 2.3; let i = g + h; // 3.8 i++; // 4.8 i--; // 3.8 let str1 = "Hello"; let str2 = "World!"; let str3 = str1 + " " + str2; // "Hello World!" 2.2. Логические && (и) || (или) if (5 > 3 && 5 < 6 ) { // условие верно, т.к. 5 больше 3 и 5 меньше 6 } if (5 > 3 && 5 < 4) { // условие не верно, т.к 5 больше 3, но 5 не меньше 4 } if (5 > 3 || 5 < 4) { // условие верно, т.к 5 больше 3 или 5 меньше 4 } if (5 < 3 || 5 > 10) { // условие не верно, т.к 5 больше 3 и 5 меньше 10 } 2.3. Сравнение == (равно без приведения типов) === (равно с приведением типов) != (не равно без приведения типов) !== (не равно с приведением типов) < (меньше) > (больше) <= (меньше или равно) >= (больше или равно) 1 == 1; // true 1 == '1'; // true 1 === 1; // true 1 === '1'; // false, т.к. типы не совпадают 1 != 2; // true 1 != 1; // false 1 > 1; // false 1 >= 1; // true 2 > 1; // true 2 >= 1; // true 3 < 4; // true 3 < 3; // false 3 <= 3; // true 0 == false; // true 0 === false; // false, т.к. типы не совпадают 3. Массивы В JavaScript индексация массива начинается с 0, то есть первый элемент в массиве имеет индекс 0, второй 1 и т.д. 3.1 Создание и изменение массива let arr = []; // создание пустого массива let arr = [1, 2, 3, 'Bob', 4, 5, 678.95]; // создание массива с элементами arr[0]; // 1 arr[2]; // 3 arr[3]; // "Bob"; arr[6]; // 678.95 arr[3] = "RAGE"; arr[3]; // "RAGE" arr[2] = 176; arr[2]; // 176 3.2 Авто-длина length У каждого массива есть свойство length, которое автоматом меняется при каждом обновлении массива. Длина массива - это не количество элементов, а максимальный целый ключ + 1: a = []; a[0] = 1; a[1000] = 1; a.length; // в массиве всего 2 элемента, но результат будет равен 1001, т.к. максимальный целый ключ - 1000 3.3 Перебор элементов let a = [1, 2, 3, 4] for (let i = 0; i < a.length; i++) { console.log(a[i]); // выведет каждое значение массива } a.forEach(function(item, index, arr) { // item - значение, index - номер(индекс), arr - массив, который переберается console.log(item); // альтернативный вариант перебора массива. }); 3.4 Добавление и удаление элементов в массив let arr = [3, 5, 7, 9]; arr.push(11); // добавит в конец массива число 11 arr.pop(); // удалит с конца массива последний элемент arr.pop(); // удалит с конца массива последний элемент console.log(arr); // выведет все значения массива, в данном случае [3, 5, 7] arr.unshift(1); // добавит в начало массива число 1 console.log(arr); // выведет все значения массива, в данном случае [1, 3, 5, 7] arr.shift(); // удалит с начала массива первый элемент console.log(arr); // выведет все значения массива, в данном случае [3, 5, 7] Об остальных методах для работы с массива вы можете прочитать здесь. 4. Функции 4.1 Создание функция function имя(параметры) { // какой-то код } function summ(a, b) { return a + b; // функция вернет результат суммы числа a и b } let c = summ(1, 5); // 6 4.2 Функции - объекты В JavaScript функции являются полноценными объектами встроенного класса Function. Именно поэтому их можно присваивать переменным, передавать и, конечно, у них есть свойства: function f() { } f.test = 6 console.log(f.test) // 6 4.3 Параметры функции Функции можно запускать с любым числом параметров. Если функции передано меньше параметров, чем есть в определении, то отсутствующие считаются undefined. function division(a, b = 2) { return a / b; } let a = division(10, 5); // вернет 2, т.к. мы передали оба параметру в функцию let b = division(10); // вернет 5, т.к. мы передали только один параметр в функцию, а b = 2, если он не передан 4.4 Работа с неопределенным числом параметров function sayHi() { for (var i = 0; i < arguments.length; i++) { console.log("Привет, " + arguments[i]); } } sayHi("Винни", "Пятачок"); // 'Привет, Винни', 'Привет, Пятачок' Частая ошибка новичков – попытка применить методы Array к arguments. Это невозможно: function sayHi() { var a = arguments.shift(); // ошибка! нет такого метода! } sayHi(1); Дело в том, что arguments – это не массив Array. В действительности, это обычный объект, просто ключи числовые и есть length. На этом сходство заканчивается. Никаких особых методов у него нет, и методы массивов он тоже не поддерживает. Впрочем, никто не мешает сделать обычный массив из arguments, например так: function Foo() { var args = []; for (var i = 0; i < arguments.length; i++) { args[i] = arguments[i]; } console.log(args); // [1, 2, 3, 4]; } Foo(1, 2, 3, 4); 5. Регулярные выражения Регулярные выражения в javascript имеют особую краткую форму и стандартный PCRE-синтаксис. Работают они через специальный объект RegExp. Кроме того, у строк есть свои методы search,match,replace, но чтобы их понять - разберем-таки сначала RegExp. В дальнейшем на эту тему будет написан отдельный урок, в котором все будет объяснено более подробно. Объект типа RegExp, или, короче, регулярное выражение, можно создать двумя путями /pattern/флаги new RegExp("pattern"[, флаги]) pattern - регулярное выражение для поиска (о замене - позже), а флаги - строка из любой комбинации символов g(глобальный поиск), i(регистр неважен) и m(многострочный поиск). Первый способ используется часто, второй - иногда. Например, два таких вызова эквивалентны: var reg = /ab+c/i var reg = new RegExp("ab+c", "i") При втором вызове - т.к регулярное выражение в кавычках, то нужно дублировать \ // эквивалентны re = new RegExp("\\w+") re = /\w+/ При поиске можно использовать большинство возможностей современного PCRE-синтаксиса. 6. Циклы 6.1 Цикл while с предоусловием let i = 0; while (i < 10) { // цикл будет увеличивать значение перемнной i на 10 до тех пор, пока проверка i < 10 не вернет false i++; } 6.2 Цикл while с пост условием Цикл, описанный, таким образом, сначала выполняет тело, а затем проверяет условие. let i = 0; do { i++; } while (i < 10); Таким образом, цикл выполненный в разделе 6.1, после окончания итераций присвоит переменной i значение 10, а цикл выполненный в разделе 6.2, после окончания итерация присвоит переменной i значение 11. 6.3 Цикл for Чаще всего применяется цикл for. Выглядит он так: for (начало; условие; шаг) { // тело цикла } Пример цикла, который выведет значение для i от 0 до 10 включительно: for (let i = 0; i <= 10; i++) { console.log(i); } В данном цикле: Начало: i = 0. Условие: i <= 10. Шаг: i++. Тело цикла: console.log(i), т.е. код внутри фигурных скобок (они не обязательны, если только одна операция) 6.4 Прерывание цикла break Выйти из цикла можно не только при проверке условия но и, вообще, в любой момент. Эту возможность обеспечивает директива break. Например, следующий цикл остановиться если значение переменной i будет больше 50. for (let i = 0; i <= 100; i++) { if (i > 50) { break; } } Директива continue прекращает выполнение текущей итерации цикла. Она – в некотором роде «младшая сестра» директивы break: прерывает не весь цикл, а только текущее выполнение его тела, как будто оно закончилось. Её используют, если понятно, что на текущем повторе цикла делать больше нечего. Например, следующий цикл использует continue, чтобы не выводить нечетные числа: for (let i = 0; i <= 10; i++) { if (i % 2 != 0) { continue; } console.log(i); // выведет число, если оно четное. }
-
Пример создания зон, территорий, и событий когда игрок входит/покидает их. Зоны будут 2х типов 2D и 3D, различия между ними в том что 3D зона имеет высоту равную ее радиусу, то есть если игрок находится выше или ниже радиуса зоны то он в ней не находится, 2D же зоны не имеют высоты и игрок находясь на любом уровне на/под ними все равно находится внутри. Создаем в каталоге 'packages/keker' файл 'zones.js', объявим его в 'packages/keker/index.js' добавив туда строку: require("./zones"); Добавляем в 'zones.js' этот код: mp.Vector3.Distance = function (v1, v2){ return (Math.sqrt(Math.pow((v2.x - v1.x),2) + Math.pow((v2.y - v1.y),2)+ Math.pow((v2.z - v1.z),2))); } mp.Vector3.Distance2D = function (v1, v2){ return (Math.sqrt(Math.pow((v2.x - v1.x),2) + Math.pow((v2.y - v1.y),2))); } var Zone = class Zone { constructor(n ,v, r, t){ this.name = n; // Название зоны this.center = v; // Центральная точка this.radius = r; // Радиус this.type = t; // Тип 2D или 3D this.insidePlayers = []; // Массив игроков находящихся в зоне this.interval = InitInterval(this); } BroadcastMessage(s){ // Фунция рассылки сообщения игрокам находящимся в нутри этой зоны this.insidePlayers.forEach(player => { player.outputChatBox(s); }); } } function InitInterval(zone){ return setInterval(function(){ mp.players.forEach(player => { let dist = (zone.type=="2D") ? mp.Vector3.Distance2D(player.position, zone.center) : mp.Vector3.Distance(player.position, zone.center); if(dist < zone.radius && zone.insidePlayers.indexOf(player) < 0){ zone.insidePlayers.push(player); mp.events.call("playerEnterZone", zone, player); } else if (dist > zone.radius && zone.insidePlayers.indexOf(player) >= 0){ zone.insidePlayers.splice(zone.insidePlayers.indexOf(player), 1); mp.events.call("playerExitZone", zone, player); } }) }, 500); } var Zones = class Zones { constructor(){ this._Zone = Zone; this.zones = []; } Add(n, v, r, t){ if(this.zones[n]) this.Remove(n); let z = new this._Zone(n, v, r, t); this.zones[n] = z; return z; } AddZone3D(n, v, r){ return this.Add(n, v, r, '3D'); } AddZone2D(n, v, r){ return this.Add(n, v, r, '2D'); } Remove(n){ let z = this.zones[n]; clearInterval(z.interval); delete this.zones[n]; } Get(n){ return this.zones[n]; } } mp.Zones = new Zones(); mp.events.add({"playerQuit" : (player, reason, kickReason) => { for(let key in mp.Zones.zones) { // Удаление игрока из зоны при выходе let zone = mp.Zones.zones[key]; if (zone.insidePlayers.indexOf(player) >= 0){ zone.insidePlayers.splice(zone.insidePlayers.indexOf(player), 1); } } } }); Теперь в любом удобном месте, или в 'events/common.js' добавляем события для зон: mp.events.add({ "playerEnterZone": (zone, player) => { /* Событие когда игрок вошел в зону на входе получаем zone - обьект зоны, и игрока - player */ }, "playerExitZone": (zone, player) => { /* Событие когда игрок покинул зону на входе получаем zone - обьект зоны, и игрока - player */ } }); Методы и свойства для работы с зонами: let zone = mp.Zones.AddZone3D("zone1", new mp.Vector3(10, 25, 46), 10); // Создает 3D зону с названием zone1, в точке X:10;Y:25;Z:46; и радиусом 10 let zone = mp.Zones.AddZone2D("zone1", new mp.Vector3(10, 25, 46), 10); // Создает 2D зону с названием zone1, в точке X:10;Y:25;Z:46; и радиусом 10 let zone = mp.Zones.Get('zone1'); // Получает зону с названием zone1 mp.Zones.Remove('zone1'); // Удаляет зону zone1 zone.BroadcastMessage("Сообщение"); // Рассылает игрокам находящимся в зоне чат сообщение; zone.insidePlayers // Массив с игроками находящимися в зоне zone.name // Название зоны Прошу строго не судить так как это костыльный метод, пока данный функционал не добавят в API.
-
Здравствуйте! Представляю для вас пример исполнения команды /weapon unit id где: unit - это блок оружия а имеено: Handguns Machine Assault Sniper ShotGun Heavy Thorow id это само оружие в блоке Для начала работи - нам нужно в паке "events" создать файл "weapon.js" Затем объявляем в нём глобальную переменную: global.weapon = { }; После объявляєм сам unit (блок), в котором будет находиться определеный тип оружия. Вставляем между фигурных скобок: Handguns: mp.joaat(["weapon_pistol"]) Полный код файла "weapon.js": global.weapon= { Handguns: mp.joaat(["weapon_pistol", "weapon_CombatPistol", "weapon_Pistol50", "weapon_SNSPistol", "weapon_HeavyPistol", "weapon_VintagePistol", "weapon_MarksmanPistol", "weapon_revolver", "weapon_APPistol", "weapon_StunGun", "weapon_FlareGun"]), Machine: mp.joaat(["weapon_MachinePistol", "weapon_SMG", "weapon_AssaultSMG", "weapon_CombatPDW", "weapon_MG", "weapon_CombatMG", "weapon_Gusenberg", "weapon_MiniSMG"]), Assault: mp.joaat(["weapon_assaultrifle", "weapon_carbinerifle", "weapon_advancedrifle", "weapon_specialcarbine", "weapon_bullpuprifle", "weapon_compactrifle"]), Sniper: mp.joaat(["weapon_SniperRifle", "weapon_heavySniper", "weapon_MarksmanRifle"]), ShotGun: mp.joaat(["weapon_pumpShotgun", "weapon_SawnoffShotgun", "weapon_bullpupshotgun", "weapon_assaultshotgun", "weapon_musket", "weapon_HeavyShotgun", "weapon_AutoShotgun"]), Heavy: mp.joaat(["weapon_grenadelauncher", "weapon_RPG", "weapon_Minigun", "weapon_Firework", "weapon_Railgun", "weapon_HomingLauncher"]), Thorow: mp.joaat(["weapon_Grenade", "weapon_StickyBomb", "weapon_Proximitymine", "weapon_BZGas", "weapon_Molotov", "weapon_Flare", "weapon_PetrolCan", "weapon_FireExtinguisher"]) }; Теперь нам нужно создать саму команду, которая будет вызывать наш блок, тип оружия. После сохранения файла, открываем файл который находиться в паке "commands" - "basiccommands.js" В нем нужно найти команду /weapon и заменить её кодом ниже: "weapon": (player, args) => { let id = parseInt(args[1]); switch (id){ case 0:{if (args[2]>=0 && args[2]<=10){player.giveWeapon(weapon.Handguns[args[2]],1000); player.outputChatBox("Weapon: "+args[2]+" of unit Handguns");}else player.outputChatBox("Use /weapon 0 [0-10]");break;} case 1:{if (args[2]>=0 && args[2]<=7){player.giveWeapon(weapon.Machine[args[2]],1000); player.outputChatBox("Weapon: "+args[2]+" of unit Machine");}else player.outputChatBox("Use /weapon 1 [0-7]");break;} case 2:{if (args[2]>=0 && args[2]<=5){player.giveWeapon(weapon.Assault[args[2]],1000); player.outputChatBox("Weapon: "+args[2]+" of unit Assault");}else player.outputChatBox("Use /weapon 2 [0-5]");break;} case 3:{if (args[2]>=0 && args[2]<=2){player.giveWeapon(weapon.Sniper[args[2]],1000); player.outputChatBox("Weapon: "+args[2]+" of unit Sniper");}else player.outputChatBox("Use /weapon 3 [0-2]");break;} case 4:{if (args[2]>=0 && args[2]<=6){player.giveWeapon(weapon.ShotGun[args[2]],1000); player.outputChatBox("Weapon: "+args[2]+" of unit ShotGun");}else player.outputChatBox("Use /weapon 4 [0-6]");break;} case 5:{if (args[2]>=0 && args[2]<=5){player.giveWeapon(weapon.Heavy[args[2]],1000); player.outputChatBox("Weapon: "+args[2]+" of unit Heavy");} else player.outputChatBox("Use /weapon 5 [0-5]");break;} case 6:{if (args[2]>=0 && args[2]<=7){player.giveWeapon(weapon.Thorow[args[2]],1000); player.outputChatBox("Weapon: "+args[2]+" of unit Thorow");} else player.outputChatBox("Use /weapon 6 [0-7]");break;} default: player.outputChatBox("Use /weapon 0-6 [id]"); break; } }, Сам файл: weapon.js Скачать: https://drive.google.com/open?id=0B__EFpIDYcQ6ZEc0akc1S0JFcEE Если возникнут проблемы обращайтесь!
-
Вступление. Привет работяги! В этой статье я попробую рассказать как быстро начать работать с PostgreSQL . Чем эта СУБД лучше чем MySQL я не буду писать. Если вам интересно, то можно почитать тут Начинаем кодить! Для начала ставим такую библиотеку: npm install pg-promise (если вы не знаете что это, то почитайте это) Устанавливаем и запускаем PostgreSQL, если у вас он еще не стоит. ОК, если все установилось, то создаем папку lib в корне вашего мода. У меня это получилось так: D:\winsrv\packages\vrp\lib В папке lib создаем файл db.js В этом файле мы подключаемся к нашей БД. Тут думаю все понятно по коду. const pgp = require('pg-promise')(); const cn = { host: 'localhost', port: 5432, database: 'vrp', user: 'postgres', password: 'postgres' }; const db = pgp(cn); module.exports = db; Теперь в любом файле где нам нужно работать с БД мы просто пишем: Если у вас ошибка типа db is not defined, то вы забыли написать это! const db = require('тут пишем путь до файла db.js'); // Пример пути: './../lib/db.js' Давайте попробуем загрузить данные о пользователе, если он зайдет к нам на сервер. Не забываем в начале файла common.js прописать: const db = require('./../lib/db.js'); В файле common.js ищем обработчик события playerJoin : module.exports = { "playerJoin" : player => { // сюда добавляем db.any("select * from users where name=$1", [player.name]) .then(function (data) { console.log("data: %j", data); // выводим данные о пользователе }) .catch(function (error) { console.log("ERROR:", error.message || error); // выводим ошибку }); } } Вот что у нас получится Полезные ссылки: Github Примеры работы с библиотекой Документация
-
Очень часто люди задают вопрос, вроде: "как установить пакеты node.js для сервера?". В данной статье попытаюсь доходчиво объяснить как это сделать. Качаем, устанавливаем node.js, желательно версию 7.3.0, т.к. на сервер стоит именно она. Жмем пуск, открываем командную строку (Win + R, cmd). Переходим в папку с сервером (в моем случае это D:\rage_mp_server). Выглядит как-то так (текст из cmd): D: cd rage_mp_server Инициализируем npm package.json файл: npm init -y Устанавливаем необходимые нам пакеты (mysql к примеру): npm install mysql Далее можем делать require в интересующем нас .js файле (на примере index.js): var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : 'me', password : 'secret', database : 'my_db' }); connection.connect(); connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) { if (err) throw err; console.log('The solution is: ', rows[0].solution); }); connection.end();