Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 06/11/19 in Posts

  1. Hallo liebe Community, warum tun sich so viele Modder und Scripter soviel Arbeit, wenn es sich immer um das selbe Spielprinzip dreht! So schnell wie die Server auftauchen so schließen sie es wieder in einem Atemzug. Es soll doch immer etwas besonderes sein, ließt man! Ich möchte endlich mal ein RP Server mit Deutschen gesetzten mit verschärften Waffen gesetzte ohne Toleranz zur Gangs. Deren Bekämpfung sollte im Vordergrund stehen! Viel härteren Strafen für z.b.: Tötungsdelikte und sehr lange Knast Aufenthalte die man auch IC wirklich absitzen muss. Oder denkt ihr, die Polizei hierzulande schaut zu wie Hells Angels oder Banditos Mitglieder einfach mit Waffen auf offener Strafen herumlaufen dürfen! Sofortiger Beschlagnahmung der Waffen und ab in den Knast. Wer sich an einer Gang anschließt muss mit aller härte der Gesetzte rechnen. Auch die Gang Zugehörigkeit und die einheits- Kleider müssen verboten werden. Auch sollte es keine vordefinierte Gangs geben, sondern aus einer Clique entstehen, wachsen und den Rest kennt Ihr ja... das sollte auch nicht von einem OCC Moderator geregelt werden. Waffen sollten nicht einfach so erwerbbar sein, nur mit einer entsprechenden Waffenschein, womit es auch sehr strenge auflagen geben müsste! Gilt auch für zukünftige Polizei Beamte und Sicherheitsdienstleister. Mehr Respekt, Zusammenhalt und Freundschaften in einem Spiel zu fördern, statt immer irgendwo ausgeraubt, getötet oder Mörder zu werden. Gutes Wirtschaft System vorausgesetzt kann es extrem viel Spaß machen z.b.: nach einen anstrengenden OCC Tag, einfach IC mit paar freunden chillen oder einfach gemeinsam zum Tuning treffen fahren, Privat oder Gewerbliche Partys veranstalten. Es gibt doch noch so viele Möglichkeiten außer herumballern. Whitelisting würde es kaum geben, weil man sich in Deutschland auch an Gesetze und Verpflichtungen halten muss. Beim ersten Fail RP statt Bann einfach mal reale 48 Stunden, beim zweiten 96, beim dritten... usw. Knast IC absitzen lassen, mit einer ordentlichen Schmerzensgeld Auszahlung für den Opfer. Dann hätte es auch der letzte Kapiert wie das hier abläuft. Zur Beweislage der straffälligen hätte ich einer Option meinerseits. Klar wird es zumindest am Anfang nicht so viel Polizei Beamte zur Verfügung stehen, aber dieses könnt man umgehen wenn man bei der einreise klar macht das die ganze Stadt Video überwacht wird. Sollte es zur einer Fail RP kommen, kann man z.b.: seine Privaten Aufnahmen über den Forum an einem Polizei Beamten zuspielen. Somit würde es vielen davon abschrecken vorsätzlich Straftaten zu begehen. Felder, Berge und abseits von Straßen sollte da aber keine Videoüberwachung stattfinden. Also so eine Grauzone für die Gangs und Verbrecher. Mein Alter ist 40 und bin sozusagen mit Videospiele groß geworden. Das ist auch der Grund warum ich gerne in so einem Server spielen möchte. Ich glaube fest daran das ich nicht der einzige bin mit so einem Grund Gedanken. Server Spenden ist auch für mich kein Fremdwort, schließlich bekomme ich ja kein Taschengeld mehr ;-) und die Server bezahlen sich auch nicht von selbst. Ich habe noch keinen REAL LIVE Server in der Art gesehen und wahrscheinlich würde es auch nie geben aber, ich würde es mir wirklich mal wünschen wenn die Programmierung mal in diese Richtung geht. Vielleicht gibt es diesen einen Server ja, und habe es mit meiner Recherche nicht gefunden? Wer auf Baller, Gangster, Troll RP steht gibt es ja genug andere Server dafür. Einfachmal auf Twitch vorbei schauen. Grüße Jason Off topic Bei sachlichen Konstruktiven Unterhaltungen mit verschieden Moderatoren auf ts wurde ich immer wieder überrascht wie manche sich so aufspielen oder arrogant auf dich herabschauen!!! Lasst euch gesagt sein, hey Ihr seit nur so stark wie eure Community ohne Ihnen seit Ihr eine null. Und vergisst es nicht, es kommen immer neue Server dazu.! Behandle die anderen genau so, wie du behandelt werden möchtest. Kritikfähigkeit ist keine schwäche sondern Ansporn es besser zu machen, als andere zuvor.
    4 points
  2. @Jason Dark @Zotti Genau die Probleme, die du in deinem Beitrag nennst, haben uns - vormals und immer noch eine Gruppe von RP-Spielern - zunehmend gestört. Wir wurden sogar aufgrund dessen, dass wir unsere Figuren auf der "Bühne" in ihren Einzelheiten und Charakterzügen aufführten, von einigen Servern ausgeschlossen. Nicht nur in GTA, sondern auch in anderen Spielen und Spielmodifikationen. Genau aus diesem Grunde wollten, wollen und entwickeln wir nun ein Rollenspiel Server, auf dem die von dir angesprochenen Probleme, z.B. der fehlende Fokus auf ein Justiz-System (wobei hier natürlich immer die Gesetzesvorlage ausschlaggebend ist) nicht Vorhanden ist oder wo so etwas von Grund auf ausgeschlossen ist und bspw. ein solches Handeln eines Moderators von uns allen, die an dem Projekt beteiligt sind, zutiefst verurteilt wird. Das ist aber nur ein Bruchteil unserer "Vision" von Rollenspiel. Wir laden dich und auch andere Interessierte gerne dazu ein, uns auf unserem Teamspeak Server zu besuchen. Wir tauschen liebend gerne unsere Erfahrungen mit anderen Spielern aus. TS-IP : ts.eisengrind.de
    2 points
  3. Introduction Hello, So I have decided I should make this tutorial about how to use CEF alongside RAGEMP to make interactable UI because I have spent some time understanding it from examples without a clear tutorial, I am going to explain how to interact between the CEF browsers and RAGEMP client, and how to send/receive information from and to server. This tutorial is targeting new comers in RAGEMP but who have background in scripting and know how to run and connect their server locally. So the main points will be: 1-What is CEF 2-Sending information from CEF to RAGEMP client (and vice versa) 3-Sending information from RAGEMP to The Server (and vice versa) (I will be using C# Bridge API for working with the serverside scripting) Before we start you are going to need the following to better understand the tutorial: Basic knowledge in HTML, CSS and JavaScript (Optional – Nice to have) Bootstrap and JQuery Let’s start! What is CEF CEF is abbreviation to Chromium Embedded Framework an open source framework that allow the ability to embed HTML webpages into applications. RAGEMP already integrates the CEF so you don’t have to download anything externally to begin using it. CEF and RAGEMP Client So now we are going to learn how to create a browser inside the RAGEMP client and interact with it. I am going to teach by giving example, it is going to be a basic login/register system. First download or or create your own webpage design, If you don't know how to create a webpage just use my sample (Attached to this thread) and follow the tutorial. Start by going to RAGEMP/server-files/client_packages folder and create a new folder name it “Login” then inside the Login folder we’ve just created place the HTML,CSS and JS files that is related to the webpage inside and then create the (clientside) script we will call it “Main.js” that will be the main connecting point between the CEF browser, client and the server. NOTE: In the Login folder you are going to place the webpage files and all dependences such as Bootstrap or JQuery libraries. So to this point you should’ve something similar to this Dependences folder contains the minified JQuery and Bootstrap libraries, Links below: https://getbootstrap.com/docs/3.3/getting-started/ https://code.jquery.com/jquery-3.3.1.min.js/ So I have pre-made this simple page for the sake of this tutorial, I will link download to all of the files that I have used at the bottom of this thread. But you can go with any page design you like. Disclaimer: I am new to web development so it may not look that good but it does the job. Now we need to interact with this page, Inside the Login.html (assuming you already have made/imported a page) find the main components that you want to interact with and give them the ‘id’ attribute, in my case I need the buttons and text input elements, image below for more understanding Also notice how we referenced the “Login.js” script. We are going to use these inside our “Login.js” file, so Open the Login.js file and write the following: (Code is written using JQuery) $('#loginButton').click(() => { mp.trigger('loginInformationToServer', $('#loginUsernameText').val(), $('#loginPasswordText').val()); }); $('#registerButton').click(() => { mp.trigger('registerInformationToServer', $('#registerUsernameText').val(), $('#registerPasswordText').val()); }); So what this basically does is once the loginButton/registerButton is clicked is going to trigger (mp.trigger) an event with the given name and pass the values inside the text fields as arguments, that later we are going to catch that in our “Main.js” script. (This point is where we send information from CEF Browser to RAGEMP Client). Now that we have send the information and they are waiting to be caught, But before we do that we are going to show the browser window when a player connect to our server. Open “Main.js” and use mp.browsers.new(‘package://path’); In our case: we have the html page inside our Login folder. var loginBrowser = mp.browsers.new('package://Login/Login.html'); Now at this point when the player connects to our server this will show him our page that we’ve just made, it is still not functional yet until we catch the information that we’ve sent before. Let’s catch them now, inside the “Main.js” add the following: mp.events.add('loginInformationToServer', (username, password) => { mp.events.callRemote('OnPlayerLoginAttempt', username, password); }); mp.events.add('registerInformationToServer', (username, password) => { mp.events.callRemote('OnPlayerRegisterAttempt', username, password); }); I am not going to go into much details here on the syntax but what we are doing is catching the 'loginInformationToServer' and 'registerInformationToServer' events (like you’d do in any other client event in ragemp) and sending them directly to the server to verify the information passed. But before we forget go back to the client_packages folder and create or open the file ‘index.js’ and place require('./Login/Main.js'); to let the server know that this file contains JavaScript codes that related to RAGEMP client (mp.events.add, mp.events.callRemote and mp.browsers.new), a complete list found on ragemp wiki https://wiki.rage.mp/index.php?title=Client-side_functions RAGEMP Client and RAGEMP Server Now that we have sent the information from the CEF client to the RAGEMP client, and then to the RAGEMP server via (mp.events.callRemote) we didn’t catch the event on the server yet, so let’s go ahead and do that. It can be done in same ways but different syntax depending on which programming language you are using, I am going to be using C# because I am more familiar with but it can be easily done with JS serverside once you are familiar with scripting in it. So go ahead and inside any resource file that you are using type the following: [RemoteEvent("OnPlayerLoginAttempt")] public void OnPlayerLoginAttempt(Client player, string username, string password) { NAPI.Util.ConsoleOutput($"[Login Attempt] Username {username} | Password: {password}"); if(username == "Max" && password == "123") { player.TriggerEvent("LoginResult", 1); } else player.TriggerEvent("LoginResult", 0); } So The above code catch the event that is triggered when player sends the information to the server so we validate them then send back a response to the client with either success or fail depending on the player data, in ideal case we should check the information from a database but that’s out of the scope for this tutorial so I am just checking if his username is Max and password is 123 then we send information back to the client with result 1 (success) else we send the result of 0 (incorrect username/password) Same thing apply for the register event handle. Now you can notice a pattern here is that whenever we send an event from one place to another we need to catch it, so back to the “Main.js” and let’s handle the response sent from the server, Add the following: mp.events.add('LoginResult', (result) => { if (result == 1) { //Success we destroy the loginBrowser as we don't need it anymore loginBrowser.destroy(); mp.gui.cursor.show(false, false); mp.gui.chat.push("You have successfully logged in."); } else { //Failed we just send a message to the player saying he provided incorrect info //Here you can be creative and handle it visually in your webpage by using the (browser).execute or loginBrowser.execute in our case to execute a js code in your webpage mp.gui.chat.push('Incorrect password or username.'); } }); Similar to what we did when we caught function from CEF we did for catching from server and we checked if the value passed is 1 then the player succeeds in logging in else he fails. Now you can just run your server and connect with your client and you should see the login page appear, enter anything and hit login - it should message Then try using the combinations of Max and 123 and you should see and the window should disappear. Same practice apply to the register I will leave it for you to practice and try to implement that by yourself! Good luck! Summary Important things to remember: - From CEF browser to RAGEMP client => mp.trigger caught by mp.events.add - From RAGEMP client to RAGEMP server (C#) => mp.events.callRemote caught by [RemoteEvent()] flag and a function Now the other way around: - From RAGEMP server (C#) to RAGEMP client => (Client).TriggerEvent caught by mp.events.add - From RAGEMP client to CEF browser => (Browser).execute For more information about the syntax for these you can check the ragemp wiki NOTE: Sometimes you don’t need to send anything to the server, For example a browser that contains information about your server, you just need to contact between CEF and RAGEMP client. NOTE: Similarly if you want to use JavaScript for serverside scripting you can find the equivalent to my functions used and do the same, however everything done in clientside scripts (Main.js) should remain the same for both languages!! The End And here you’ve just completed the tutorial! Thanks for taking your time to read and if you have faced any problems or any question post a comment below and I will do my best to answer it. Also feel free to correct me if there is any suggestions or any syntax/logical errors. Happy coding! Files used in this tutorial: https://www.solidfiles.com/v/nYR8xn43j57jv
    1 point
  4. Hallo(dieser Post richtet sich auch an absolute Anfänger) Vor ein paar Jahren hatte ich für SAMP eine Idee eines Wirtschaftssimulators. Ich war allerdings nie motiviert genug ihn umzusetzen. Mit RAGE:MP hat man mehr Möglichkeiten und ich habe mal einen Prototypen entwickelt der bereits spielbar ist.(es gibt allerdings kaum GUI und es wird momentan noch alles über Commands geregelnt). Im Moment kann man z.B. Weizen bei einer Farm kaufen und diesen teurer bei einer Mühle verkaufen. Die Mühle stellt Mehl her, das zur Bäckerei gebracht werden kann, die Brot daraus backt. usw. So kann man bereits etwas Geld verdienen und sich einen größeren Transporter leisten. Geplant sind Firmen, in denen sich die Spieler ein gemeinsames Konto und einen gemeinsamen Fuhrpark teilen. Der Kauf und das Aufrüsten von Produktionsstätten und Lagern. Ein Tutorial und Voicechat. Zu mir als Leiter des Projekts: Ich bin 28 Jahre alt und Programmiere seit 10 Jahren Hobbymäßig. Ich habe mit PHP angefangen, bin dann über Java auf C++ gekommen. Mit C++ habe ich ein paar Jahre gearbeitet und habe dann C# entdeckt. Mein Ziel war es immer möglichst guten Code zu schreiben und ich habe deswegen viele Bücher gelesen. Ich gebe seit 6 Jahren Unterricht im Programmieren und habe ein paar Auftragsarbeiten erledigt. Projekte an denen ich (zumindest) mitgearbeitet habe: Blitzkicker Blitzkicker Euro Bersch Buttons Xytka TilePainter Wenn du Interesse am Projekt hast kannst du dich gerne per PM oder über Discord(NachoMan#8519) bei mir melden. Wenn du noch nicht (gut) Programmieren kannst ist das kein Problem, da ich regelmäßig Unterricht gebe. Ich würde dir dann natürlich unentgeldlich helfen. Edit: Der Gamemode soll keine RP Elemente enthalten und ich möchte auch nicht an einem Projekt mitarbeiten, dass solche Enthält.
    1 point
  5. Leider wurden mir die Nachrichten nicht angezeigt. Sobald der erste Spieler sich registriert hat wird eine "Datenbank.db" Datei im Ordner erstellt wo du die "Server.exe" findest, dort muss auch eine Datei mit dem Namen "LiteDB.exe" drinnen sein diese muss du öffnen und dann die Datenbank.db darüber öffnen. Das nächste Update wird wahrscheinlich am 15.06.2019 erscheinen mit einigen Fixes, verbesserungen und neuen Funktionen sowie Fraktionen.
    1 point
  6. Ich hänge mich mal hier mit rein. Alter 46 und 1 zu 1 der selben Meinung.
    1 point
  7. Da bin ich bei dir!! Möchte ja auch einen machen und der sollte in die Art gehen wie du sagtest. Mein Alter 48 Jahre und diese RP Trolle ala GTA Online sehr schlimm.
    1 point
  8. niemals! alles gut, mich würde nur interessieren ob der thread ersteller es nun auch hinbekommen hat, finde toll das leute immer fragen aber dann nichts mehr kommt
    1 point
  9. Всем доброго времени суток! Я уже неоднократно упоминал на сервере дискорда о такой штуке, как 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 и зачем это нужно. Я надеюсь, что для кого-то из вас эта статья была полезна и, возможно, все таки убедит вас в том, что его использования крайне важно. Спасибо за внимание! Я надеюсь, что вы не напрасно потратили свое время.
    1 point
  10. Данная статья является первой часть курса уроков по 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); // выведет число, если оно четное. }
    1 point
  11. Декораторы скоро войдут в спецификацию языка, это чудесный и очень гибкий инструмент, позволяющий умело внедрять мета программирование; изменять поведение функции; валидировать ваши данные; элегантный код; и многое другое... Всецело, рай для программиста! Но пока, мы можем их использовать без нативных операторов, благодаря функциям высшего порядка. Данный урок содержит в основном пересказ из оригинальной статьи на ресурсе learn javascript, по названию "Декораторы". Данный урок предполагает наличие неплохих знаний в программировании, в javascript. Итак, к коду! Внимание! Версия без комментариев, http://pastebin.com/JZNgHwdY ## метод afterLogin все так находится внутри метода login, фиксану чуть позднее, вся проблема в асинхронности /* Цель - Не допускать юзеров, которые находятся в черном списке */ /* Паттерн декораторы, подробнее - https://learn.javascript.ru/decorators */ /* Имеем обычный метод логина пользователя, куда передаются два параметра - логин и пароль соответственно. Однако, мы захотели навесить на метод login событие, чтобы при login у нас проверялся (условно) IP адрес из черного списка и если все впорядке, проводить логин. Самый очевидный вариант это просто дополнить метод login проверкой вида if ( User.blackList.indexOf( player.ip ) >= 0 ) return false; Однако, предположим что наш класс может быть унаследован и метод login перезаписан по своему или даже нам банально нужно вести какую нибудь статистику под авторизацию пользователя, и записывать попытки входа Не вопрос! Скажем мы, можно все пихнуть в метод login, он правда расбухнет и станет очень не читабельным, однако это реализация вполне годная на жизнь Но опять же, к нашим проблемам, -- метод могут переопределить, а поведение мы все таки хотим оставить так как же быть? На помощь приходят Декораторы! Суть декораторов проста -- мы подмешиваем в исходную функцию новое поведение, мы вольны задавать новое поведение как угодно! Давайте попробуем... Для начала реализация метода декоратора, метод bind Все просто -- метод bind всего лишь возвращает новую функицю и все! Все просто! (Немного теории: в функциональщине когда функция возвращает другую функцию, такая функция называется функцией высшего порядка) */ let mysql = require('mysql') // подключаем либу mysql, npm install mysql , SHA256 = require('crypto-js/sha256') // подключаем либу криптографии, можно стянуть npm install crypto , config = require('./config') // подключаем условный конфиг config.js, который якобы лежит у нас в корне каталога и возвращает объект { config: { } } , connection = mysql.createConnection(config.db) // создаем коннект к бд // описываем класс class User { constructor() { // по дефолту ставим статус авторизации как false this.logged = false // по дефолту ставим попытки входа на 0 this.loginAttempts = 0 // а максимальное количество попыток ставим равное 3 this.maxLoginAttempts = 3 // здесь навешиваем события, соответственно до и после this.login = this.bind (this.login, this.onBeforeLogin, this.onAfterLogin) } // собственно здесь вся магия, мы переиначиваем поведение func так как нам // захочется, добавляя до и после вызов событий // причем, заметьте что afterFunc передается в качестве параметра, ведь // node.js асинхронный, а значит мы должны подождать конца запроса // прежде чем использовать событие после авторизации bind (func, beforeFunc, afterFunc) { return function() { // здесь важно указать именно function() а не () => { }, // так как () => { } не имеет своего arguments и this // валидируем, может ли пользователь приступить к авторизации // параметр this обозначает наш экземпляр класса User let canLogin = beforeFunc.call(this, arguments) // func.call вызывает функцию func с параметрами arguments, afterFunc и передает туда // наш экземпляр объекта User // если canLogin = true, то совершаем попытку входа, иначе возвращаем ничего return canLogin ? func.call(this, arguments, afterFunc) : null } } // условный черный список static get blackList() { return ['127.0.0.1']; } login (player, username, password, callback) { if (this.logged) return true // условный запрос к базе данных connection.query('SELECT * FROM users WHERE username = ?, password = ?',[ username.toString(), SHA256(password.toString()), // хэшируем пароль ], function(err, result) { if (!err) { // ошибок нет, все окей // Запись с такой парой найдена? if (result.length) { this.logged = true return callback(username, this.logged, this.loginAttempts) } else { return callback(username, this.logged, ++this.loginAttempts) } } else { debug(`User::login, ошибка запроса к БД, причина: ${err}`) } }) } // сюда ушли все те же самые параметры что и в login // (т.е. player, username, password, без callback, его мы подключаем позже) // однако здесь их явно не указываем за не надобностью beforeLogin (player) { return this.loginAttempts > this.maxLoginAttempts || User.blackList.indexOf(player.ip) >= 0 ? false : true } afterLogin (username, status, count) { if (status) { // Пишем в какой-нибудь условный дебаг debug(`Пользовател ${username} авторизовался! ${count ? 'Его количество попыток входа = ' + count : ''}`) this.loginAttempts = 0 } else { // Пишем в какой-нибудь условный дебаг debug(`Ошибка авторизации. Количество попыток входа с логином ${username} = ${count.toString()}`) } return status } } статья дорабатывается... вопросы, пожелания, критика
    1 point
×
×
  • Create New...